Skip to content

Commit fef188c

Browse files
committed
better properties for symbols
1 parent 83ae6da commit fef188c

File tree

2 files changed

+33
-31
lines changed

2 files changed

+33
-31
lines changed

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

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ class ExtractSemanticDB extends Phase with
4242
val unit = ctx.compilationUnit
4343
val extract = Extractor()
4444
extract.traverse(unit.tpdTree)
45-
ExtractSemanticDB.write(unit.source, extract.occurrences.toList, extract.symbols.toList)
45+
ExtractSemanticDB.write(unit.source, extract.occurrences.toList, extract.symbolInfos.toList)
4646

4747
/** Extractor of symbol occurrences from trees */
4848
class Extractor extends TreeTraverser with
@@ -60,7 +60,10 @@ class ExtractSemanticDB extends Phase with
6060
val occurrences = new mutable.ListBuffer[SymbolOccurrence]()
6161

6262
/** The extracted symbol infos */
63-
val symbols = new mutable.HashSet[SymbolInformation]()
63+
val symbolInfos = new mutable.HashSet[SymbolInformation]()
64+
65+
/** A cache of localN names */
66+
val localNames = new mutable.HashSet[String]()
6467

6568
/** The symbol occurrences generated so far, as a set */
6669
private val generated = new mutable.HashSet[SymbolOccurrence]
@@ -76,7 +79,7 @@ class ExtractSemanticDB extends Phase with
7679
if isJavaIdent(str) then b append str
7780
else b append '`' append str append '`'
7881

79-
/** Is symbol global? Non-global symbols get localX names */
82+
/** Is symbol global? Non-global symbols get localNå names */
8083
def isGlobal(sym: Symbol): Boolean =
8184
sym.is(Package)
8285
|| !sym.isSelfSym && (sym.is(Param) || sym.owner.isClass) && isGlobal(sym.owner)
@@ -265,7 +268,11 @@ class ExtractSemanticDB extends Phase with
265268
)
266269

267270
private def registerSymbol(sym: Symbol, symbolName: String, symkinds: Set[SymbolKind])(given Context): Unit =
268-
symbols += symbolInfo(sym, symbolName, symkinds)
271+
val isLocal = symbolName.isLocal
272+
if !isLocal || !localNames.contains(symbolName)
273+
if isLocal
274+
localNames += symbolName
275+
symbolInfos += symbolInfo(sym, symbolName, symkinds)
269276

270277
private def registerOccurrence(symbol: String, span: Span, role: SymbolOccurrence.Role)(given Context): Unit =
271278
val occ = SymbolOccurrence(symbol, range(span), role)
@@ -351,7 +358,7 @@ class ExtractSemanticDB extends Phase with
351358
val symkinds = mutable.HashSet.empty[SymbolKind]
352359
tree match
353360
case tree: ValDef =>
354-
if !tree.symbol.owner.is(Method)
361+
if !tree.symbol.is(Param)
355362
symkinds += (if tree.mods is Mutable then SymbolKind.Var else SymbolKind.Val)
356363
if tree.rhs.isEmpty && !tree.symbol.isOneOf(TermParam | CaseAccessor | ParamAccessor)
357364
symkinds += SymbolKind.Abstract
@@ -360,7 +367,8 @@ class ExtractSemanticDB extends Phase with
360367
symkinds += SymbolKind.Setter
361368
else if tree.rhs.isEmpty
362369
symkinds += SymbolKind.Abstract
363-
case tree: Bind => symkinds += SymbolKind.Val
370+
case tree: Bind =>
371+
symkinds += SymbolKind.Val
364372
case _ =>
365373
symkinds.toSet
366374

@@ -493,7 +501,7 @@ object ExtractSemanticDB with
493501

494502
val name: String = "extractSemanticDB"
495503

496-
def write(source: SourceFile, occurrences: List[SymbolOccurrence], symbols: List[SymbolInformation])(given ctx: Context): Unit =
504+
def write(source: SourceFile, occurrences: List[SymbolOccurrence], symbolInfos: List[SymbolInformation])(given ctx: Context): Unit =
497505
def absolutePath(path: Path): Path = path.toAbsolutePath.normalize
498506
val sourcePath = absolutePath(source.file.jpath)
499507
val sourceRoot = absolutePath(Paths.get(ctx.settings.sourceroot.value))
@@ -516,7 +524,7 @@ object ExtractSemanticDB with
516524
uri = relPath.toString,
517525
text = "",
518526
md5 = internal.MD5.compute(String(source.content)),
519-
symbols = symbols,
527+
symbols = symbolInfos,
520528
occurrences = occurrences
521529
)
522530
val docs = TextDocuments(List(doc))

