Skip to content

Commit 53ae82f

Browse files
committed
pass Tree in context, source->treeSource
1 parent 3c167a7 commit 53ae82f

File tree

6 files changed

+79
-71
lines changed

6 files changed

+79
-71
lines changed

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

Lines changed: 35 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,8 @@ class ExtractSemanticDB extends Phase:
112112
case tree: Typed => () // hack for inline code
113113
case tree => traverse(tree)
114114

115+
inline def treeSource(using Tree): SourceFile = summon[Tree].source
116+
115117
override def traverse(tree: Tree)(using Context): Unit =
116118

117119
tree match
@@ -125,12 +127,12 @@ class ExtractSemanticDB extends Phase:
125127
if !excludeDef(tree.pid.symbol)
126128
&& tree.pid.span.hasLength
127129
tree.pid match
128-
case tree @ Select(qual, name) =>
129-
registerDefinition(tree.symbol, adjustSpanToName(tree.span, qual.span, name, tree.source), Set.empty)
130-
traverse(qual)
131-
case tree => registerDefinition(tree.symbol, tree.span, Set.empty)
130+
case (given tree: Select) =>
131+
registerDefinition(tree.symbol, selectSpan, Set.empty)
132+
traverse(tree.qualifier)
133+
case (given tree: Tree) => registerDefinition(tree.symbol, tree.span, Set.empty)
132134
tree.stats.foreach(traverse)
133-
case tree: NamedDefTree =>
135+
case (given tree: NamedDefTree) =>
134136
if tree.symbol.isAllOf(ModuleValCreationFlags)
135137
return
136138
if !excludeDef(tree.symbol)
@@ -172,7 +174,7 @@ class ExtractSemanticDB extends Phase:
172174
case tree =>
173175
if !excludeChildren(tree.symbol)
174176
traverseChildren(tree)
175-
case tree: Template =>
177+
case (given tree: Template) =>
176178
val ctorSym = tree.constr.symbol
177179
if !excludeDef(ctorSym)
178180
traverseAnnotsOfDefinition(ctorSym)
@@ -192,31 +194,33 @@ class ExtractSemanticDB extends Phase:
192194
traverse(tree.fun)
193195
for arg <- tree.args do
194196
arg match
195-
case arg @ NamedArg(name, value) =>
196-
registerUse(genParamSymbol(name), arg.span.startPos.withEnd(arg.span.start + name.toString.length))
197-
traverse(localBodies.get(value.symbol).getOrElse(value))
197+
case (given tree: NamedArg) =>
198+
val NamedArg(name, arg) = tree
199+
registerUse(genParamSymbol(name), tree.span.startPos.withEnd(tree.span.start + name.toString.length))
200+
traverse(localBodies.get(arg.symbol).getOrElse(arg))
198201
case _ => traverse(arg)
199202
case tree: Assign =>
200203
val qualSym = condOpt(tree.lhs) { case Select(qual, _) if qual.symbol.exists => qual.symbol }
201204
if !excludeUse(qualSym, tree.lhs.symbol)
202205
val lhs = tree.lhs.symbol
203206
val setter = lhs.matchingSetter.orElse(lhs)
204207
tree.lhs match
205-
case tree @ Select(qual, name) => registerUse(setter, adjustSpanToName(tree.span, qual.span, name, tree.source))
206-
case tree => registerUse(setter, tree.span)
208+
case (given tree: Select) => registerUse(setter, selectSpan)
209+
case (given tree: Tree) => registerUse(setter, tree.span)
207210
traverseChildren(tree.lhs)
208211
traverse(tree.rhs)
209-
case tree: Ident =>
212+
case (given tree: Ident) =>
210213
if tree.name != nme.WILDCARD then
211214
val sym = tree.symbol.adjustIfCtorTyparam
212215
registerUseGuarded(None, sym, tree.span)
213-
case tree: Select =>
214-
val qualSpan = tree.qualifier.span
216+
case (given tree: Select) =>
217+
val qual = tree.qualifier
218+
val qualSpan = qual.span
215219
val sym = tree.symbol.adjustIfCtorTyparam
216-
registerUseGuarded(tree.qualifier.symbol.ifExists, sym, adjustSpanToName(tree.span, qualSpan, tree.name, tree.source))
220+
registerUseGuarded(qual.symbol.ifExists, sym, selectSpan)
217221
if qualSpan.exists && qualSpan.hasLength then
218-
traverse(tree.qualifier)
219-
case tree: Import =>
222+
traverse(qual)
223+
case (given tree: Import) =>
220224
if tree.span.exists && tree.span.hasLength then
221225
for sel <- tree.selectors do
222226
val imported = sel.imported.name
@@ -361,10 +365,8 @@ class ExtractSemanticDB extends Phase:
361365
addSymName(b, sym)
362366
b.toString
363367

