@@ -26,6 +26,7 @@ import java.nio.file.Paths
2626class ExtractSemanticDB extends Phase {
2727 import ast .tpd ._
2828 import untpd .given
29+ import NameOps .given
2930
3031 override val phaseName : String = ExtractSemanticDB .name
3132
@@ -84,11 +85,18 @@ class ExtractSemanticDB extends Phase {
8485 private enum SymbolKind derives Eql with
8586 kind =>
8687
87- case Val , Var , Other
88+ case Val , Var , Setter , Abstract
8889
89- def isValOrVar : Boolean = kind match
90- case Val | Var => true
91- case _ => false
90+ def isVar : Boolean =
91+ kind == Var
92+ || kind == Setter
93+
94+ def isVal : Boolean =
95+ kind == Val
96+
97+ def isValOrVar : Boolean =
98+ kind.isVar
99+ || kind.isVal
92100
93101 /** Add semanticdb name of the given symbol to string builder */
94102 private def addSymName (b : StringBuilder , sym : Symbol )(given ctx : Context ): Unit =
@@ -217,7 +225,7 @@ class ExtractSemanticDB extends Phase {
217225 private def excludeUseStrict (sym : Symbol , span : Span )(given Context ): Boolean =
218226 excludeDefStrict(sym) || (excludeDef(sym) && span.start == span.end)
219227
220- private def symbolKind (sym : Symbol , symkind : SymbolKind )(given Context ): SymbolInformation .Kind =
228+ private def symbolKind (sym : Symbol , symkinds : Set [ SymbolKind ] )(given Context ): SymbolInformation .Kind =
221229 if sym.isTypeParam
222230 SymbolInformation .Kind .TYPE_PARAMETER
223231 else if sym.is(TermParam )
@@ -230,7 +238,7 @@ class ExtractSemanticDB extends Phase {
230238 SymbolInformation .Kind .CONSTRUCTOR
231239 else if sym.isSelfSym
232240 SymbolInformation .Kind .SELF_PARAMETER
233- else if sym.isOneOf(Method ) || symkind. isValOrVar
241+ else if sym.isOneOf(Method ) || symkinds.exists(_. isValOrVar)
234242 SymbolInformation .Kind .METHOD
235243 else if sym.isPackageObject
236244 SymbolInformation .Kind .PACKAGE_OBJECT
@@ -251,11 +259,11 @@ class ExtractSemanticDB extends Phase {
251259 else
252260 SymbolInformation .Kind .UNKNOWN_KIND
253261
254- private def symbolProps (sym : Symbol , symkind : SymbolKind )(given Context ): Set [SymbolInformation .Property ] =
262+ private def symbolProps (sym : Symbol , symkinds : Set [ SymbolKind ] )(given Context ): Set [SymbolInformation .Property ] =
255263 val props = mutable.HashSet .empty[SymbolInformation .Property ]
256264 if sym.isPrimaryConstructor
257265 props += SymbolInformation .Property .PRIMARY
258- if sym.is(Abstract )
266+ if sym.is(Abstract ) || symkinds.contains( SymbolKind . Abstract )
259267 props += SymbolInformation .Property .ABSTRACT
260268 if sym.is(Final )
261269 props += SymbolInformation .Property .FINAL
@@ -273,26 +281,26 @@ class ExtractSemanticDB extends Phase {
273281 props += SymbolInformation .Property .CONTRAVARIANT
274282 if sym.isAllOf(DefaultMethod | JavaDefined ) || sym.is(Accessor ) && sym.name.is(NameKinds .DefaultGetterName )
275283 props += SymbolInformation .Property .DEFAULT
276- if symkind == SymbolKind . Val
284+ if symkinds.exists(_.isVal)
277285 props += SymbolInformation .Property .VAL
278- if symkind == SymbolKind . Var
286+ if symkinds.exists(_.isVar)
279287 props += SymbolInformation .Property .VAR
280288 if sym.is(JavaStatic )
281289 props += SymbolInformation .Property .STATIC
282290 if sym.is(Enum )
283291 props += SymbolInformation .Property .ENUM
284292 props.toSet
285293
286- private def symbolInfo (sym : Symbol , symbolName : String , symkind : SymbolKind )(given Context ): SymbolInformation = SymbolInformation (
294+ private def symbolInfo (sym : Symbol , symbolName : String , symkinds : Set [ SymbolKind ] )(given Context ): SymbolInformation = SymbolInformation (
287295 symbol = symbolName,
288296 language = Language .SCALA ,
289- kind = symbolKind(sym, symkind ),
290- properties = symbolProps(sym, symkind ).foldLeft(0 )(_ | _.value),
297+ kind = symbolKind(sym, symkinds ),
298+ properties = symbolProps(sym, symkinds ).foldLeft(0 )(_ | _.value),
291299 displayName = Symbols .displaySymbol(sym)
292300 )
293301
294- private def registerSymbol (sym : Symbol , symbolName : String , symkind : SymbolKind )(given Context ): Unit =
295- symbols += symbolInfo(sym, symbolName, symkind )
302+ private def registerSymbol (sym : Symbol , symbolName : String , symkinds : Set [ SymbolKind ] )(given Context ): Unit =
303+ symbols += symbolInfo(sym, symbolName, symkinds )
296304
297305 private def registerOccurrence (symbol : String , span : Span , role : SymbolOccurrence .Role )(given Context ): Unit =
298306 val occ = SymbolOccurrence (symbol, range(span), role)
@@ -304,11 +312,11 @@ class ExtractSemanticDB extends Phase {
304312 if ! excludeUseStrict(sym, span) && ! isWildcard(sym.name) then
305313 registerOccurrence(symbolName(sym), span, SymbolOccurrence .Role .REFERENCE )
306314
307- private def registerDefinition (sym : Symbol , span : Span , symkind : SymbolKind )(given Context ) =
315+ private def registerDefinition (sym : Symbol , span : Span , symkinds : Set [ SymbolKind ] )(given Context ) =
308316 if ! isWildcard(sym.name) then
309317 val symbol = symbolName(sym)
310318 registerOccurrence(symbol, span, SymbolOccurrence .Role .DEFINITION )
311- registerSymbol(sym, symbol, symkind )
319+ registerSymbol(sym, symbol, symkinds )
312320
313321 private def spanOfSymbol (sym : Symbol , span : Span )(given Context ): Span = {
314322 val contents = if source.exists then source.content() else Array .empty[Char ]
@@ -317,7 +325,10 @@ class ExtractSemanticDB extends Phase {
317325 Span (start, start + sym.name.show.length, start)
318326 }
319327
320- override def traverse (tree : Tree )(given ctx : Context ): Unit =
328+ def (tree : DefDef ) isSetterDef(given Context ): Boolean =
329+ tree.name.isSetterName && tree.mods.is(Accessor ) && tree.vparamss.flatten.length == 1
330+
331+ override def traverse (tree : Tree )(given Context ): Unit =
321332 for annot <- tree.symbol.annotations do
322333 if annot.tree.span.exists
323334 && annot.symbol.owner != defn.ScalaAnnotationInternal
@@ -328,22 +339,37 @@ class ExtractSemanticDB extends Phase {
328339 case tree : ValDef if tree.symbol.is(Module ) => // skip module val
329340 case tree : NamedDefTree
330341 if ! excludeDef(tree.symbol) && tree.span.start != tree.span.end =>
331- val symkind =
342+ val symkinds =
332343 if tree.symbol.isSelfSym
333- SymbolKind .Other
334- else tree match
335- case _ : ValDef => if tree.mods.is(Mutable ) then SymbolKind .Var else SymbolKind .Val
336- case _ : Bind => SymbolKind .Val
337- case _ => SymbolKind .Other
338- registerDefinition(tree.symbol, tree.nameSpan, symkind)
344+ Set .empty
345+ else
346+ val symkinds = mutable.HashSet .empty[SymbolKind ]
347+ tree match
348+ case tree : ValDef =>
349+ if tree.mods.is(Mutable )
350+ symkinds += SymbolKind .Var
351+ else
352+ symkinds += SymbolKind .Val
353+ if tree.rhs.isEmpty && ! tree.symbol.is(TermParam ) && ! tree.symbol.is(CaseAccessor ) && ! tree.mods.is(ParamAccessor )
354+ symkinds += SymbolKind .Abstract
355+ case tree : DefDef =>
356+ if tree.isSetterDef then
357+ symkinds += SymbolKind .Setter
358+ else
359+ if tree.rhs.isEmpty
360+ symkinds += SymbolKind .Abstract
361+ case tree : Bind => symkinds += SymbolKind .Val
362+ case _ =>
363+ symkinds.toSet
364+ registerDefinition(tree.symbol, tree.nameSpan, symkinds)
339365 val privateWithin = tree.symbol.privateWithin
340366 if privateWithin `ne` NoSymbol
341367 registerUse(privateWithin, spanOfSymbol(privateWithin, tree.span))
342368 traverseChildren(tree)
343369 case tree : (ValDef | DefDef | TypeDef ) if tree.symbol.is(Synthetic , butNot= Module ) && ! tree.symbol.isAnonymous => // skip
344370 case tree : Template =>
345371 if ! excludeDef(tree.constr.symbol)
346- registerDefinition(tree.constr.symbol, tree.constr.span, SymbolKind . Other )
372+ registerDefinition(tree.constr.symbol, tree.constr.span, Set .empty )
347373 tree.constr.vparamss.flatten.foreach(vparam => traverse(vparam.tpt)) // the accessor symbol is traversed in the body
348374 for parent <- tree.parentsOrDerived do
349375 if
0 commit comments