@@ -276,7 +276,14 @@ object Denotations {
276
276
* if generateStubs is specified, return a stubsymbol if denotation is a missing ref.
277
277
* Throw a `TypeError` if predicate fails to disambiguate symbol or no alternative matches.
278
278
*/
279
- def requiredSymbol (p : Symbol => Boolean , source : AbstractFile = null , generateStubs : Boolean = true )(implicit ctx : Context ): Symbol =
279
+ def requiredSymbol (kind : String ,
280
+ name : Name ,
281
+ site : Denotation = NoDenotation ,
282
+ args : List [Type ] = Nil ,
283
+ source : AbstractFile = null ,
284
+ generateStubs : Boolean = true )
285
+ (p : Symbol => Boolean )
286
+ (implicit ctx : Context ): Symbol =
280
287
disambiguate(p) match {
281
288
case m @ MissingRef (ownerd, name) =>
282
289
if (generateStubs) {
@@ -285,18 +292,25 @@ object Denotations {
285
292
}
286
293
else NoSymbol
287
294
case NoDenotation | _ : NoQualifyingRef =>
288
- throw new TypeError (i " None of the alternatives of $this satisfies required predicate " )
295
+ def argStr = if (args.isEmpty) " " else i " matching ( $args%, %) "
296
+ val msg =
297
+ if (site.exists) i " $site does not have a member $kind $name$argStr"
298
+ else i " missing: $kind $name$argStr"
299
+ throw new TypeError (msg)
289
300
case denot =>
290
301
denot.symbol
291
302
}
292
303
293
- def requiredMethod (name : PreName )(implicit ctx : Context ): TermSymbol =
294
- info.member(name.toTermName).requiredSymbol(_ is Method ).asTerm
304
+ def requiredMethod (pname : PreName )(implicit ctx : Context ): TermSymbol = {
305
+ val name = pname.toTermName
306
+ info.member(name).requiredSymbol(" method" , name, this )(_ is Method ).asTerm
307
+ }
295
308
def requiredMethodRef (name : PreName )(implicit ctx : Context ): TermRef =
296
309
requiredMethod(name).termRef
297
310
298
- def requiredMethod (name : PreName , argTypes : List [Type ])(implicit ctx : Context ): TermSymbol = {
299
- info.member(name.toTermName).requiredSymbol { x =>
311
+ def requiredMethod (pname : PreName , argTypes : List [Type ])(implicit ctx : Context ): TermSymbol = {
312
+ val name = pname.toTermName
313
+ info.member(name).requiredSymbol(i " method " , name, this , argTypes) { x =>
300
314
(x is Method ) && {
301
315
x.info.paramInfoss match {
302
316
case paramInfos :: Nil => paramInfos.corresponds(argTypes)(_ =:= _)
@@ -308,16 +322,22 @@ object Denotations {
308
322
def requiredMethodRef (name : PreName , argTypes : List [Type ])(implicit ctx : Context ): TermRef =
309
323
requiredMethod(name, argTypes).termRef
310
324
311
- def requiredValue (name : PreName )(implicit ctx : Context ): TermSymbol =
312
- info.member(name.toTermName).requiredSymbol(_.info.isParameterless).asTerm
325
+ def requiredValue (pname : PreName )(implicit ctx : Context ): TermSymbol = {
326
+ val name = pname.toTermName
327
+ info.member(name).requiredSymbol(" field or getter" , name, this )(_.info.isParameterless).asTerm
328
+ }
313
329
def requiredValueRef (name : PreName )(implicit ctx : Context ): TermRef =
314
330
requiredValue(name).termRef
315
331
316
- def requiredClass (name : PreName )(implicit ctx : Context ): ClassSymbol =
317
- info.member(name.toTypeName).requiredSymbol(_.isClass).asClass
332
+ def requiredClass (pname : PreName )(implicit ctx : Context ): ClassSymbol = {
333
+ val name = pname.toTypeName
334
+ info.member(name).requiredSymbol(" class" , name, this )(_.isClass).asClass
335
+ }
318
336
319
- def requiredType (name : PreName )(implicit ctx : Context ): TypeSymbol =
320
- info.member(name.toTypeName).requiredSymbol(_.isType).asType
337
+ def requiredType (pname : PreName )(implicit ctx : Context ): TypeSymbol = {
338
+ val name = pname.toTypeName
339
+ info.member(name).requiredSymbol(" type" , name, this )(_.isType).asType
340
+ }
321
341
322
342
/** The alternative of this denotation that has a type matching `targetType` when seen
323
343
* as a member of type `site`, `NoDenotation` if none exists.
0 commit comments