@@ -112,6 +112,8 @@ class ExtractSemanticDB extends Phase:
112
112
case tree : Typed => () // hack for inline code
113
113
case tree => traverse(tree)
114
114
115
+ inline def treeSource (using Tree ): SourceFile = summon[Tree ].source
116
+
115
117
override def traverse (tree : Tree )(using Context ): Unit =
116
118
117
119
tree match
@@ -125,12 +127,12 @@ class ExtractSemanticDB extends Phase:
125
127
if ! excludeDef(tree.pid.symbol)
126
128
&& tree.pid.span.hasLength
127
129
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)
132
134
tree.stats.foreach(traverse)
133
- case tree : NamedDefTree =>
135
+ case ( given tree : NamedDefTree ) =>
134
136
if tree.symbol.isAllOf(ModuleValCreationFlags )
135
137
return
136
138
if ! excludeDef(tree.symbol)
@@ -172,7 +174,7 @@ class ExtractSemanticDB extends Phase:
172
174
case tree =>
173
175
if ! excludeChildren(tree.symbol)
174
176
traverseChildren(tree)
175
- case tree : Template =>
177
+ case ( given tree : Template ) =>
176
178
val ctorSym = tree.constr.symbol
177
179
if ! excludeDef(ctorSym)
178
180
traverseAnnotsOfDefinition(ctorSym)
@@ -192,31 +194,33 @@ class ExtractSemanticDB extends Phase:
192
194
traverse(tree.fun)
193
195
for arg <- tree.args do
194
196
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))
198
201
case _ => traverse(arg)
199
202
case tree : Assign =>
200
203
val qualSym = condOpt(tree.lhs) { case Select (qual, _) if qual.symbol.exists => qual.symbol }
201
204
if ! excludeUse(qualSym, tree.lhs.symbol)
202
205
val lhs = tree.lhs.symbol
203
206
val setter = lhs.matchingSetter.orElse(lhs)
204
207
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)
207
210
traverseChildren(tree.lhs)
208
211
traverse(tree.rhs)
209
- case tree : Ident =>
212
+ case ( given tree : Ident ) =>
210
213
if tree.name != nme.WILDCARD then
211
214
val sym = tree.symbol.adjustIfCtorTyparam
212
215
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
215
219
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 )
217
221
if qualSpan.exists && qualSpan.hasLength then
218
- traverse(tree.qualifier )
219
- case tree : Import =>
222
+ traverse(qual )
223
+ case ( given tree : Import ) =>
220
224
if tree.span.exists && tree.span.hasLength then
221
225
for sel <- tree.selectors do
222
226
val imported = sel.imported.name
@@ -361,10 +365,8 @@ class ExtractSemanticDB extends Phase:
361
365
addSymName(b, sym)
362
366
b.toString
363
367
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))
368
370
val (startLine, startCol) = lineCol(span.start)
369
371
val (endLine, endCol) = lineCol(span.end)
370
372
Some (Range (startLine, startCol, endLine, endCol))
@@ -456,30 +458,30 @@ class ExtractSemanticDB extends Phase:
456
458
private def registerSymbolSimple (sym : Symbol )(using Context ): Unit =
457
459
registerSymbol(sym, symbolName(sym), Set .empty)
458
460
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 =
460
462
val occ = SymbolOccurrence (symbol, range(span), role)
461
463
if ! generated.contains(occ) && occ.symbol.nonEmpty then
462
464
occurrences += occ
463
465
generated += occ
464
466
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 ) =
466
468
if ! excludeUse(qualSym, sym) then
467
469
registerUse(sym, span)
468
470
469
- private def registerUse (sym : Symbol , span : Span )(using Context ): Unit =
471
+ private def registerUse (sym : Symbol , span : Span )(using Tree , Context ): Unit =
470
472
registerUse(symbolName(sym), span)
471
473
472
- private def registerUse (symbol : String , span : Span )(using Context ): Unit =
474
+ private def registerUse (symbol : String , span : Span )(using Tree , Context ): Unit =
473
475
registerOccurrence(symbol, span, SymbolOccurrence .Role .REFERENCE )
474
476
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 ) =
476
478
val symbol = symbolName(sym)
477
479
registerOccurrence(symbol, span, SymbolOccurrence .Role .DEFINITION )
478
480
if ! sym.is(Package )
479
481
registerSymbol(sym, symbol, symkinds)
480
482
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 ]
483
485
val idx = contents.indexOfSlice(sym.name.show, span.start)
484
486
val start = if idx >= 0 then idx else span.start
485
487
Span (start, start + sym.name.show.length, start)
@@ -503,13 +505,13 @@ class ExtractSemanticDB extends Phase:
503
505
}).toMap
504
506
end findGetters
505
507
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
509
511
val start =
510
512
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
513
515
else limit
514
516
Span (start max limit, end)
515
517
0 commit comments