aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Liam Miller-Cushon <cushon@google.com>2016-03-29 19:04:16 +0000
committerGravatar Klaus Aehlig <aehlig@google.com>2016-03-30 08:15:01 +0000
commit9c3e23fddac77489922cc0d0fe9cd3b5b17471da (patch)
treed7dc3f5ce122d7de96a56bba7613afbb158a2dca
parentcadba0c2e44fe7895083b8b72ff6ce4a351772b5 (diff)
Don't prune qualified super constructors invocations in chained constructors
-- MOS_MIGRATED_REVID=118488791
-rw-r--r--src/java_tools/buildjar/java/com/google/devtools/build/java/turbine/javac/TreePruner.java16
-rw-r--r--src/java_tools/buildjar/javatests/com/google/devtools/build/java/turbine/javac/TreePrunerTest.java27
2 files changed, 39 insertions, 4 deletions
diff --git a/src/java_tools/buildjar/java/com/google/devtools/build/java/turbine/javac/TreePruner.java b/src/java_tools/buildjar/java/com/google/devtools/build/java/turbine/javac/TreePruner.java
index b25d4e79ea..1e6acea1b6 100644
--- a/src/java_tools/buildjar/java/com/google/devtools/build/java/turbine/javac/TreePruner.java
+++ b/src/java_tools/buildjar/java/com/google/devtools/build/java/turbine/javac/TreePruner.java
@@ -32,6 +32,7 @@ import com.sun.tools.javac.tree.JCTree.JCBlock;
import com.sun.tools.javac.tree.JCTree.JCClassDecl;
import com.sun.tools.javac.tree.JCTree.JCExpression;
import com.sun.tools.javac.tree.JCTree.JCExpressionStatement;
+import com.sun.tools.javac.tree.JCTree.JCFieldAccess;
import com.sun.tools.javac.tree.JCTree.JCIdent;
import com.sun.tools.javac.tree.JCTree.JCMethodDecl;
import com.sun.tools.javac.tree.JCTree.JCMethodInvocation;
@@ -126,11 +127,18 @@ public class TreePruner {
if (expr.getKind() != Kind.METHOD_INVOCATION) {
return false;
}
- JCExpression select = ((JCMethodInvocation) expr).getMethodSelect();
- if (select.getKind() != Kind.IDENTIFIER) {
- return false;
+ JCExpression method = ((JCMethodInvocation) expr).getMethodSelect();
+ Name name;
+ switch (method.getKind()) {
+ case IDENTIFIER:
+ name = ((JCIdent) method).getName();
+ break;
+ case MEMBER_SELECT:
+ name = ((JCFieldAccess) method).getIdentifier();
+ break;
+ default:
+ return false;
}
- Name name = ((JCIdent) select).getName();
return name.contentEquals("this") || name.contentEquals("super");
}
diff --git a/src/java_tools/buildjar/javatests/com/google/devtools/build/java/turbine/javac/TreePrunerTest.java b/src/java_tools/buildjar/javatests/com/google/devtools/build/java/turbine/javac/TreePrunerTest.java
index 9cd3acb6c5..5f3962b9ad 100644
--- a/src/java_tools/buildjar/javatests/com/google/devtools/build/java/turbine/javac/TreePrunerTest.java
+++ b/src/java_tools/buildjar/javatests/com/google/devtools/build/java/turbine/javac/TreePrunerTest.java
@@ -305,4 +305,31 @@ public class TreePrunerTest {
private String prettyPrint(JCCompilationUnit tree) {
return tree.toString().trim();
}
+
+ @Test
+ public void qualifiedSuperConstructorChaining() {
+ String[] lines = {
+ "class Test {",
+ " class Inner {",
+ " Inner(OuterInstance outer) {",
+ " outer.super();",
+ " }",
+ " }",
+ "}",
+ };
+ JCCompilationUnit tree = parseLines(lines);
+ TreePruner.prune(tree);
+ String[] expected = {
+ "class Test {",
+ " ",
+ " class Inner {",
+ " ",
+ " Inner(OuterInstance outer) {",
+ " outer.super();",
+ " }",
+ " }",
+ "}",
+ };
+ assertThat(prettyPrint(tree)).isEqualTo(Joiner.on('\n').join(expected));
+ }
}