@@ -156,27 +156,22 @@ abstract class RefChecks extends InfoTransform with scala.reflect.internal.trans
156
156
157
157
// Override checking ------------------------------------------------------------
158
158
159
- def isJavaVarargsAncestor (clazz : Symbol ) = (
160
- clazz.isClass
161
- && clazz.isJavaDefined
162
- && (clazz.info.nonPrivateDecls exists isJavaVarArgsMethod)
163
- )
164
-
165
159
/** Add bridges for vararg methods that extend Java vararg methods
166
160
*/
167
161
def addVarargBridges (clazz : Symbol ): List [Tree ] = {
168
162
// This is quite expensive, so attempt to skip it completely.
169
163
// Insist there at least be a java-defined ancestor which
170
164
// defines a varargs method. TODO: Find a cheaper way to exclude.
171
- if (clazz.thisType.baseClasses exists isJavaVarargsAncestor ) {
165
+ if (inheritsJavaVarArgsMethod( clazz) ) {
172
166
log(" Found java varargs ancestor in " + clazz.fullLocationString + " ." )
173
167
val self = clazz.thisType
174
168
val bridges = new ListBuffer [Tree ]
175
169
176
170
def varargBridge (member : Symbol , bridgetpe : Type ): Tree = {
177
- log(" Generating varargs bridge for " + member.fullLocationString + " of type " + bridgetpe)
171
+ log(s " Generating varargs bridge for ${ member.fullLocationString} of type $ bridgetpe" )
178
172
179
- val bridge = member.cloneSymbolImpl(clazz, member.flags | VBRIDGE ) setPos clazz.pos
173
+ val newFlags = (member.flags | VBRIDGE | ARTIFACT ) & ~ PRIVATE
174
+ val bridge = member.cloneSymbolImpl(clazz, newFlags) setPos clazz.pos
180
175
bridge.setInfo(bridgetpe.cloneInfo(bridge))
181
176
clazz.info.decls enter bridge
182
177
@@ -189,26 +184,35 @@ abstract class RefChecks extends InfoTransform with scala.reflect.internal.trans
189
184
localTyper typed DefDef (bridge, body)
190
185
}
191
186
192
- // For all concrete non-private members that have a (Scala) repeated parameter:
193
- // compute the corresponding method type `jtpe` with a Java repeated parameter
187
+ // For all concrete non-private members (but: see below) that have a (Scala) repeated
188
+ // parameter: compute the corresponding method type `jtpe` with a Java repeated parameter
194
189
// if a method with type `jtpe` exists and that method is not a varargs bridge
195
190
// then create a varargs bridge of type `jtpe` that forwards to the
196
191
// member method with the Scala vararg type.
197
- for (member <- clazz.info.nonPrivateMembers) {
192
+ //
193
+ // @PP: Can't call nonPrivateMembers because we will miss refinement members,
194
+ // which have been marked private. See SI-4729.
195
+ for (member <- nonTrivialMembers(clazz)) {
196
+ log(s " Considering $member for java varargs bridge in $clazz" )
198
197
if (! member.isDeferred && member.isMethod && hasRepeatedParam(member.info)) {
199
198
val inherited = clazz.info.nonPrivateMemberAdmitting(member.name, VBRIDGE )
199
+
200
200
// Delaying calling memberType as long as possible
201
201
if (inherited ne NoSymbol ) {
202
- val jtpe = toJavaRepeatedParam(self. memberType( member) )
202
+ val jtpe = toJavaRepeatedParam(self memberType member)
203
203
// this is a bit tortuous: we look for non-private members or bridges
204
204
// if we find a bridge everything is OK. If we find another member,
205
205
// we need to create a bridge
206
- if (inherited filter (sym => (self.memberType(sym) matches jtpe) && ! (sym hasFlag VBRIDGE )) exists)
206
+ val inherited1 = inherited filter (sym => ! (sym hasFlag VBRIDGE ) && (self memberType sym matches jtpe))
207
+ if (inherited1.exists)
207
208
bridges += varargBridge(member, jtpe)
208
209
}
209
210
}
210
211
}
211
212
213
+ if (bridges.size > 0 )
214
+ log(s " Adding ${bridges.size} bridges for methods extending java varargs. " )
215
+
212
216
bridges.toList
213
217
}
214
218
else Nil
0 commit comments