@@ -26,15 +26,23 @@ trait MemberLookup {
26
26
if sym.isClassDef || sym.flags.is(Flags .Package ) then sym else nearestMembered(sym.owner)
27
27
28
28
val res =
29
+ def toplevelLookup (querystrings : List [String ]) =
30
+ downwardLookup(querystrings, defn.PredefModule .moduleClass)
31
+ .orElse(downwardLookup(querystrings, defn.ScalaPackage ))
32
+ .orElse(downwardLookup(querystrings, defn.RootPackage ))
33
+
29
34
ownerOpt match {
30
35
case Some (owner) =>
31
36
val nearest = nearestMembered(owner)
32
37
val nearestCls = nearestClass(owner)
33
38
val nearestPkg = nearestPackage(owner)
39
+ def relativeLookup (querystrings : List [String ]) =
40
+ // TODO walk the owner chain?
41
+ downwardLookup(querystrings, nearestPkg).orElse(toplevelLookup(querystrings))
34
42
query match {
35
43
case Query .StrictMemberId (id) => localLookup(id, nearest).map(_ -> id)
36
44
case Query .Id (id) =>
37
- (localLookup(id, nearest) orElse localLookup(id, nearestPkg )).map(_ -> id)
45
+ (localLookup(id, nearest) orElse relativeLookup( List (id) )).map(_ -> id)
38
46
case Query .QualifiedId (Query .Qual .This , _, rest) =>
39
47
downwardLookup(rest.asList, nearestCls).map(_ -> rest.join)
40
48
case Query .QualifiedId (Query .Qual .Package , _, rest) =>
@@ -43,11 +51,12 @@ trait MemberLookup {
43
51
downwardLookup(rest.asList, nearestCls).map(_ -> rest.join)
44
52
case Query .QualifiedId (Query .Qual .Id (id), _, rest) if id == nearestPkg.name =>
45
53
downwardLookup(rest.asList, nearestPkg).map(_ -> rest.join)
46
- case query : Query .QualifiedId => downwardLookup(query.asList, defn.RootPackage ).map(_ -> query.join)
54
+ case query : Query .QualifiedId =>
55
+ relativeLookup(query.asList).map(_ -> query.join)
47
56
}
48
57
49
58
case None =>
50
- downwardLookup (query.asList, defn. RootPackage ).map(_ -> query.join)
59
+ toplevelLookup (query.asList).map(_ -> query.join)
51
60
}
52
61
53
62
// println(s"looked up `$query` in ${owner.show}[${owner.flags.show}] as ${res.map(_.show)}")
@@ -103,7 +112,12 @@ trait MemberLookup {
103
112
def hackResolveModule (s : Symbol ): Symbol =
104
113
if s.flags.is(Flags .Module ) then s.moduleClass else s
105
114
106
- val matched = syms.find(matches)
115
+ // val syms0 = syms.toList
116
+ // val matched0 = syms0.find(matches)
117
+ // if matched0.isEmpty then
118
+ // println(s"Failed to look up $q in $owner; all members below:")
119
+ // syms0.foreach { s => println(s"\t$s") }
120
+ // val matched = matched0
107
121
108
122
// def showMatched() = matched.foreach { s =>
109
123
// println(s">>> ${s.show}")
@@ -115,6 +129,7 @@ trait MemberLookup {
115
129
// println(s"localLookup for class ${owner.show} of `$q`{forceTerm=$forceTerm}")
116
130
// showMatched()
117
131
132
+ val matched = syms.find(matches)
118
133
matched.map(hackResolveModule)
119
134
}
120
135
@@ -124,6 +139,16 @@ trait MemberLookup {
124
139
owner.tree match {
125
140
case tree : ClassDef =>
126
141
findMatch(tree.body.iterator.collect { case t : Definition if hackIsNotAbsent(t.symbol) => t.symbol })
142
+ case tree : TypeDef =>
143
+ val tpe =
144
+ tree.rhs match {
145
+ case tb : TypeBoundsTree => tb.hi.tpe
146
+ case tpt : TypeTree => tpt.tpe
147
+ }
148
+
149
+ tpe.classSymbol.flatMap { s =>
150
+ findMatch(hackMembersOf(s))
151
+ }
127
152
case _ =>
128
153
findMatch(hackMembersOf(owner))
129
154
}
0 commit comments