@@ -8,7 +8,9 @@ import dotty.tools.dotc.tastyreflect
8
8
import scala .collection .mutable .HashMap
9
9
10
10
class SemanticdbConsumer extends TastyConsumer {
11
- var stack : List [String ] = Nil
11
+ var stack : List [String ] = Nil
12
+
13
+ /*
12
14
val symbolsDefs : HashMap[String, Int] = HashMap()
13
15
val symbolsVals : HashMap[String, Int] = HashMap()
14
16
@@ -29,41 +31,62 @@ class SemanticdbConsumer extends TastyConsumer {
29
31
symbolsVals += (path -> 1)
30
32
""
31
33
}
32
- }
34
+ }*/
33
35
34
36
final def apply (reflect : Reflection )(root : reflect.Tree ): Unit = {
35
37
import reflect ._
36
38
object Traverser extends TreeTraverser {
39
+ val symbolsCache : HashMap [tasty.Symbol , String ] = HashMap ()
40
+ val symbolPathsDisimbiguator : HashMap [String , Int ] = HashMap ()
37
41
38
42
def packageDefToOccurence (term : Term ): String = {
39
43
// println(term, term.pos.start, term.pos.end)
40
44
val Term .Ident (id) = term
41
45
return stack.head + id + " /"
42
46
}
43
47
48
+ def disimbiguate (symbol_path : String ): String = {
49
+ if (symbolPathsDisimbiguator.contains(symbol_path)) {
50
+ symbolPathsDisimbiguator +=
51
+ (symbol_path -> (symbolPathsDisimbiguator(symbol_path) + 1 ))
52
+ " (+" + (symbolPathsDisimbiguator(symbol_path) - 1 ) + " )"
53
+ } else {
54
+ symbolPathsDisimbiguator += (symbol_path -> 1 )
55
+ " ()"
56
+ }
57
+ }
58
+
44
59
def iterateParent (symbol : Symbol ): String = {
45
- if (symbol.name == " <none>" ) then {
46
- // TODO had a "NoDenotation" test to avoid
47
- // relying on the name itself
48
- " "
60
+ if (symbolsCache.contains(symbol)) {
61
+ return symbolsCache(symbol)
49
62
} else {
50
- val previous_symbol = iterateParent(symbol.owner)
51
- val next_atom =
52
- symbol match {
53
- case IsPackageSymbol (symbol) => symbol.name + " /"
54
- case IsClassSymbol (symbol) => symbol.name + " #"
55
- case IsDefSymbol (symbol) => symbol.name + " ."
56
- case IsValSymbol (symbol) => symbol.name + " ."
57
- case owner => {
58
- " "
59
- }
60
- }
61
- previous_symbol + next_atom
63
+ val out_symbol_path =
64
+ if (symbol.name == " <none>" ) then {
65
+ // TODO had a "NoDenotation" test to avoid
66
+ // relying on the name itself
67
+ " "
68
+ } else {
69
+ val previous_symbol = iterateParent(symbol.owner)
70
+ val next_atom =
71
+ symbol match {
72
+ case IsPackageSymbol (symbol) => symbol.name + " /"
73
+ case IsClassSymbol (symbol) => symbol.name + " #"
74
+ case IsDefSymbol (symbol) =>
75
+ symbol.name + disimbiguate(previous_symbol + symbol.name) + " ."
76
+ case IsValSymbol (symbol) => symbol.name + " ."
77
+ case owner => {
78
+ " "
79
+ }
80
+ }
81
+ previous_symbol + next_atom
82
+ }
83
+ symbolsCache += (symbol -> out_symbol_path)
84
+ out_symbol_path
62
85
}
63
86
}
64
87
65
88
override def traverseTree (tree : Tree )(implicit ctx : Context ): Unit = {
66
- val previous_path = stack.head
89
+ val previous_path = stack.head
67
90
68
91
tree match {
69
92
/* case IsClassDef(body) =>
0 commit comments