@@ -944,19 +944,20 @@ class Namer { typer: Typer =>
944944 val path = typedAheadExpr(expr, AnySelectionProto )
945945 checkLegalImportPath(path)
946946
947- def needsForwarder (sym : Symbol ) =
948- sym.is(ImplicitOrImplied ) == exp.impliedOnly &&
949- sym.isAccessibleFrom(path.tpe) &&
950- ! sym.isConstructor &&
951- ! sym.is(ModuleClass ) &&
952- ! sym.is(Bridge ) &&
953- ! cls.derivesFrom(sym.owner)
947+ def whyNoForwarder (mbr : SingleDenotation ): String = {
948+ val sym = mbr.symbol
949+ if (sym.is(ImplicitOrImplied ) != exp.impliedOnly) s " is ${if (exp.impliedOnly) " not " else " " }implied "
950+ else if (! sym.isAccessibleFrom(path.tpe)) " is not accessible"
951+ else if (sym.isConstructor || sym.is(ModuleClass ) || sym.is(Bridge )) " _"
952+ else if (cls.derivesFrom(sym.owner)) i " is already a member of $cls"
953+ else " "
954+ }
954955
955956 /** Add a forwarder with name `alias` or its type name equivalent to `mbr`,
956957 * provided `mbr` is accessible and of the right implicit/non-implicit kind.
957958 */
958- def addForwarder (alias : TermName , mbr : SingleDenotation , span : Span ): Unit =
959- if (needsForwarder (mbr.symbol) ) {
959+ def addForwarder (alias : TermName , mbr : SingleDenotation , span : Span ): Unit = {
960+ if (whyNoForwarder (mbr) == " " ) {
960961
961962 /** The info of a forwarder to type `ref` which has info `info`
962963 */
@@ -998,12 +999,19 @@ class Namer { typer: Typer =>
998999 }
9991000 buf += forwarderDef.withSpan(span)
10001001 }
1002+ }
10011003
10021004 def addForwardersNamed (name : TermName , alias : TermName , span : Span ): Unit = {
1005+ val size = buf.size
10031006 val mbrs = List (name, name.toTypeName).flatMap(path.tpe.member(_).alternatives)
1004- if (mbrs.isEmpty)
1005- ctx.error(i " no accessible member $name at $path" , ctx.source.atSpan(span))
10061007 mbrs.foreach(addForwarder(alias, _, span))
1008+ if (buf.size == size) {
1009+ val reason = mbrs.map(whyNoForwarder).dropWhile(_ == " -" ) match {
1010+ case Nil => " "
1011+ case why :: _ => i " \n $path. $name cannot be exported because it $why"
1012+ }
1013+ ctx.error(i """ no eligible member $name at $path$reason""" , ctx.source.atSpan(span))
1014+ }
10071015 }
10081016
10091017 def addForwardersExcept (seen : List [TermName ], span : Span ): Unit =
0 commit comments