@@ -124,7 +124,7 @@ trait TypeOps extends TastyKernel { self: TastyUniverse =>
124124 */
125125 case object AndType extends Type
126126
127- def selectType (pre : Type , name : TastyName )(implicit ctx : Context ): Type = {
127+ def selectType (pre : Type , space : Type , name : TastyName )(implicit ctx : Context ): Type = {
128128 if (pre.typeSymbol === defn.ScalaPackage && ( name === nme.And || name === nme.Or ) ) {
129129 if (name === nme.And ) {
130130 AndType
@@ -135,12 +135,12 @@ trait TypeOps extends TastyKernel { self: TastyUniverse =>
135135 }
136136 }
137137 else {
138- selectFromPrefix (pre, name, selectingTerm = false )
138+ selectFromSpaceWithPrefix (pre, space , name, selectingTerm = false )
139139 }
140140 }
141141
142- def selectTerm (pre : Type , name : TastyName )(implicit ctx : Context ): Type =
143- selectFromPrefix (pre, name, selectingTerm = true )
142+ def selectTerm (pre : Type , space : Type , name : TastyName )(implicit ctx : Context ): Type =
143+ selectFromSpaceWithPrefix (pre, space , name, selectingTerm = true )
144144
145145 /**
146146 * Ported from dotc
@@ -190,32 +190,41 @@ trait TypeOps extends TastyKernel { self: TastyUniverse =>
190190 }
191191 }
192192
193- private def selectSymFromSig0 (qualType : Type , name : Name , sig : Signature [Type ])(implicit ctx : Context ): Either [String ,(Int , Symbol )] =
194- selectSymFromSig(qualType , name, sig).toRight(s " No matching overload of $qualType . $name with signature ${sig.show}" )
193+ private def selectSymFromSig0 (space : Type , name : Name , sig : Signature [Type ])(implicit ctx : Context ): Either [String ,(Int , Symbol )] =
194+ selectSymFromSig(space , name, sig).toRight(s " No matching overload of $space . $name with signature ${sig.show}" )
195195
196196 private def reportThenErrorTpe (msg : String ): Type = {
197197 reporter.error(noPosition, msg)
198198 errorType
199199 }
200200
201201 def selectFromPrefix (pre : Type , name : TastyName , selectingTerm : Boolean )(implicit ctx : Context ): Type = {
202+ selectFromSpaceWithPrefix(pre, pre, name, selectingTerm)
203+ }
204+
205+ def selectFromSpaceWithPrefix (pre : Type , space : Type , name : TastyName , selectingTerm : Boolean )(implicit ctx : Context ): Type = {
202206 val encoded = name.toEncodedTermName
203207 val selector = if (selectingTerm) encoded else encoded.toTypeName
204208 def debugSelectedSym (sym : Symbol ): Symbol = {
205209 ctx.log(s " selected ${showSym(sym)} : ${sym.tpe}" )
206210 sym
207211 }
212+ def memberOfSpace (space : Type , name : Name ): Symbol = {
213+ def lookInTypeCtor = space.typeConstructor.typeParams.filter(_.name == name).headOption.getOrElse(noSymbol)
214+ val fetched = space.member(name)
215+ if (name.isTypeName) fetched.orElse(lookInTypeCtor) else fetched
216+ }
208217 val resolved = name match {
209218 case SignedName (_, sig) =>
210- selectSymFromSig0(pre , selector, sig.map(erasedNameToErasedType)).map(pair => debugSelectedSym(pair._2))
211- case _ => Right (pre.member( selector))
219+ selectSymFromSig0(space , selector, sig.map(erasedNameToErasedType)).map(pair => debugSelectedSym(pair._2))
220+ case _ => Right (memberOfSpace(space, selector))
212221 }
213222 val tpeOrErr = resolved.map(sym => NamedType (pre, if (name.isModuleName) sym.linkedClassOfClass else sym))
214223 tpeOrErr.fold(reportThenErrorTpe, identity)
215224 }
216225
217- def selectFromSig (qualType : Type , name : Name , sig : Signature [Type ])(implicit ctx : Context ): Type = {
218- val tpeOrErr = selectSymFromSig0(qualType , name, sig).map {
226+ def selectFromSig (space : Type , name : Name , sig : Signature [Type ])(implicit ctx : Context ): Type = {
227+ val tpeOrErr = selectSymFromSig0(space , name, sig).map {
219228 case (tyParamCount, sym) =>
220229 var tpe = sym.tpe
221230 if (name === nme.CONSTRUCTOR && tyParamCount > 0 ) tpe = mkPolyType(sym.owner.typeParams, tpe)
0 commit comments