Skip to content

Commit 3f9f82f

Browse files
committed
abstract, and var method for SymbolInformation
1 parent b4ab377 commit 3f9f82f

File tree

2 files changed

+75
-49
lines changed

2 files changed

+75
-49
lines changed

compiler/src/dotty/tools/dotc/semanticdb/ExtractSemanticDB.scala

Lines changed: 52 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import java.nio.file.Paths
2626
class 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

tests/semanticdb/metac.expect

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -76,11 +76,11 @@ advanced/Test.s3x. => val method s3x
7676
advanced/Wildcards# => class Wildcards
7777
advanced/Wildcards#`<init>`(). => primary ctor <init>
7878
advanced/Wildcards#e1(). => method e1
79-
local0 => val method x
80-
local1 => val method x
79+
local0 => abstract val method x
80+
local1 => abstract val method x
8181
local2 => primary ctor <init>
8282
local3 => val method x
83-
local4 => method m
83+
local4 => abstract method m
8484
local5 => val param x
8585
local6 => primary ctor <init>
8686
local7 => method m
@@ -459,7 +459,7 @@ a/Definitions.D# => class D
459459
a/Definitions.D#`<init>`(). => primary ctor <init>
460460
a/Definitions.E# => class E
461461
a/Definitions.E#`<init>`(). => primary ctor <init>
462-
a/Definitions.`b_=`(). => method b_=
462+
a/Definitions.`b_=`(). => var method b_=
463463
a/Definitions.a. => val method a
464464
a/Definitions.b(). => var method b
465465
a/Definitions.c(). => method c
@@ -852,7 +852,7 @@ Symbols:
852852
flags/p/package. => final package object p
853853
flags/p/package.AA# => class AA
854854
flags/p/package.AA#`<init>`(). => primary ctor <init>
855-
flags/p/package.AA#`z_=`(). => method z_=
855+
flags/p/package.AA#`z_=`(). => var method z_=
856856
flags/p/package.AA#x. => val method x
857857
flags/p/package.AA#y. => val method y
858858
flags/p/package.AA#z(). => var method z
@@ -865,7 +865,7 @@ flags/p/package.C#`<init>`(+1). => ctor <init>
865865
flags/p/package.C#`<init>`(+1).[T] => typeparam T
866866
flags/p/package.C#`<init>`(+1).[U] => typeparam U
867867
flags/p/package.C#`<init>`(+1).[V] => typeparam V
868-
flags/p/package.C#w(). => method w
868+
flags/p/package.C#w(). => abstract method w
869869
flags/p/package.C#x. => val method x
870870
flags/p/package.C#y. => val method y
871871
flags/p/package.C#z. => val method z
@@ -882,7 +882,7 @@ flags/p/package.Y# => final class Y
882882
flags/p/package.Y#`<init>`(). => primary ctor <init>
883883
flags/p/package.Z# => sealed class Z
884884
flags/p/package.Z#`<init>`(). => primary ctor <init>
885-
flags/p/package.`y_=`(). => method y_=
885+
flags/p/package.`y_=`(). => var method y_=
886886
flags/p/package.m(). => method m
887887
flags/p/package.m().[TT] => typeparam TT
888888
flags/p/package.x. => lazy val method x
@@ -1076,10 +1076,10 @@ a/b/Givens. => final object Givens
10761076
a/b/Givens.Monoid# => class Monoid
10771077
a/b/Givens.Monoid#[A] => typeparam A
10781078
a/b/Givens.Monoid#`<init>`(). => primary ctor <init>
1079-
a/b/Givens.Monoid#combine(). => method combine
1079+
a/b/Givens.Monoid#combine(). => abstract method combine
10801080
a/b/Givens.Monoid#combine().(x) => val param x
10811081
a/b/Givens.Monoid#combine().(y) => val param y
1082-
a/b/Givens.Monoid#empty(). => method empty
1082+
a/b/Givens.Monoid#empty(). => abstract method empty
10831083
a/b/Givens.foo(). => method foo
10841084
a/b/Givens.foo().(A) => implicit val param A
10851085
a/b/Givens.foo().[A] => typeparam A
@@ -1713,7 +1713,7 @@ example/Methods#m19(). => method m19
17131713
example/Methods#m19().(x) => val param x
17141714
example/Methods#m19().(y) => val param y
17151715
example/Methods#m19().(z) => val param z
1716-
local0 => val method x
1716+
local0 => abstract val method x
17171717

