diff options
author | odersky <odersky@gmail.com> | 2017-03-12 16:51:42 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-03-12 16:51:42 +0100 |
commit | a886727f0fc4dae7f7db67ae7577d85cca567ba9 (patch) | |
tree | d630c03a85c1d2086b8617b2a4af35a5e8a264cf /compiler | |
parent | d1f2ef434befc7c96b26d62bd43cd4892228d818 (diff) | |
parent | 568b1e71d3767827e4a61cd93736ae3b318a6dce (diff) | |
download | dotty-a886727f0fc4dae7f7db67ae7577d85cca567ba9.tar.gz dotty-a886727f0fc4dae7f7db67ae7577d85cca567ba9.tar.bz2 dotty-a886727f0fc4dae7f7db67ae7577d85cca567ba9.zip |
Merge pull request #2076 from dotty-staging/fix/override-java-varargs
Fix overriding a Java method with varargs
Diffstat (limited to 'compiler')
-rw-r--r-- | compiler/src/dotty/tools/dotc/Compiler.scala | 4 | ||||
-rw-r--r-- | compiler/src/dotty/tools/dotc/transform/ElimRepeated.scala | 21 | ||||
-rw-r--r-- | compiler/src/dotty/tools/dotc/typer/RefChecks.scala | 3 |
3 files changed, 22 insertions, 6 deletions
diff --git a/compiler/src/dotty/tools/dotc/Compiler.scala b/compiler/src/dotty/tools/dotc/Compiler.scala index 1d319242b..f413fc902 100644 --- a/compiler/src/dotty/tools/dotc/Compiler.scala +++ b/compiler/src/dotty/tools/dotc/Compiler.scala @@ -48,9 +48,9 @@ class Compiler { List(new Pickler), // Generate TASTY info List(new FirstTransform, // Some transformations to put trees into a canonical form new CheckReentrant), // Internal use only: Check that compiled program has no data races involving global vars - List(new RefChecks, // Various checks mostly related to abstract members and overriding - new CheckStatic, // Check restrictions that apply to @static members + List(new CheckStatic, // Check restrictions that apply to @static members new ElimRepeated, // Rewrite vararg parameters and arguments + new RefChecks, // Various checks mostly related to abstract members and overriding new NormalizeFlags, // Rewrite some definition flags new ExtensionMethods, // Expand methods of value classes with extension methods new ExpandSAMs, // Expand single abstract method closures to anonymous classes diff --git a/compiler/src/dotty/tools/dotc/transform/ElimRepeated.scala b/compiler/src/dotty/tools/dotc/transform/ElimRepeated.scala index 258b7f234..d955628e3 100644 --- a/compiler/src/dotty/tools/dotc/transform/ElimRepeated.scala +++ b/compiler/src/dotty/tools/dotc/transform/ElimRepeated.scala @@ -32,8 +32,21 @@ class ElimRepeated extends MiniPhaseTransform with InfoTransformer with Annotati def transformInfo(tp: Type, sym: Symbol)(implicit ctx: Context): Type = elimRepeated(tp) + + override def transform(ref: SingleDenotation)(implicit ctx: Context): SingleDenotation = + super.transform(ref) match { + case ref1: SymDenotation if (ref1 ne ref) && overridesJava(ref1.symbol) => + // This method won't override the corresponding Java method at the end of this phase, + // only the bridge added by `addVarArgsBridge` will. + ref1.copySymDenotation(initFlags = ref1.flags &~ Override) + case ref1 => + ref1 + } + override def mayChange(sym: Symbol)(implicit ctx: Context): Boolean = sym is Method + private def overridesJava(sym: Symbol)(implicit ctx: Context) = sym.allOverriddenSymbols.exists(_ is JavaDefined) + private def elimRepeated(tp: Type)(implicit ctx: Context): Type = tp.stripTypeVar match { case tp @ MethodType(paramNames, paramTypes) => val resultType1 = elimRepeated(tp.resultType) @@ -93,10 +106,9 @@ class ElimRepeated extends MiniPhaseTransform with InfoTransformer with Annotati */ override def transformDefDef(tree: DefDef)(implicit ctx: Context, info: TransformerInfo): Tree = { assert(ctx.phase == thisTransformer) - def overridesJava = tree.symbol.allOverriddenSymbols.exists(_ is JavaDefined) - if (tree.symbol.info.isVarArgsMethod && overridesJava) - addVarArgsBridge(tree)(ctx.withPhase(thisTransformer.next)) - else + if (tree.symbol.info.isVarArgsMethod && overridesJava(tree.symbol)) + addVarArgsBridge(tree) + else tree } @@ -120,6 +132,7 @@ class ElimRepeated extends MiniPhaseTransform with InfoTransformer with Annotati .appliedToArgs(vrefs :+ TreeGen.wrapArray(varArgRef, elemtp)) .appliedToArgss(vrefss1) }) + Thicket(ddef, bridgeDef) } diff --git a/compiler/src/dotty/tools/dotc/typer/RefChecks.scala b/compiler/src/dotty/tools/dotc/typer/RefChecks.scala index 23d05e087..e8ff7d572 100644 --- a/compiler/src/dotty/tools/dotc/typer/RefChecks.scala +++ b/compiler/src/dotty/tools/dotc/typer/RefChecks.scala @@ -766,6 +766,9 @@ class RefChecks extends MiniPhase { thisTransformer => override def phaseName: String = "refchecks" + // Needs to run after ElimRepeated for override checks involving varargs methods + override def runsAfter = Set(classOf[ElimRepeated]) + val treeTransform = new Transform(NoLevelInfo) class Transform(currentLevel: RefChecks.OptLevelInfo = RefChecks.NoLevelInfo) extends TreeTransform { |