|
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