364-
inline private def source(using Context) = ctx.compilationUnit.source
365-
366-
private def range(span: Span)(using Context): Option[Range] =
367-
def lineCol(offset: Int) = (source.offsetToLine(offset), source.column(offset))
368+
private def range(span: Span)(using Tree, Context): Option[Range] =
369+
def lineCol(offset: Int) = (treeSource.offsetToLine(offset), treeSource.column(offset))
368370
val (startLine, startCol) = lineCol(span.start)
369371
val (endLine, endCol) = lineCol(span.end)
370372
Some(Range(startLine, startCol, endLine, endCol))
@@ -456,30 +458,30 @@ class ExtractSemanticDB extends Phase:
456458
private def registerSymbolSimple(sym: Symbol)(using Context): Unit =
457459
registerSymbol(sym, symbolName(sym), Set.empty)
458460

459-
private def registerOccurrence(symbol: String, span: Span, role: SymbolOccurrence.Role)(using Context): Unit =
461+
private def registerOccurrence(symbol: String, span: Span, role: SymbolOccurrence.Role)(using Tree, Context): Unit =
460462
val occ = SymbolOccurrence(symbol, range(span), role)
461463
if !generated.contains(occ) && occ.symbol.nonEmpty then
462464
occurrences += occ
463465
generated += occ
464466

465-
private def registerUseGuarded(qualSym: Option[Symbol], sym: Symbol, span: Span)(using Context) =
467+
private def registerUseGuarded(qualSym: Option[Symbol], sym: Symbol, span: Span)(using Tree, Context) =
466468
if !excludeUse(qualSym, sym) then
467469
registerUse(sym, span)
468470

469-
private def registerUse(sym: Symbol, span: Span)(using Context): Unit =
471+
private def registerUse(sym: Symbol, span: Span)(using Tree, Context): Unit =
470472
registerUse(symbolName(sym), span)
471473

472-
private def registerUse(symbol: String, span: Span)(using Context): Unit =
474+
private def registerUse(symbol: String, span: Span)(using Tree, Context): Unit =
473475
registerOccurrence(symbol, span, SymbolOccurrence.Role.REFERENCE)
474476

475-
private def registerDefinition(sym: Symbol, span: Span, symkinds: Set[SymbolKind])(using Context) =
477+
private def registerDefinition(sym: Symbol, span: Span, symkinds: Set[SymbolKind])(using Tree, Context) =
476478
val symbol = symbolName(sym)
477479
registerOccurrence(symbol, span, SymbolOccurrence.Role.DEFINITION)
478480
if !sym.is(Package)
479481
registerSymbol(sym, symbol, symkinds)
480482

481-
private def spanOfSymbol(sym: Symbol, span: Span)(using Context): Span =
482-
val contents = if source.exists then source.content() else Array.empty[Char]
483+
private def spanOfSymbol(sym: Symbol, span: Span)(using Tree, Context): Span =
484+
val contents = if treeSource.exists then treeSource.content() else Array.empty[Char]
483485
val idx = contents.indexOfSlice(sym.name.show, span.start)
484486
val start = if idx >= 0 then idx else span.start
485487
Span(start, start + sym.name.show.length, start)
@@ -503,13 +505,13 @@ class ExtractSemanticDB extends Phase:
503505
}).toMap
504506
end findGetters
505507

506-
private def adjustSpanToName(span: Span, qualSpan: Span, name: Name, source: SourceFile) =
507-
val end = span.end
508-
val limit = qualSpan.end
508+
private def selectSpan(using tree: Select) =
509+
val end = tree.span.end
510+
val limit = tree.qualifier.span.end
509511
val start =
510512
if limit < end then
511-
val len = name.toString.length
512-
if source.content()(end - 1) == '`' then end - len - 2 else end - len
513+
val len = tree.name.toString.length
514+
if treeSource.content()(end - 1) == '`' then end - len - 2 else end - len
513515
else limit
514516
Span(start max limit, end)
515517

