@@ -23,13 +23,13 @@ sealed trait IndexedContext:
23
23
given ctx : Context
24
24
def scopeSymbols : List [Symbol ]
25
25
def rename (sym : Symbol ): Option [String ]
26
- def findSymbol (name : Name ): Option [List [Symbol ]]
26
+ def findSymbol (name : Name , fromPrefix : Option [ Type ] = None ): Option [List [Symbol ]]
27
27
def findSymbolInLocalScope (name : String ): Option [List [Symbol ]]
28
28
29
- final def lookupSym (sym : Symbol ): Result =
29
+ final def lookupSym (sym : Symbol , fromPrefix : Option [ Type ] = None ): Result =
30
30
def all (symbol : Symbol ): Set [Symbol ] = Set (symbol, symbol.companionModule, symbol.companionClass, symbol.companion).filter(_ != NoSymbol )
31
31
val isRelated = all(sym) ++ all(sym.dealiasType)
32
- findSymbol(sym.name) match
32
+ findSymbol(sym.name, fromPrefix ) match
33
33
case Some (symbols) if symbols.exists(isRelated) => Result .InScope
34
34
case Some (symbols) if symbols.exists(isTermAliasOf(_, sym)) => Result .InScope
35
35
case Some (symbols) if symbols.map(_.dealiasType).exists(isRelated) => Result .InScope
@@ -81,7 +81,7 @@ object IndexedContext:
81
81
82
82
case object Empty extends IndexedContext :
83
83
given ctx : Context = NoContext
84
- def findSymbol (name : Name ): Option [List [Symbol ]] = None
84
+ def findSymbol (name : Name , fromPrefix : Option [ Type ] ): Option [List [Symbol ]] = None
85
85
def findSymbolInLocalScope (name : String ): Option [List [Symbol ]] = None
86
86
def scopeSymbols : List [Symbol ] = List .empty
87
87
def rename (sym : Symbol ): Option [String ] = None
@@ -111,11 +111,31 @@ object IndexedContext:
111
111
112
112
override def findSymbolInLocalScope (name : String ): Option [List [Symbol ]] =
113
113
names.get(name).map(_.map(_.symbol).toList).filter(_.nonEmpty)
114
- def findSymbol (name : Name ): Option [List [Symbol ]] =
114
+ def findSymbol (name : Name , fromPrefix : Option [ Type ] ): Option [List [Symbol ]] =
115
115
names
116
116
.get(name.show)
117
- .map(_.map(_.symbol).toList)
118
- .orElse(defaultScopes(name))
117
+ .map { denots =>
118
+ def skipThisType (tp : Type ): Type = tp match
119
+ case ThisType (prefix) => skipThisType(prefix)
120
+ case _ => tp
121
+
122
+ val filteredDenots = fromPrefix match
123
+ case Some (prefix) =>
124
+ val target = skipThisType(prefix)
125
+ denots.filter { denot =>
126
+ denot.prefix == NoPrefix ||
127
+ (denot.prefix match
128
+ case tref : TermRef =>
129
+ tref.termSymbol.info <:< target
130
+ case otherPrefix =>
131
+ otherPrefix <:< target
132
+ )
133
+ }
134
+ case None => denots
135
+
136
+ filteredDenots.map(_.symbol).toList
137
+ }
138
+ .orElse(defaultScopes(name)).filter(_.nonEmpty)
119
139
120
140
def scopeSymbols : List [Symbol ] =
121
141
names.values.flatten.map(_.symbol).toList
0 commit comments