@@ -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