tests/semanticdb/expect/MethodUsages.expect.scala

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,8 @@ class MethodUsages/*<-example::MethodUsages#*/ {
2929
m/*->example::MethodUsages#m.*/.m18/*->example::Methods#m18.*/.m/*->example::Methods#m17.m().*/()
3030
m/*->example::MethodUsages#m.*/.m18/*->example::Methods#m18().*/(1)
3131
m/*->example::MethodUsages#m.*/.m18/*->example::Methods#m18(+1).*/("")
32-
}
33-
34-
object MethodUsages/*<-example::MethodUsages.*/ {
35-
var x/*<-example::MethodUsages.x().*/: Int/*->scala::Int#*/ = 1
36-
def x/*<-example::MethodUsages.x(+1).*/(n/*<-example::MethodUsages.x(+1).(n)*/: String/*->scala::Predef.String#*/): Int/*->scala::Int#*/ = /*->scala::Predef.augmentString().*/n/*->example::MethodUsages.x(+1).(n)*/.toInt/*->scala::collection::StringOps#toInt().*/
37-
def foo/*<-example::MethodUsages.foo().*/: Int/*->scala::Int#*/ = x/*->example::MethodUsages.x().*/ +/*->scala::Int#`+`(+4).*/ x/*->example::MethodUsages.x(+1).*/("22")
32+
m/*->example::MethodUsages#m.*/.m19/*->example::Methods#m19().*/(1,2)(3)
33+
m/*->example::MethodUsages#m.*/.m20/*->example::Methods#m20().*/(1)
34+
m/*->example::MethodUsages#m.*/.m20/*->example::Methods#m20(+1).*/("")
35+
m/*->example::MethodUsages#m.*/.m20/*->example::Methods#m20(+2).*/.m/*->example::Methods#m17.m().*/()
3836
}

tests/semanticdb/expect/MethodUsages.scala

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,8 @@ class MethodUsages {
2929
m.m18.m()
3030
m.m18(1)
3131
m.m18("")
32-
}
33-
34-
object MethodUsages {
35-
var x: Int = 1
36-
def x(n: String): Int = n.toInt
37-
def foo: Int = x + x("22")
32+
m.m19(1,2)(3)
33+
m.m20(1)
34+
m.m20("")
35+
m.m20.m()
3836
}

tests/semanticdb/expect/Methods.expect.scala

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,4 +34,7 @@ class Methods/*<-example::Methods#*/[T/*<-example::Methods#[T]*/] {
3434
def m18/*<-example::Methods#m18().*/(a/*<-example::Methods#m18().(a)*/: Int/*->scala::Int#*/) = ???/*->scala::Predef.`???`().*/
3535
def m18/*<-example::Methods#m18(+1).*/(b/*<-example::Methods#m18(+1).(b)*/: String/*->scala::Predef.String#*/) = ???/*->scala::Predef.`???`().*/
3636
def m19/*<-example::Methods#m19().*/(x/*<-example::Methods#m19().(x)*//*<-example::Methods#m19$default$3().(x)*/: Int/*->scala::Int#*/, y/*<-example::Methods#m19().(y)*//*<-example::Methods#m19$default$3().(y)*/: Int/*->scala::Int#*/ = 2)(z/*<-example::Methods#m19().(z)*/: Int/*->scala::Int#*/ = 3) = ???/*->scala::Predef.`???`().*/
37+
def m20/*<-example::Methods#m20().*/(a/*<-example::Methods#m20().(a)*/: Int/*->scala::Int#*/) = ???/*->scala::Predef.`???`().*/
38+
def m20/*<-example::Methods#m20(+1).*/(b/*<-example::Methods#m20(+1).(b)*/: String/*->scala::Predef.String#*/) = ???/*->scala::Predef.`???`().*/
39+
var m20/*<-example::Methods#m20(+2).*/ = m17/*->example::Methods#m17.*/
3740
}

tests/semanticdb/expect/Methods.scala

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,4 +34,7 @@ class Methods[T] {
3434
def m18(a: Int) = ???
3535
def m18(b: String) = ???
3636
def m19(x: Int, y: Int = 2)(z: Int = 3) = ???
37+
def m20(a: Int) = ???
38+
def m20(b: String) = ???
39+
var m20 = m17
3740
}

tests/semanticdb/metac.expect

Lines changed: 30 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1707,20 +1707,13 @@ Schema => SemanticDB v4
17071707
Uri => MethodUsages.scala
17081708
Text => empty
17091709
Language => Scala
1710-
Symbols => 10 entries
1711-
Occurrences => 91 entries
1710+
Symbols => 3 entries
1711+
Occurrences => 85 entries
17121712

17131713
Symbols:
17141714
example/MethodUsages# => class MethodUsages
17151715
example/MethodUsages#`<init>`(). => primary ctor <init>
17161716
example/MethodUsages#m. => val method m
1717-
example/MethodUsages. => final object MethodUsages
1718-
example/MethodUsages.`x_=`(). => var method x_=
1719-
example/MethodUsages.`x_=`().(x$1) => param x$1
1720-
example/MethodUsages.foo(). => method foo
1721-
example/MethodUsages.x(). => var method x
1722-
example/MethodUsages.x(+1). => method x
1723-
example/MethodUsages.x(+1).(n) => param n
17241717

