@@ -26,15 +26,23 @@ trait MemberLookup {
2626 if sym.isClassDef || sym.flags.is(Flags .Package ) then sym else nearestMembered(sym.owner)
2727
2828 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+
2934 ownerOpt match {
3035 case Some (owner) =>
3136 val nearest = nearestMembered(owner)
3237 val nearestCls = nearestClass(owner)
3338 val nearestPkg = nearestPackage(owner)
39+ def relativeLookup (querystrings : List [String ]) =
40+ // TODO walk the owner chain?
41+ downwardLookup(querystrings, nearestPkg).orElse(toplevelLookup(querystrings))
3442 query match {
3543 case Query .StrictMemberId (id) => localLookup(id, nearest).map(_ -> id)
3644 case Query .Id (id) =>
37- (localLookup(id, nearest) orElse localLookup(id, nearestPkg )).map(_ -> id)
45+ (localLookup(id, nearest) orElse relativeLookup( List (id) )).map(_ -> id)
3846 case Query .QualifiedId (Query .Qual .This , _, rest) =>
3947 downwardLookup(rest.asList, nearestCls).map(_ -> rest.join)
4048 case Query .QualifiedId (Query .Qual .Package , _, rest) =>
@@ -43,11 +51,12 @@ trait MemberLookup {
4351 downwardLookup(rest.asList, nearestCls).map(_ -> rest.join)
4452 case Query .QualifiedId (Query .Qual .Id (id), _, rest) if id == nearestPkg.name =>
4553 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)
4756 }
4857
4958 case None =>
50- downwardLookup (query.asList, defn. RootPackage ).map(_ -> query.join)
59+ toplevelLookup (query.asList).map(_ -> query.join)
5160 }
5261
5362 // println(s"looked up `$query` in ${owner.show}[${owner.flags.show}] as ${res.map(_.show)}")
@@ -103,7 +112,12 @@ trait MemberLookup {
103112 def hackResolveModule (s : Symbol ): Symbol =
104113 if s.flags.is(Flags .Module ) then s.moduleClass else s
105114
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
107121
108122 // def showMatched() = matched.foreach { s =>
109123 // println(s">>> ${s.show}")
@@ -115,6 +129,7 @@ trait MemberLookup {
115129 // println(s"localLookup for class ${owner.show} of `$q`{forceTerm=$forceTerm}")
116130 // showMatched()
117131
132+ val matched = syms.find(matches)
118133 matched.map(hackResolveModule)
119134 }
120135
@@ -124,6 +139,16 @@ trait MemberLookup {
124139 owner.tree match {
125140 case tree : ClassDef =>
126141 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+ }
127152 case _ =>
128153 findMatch(hackMembersOf(owner))
129154 }
0 commit comments