@@ -16,6 +16,7 @@ import scala.tools.nsc.tasty.SafeEq
16
16
17
17
import scala .tools .nsc .tasty .{TastyUniverse , TastyModes }, TastyModes ._
18
18
import scala .tools .tasty .{TastyName , Signature , TastyFlags }, TastyName .SignedName , Signature .MethodSignature , TastyFlags .TastyFlagSet
19
+ import scala .tools .tasty .ErasedTypeRef
19
20
20
21
trait SymbolOps { self : TastyUniverse =>
21
22
import self .{symbolTable => u }
@@ -67,7 +68,7 @@ trait SymbolOps { self: TastyUniverse =>
67
68
termParamss
68
69
69
70
def namedMemberOfType (space : Type , tname : TastyName )(implicit ctx : Context ): Symbol = tname match {
70
- case SignedName (qual, sig) => signedMemberOfSpace(space, qual, sig.map(resolveErasedTypeRef ))
71
+ case SignedName (qual, sig) => signedMemberOfSpace(space, qual, sig.map(_.encode ))
71
72
case _ => memberOfSpace(space, tname)
72
73
}
73
74
@@ -88,40 +89,57 @@ trait SymbolOps { self: TastyUniverse =>
88
89
}
89
90
else space.member(encodeTermName(tname))
90
91
}
91
- if (isSymbol(member)) member
92
- else {
93
- val kind = if (tname.isTypeName) " type" else " term"
94
- def addendum (name : String ) =
95
- if (ctx.mode.is(ReadParents )) s " $kind in parents of ${if (ctx.owner.isLocalDummy) ctx.owner.owner else ctx.owner}: $name"
96
- else if (ctx.owner.isClass) s " $kind required by a member of ${ctx.owner}: $name"
97
- else s " $kind $name while unpickling ${ctx.owner}"
98
- val msg =
99
- if (tname.isTypeName && space.typeSymbol.hasPackageFlag)
100
- s " can't find ${addendum(s " ${space.typeSymbol.fullNameString}. $tname" )}; perhaps it is missing from the classpath. "
101
- else
102
- s " can't find ${addendum(" " + tname)}, in $space"
103
- typeError(msg)
92
+ if (isSymbol(member) && hasType(member)) member
93
+ else errorMissing(space, tname)
94
+ }
95
+
96
+ private def hasType (member : Symbol )(implicit ctx : Context ) = {
97
+ ctx.mode.is(ReadAnnotation ) || (member.rawInfo `ne` u.NoType )
98
+ }
99
+
100
+ private def errorMissing [T ](space : Type , tname : TastyName )(implicit ctx : Context ) = {
101
+ val kind = if (tname.isTypeName) " type" else " term"
102
+ def typeToString (tpe : Type ) = {
103
+ def inner (sb : StringBuilder , tpe : Type ): StringBuilder = tpe match {
104
+ case u.SingleType (pre, sym) => inner(sb, pre) append '.' append (
105
+ if (sym.isPackageObjectOrClass) s " ` ${sym.name}` "
106
+ else String valueOf sym.name
107
+ )
108
+ case u.TypeRef (pre, sym, _) if sym.isTerm =>
109
+ if ((pre eq u.NoPrefix ) || (pre eq u.NoType )) sb append sym.name
110
+ else inner(sb, pre) append '.' append sym.name
111
+ case tpe => sb append tpe
112
+ }
113
+ inner(new StringBuilder (), tpe).toString
114
+ }
115
+ def addendum (name : String ) = {
116
+ if (ctx.mode.is(ReadParents )) s " $kind in parents of ${location(if (ctx.owner.isLocalDummy) ctx.owner.owner else ctx.owner)}: $name"
117
+ else s " $kind required by ${location(ctx.owner)}: $name"
104
118
}
119
+ val missing = addendum(s " ${typeToString(space)}. $tname" )
120
+ typeError(s " can't find $missing; perhaps it is missing from the classpath. " )
105
121
}
106
122
107
- private def signedMemberOfSpace (space : Type , qual : TastyName , sig : MethodSignature [Type ])(implicit ctx : Context ): Symbol = {
108
- ctx.log(s """ <<< looking for overload member[ $space] @@ $qual: ${sig.show }""" )
123
+ private def signedMemberOfSpace (space : Type , qual : TastyName , sig : MethodSignature [ErasedTypeRef ])(implicit ctx : Context ): Symbol = {
124
+ ctx.log(s """ <<< looking for overload member[ $space] @@ $qual: ${showSig( sig) }""" )
109
125
val member = space.member(encodeTermName(qual))
110
- val (tyParamCount, argTpes) = {
126
+ if (! (isSymbol(member) && hasType(member))) errorMissing(space, qual)
127
+ val (tyParamCount, argTpeRefs) = {
111
128
val (tyParamCounts, params) = sig.params.partitionMap(identity)
112
129
if (tyParamCounts.length > 1 ) {
113
- unsupportedError(s " multiple type parameter lists on erased method signature ${sig.show }" )
130
+ unsupportedError(s " multiple type parameter lists on erased method signature ${showSig( sig) }" )
114
131
}
115
132
(tyParamCounts.headOption.getOrElse(0 ), params)
116
133
}
117
134
def compareSym (sym : Symbol ): Boolean = sym match {
118
135
case sym : u.MethodSymbol =>
119
136
val params = sym.paramss.flatten
120
- sym.returnType.erasure =:= sig.result &&
121
- params.length === argTpes.length &&
137
+ val isJava = sym.isJavaDefined
138
+ NameErasure .sigName(sym.returnType, isJava) === sig.result &&
139
+ params.length === argTpeRefs.length &&
122
140
(qual === TastyName .Constructor && tyParamCount === member.owner.typeParams.length
123
141
|| tyParamCount === sym.typeParams.length) &&
124
- params.zip(argTpes ).forall { case (param, tpe) => param.tpe.erasure =: = tpe } && {
142
+ params.zip(argTpeRefs ).forall { case (param, tpe) => NameErasure .sigName( param.tpe, isJava) == = tpe } && {
125
143
ctx.log(s " >>> selected ${showSym(sym)}: ${sym.tpe}" )
126
144
true
127
145
}
@@ -130,8 +148,9 @@ trait SymbolOps { self: TastyUniverse =>
130
148
false
131
149
}
132
150
member.asTerm.alternatives.find(compareSym).getOrElse(
133
- typeError(s " No matching overload of $space. $qual with signature ${sig.show }" ))
151
+ typeError(s " No matching overload of $space. $qual with signature ${showSig( sig) }" ))
134
152
}
135
153
154
+ def showSig (sig : MethodSignature [ErasedTypeRef ]): String = sig.map(_.signature).show
136
155
def showSym (sym : Symbol ): String = s " Symbol( $sym, # ${sym.id}) "
137
156
}
0 commit comments