@@ -45,9 +45,44 @@ class SemanticdbConsumer extends TastyConsumer {
45
45
46
46
final def apply (reflect : Reflection )(root : reflect.Tree ): Unit = {
47
47
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
+
48
69
object Traverser extends TreeTraverser {
49
70
val symbolsCache : HashMap [tasty.Symbol , String ] = HashMap ()
50
71
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
+ }
51
86
52
87
implicit class SymbolExtender (symbol : Symbol ) {
53
88
def isTypeParameter : Boolean = symbol match {
@@ -57,17 +92,17 @@ class SemanticdbConsumer extends TastyConsumer {
57
92
58
93
def isType : Boolean = symbol match {
59
94
case IsTypeSymbol (_) => true
60
- case _ => false
95
+ case _ => false
61
96
}
62
97
63
98
def isMethod : Boolean = symbol match {
64
99
case IsDefSymbol (_) => true
65
- case _ => false
100
+ case _ => false
66
101
}
67
102
68
103
def isPackage : Boolean = symbol match {
69
104
case IsPackageSymbol (_) => true
70
- case _ => false
105
+ case _ => false
71
106
}
72
107
73
108
def isObject : Boolean = symbol.flags.isObject
@@ -106,23 +141,24 @@ class SemanticdbConsumer extends TastyConsumer {
106
141
} else {
107
142
val previous_symbol = iterateParent(symbol.owner)
108
143
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
+ }
126
162
127
163
Symbols .Global (previous_symbol, next_atom)
128
164
}
@@ -134,10 +170,8 @@ class SemanticdbConsumer extends TastyConsumer {
134
170
def addOccurence (symbol : Symbol ,
135
171
type_symbol : s.SymbolOccurrence .Role ,
136
172
range : s.Range ): Unit = {
137
- // if (symbolsCache.contains(symbol)) return
138
-
139
173
val symbol_path = iterateParent(symbol)
140
- if (symbol_path == " " || symbol.name == " <init> " ) return
174
+ if (symbol_path == " " ) return
141
175
142
176
occurrences =
143
177
occurrences :+
@@ -146,12 +180,29 @@ class SemanticdbConsumer extends TastyConsumer {
146
180
symbol_path,
147
181
type_symbol
148
182
)
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
+ }
149
200
}
150
201
151
202
def range (tree : Tree , pos : Position , name : String ): s.Range = {
152
203
val offset = tree match {
153
- case IsPackageClause (tree) => " package " .length
154
- case _ => 0
204
+ case IsPackageClause (tree) => " package " .length
205
+ case _ => 0
155
206
}
156
207
157
208
val range_end_column =
@@ -161,7 +212,10 @@ class SemanticdbConsumer extends TastyConsumer {
161
212
pos.startColumn + name.length
162
213
}
163
214
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)
165
219
}
166
220
167
221
def rangeExclude (range : Position , exclude : Position ): s.Range = {
@@ -176,48 +230,63 @@ class SemanticdbConsumer extends TastyConsumer {
176
230
typetree match {
177
231
case TypeTree .Synthetic => ()
178
232
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))
182
237
}
183
238
184
239
override def traverseTree (tree : Tree )(implicit ctx : Context ): Unit = {
185
240
// println(tree.pos.startColumn, tree.symbol.name, tree.pos.endColumn)
241
+ println(tree)
186
242
tree match {
187
243
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 _ => ()
194
250
}
195
- addOccurence(tree.symbol,
196
- s.SymbolOccurrence .Role .DEFINITION ,
197
- range(tree, tree.symbol.pos, tree.symbol.name))
198
251
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
+ }
199
268
super .traverseTree(body)
200
269
}
201
270
202
271
case Term .Select (qualifier, _, _) => {
203
272
val range = rangeExclude(tree.pos, qualifier.pos)
204
- addOccurence (tree.symbol , s.SymbolOccurrence .Role .REFERENCE , range)
273
+ addOccurenceTree (tree, s.SymbolOccurrence .Role .REFERENCE , range)
205
274
super .traverseTree(tree)
206
275
}
207
276
208
277
case Term .Ident (_) => {
209
278
// To avoid adding the identifier of the package symbol
210
279
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))
214
283
}
215
284
super .traverseTree(tree)
216
285
}
217
286
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))
221
290
super .traverseTree(tree)
222
291
223
292
case tree =>
0 commit comments