@@ -234,38 +234,46 @@ trait TypeAssigner {
234
234
test(tpe, true )
235
235
}
236
236
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)
241
247
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))
244
250
TryDynamicCallType
245
- else if (site .isErroneous || name.toTermName == nme.ERROR )
251
+ else if (qualType .isErroneous || name.toTermName == nme.ERROR )
246
252
UnspecifiedErrorType
253
+ else if (name == nme.CONSTRUCTOR )
254
+ errorType(ex " $qualType does not have a constructor " , tree.sourcePos)
247
255
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)
256
269
}
257
270
}
258
271
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.
260
274
*/
261
275
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)
269
277
if (tree.getAttachment(desugar.SuppressAccessCheck ).isDefined) ownType
270
278
else ensureAccessible(ownType, qual1.isInstanceOf [Super ], tree.sourcePos)
271
279
}
0 commit comments