@@ -23,6 +23,7 @@ import scala.annotation.{ threadUnsafe => tu, tailrec }
2323import scala .PartialFunction .condOpt
2424
2525import dotty .tools .dotc .semanticdb .SemanticSymbolBuilder
26+ import dotty .tools .dotc .semanticdb .{TypeOps => TOps }
2627
2728/** Extract symbol references and uses to semanticdb files.
2829 * See https://scalameta.org/docs/semanticdb/specification.html#symbol-1
@@ -50,6 +51,7 @@ class ExtractSemanticDB extends Phase:
5051 /** Extractor of symbol occurrences from trees */
5152 class Extractor extends TreeTraverser :
5253 given builder : SemanticSymbolBuilder = SemanticSymbolBuilder ()
54+ given typeOps : TOps = TOps ()
5355
5456 /** The bodies of synthetic locals */
5557 private val localBodies = mutable.HashMap [Symbol , Tree ]()
@@ -123,61 +125,52 @@ class ExtractSemanticDB extends Phase:
123125
124126 tree match
125127 case tree : PackageDef =>
126- if ! excludeDef(tree.pid.symbol)
127- && tree.pid.span.hasLength then
128- tree.pid match
129- case tree : Select =>
130- registerDefinition(tree.symbol, selectSpan(tree), Set .empty, tree.source)
131- traverse(tree.qualifier)
132- case tree => registerDefinition(tree.symbol, tree.span, Set .empty, tree.source)
133128 tree.stats.foreach(traverse)
129+ if ! excludeDef(tree.pid.symbol) && tree.pid.span.hasLength then
130+ tree.pid match
131+ case tree : Select =>
132+ traverse(tree.qualifier)
133+ registerDefinition(tree.symbol, selectSpan(tree), Set .empty, tree.source)
134+ case tree => registerDefinition(tree.symbol, tree.span, Set .empty, tree.source)
134135 case tree : NamedDefTree =>
135136 if ! tree.symbol.isAllOf(ModuleValCreationFlags ) then
136- if ! excludeDef(tree.symbol)
137- && tree.span.hasLength then
137+ tree match {
138+ case tree : ValDef if tree.symbol.isAllOf(EnumValue ) =>
139+ tree.rhs match
140+ case Block (TypeDef (_, template : Template ) :: _, _) => // simple case with specialised extends clause
141+ template.parents.filter(! _.span.isZeroExtent).foreach(traverse)
142+ case _ => // calls $new
143+ case tree : ValDef if tree.symbol.isSelfSym =>
144+ if tree.tpt.span.hasLength then
145+ traverse(tree.tpt)
146+ case tree : DefDef if tree.symbol.isConstructor => // ignore typeparams for secondary ctors
147+ tree.trailingParamss.foreach(_.foreach(traverse))
148+ traverse(tree.rhs)
149+ case tree : (DefDef | ValDef ) if tree.symbol.isSyntheticWithIdent =>
150+ tree match
151+ case tree : DefDef =>
152+ tree.paramss.foreach(_.foreach(param => registerSymbolSimple(param.symbol)))
153+ case tree : ValDef if tree.symbol.is(Given ) => traverse(tree.tpt)
154+ case _ =>
155+ if ! tree.symbol.isGlobal then
156+ localBodies(tree.symbol) = tree.rhs
157+ // ignore rhs
158+ case PatternValDef (pat, rhs) =>
159+ traverse(rhs)
160+ PatternValDef .collectPats(pat).foreach(traverse)
161+ case tree =>
162+ if ! excludeChildren(tree.symbol) then
163+ traverseChildren(tree)
164+ }
165+ if ! excludeDef(tree.symbol) && tree.span.hasLength then
138166 registerDefinition(tree.symbol, tree.nameSpan, symbolKinds(tree), tree.source)
139167 val privateWithin = tree.symbol.privateWithin
140168 if privateWithin.exists then
141169 registerUseGuarded(None , privateWithin, spanOfSymbol(privateWithin, tree.span, tree.source), tree.source)
142170 else if ! excludeSymbol(tree.symbol) then
143171 registerSymbol(tree.symbol, symbolKinds(tree))
144- tree match
145- case tree : ValDef
146- if tree.symbol.isAllOf(EnumValue ) =>
147- tree.rhs match
148- case Block (TypeDef (_, template : Template ) :: _, _) => // simple case with specialised extends clause
149- template.parents.filter(! _.span.isZeroExtent).foreach(traverse)
150- case _ => // calls $new
151- case tree : ValDef
152- if tree.symbol.isSelfSym =>
153- if tree.tpt.span.hasLength then
154- traverse(tree.tpt)
155- case tree : DefDef
156- if tree.symbol.isConstructor => // ignore typeparams for secondary ctors
157- tree.trailingParamss.foreach(_.foreach(traverse))
158- traverse(tree.rhs)
159- case tree : (DefDef | ValDef )
160- if tree.symbol.isSyntheticWithIdent =>
161- tree match
162- case tree : DefDef =>
163- tree.paramss.foreach(_.foreach(param => registerSymbolSimple(param.symbol)))
164- case tree : ValDef if tree.symbol.is(Given ) => traverse(tree.tpt)
165- case _ =>
166- if ! tree.symbol.isGlobal then
167- localBodies(tree.symbol) = tree.rhs
168- // ignore rhs
169- case PatternValDef (pat, rhs) =>
170- traverse(rhs)
171- PatternValDef .collectPats(pat).foreach(traverse)
172- case tree =>
173- if ! excludeChildren(tree.symbol) then
174- traverseChildren(tree)
175172 case tree : Template =>
176173 val ctorSym = tree.constr.symbol
177- if ! excludeDef(ctorSym) then
178- traverseAnnotsOfDefinition(ctorSym)
179- registerDefinition(ctorSym, tree.constr.nameSpan.startPos, Set .empty, tree.source)
180- ctorParams(tree.constr.termParamss, tree.body)
181174 for parent <- tree.parentsOrDerived if parent.span.hasLength do
182175 traverse(parent)
183176 val selfSpan = tree.self.span
@@ -187,14 +180,18 @@ class ExtractSemanticDB extends Phase:
187180 tree.body.foreachUntilImport(traverse).foreach(traverse) // the first import statement
188181 else
189182 tree.body.foreach(traverse)
183+ if ! excludeDef(ctorSym) then
184+ traverseAnnotsOfDefinition(ctorSym)
185+ ctorParams(tree.constr.termParamss, tree.body)
186+ registerDefinition(ctorSym, tree.constr.nameSpan.startPos, Set .empty, tree.source)
190187 case tree : Apply =>
191188 @ tu lazy val genParamSymbol : Name => String = tree.fun.symbol.funParamSymbol
192189 traverse(tree.fun)
193190 for arg <- tree.args do
194191 arg match
195192 case tree @ NamedArg (name, arg) =>
196- registerUse(genParamSymbol(name), tree.span.startPos.withEnd(tree.span.start + name.toString.length), tree.source)
197193 traverse(localBodies.get(arg.symbol).getOrElse(arg))
194+ registerUse(genParamSymbol(name), tree.span.startPos.withEnd(tree.span.start + name.toString.length), tree.source)
198195 case _ => traverse(arg)
199196 case tree : Assign =>
200197 val qualSym = condOpt(tree.lhs) { case Select (qual, _) if qual.symbol.exists => qual.symbol }
@@ -214,19 +211,19 @@ class ExtractSemanticDB extends Phase:
214211 val qual = tree.qualifier
215212 val qualSpan = qual.span
216213 val sym = tree.symbol.adjustIfCtorTyparam
217- registerUseGuarded(qual.symbol.ifExists, sym, selectSpan(tree), tree.source)
218214 if qualSpan.exists && qualSpan.hasLength then
219215 traverse(qual)
216+ registerUseGuarded(qual.symbol.ifExists, sym, selectSpan(tree), tree.source)
220217 case tree : Import =>
221218 if tree.span.exists && tree.span.hasLength then
219+ traverseChildren(tree)
222220 for sel <- tree.selectors do
223221 val imported = sel.imported.name
224222 if imported != nme.WILDCARD then
225223 for alt <- tree.expr.tpe.member(imported).alternatives do
226224 registerUseGuarded(None , alt.symbol, sel.imported.span, tree.source)
227225 if (alt.symbol.companionClass.exists)
228226 registerUseGuarded(None , alt.symbol.companionClass, sel.imported.span, tree.source)
229- traverseChildren(tree)
230227 case tree : Inlined =>
231228 traverse(tree.call)
232229 case _ =>
@@ -416,13 +413,13 @@ class ExtractSemanticDB extends Phase:
416413 vparams <- vparamss
417414 vparam <- vparams
418415 do
416+ traverse(vparam.tpt)
419417 if ! excludeSymbol(vparam.symbol) then
420418 traverseAnnotsOfDefinition(vparam.symbol)
421419 val symkinds =
422420 getters.get(vparam.name).fold(SymbolKind .emptySet)(getter =>
423421 if getter.mods.is(Mutable ) then SymbolKind .VarSet else SymbolKind .ValSet )
424422 registerSymbol(vparam.symbol, symkinds)
425- traverse(vparam.tpt)
426423
427424object ExtractSemanticDB :
428425 import java .nio .file .Path
0 commit comments