tests/semanticdb/metac.expect

Lines changed: 17 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,7 @@ annot/M.m().[TT] => typeparam TT
219219
annot/T# => trait T
220220
annot/T#`<init>`(). => primary ctor <init>
221221
local0 => selfparam self
222-
local1 => local local
222+
local1 => val local local
223223

224224
Occurrences:
225225
[0:8..0:13): annot <- annot/
@@ -412,7 +412,7 @@ classes/N.anonFun. => val method anonFun
412412
local0 => primary ctor <init>
413413
local1 => val method local
414414
local2 => param i
415-
local3 => local local
415+
local3 => val local local
416416

417417
Occurrences:
418418
[0:8..0:15): classes <- classes/
@@ -1125,16 +1125,14 @@ Schema => SemanticDB v4
11251125
Uri => ForComprehension.scala
11261126
Text => empty
11271127
Language => Scala
1128-
Symbols => 16 entries
1128+
Symbols => 13 entries
11291129
Occurrences => 72 entries
11301130

11311131
Symbols:
11321132
example/ForComprehension# => class ForComprehension
11331133
example/ForComprehension#`<init>`(). => primary ctor <init>
11341134
local0 => param a
1135-
local1 => val local b
11361135
local1 => param b
1137-
local2 => local c
11381136
local2 => val local c
11391137
local3 => param x$1
11401138
local4 => param a
@@ -1143,7 +1141,6 @@ local6 => param x$1
11431141
local7 => val local c
11441142
local8 => val local d
11451143
local9 => val local e
1146-
local9 => local e
11471144
local10 => param f
11481145

11491146
Occurrences:
@@ -2089,9 +2086,9 @@ example/NamedApplyBlockMethods.foo().(b) => param b
20892086
example/NamedApplyBlockMethods.foo().(c) => param c
20902087
example/NamedApplyBlockMethods.local. => val method local
20912088
example/NamedApplyBlockMethods.recursive(). => method recursive
2092-
local0 => local b$1
2093-
local1 => local c$1
2094-
local2 => local b$3
2089+
local0 => val local b$1
2090+
local1 => val local c$1
2091+
local2 => val local b$3
20952092
local3 => val local head$1
20962093

20972094
Occurrences:
@@ -3018,7 +3015,7 @@ Schema => SemanticDB v4
30183015
Uri => ValPattern.scala
30193016
Text => empty
30203017
Language => Scala
3021-
Symbols => 25 entries
3018+
Symbols => 23 entries
30223019
Occurrences => 57 entries
30233020

30243021
Symbols:
@@ -3039,14 +3036,12 @@ example/ValPattern#right. => val method right
30393036
example/ValPattern#rightVar(). => var method rightVar
30403037
local0 => val local number1
30413038
local1 => val local number1Var
3042-
local2 => local left
3043-
local3 => local right
3044-
local4 => local number1
3039+
local2 => val local left
3040+
local3 => val local right
30453041
local4 => val local number1
3046-
local5 => local leftVar
3047-
local6 => local rightVar
3048-
local7 => local number1Var
3049-
local7 => val local number1Var
3042+
local5 => var local leftVar
3043+
local6 => var local rightVar
3044+
local7 => var local number1Var
30503045

30513046
Occurrences:
30523047
[0:8..0:15): example <- example/
@@ -3152,11 +3147,11 @@ example/Vals#yim(). => implicit var method yim
31523147
example/Vals#ylm(). => var method ylm
31533148
example/Vals#ym(). => var method ym
31543149
example/Vals#yp(). => var method yp
3155-
local0 => local xl
3156-
local1 => lazy local xzl
3157-
local2 => implicit local xil
3158-
local3 => local yl
3159-
local4 => implicit local yil
3150+
local0 => val local xl
3151+
local1 => lazy val local xzl
3152+
local2 => implicit val local xil
3153+
local3 => var local yl
3154+
local4 => implicit var local yil
31603155

31613156
Occurrences:
31623157
[0:8..0:15): example <- example/
@@ -3459,4 +3454,3 @@ Occurrences:
34593454
[2:46..2:47): z -> _empty_/toplevel$package.combine(+1).(z)
34603455
[3:4..3:11): combine <- _empty_/toplevel$package.combine(+2).
34613456
[4:4..4:7): foo <- _empty_/toplevel$package.foo().
3462-

0 commit comments

Comments
 (0)