17181718
Occurrences:
17191719
[0:8..0:15) => example/
@@ -2009,7 +2009,7 @@ Occurrences => 10 entries
20092009
Symbols:
20102010
example/A# => class A
20112011
example/A#`<init>`(). => primary ctor <init>
2012-
example/A#foo(). => method foo
2012+
example/A#foo(). => abstract method foo
20132013
example/B# => class B
20142014
example/B#`<init>`(). => primary ctor <init>
20152015
example/B#foo(). => method foo
@@ -2399,8 +2399,8 @@ Symbols => 117 entries
23992399
Occurrences => 249 entries
24002400

24012401
Symbols:
2402-
local0 => method k
2403-
local1 => method k
2402+
local0 => abstract method k
2403+
local1 => abstract method k
24042404
local2 => primary ctor <init>
24052405
local3 => method k
24062406
local4 => primary ctor <init>
@@ -2782,9 +2782,9 @@ Occurrences => 57 entries
27822782
Symbols:
27832783
example/ValPattern# => class ValPattern
27842784
example/ValPattern#`<init>`(). => primary ctor <init>
2785-
example/ValPattern#`leftVar_=`(). => method leftVar_=
2786-
example/ValPattern#`number1Var_=`(). => method number1Var_=
2787-
example/ValPattern#`rightVar_=`(). => method rightVar_=
2785+
example/ValPattern#`leftVar_=`(). => var method leftVar_=
2786+
example/ValPattern#`number1Var_=`(). => var method number1Var_=
2787+
example/ValPattern#`rightVar_=`(). => var method rightVar_=
27882788
example/ValPattern#app(). => method app
27892789
example/ValPattern#left. => val method left
27902790
example/ValPattern#leftVar(). => var method leftVar
@@ -2877,22 +2877,22 @@ example/ValUsages. => final object ValUsages
28772877
example/ValUsages.v. => val method v
28782878
example/Vals# => abstract class Vals
28792879
example/Vals#`<init>`(). => primary ctor <init>
2880-
example/Vals#`yam_=`(). => method yam_=
2881-
example/Vals#`yfm_=`(). => final method yfm_=
2882-
example/Vals#`yim_=`(). => method yim_=
2883-
example/Vals#`ym_=`(). => method ym_=
2884-
example/Vals#`yp_=`(). => method yp_=
2880+
example/Vals#`yam_=`(). => var method yam_=
2881+
example/Vals#`yfm_=`(). => final var method yfm_=
2882+
example/Vals#`yim_=`(). => var method yim_=
2883+
example/Vals#`ym_=`(). => var method ym_=
2884+
example/Vals#`yp_=`(). => var method yp_=
28852885
example/Vals#m(). => method m
28862886
example/Vals#p. => val method p
2887-
example/Vals#xam. => val method xam
2887+
example/Vals#xam. => abstract val method xam
28882888
example/Vals#xfm. => final val method xfm
28892889
example/Vals#xim. => implicit val method xim
28902890
example/Vals#xlm. => val method xlm
28912891
example/Vals#xm. => val method xm
28922892
example/Vals#xp. => val method xp
28932893
example/Vals#xzlm. => lazy val method xzlm
28942894
example/Vals#xzm. => lazy val method xzm
2895-
example/Vals#yam(). => var method yam
2895+
example/Vals#yam(). => abstract var method yam
28962896
example/Vals#yfm(). => final var method yfm
28972897
example/Vals#yim(). => implicit var method yim
28982898
example/Vals#ylm(). => var method ylm

0 commit comments

Comments
 (0)