17251718
Occurrences:
17261719
[0:8..0:15): example <- example/
@@ -1799,21 +1792,15 @@ Occurrences:
17991792
[29:4..29:7): m18 -> example/Methods#m18().
18001793
[30:2..30:3): m -> example/MethodUsages#m.
18011794
[30:4..30:7): m18 -> example/Methods#m18(+1).
1802-
[33:7..33:19): MethodUsages <- example/MethodUsages.
1803-
[34:6..34:7): x <- example/MethodUsages.x().
1804-
[34:9..34:12): Int -> scala/Int#
1805-
[35:6..35:7): x <- example/MethodUsages.x(+1).
1806-
[35:8..35:9): n <- example/MethodUsages.x(+1).(n)
1807-
[35:11..35:17): String -> scala/Predef.String#
1808-
[35:20..35:23): Int -> scala/Int#
1809-
[35:26..35:26): -> scala/Predef.augmentString().
1810-
[35:26..35:27): n -> example/MethodUsages.x(+1).(n)
1811-
[35:28..35:33): toInt -> scala/collection/StringOps#toInt().
1812-
[36:6..36:9): foo <- example/MethodUsages.foo().
1813-
[36:11..36:14): Int -> scala/Int#
1814-
[36:17..36:18): x -> example/MethodUsages.x().
1815-
[36:19..36:20): + -> scala/Int#`+`(+4).
1816-
[36:21..36:22): x -> example/MethodUsages.x(+1).
1795+
[31:2..31:3): m -> example/MethodUsages#m.
1796+
[31:4..31:7): m19 -> example/Methods#m19().
1797+
[32:2..32:3): m -> example/MethodUsages#m.
1798+
[32:4..32:7): m20 -> example/Methods#m20().
1799+
[33:2..33:3): m -> example/MethodUsages#m.
1800+
[33:4..33:7): m20 -> example/Methods#m20(+1).
1801+
[34:2..34:3): m -> example/MethodUsages#m.
1802+
[34:4..34:7): m20 -> example/Methods#m20(+2).
1803+
[34:8..34:9): m -> example/Methods#m17.m().
18171804

18181805
expect/Methods.scala
18191806
--------------------
@@ -1823,8 +1810,8 @@ Schema => SemanticDB v4
18231810
Uri => Methods.scala
18241811
Text => empty
18251812
Language => Scala
1826-
Symbols => 70 entries
1827-
Occurrences => 139 entries
1813+
Symbols => 77 entries
1814+
Occurrences => 149 entries
18281815

18291816
Symbols:
18301817
example/Methods# => class Methods
@@ -1838,6 +1825,8 @@ example/Methods#`<init>`(). => primary ctor <init>
18381825
example/Methods#`m8().`(). => method m8().
18391826
example/Methods#`m9().`# => class m9().
18401827
example/Methods#`m9().`#`<init>`(). => primary ctor <init>
1828+
example/Methods#`m20_=`(). => var method m20_=
1829+
example/Methods#`m20_=`().(x$1) => param x$1
18411830
example/Methods#m1(). => method m1
18421831
example/Methods#m2(). => method m2
18431832
example/Methods#m3(). => method m3
@@ -1896,6 +1885,11 @@ example/Methods#m19(). => method m19
18961885
example/Methods#m19().(x) => param x
18971886
example/Methods#m19().(y) => param y
18981887
example/Methods#m19().(z) => param z
1888+
example/Methods#m20(). => method m20
1889+
example/Methods#m20().(a) => param a
1890+
example/Methods#m20(+1). => method m20
1891+
example/Methods#m20(+1).(b) => param b
1892+
example/Methods#m20(+2). => var method m20
18991893
local0 => abstract val method x
19001894

19011895
Occurrences:
@@ -2038,6 +2032,16 @@ Occurrences:
20382032
[35:30..35:31): z <- example/Methods#m19().(z)
20392033
[35:33..35:36): Int -> scala/Int#
20402034
[35:44..35:47): ??? -> scala/Predef.`???`().
2035+
[36:6..36:9): m20 <- example/Methods#m20().
2036+
[36:10..36:11): a <- example/Methods#m20().(a)
2037+
[36:13..36:16): Int -> scala/Int#
2038+
[36:20..36:23): ??? -> scala/Predef.`???`().
2039+
[37:6..37:9): m20 <- example/Methods#m20(+1).
2040+
[37:10..37:11): b <- example/Methods#m20(+1).(b)
2041+
[37:13..37:19): String -> scala/Predef.String#
2042+
[37:23..37:26): ??? -> scala/Predef.`???`().
2043+
[38:6..38:9): m20 <- example/Methods#m20(+2).
2044+
[38:12..38:15): m17 -> example/Methods#m17.
20412045

20422046
expect/NamedApplyBlock.scala
20432047
----------------------------

0 commit comments

Comments
 (0)