@@ -126,6 +126,86 @@ object Scala3:
126
126
def isSyntheticWithIdent (using Context ): Boolean =
127
127
sym.is(Synthetic ) && ! sym.isAnonymous && ! sym.name.isEmptyNumbered
128
128
129
+ def symbolInfo (symkinds : Set [SymbolKind ])(using LinkMode , Context , SemanticSymbolBuilder ): SymbolInformation =
130
+ import TypeOps ._
131
+ val sname = sym.symbolName
132
+ val signature = sym.info.toSemanticSig(sym)
133
+ SymbolInformation (
134
+ symbol = sname,
135
+ language = Language .SCALA ,
136
+ kind = symbolKind(symkinds),
137
+ properties = sym.symbolProps(symkinds),
138
+ displayName = Symbols .displaySymbol(sym),
139
+ signature = signature,
140
+ )
141
+
142
+ private def symbolKind (symkinds : Set [SymbolKind ])(using Context ): SymbolInformation .Kind =
143
+ if sym.isTypeParam then
144
+ SymbolInformation .Kind .TYPE_PARAMETER
145
+ else if sym.is(TermParam ) then
146
+ SymbolInformation .Kind .PARAMETER
147
+ else if sym.isTerm && sym.owner.isTerm then
148
+ SymbolInformation .Kind .LOCAL
149
+ else if sym.isInlineMethod || sym.is(Macro ) then
150
+ SymbolInformation .Kind .MACRO
151
+ else if sym.isConstructor then
152
+ SymbolInformation .Kind .CONSTRUCTOR
153
+ else if sym.isSelfSym then
154
+ SymbolInformation .Kind .SELF_PARAMETER
155
+ else if sym.isOneOf(Method ) || symkinds.exists(_.isVarOrVal) then
156
+ SymbolInformation .Kind .METHOD
157
+ else if sym.isPackageObject then
158
+ SymbolInformation .Kind .PACKAGE_OBJECT
159
+ else if sym.is(Module ) then
160
+ SymbolInformation .Kind .OBJECT
161
+ else if sym.is(Package ) then
162
+ SymbolInformation .Kind .PACKAGE
163
+ else if sym.isAllOf(JavaInterface ) then
164
+ SymbolInformation .Kind .INTERFACE
165
+ else if sym.is(Trait ) then
166
+ SymbolInformation .Kind .TRAIT
167
+ else if sym.isClass then
168
+ SymbolInformation .Kind .CLASS
169
+ else if sym.isType then
170
+ SymbolInformation .Kind .TYPE
171
+ else if sym.is(ParamAccessor ) then
172
+ SymbolInformation .Kind .FIELD
173
+ else
174
+ SymbolInformation .Kind .UNKNOWN_KIND
175
+
176
+ private def symbolProps (symkinds : Set [SymbolKind ])(using Context ): Int =
177
+ if sym.is(ModuleClass ) then
178
+ return sym.sourceModule.symbolProps(symkinds)
179
+ var props = 0
180
+ if sym.isPrimaryConstructor then
181
+ props |= SymbolInformation .Property .PRIMARY .value
182
+ if sym.is(Abstract ) || symkinds.contains(SymbolKind .Abstract ) then
183
+ props |= SymbolInformation .Property .ABSTRACT .value
184
+ if sym.is(Final ) then
185
+ props |= SymbolInformation .Property .FINAL .value
186
+ if sym.is(Sealed ) then
187
+ props |= SymbolInformation .Property .SEALED .value
188
+ if sym.isOneOf(GivenOrImplicit ) then
189
+ props |= SymbolInformation .Property .IMPLICIT .value
190
+ if sym.is(Lazy , butNot= Module ) then
191
+ props |= SymbolInformation .Property .LAZY .value
192
+ if sym.isAllOf(Case | Module ) || sym.is(CaseClass ) || sym.isAllOf(EnumCase ) then
193
+ props |= SymbolInformation .Property .CASE .value
194
+ if sym.is(Covariant ) then
195
+ props |= SymbolInformation .Property .COVARIANT .value
196
+ if sym.is(Contravariant ) then
197
+ props |= SymbolInformation .Property .CONTRAVARIANT .value
198
+ if sym.isAllOf(DefaultMethod | JavaDefined ) || sym.is(Accessor ) && sym.name.is(NameKinds .DefaultGetterName ) then
199
+ props |= SymbolInformation .Property .DEFAULT .value
200
+ if symkinds.exists(_.isVal) then
201
+ props |= SymbolInformation .Property .VAL .value
202
+ if symkinds.exists(_.isVar) then
203
+ props |= SymbolInformation .Property .VAR .value
204
+ if sym.is(JavaStatic ) then
205
+ props |= SymbolInformation .Property .STATIC .value
206
+ if sym.is(Enum ) then
207
+ props |= SymbolInformation .Property .ENUM .value
208
+ props
129
209
end SymbolOps
130
210
131
211
object LocalSymbol :
0 commit comments