Skip to content

Commit a121e35

Browse files
committed
fix <init> symbols and add method to distinguish compiler generated constructs
1 parent deafdfa commit a121e35

File tree

5 files changed

+116
-49
lines changed

5 files changed

+116
-49
lines changed

compiler/src/dotty/tools/dotc/tastyreflect/TypeOrBoundsTreesOpsImpl.scala

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ trait TypeOrBoundsTreesOpsImpl extends scala.tasty.reflect.TypeOrBoundsTreeOps w
2020
def pos(implicit ctx: Context): Position = tpt.pos
2121
def symbol(implicit ctx: Context): Symbol = tpt.symbol
2222
def tpe(implicit ctx: Context): Type = tpt.tpe.stripTypeVar
23-
def symbol(implicit ctx: Context): Symbol = tpt.symbol
2423
}
2524

2625
object IsTypeTree extends IsTypeTreeExtractor {

semanticdb/input/src/main/scala/example/Example.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,4 @@ class Example {
1414
x +
1515
y
1616
)
17-
}
17+
}

semanticdb/input/src/main/scala/example/Example2.scala

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package example
33
import scala.concurrent.Future
44

55
object OExample { self =>
6-
new scala.collection.mutable.Stack[Int]()
76
def main(args: Array[String]): Unit = {
87
println(1)
98
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
import scala.util.control.NonFatal
1+
//import scala.util.control.NonFatal

semanticdb/src/dotty/semanticdb/SemanticdbConsumer.scala

Lines changed: 114 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,44 @@ class SemanticdbConsumer extends TastyConsumer {
4545

4646
final def apply(reflect: Reflection)(root: reflect.Tree): Unit = {
4747
import reflect._
48+
49+
object ChildTraverser extends TreeTraverser {
50+
var depth: Int = 0
51+
var children: List[Tree] = Nil
52+
override def traverseTree(tree: Tree)(implicit ctx: Context): Unit = {
53+
if (depth == 0) {
54+
depth = depth + 1
55+
super.traverseTree(tree)
56+
depth = depth - 1
57+
} else {
58+
children = tree :: children
59+
}
60+
}
61+
def getChildren(tree: Tree)(implicit ctx: Context): List[Position] = {
62+
children = Nil
63+
depth = 0
64+
traverseTree(tree)(ctx)
65+
return children.map(_.pos)
66+
}
67+
}
68+
4869
object Traverser extends TreeTraverser {
4970
val symbolsCache: HashMap[tasty.Symbol, String] = HashMap()
5071
val symbolPathsDisimbiguator: HashMap[String, Int] = HashMap()
72+
implicit class TreeExtender(tree: Tree) {
73+
def isUserCreated: Boolean = {
74+
val children: List[Position] =
75+
ChildTraverser.getChildren(tree)(tasty.rootContext)
76+
return !((tree.pos.exists && tree.pos.start == tree.pos.end && children == Nil) || children
77+
.exists(_ == tree.pos))
78+
}
79+
}
80+
81+
implicit class TypeTreeExtender(tree: TypeTree) {
82+
def isUserCreated: Boolean = {
83+
return !(tree.pos.exists && tree.pos.start == tree.pos.end)
84+
}
85+
}
5186

5287
implicit class SymbolExtender(symbol: Symbol) {
5388
def isTypeParameter: Boolean = symbol match {
@@ -57,17 +92,17 @@ class SemanticdbConsumer extends TastyConsumer {
5792

5893
def isType: Boolean = symbol match {
5994
case IsTypeSymbol(_) => true
60-
case _ => false
95+
case _ => false
6196
}
6297

6398
def isMethod: Boolean = symbol match {
6499
case IsDefSymbol(_) => true
65-
case _ => false
100+
case _ => false
66101
}
67102

68103
def isPackage: Boolean = symbol match {
69104
case IsPackageSymbol(_) => true
70-
case _ => false
105+
case _ => false
71106
}
72107

73108
def isObject: Boolean = symbol.flags.isObject
@@ -106,23 +141,24 @@ class SemanticdbConsumer extends TastyConsumer {
106141
} else {
107142
val previous_symbol = iterateParent(symbol.owner)
108143
val next_atom =
109-
if (symbol.isPackage) {
110-
d.Package(symbol.name)
111-
} else if (symbol.isObject) {
112-
d.Term(symbol.companionModule.name)
113-
} else if (symbol.isMethod) {
114-
d.Method(symbol.name, disimbiguate(previous_symbol + symbol.name))
115-
} else if (symbol.isValueParameter) {
116-
d.Parameter(symbol.name)
117-
} else if (symbol.isTypeParameter) {
118-
d.TypeParameter(symbol.name)
119-
} else if (symbol.isType || symbol.isTrait) {
120-
//println(symbol.name, symbol.companionClass.name, symbol.companionModule.name, symbol.flags.toString)
121-
122-
d.Type(symbol.name)
123-
} else {
124-
d.Term(symbol.name)
125-
}
144+
if (symbol.isPackage) {
145+
d.Package(symbol.name)
146+
} else if (symbol.isObject) {
147+
d.Term(symbol.companionModule.name)
148+
} else if (symbol.isMethod) {
149+
d.Method(symbol.name,
150+
disimbiguate(previous_symbol + symbol.name))
151+
} else if (symbol.isValueParameter) {
152+
d.Parameter(symbol.name)
153+
} else if (symbol.isTypeParameter) {
154+
d.TypeParameter(symbol.name)
155+
} else if (symbol.isType || symbol.isTrait) {
156+
//println(symbol.name, symbol.companionClass.name, symbol.companionModule.name, symbol.flags.toString)
157+
158+
d.Type(symbol.name)
159+
} else {
160+
d.Term(symbol.name)
161+
}
126162

127163
Symbols.Global(previous_symbol, next_atom)
128164
}
@@ -134,10 +170,8 @@ class SemanticdbConsumer extends TastyConsumer {
134170
def addOccurence(symbol: Symbol,
135171
type_symbol: s.SymbolOccurrence.Role,
136172
range: s.Range): Unit = {
137-
//if (symbolsCache.contains(symbol)) return
138-
139173
val symbol_path = iterateParent(symbol)
140-
if (symbol_path == "" || symbol.name == "<init>") return
174+
if (symbol_path == "") return
141175

142176
occurrences =
143177
occurrences :+
@@ -146,12 +180,29 @@ class SemanticdbConsumer extends TastyConsumer {
146180
symbol_path,
147181
type_symbol
148182
)
183+
184+
}
185+
186+
def addOccurenceTree(tree: Tree,
187+
type_symbol: s.SymbolOccurrence.Role,
188+
range: s.Range,
189+
force_add: Boolean = false): Unit = {
190+
if (tree.isUserCreated || force_add) {
191+
addOccurence(tree.symbol, type_symbol, range)
192+
}
193+
}
194+
def addOccurenceTypeTree(typetree: TypeTree,
195+
type_symbol: s.SymbolOccurrence.Role,
196+
range: s.Range): Unit = {
197+
if (typetree.isUserCreated) {
198+
addOccurence(typetree.symbol, type_symbol, range)
199+
}
149200
}
150201

151202
def range(tree: Tree, pos: Position, name: String): s.Range = {
152203
val offset = tree match {
153-
case IsPackageClause(tree) => "package ".length
154-
case _ => 0
204+
case IsPackageClause(tree) => "package ".length
205+
case _ => 0
155206
}
156207

157208
val range_end_column =
@@ -161,7 +212,10 @@ class SemanticdbConsumer extends TastyConsumer {
161212
pos.startColumn + name.length
162213
}
163214

164-
s.Range(pos.startLine, pos.startColumn + offset, pos.startLine, range_end_column + offset)
215+
s.Range(pos.startLine,
216+
pos.startColumn + offset,
217+
pos.startLine,
218+
range_end_column + offset)
165219
}
166220

167221
def rangeExclude(range: Position, exclude: Position): s.Range = {
@@ -176,48 +230,63 @@ class SemanticdbConsumer extends TastyConsumer {
176230
typetree match {
177231
case TypeTree.Synthetic => ()
178232
case _ =>
179-
addOccurence(typetree.symbol,
180-
s.SymbolOccurrence.Role.REFERENCE,
181-
range(tree, typetree.pos, typetree.symbol.name))
233+
addOccurenceTypeTree(
234+
typetree,
235+
s.SymbolOccurrence.Role.REFERENCE,
236+
range(tree, typetree.pos, typetree.symbol.name))
182237
}
183238

184239
override def traverseTree(tree: Tree)(implicit ctx: Context): Unit = {
185240
//println(tree.pos.startColumn, tree.symbol.name, tree.pos.endColumn)
241+
println(tree)
186242
tree match {
187243
case IsDefinition(body) => {
188-
if (tree.symbol.name != "<init>") {
189-
val _ = tree match {
190-
case DefDef(_, _, _, typetree, _) => typetreeSymbol(tree, typetree)
191-
case ValDef(_, typetree, _) => typetreeSymbol(tree, typetree)
192-
case _ => ()
193-
}
244+
tree match {
245+
case DefDef(name, _, _, typetree, _) =>
246+
typetreeSymbol(tree, typetree)
247+
case ValDef(_, typetree, _) =>
248+
typetreeSymbol(tree, typetree)
249+
case _ => ()
194250
}
195-
addOccurence(tree.symbol,
196-
s.SymbolOccurrence.Role.DEFINITION,
197-
range(tree, tree.symbol.pos, tree.symbol.name))
198251

252+
val range_symbol = range(tree, tree.symbol.pos, tree.symbol.name)
253+
if (tree.symbol.name == "<init>" && !tree.isUserCreated) {
254+
val range_symbol2 = s.Range(range_symbol.startLine,
255+
range_symbol.startCharacter - 4,
256+
range_symbol.endLine,
257+
range_symbol.endCharacter - 4)
258+
addOccurenceTree(tree,
259+
s.SymbolOccurrence.Role.DEFINITION,
260+
range_symbol2,
261+
true)
262+
263+
} else {
264+
addOccurenceTree(tree,
265+
s.SymbolOccurrence.Role.DEFINITION,
266+
range_symbol)
267+
}
199268
super.traverseTree(body)
200269
}
201270

202271
case Term.Select(qualifier, _, _) => {
203272
val range = rangeExclude(tree.pos, qualifier.pos)
204-
addOccurence(tree.symbol, s.SymbolOccurrence.Role.REFERENCE, range)
273+
addOccurenceTree(tree, s.SymbolOccurrence.Role.REFERENCE, range)
205274
super.traverseTree(tree)
206275
}
207276

208277
case Term.Ident(_) => {
209278
// To avoid adding the identifier of the package symbol
210279
if (tree.symbol.owner.name != "<root>") {
211-
addOccurence(tree.symbol,
212-
s.SymbolOccurrence.Role.REFERENCE,
213-
range(tree, tree.pos, tree.symbol.name))
280+
addOccurenceTree(tree,
281+
s.SymbolOccurrence.Role.REFERENCE,
282+
range(tree, tree.pos, tree.symbol.name))
214283
}
215284
super.traverseTree(tree)
216285
}
217286
case PackageClause(_) =>
218-
addOccurence(tree.symbol,
219-
s.SymbolOccurrence.Role.REFERENCE,
220-
range(tree, tree.pos, tree.symbol.name))
287+
addOccurenceTree(tree,
288+
s.SymbolOccurrence.Role.REFERENCE,
289+
range(tree, tree.pos, tree.symbol.name))
221290
super.traverseTree(tree)
222291

223292
case tree =>

0 commit comments

Comments
 (0)