@@ -234,38 +234,46 @@ trait TypeAssigner {
234234 test(tpe, true )
235235 }
236236
237- /** The type of a selection with `name` of a tree with type `site`.
238- */
239- def selectionType (site : Type , name : Name , pos : SourcePosition )(implicit ctx : Context ): Type = {
240- val mbr = site.member(name)
237+ /** The type of the selection `tree`, where `qual1` is the typed qualifier part. */
238+ def selectionType (tree : untpd.RefTree , qual1 : Tree )(implicit ctx : Context ): Type = {
239+ var qualType = qual1.tpe.widenIfUnstable
240+ if (! qualType.hasSimpleKind && tree.name != nme.CONSTRUCTOR )
241+ // constructors are selected on typeconstructor, type arguments are passed afterwards
242+ qualType = errorType(em " $qualType takes type parameters " , qual1.sourcePos)
243+ else if (! qualType.isInstanceOf [TermType ])
244+ qualType = errorType(em " $qualType is illegal as a selection prefix " , qual1.sourcePos)
245+ val name = tree.name
246+ val mbr = qualType.member(name)
241247 if (reallyExists(mbr))
242- site .select(name, mbr)
243- else if (site .derivesFrom(defn.DynamicClass ) && ! Dynamic .isDynamicMethod(name))
248+ qualType .select(name, mbr)
249+ else if (qualType .derivesFrom(defn.DynamicClass ) && ! Dynamic .isDynamicMethod(name))
244250 TryDynamicCallType
245- else if (site .isErroneous || name.toTermName == nme.ERROR )
251+ else if (qualType .isErroneous || name.toTermName == nme.ERROR )
246252 UnspecifiedErrorType
253+ else if (name == nme.CONSTRUCTOR )
254+ errorType(ex " $qualType does not have a constructor " , tree.sourcePos)
247255 else {
248- def kind = if (name.isTypeName) " type" else " value"
249- def addendum =
250- if (site.derivesFrom(defn.DynamicClass )) " \n possible cause: maybe a wrong Dynamic method signature?"
251- else " "
252- errorType(
253- if (name == nme.CONSTRUCTOR ) ex " $site does not have a constructor "
254- else NotAMember (site, name, kind),
255- pos)
256+ val kind = if (name.isTypeName) " type" else " value"
257+ val addendum =
258+ if (qualType.derivesFrom(defn.DynamicClass ))
259+ " \n possible cause: maybe a wrong Dynamic method signature?"
260+ else qual1.getAttachment(Typer .HiddenSearchFailure ) match {
261+ case Some (failure) if ! failure.reason.isInstanceOf [Implicits .NoMatchingImplicits ] =>
262+ i """ .
263+ |An extension method was tried, but could not be fully constructed:
264+ |
265+ | ${failure.tree.show.replace(" \n " , " \n " )}"""
266+ case _ => " "
267+ }
268+ errorType(NotAMember (qualType, name, kind, addendum), tree.sourcePos)
256269 }
257270 }
258271
259- /** The selection type, which is additionally checked for accessibility.
272+ /** The type of the selection in `tree`, where `qual1` is the typed qualifier part.
273+ * The selection type is additionally checked for accessibility.
260274 */
261275 def accessibleSelectionType (tree : untpd.RefTree , qual1 : Tree )(implicit ctx : Context ): Type = {
262- var qualType = qual1.tpe.widenIfUnstable
263- if (! qualType.hasSimpleKind && tree.name != nme.CONSTRUCTOR )
264- // constructors are selected on typeconstructor, type arguments are passed afterwards
265- qualType = errorType(em " $qualType takes type parameters " , qual1.sourcePos)
266- else if (! qualType.isInstanceOf [TermType ])
267- qualType = errorType(em " $qualType is illegal as a selection prefix " , qual1.sourcePos)
268- val ownType = selectionType(qualType, tree.name, tree.sourcePos)
276+ val ownType = selectionType(tree, qual1)
269277 if (tree.getAttachment(desugar.SuppressAccessCheck ).isDefined) ownType
270278 else ensureAccessible(ownType, qual1.isInstanceOf [Super ], tree.sourcePos)
271279 }
0 commit comments