@@ -276,7 +276,14 @@ object Denotations {
276276 * if generateStubs is specified, return a stubsymbol if denotation is a missing ref.
277277 * Throw a `TypeError` if predicate fails to disambiguate symbol or no alternative matches.
278278 */
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 =
280287 disambiguate(p) match {
281288 case m @ MissingRef (ownerd, name) =>
282289 if (generateStubs) {
@@ -285,18 +292,25 @@ object Denotations {
285292 }
286293 else NoSymbol
287294 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)
289300 case denot =>
290301 denot.symbol
291302 }
292303
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+ }
295308 def requiredMethodRef (name : PreName )(implicit ctx : Context ): TermRef =
296309 requiredMethod(name).termRef
297310
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 =>
300314 (x is Method ) && {
301315 x.info.paramInfoss match {
302316 case paramInfos :: Nil => paramInfos.corresponds(argTypes)(_ =:= _)
@@ -308,16 +322,22 @@ object Denotations {
308322 def requiredMethodRef (name : PreName , argTypes : List [Type ])(implicit ctx : Context ): TermRef =
309323 requiredMethod(name, argTypes).termRef
310324
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+ }
313329 def requiredValueRef (name : PreName )(implicit ctx : Context ): TermRef =
314330 requiredValue(name).termRef
315331
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+ }
318336
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+ }
321341
322342 /** The alternative of this denotation that has a type matching `targetType` when seen
323343 * as a member of type `site`, `NoDenotation` if none exists.
0 commit comments