|
1 | | -package dotty.tools.dotc |
| 1 | +package dotty.tools |
| 2 | +package dotc |
2 | 3 | package transform |
3 | 4 |
|
4 | 5 | import core._ |
@@ -76,16 +77,32 @@ class ElimRepeated extends MiniPhase with InfoTransformer { thisPhase => |
76 | 77 |
|
77 | 78 | override def infoMayChange(sym: Symbol)(using Context): Boolean = sym.is(Method) |
78 | 79 |
|
79 | | - private def overridesJava(sym: Symbol)(using Context) = sym.allOverriddenSymbols.exists(_.is(JavaDefined)) |
| 80 | + /** Does `sym` override a symbol defined in a Java class? One might think that |
| 81 | + * this can be expressed as |
| 82 | + * |
| 83 | + * sym.allOverriddenSymbols.exists(_.is(JavaDefined)) |
| 84 | + * |
| 85 | + * but that does not work, since `allOverriddenSymbols` gets confused because the |
| 86 | + * signatures of a Java varargs method and a Scala varargs override are not the same. |
| 87 | + */ |
| 88 | + private def overridesJava(sym: Symbol)(using Context) = |
| 89 | + sym.owner.info.baseClasses.drop(1).exists { bc => |
| 90 | + bc.is(JavaDefined) && { |
| 91 | + val other = bc.info.nonPrivateDecl(sym.name) |
| 92 | + other.hasAltWith { alt => |
| 93 | + sym.owner.thisType.memberInfo(alt.symbol).matchesLoosely(sym.info) |
| 94 | + } |
| 95 | + } |
| 96 | + } |
80 | 97 |
|
81 | 98 | private def hasVarargsAnnotation(sym: Symbol)(using Context) = sym.hasAnnotation(defn.VarargsAnnot) |
82 | 99 |
|
83 | 100 | private def parentHasVarargsAnnotation(sym: Symbol)(using Context) = sym.allOverriddenSymbols.exists(hasVarargsAnnotation) |
84 | 101 |
|
85 | 102 | private def isVarargsMethod(sym: Symbol)(using Context) = |
86 | | - hasVarargsAnnotation(sym) || |
87 | | - hasRepeatedParams(sym) && |
88 | | - (sym.allOverriddenSymbols.exists(s => s.is(JavaDefined) || hasVarargsAnnotation(s))) |
| 103 | + hasVarargsAnnotation(sym) |
| 104 | + || hasRepeatedParams(sym) |
| 105 | + && (overridesJava(sym) || sym.allOverriddenSymbols.exists(hasVarargsAnnotation)) |
89 | 106 |
|
90 | 107 | /** Eliminate repeated parameters from method types. */ |
91 | 108 | private def elimRepeated(tp: Type, isJava: Boolean)(using Context): Type = tp.stripTypeVar match |
@@ -292,6 +309,7 @@ class ElimRepeated extends MiniPhase with InfoTransformer { thisPhase => |
292 | 309 | report.error(s"$src produces a forwarder method that conflicts with ${conflict.showDcl}", original.srcPos) |
293 | 310 | case Nil => |
294 | 311 | forwarder.enteredAfter(thisPhase) |
| 312 | + end addVarArgsForwarder |
295 | 313 |
|
296 | 314 | /** Convert type from Scala to Java varargs method */ |
297 | 315 | private def toJavaVarArgs(tp: Type)(using Context): Type = tp match |
|
0 commit comments