aboutsummaryrefslogtreecommitdiff
path: root/compiler/src
diff options
context:
space:
mode:
authorodersky <odersky@gmail.com>2017-03-12 16:51:42 +0100
committerGitHub <noreply@github.com>2017-03-12 16:51:42 +0100
commita886727f0fc4dae7f7db67ae7577d85cca567ba9 (patch)
treed630c03a85c1d2086b8617b2a4af35a5e8a264cf /compiler/src
parentd1f2ef434befc7c96b26d62bd43cd4892228d818 (diff)
parent568b1e71d3767827e4a61cd93736ae3b318a6dce (diff)
downloaddotty-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/src')
-rw-r--r--compiler/src/dotty/tools/dotc/Compiler.scala4
-rw-r--r--compiler/src/dotty/tools/dotc/transform/ElimRepeated.scala21
-rw-r--r--compiler/src/dotty/tools/dotc/typer/RefChecks.scala3
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 {