From 2b9e2e90380f9c417888e7242b6ac93dae368e34 Mon Sep 17 00:00:00 2001 From: Matherey Nunez Date: Wed, 7 Dec 2011 10:47:46 -0800 Subject: [PATCH 1/4] 7086015: fix test/tools/javac/parser/netbeans/JavacParserTest.java Reviewed-by: ksrini, jjg --- .../parser/netbeans/JavacParserTest.java | 209 ++++++++++++++++-- 1 file changed, 186 insertions(+), 23 deletions(-) diff --git a/langtools/test/tools/javac/parser/netbeans/JavacParserTest.java b/langtools/test/tools/javac/parser/netbeans/JavacParserTest.java index 79ce2132d02..264e2de15ad 100644 --- a/langtools/test/tools/javac/parser/netbeans/JavacParserTest.java +++ b/langtools/test/tools/javac/parser/netbeans/JavacParserTest.java @@ -32,6 +32,7 @@ import com.sun.source.tree.BinaryTree; import com.sun.source.tree.BlockTree; import com.sun.source.tree.ClassTree; import com.sun.source.tree.CompilationUnitTree; +import com.sun.source.tree.ErroneousTree; import com.sun.source.tree.ExpressionStatementTree; import com.sun.source.tree.ExpressionTree; import com.sun.source.tree.MethodInvocationTree; @@ -49,6 +50,7 @@ import com.sun.tools.javac.api.JavacTaskImpl; import com.sun.tools.javac.tree.JCTree; import java.io.IOException; import java.net.URI; +import java.util.ArrayList; import java.util.Arrays; import java.util.LinkedList; import java.util.List; @@ -82,6 +84,30 @@ public class JavacParserTest extends TestCase { } } + public CompilationUnitTree getCompilationUnitTree(String code) throws IOException { + + JavacTaskImpl ct = (JavacTaskImpl) tool.getTask(null, null, null, null, + null, Arrays.asList(new MyFileObject(code))); + CompilationUnitTree cut = ct.parse().iterator().next(); + return cut; + } + + public List getErroneousTreeValues(ErroneousTree node) { + + List values = new ArrayList<>(); + + if (node.getErrorTrees() != null) { + + for (Tree t : node.getErrorTrees()) { + values.add(t.toString()); + } + } else { + throw new RuntimeException("ERROR: No Erroneous tree " + + "has been created."); + } + return values; + } + public void testPositionForSuperConstructorCalls() throws IOException { assert tool != null; @@ -97,22 +123,28 @@ public class JavacParserTest extends TestCase { ExpressionStatementTree es = (ExpressionStatementTree) method.getBody().getStatements().get(0); + final int esStartPos = code.indexOf(es.toString()); + final int esEndPos = esStartPos + es.toString().length(); assertEquals("testPositionForSuperConstructorCalls", - 72 - 24, pos.getStartPosition(cut, es)); + esStartPos, pos.getStartPosition(cut, es)); assertEquals("testPositionForSuperConstructorCalls", - 80 - 24, pos.getEndPosition(cut, es)); + esEndPos, pos.getEndPosition(cut, es)); MethodInvocationTree mit = (MethodInvocationTree) es.getExpression(); + final int mitStartPos = code.indexOf(mit.toString()); + final int mitEndPos = mitStartPos + mit.toString().length(); assertEquals("testPositionForSuperConstructorCalls", - 72 - 24, pos.getStartPosition(cut, mit)); + mitStartPos, pos.getStartPosition(cut, mit)); assertEquals("testPositionForSuperConstructorCalls", - 79 - 24, pos.getEndPosition(cut, mit)); + mitEndPos, pos.getEndPosition(cut, mit)); + final int methodStartPos = mitStartPos; + final int methodEndPos = methodStartPos + mit.getMethodSelect().toString().length(); assertEquals("testPositionForSuperConstructorCalls", - 72 - 24, pos.getStartPosition(cut, mit.getMethodSelect())); + methodStartPos, pos.getStartPosition(cut, mit.getMethodSelect())); assertEquals("testPositionForSuperConstructorCalls", - 77 - 24, pos.getEndPosition(cut, mit.getMethodSelect())); + methodEndPos, pos.getEndPosition(cut, mit.getMethodSelect())); } @@ -158,24 +190,21 @@ public class JavacParserTest extends TestCase { public void testPreferredPositionForBinaryOp() throws IOException { - String code = "package test; public class Test {" + - "private void test() {" + - "Object o = null; boolean b = o != null && o instanceof String;" + - "} private Test() {}}"; - - JavacTaskImpl ct = (JavacTaskImpl) tool.getTask(null, null, null, null, - null, Arrays.asList(new MyFileObject(code))); - CompilationUnitTree cut = ct.parse().iterator().next(); + String code = "package test; public class Test {" + + "private void test() {" + + "Object o = null; boolean b = o != null && o instanceof String;" + + "} private Test() {}}"; + CompilationUnitTree cut = getCompilationUnitTree(code); ClassTree clazz = (ClassTree) cut.getTypeDecls().get(0); MethodTree method = (MethodTree) clazz.getMembers().get(0); VariableTree condSt = (VariableTree) method.getBody().getStatements().get(1); BinaryTree cond = (BinaryTree) condSt.getInitializer(); JCTree condJC = (JCTree) cond; - - assertEquals("testNewClassWithEnclosing", - 117 - 24, condJC.pos); + int condStartPos = code.indexOf("&&"); + assertEquals("testPreferredPositionForBinaryOp", + condStartPos, condJC.pos); } public void testPositionBrokenSource126732a() throws IOException { @@ -599,9 +628,7 @@ public class JavacParserTest extends TestCase { final String code = "package t; class Test { " + "{ try (java.io.InputStream in = null) { } } }"; - JavacTaskImpl ct = (JavacTaskImpl) tool.getTask(null, null, null, null, - null, Arrays.asList(new MyFileObject(code))); - CompilationUnitTree cut = ct.parse().iterator().next(); + CompilationUnitTree cut = getCompilationUnitTree(code); new TreeScanner() { @Override @@ -622,9 +649,7 @@ public class JavacParserTest extends TestCase { final String code = "package t; class Test { " + "{ java.io.InputStream in = null; } }"; - JavacTaskImpl ct = (JavacTaskImpl) tool.getTask(null, null, null, null, - null, Arrays.asList(new MyFileObject(code))); - CompilationUnitTree cut = ct.parse().iterator().next(); + CompilationUnitTree cut = getCompilationUnitTree(code); new TreeScanner() { @@ -640,6 +665,138 @@ public class JavacParserTest extends TestCase { }.scan(cut, null); } + // expected erroneous tree: int x = y;(ERROR); + public void testOperatorMissingError() throws IOException { + + String code = "package test; public class ErrorTest { " + + "void method() { int x = y z } }"; + CompilationUnitTree cut = getCompilationUnitTree(code); + final List values = new ArrayList<>(); + final List expectedValues = + new ArrayList<>(Arrays.asList("[z]")); + + new TreeScanner() { + + @Override + public Void visitErroneous(ErroneousTree node, Void p) { + + values.add(getErroneousTreeValues(node).toString()); + return null; + + } + }.scan(cut, null); + + assertEquals("testSwitchError: The Erroneous tree " + + "error values: " + values + + " do not match expected error values: " + + expectedValues, values, expectedValues); + } + + //expected erroneous tree: String s = (ERROR); + public void testMissingParenthesisError() throws IOException { + + String code = "package test; public class ErrorTest { " + + "void f() {String s = new String; } }"; + CompilationUnitTree cut = getCompilationUnitTree(code); + final List values = new ArrayList<>(); + final List expectedValues = + new ArrayList<>(Arrays.asList("[new String()]")); + + new TreeScanner() { + + @Override + public Void visitErroneous(ErroneousTree node, Void p) { + + values.add(getErroneousTreeValues(node).toString()); + return null; + } + }.scan(cut, null); + + assertEquals("testSwitchError: The Erroneous tree " + + "error values: " + values + + " do not match expected error values: " + + expectedValues, values, expectedValues); + } + + //expected erroneous tree: package test; (ERROR)(ERROR) + public void testMissingClassError() throws IOException { + + String code = "package Test; clas ErrorTest { " + + "void f() {String s = new String(); } }"; + CompilationUnitTree cut = getCompilationUnitTree(code); + final List values = new ArrayList<>(); + final List expectedValues = + new ArrayList<>(Arrays.asList("[, clas]", "[]")); + + new TreeScanner() { + + @Override + public Void visitErroneous(ErroneousTree node, Void p) { + + values.add(getErroneousTreeValues(node).toString()); + return null; + } + }.scan(cut, null); + + assertEquals("testSwitchError: The Erroneous tree " + + "error values: " + values + + " do not match expected error values: " + + expectedValues, values, expectedValues); + } + + //expected erroneous tree: void m1(int i) {(ERROR);{(ERROR);} + public void testSwitchError() throws IOException { + + String code = "package test; public class ErrorTest { " + + "int numDays; void m1(int i) { switchh {i} { case 1: " + + "numDays = 31; break; } } }"; + CompilationUnitTree cut = getCompilationUnitTree(code); + final List values = new ArrayList<>(); + final List expectedValues = + new ArrayList<>(Arrays.asList("[switchh]", "[i]")); + + new TreeScanner() { + + @Override + public Void visitErroneous(ErroneousTree node, Void p) { + + values.add(getErroneousTreeValues(node).toString()); + return null; + } + }.scan(cut, null); + + assertEquals("testSwitchError: The Erroneous tree " + + "error values: " + values + + " do not match expected error values: " + + expectedValues, values, expectedValues); + } + + //expected erroneous tree: class ErrorTest {(ERROR) + public void testMethodError() throws IOException { + + String code = "package Test; class ErrorTest { " + + "static final void f) {String s = new String(); } }"; + CompilationUnitTree cut = getCompilationUnitTree(code); + final List values = new ArrayList<>(); + final List expectedValues = + new ArrayList<>(Arrays.asList("[\nstatic final void f();]")); + + new TreeScanner() { + + @Override + public Void visitErroneous(ErroneousTree node, Void p) { + + values.add(getErroneousTreeValues(node).toString()); + return null; + } + }.scan(cut, null); + + assertEquals("testMethodError: The Erroneous tree " + + "error value: " + values + + " does not match expected error values: " + + expectedValues, values, expectedValues); + } + void testsNotWorking() throws IOException { // Fails with nb-javac, needs further investigation @@ -661,7 +818,13 @@ public class JavacParserTest extends TestCase { testStartPositionForMethodWithoutModifiers(); testVarPos(); testVariableInIfThen3(); + testMissingExponent(); testTryResourcePos(); + testOperatorMissingError(); + testMissingParenthesisError(); + testMissingClassError(); + testSwitchError(); + testMethodError(); } public static void main(String... args) throws IOException { From 7beeeca1de07cca7212592b5e18190552a9c9a57 Mon Sep 17 00:00:00 2001 From: Jan Lahoda Date: Fri, 9 Dec 2011 08:40:40 -0800 Subject: [PATCH 2/4] 7119032: (javac) increase visibility of JavacParser methods to improve subtyping Reviewed-by: jjg --- .../classes/com/sun/tools/javac/parser/JavacParser.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/langtools/src/share/classes/com/sun/tools/javac/parser/JavacParser.java b/langtools/src/share/classes/com/sun/tools/javac/parser/JavacParser.java index 8903acb5d3a..fb98137708c 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/parser/JavacParser.java +++ b/langtools/src/share/classes/com/sun/tools/javac/parser/JavacParser.java @@ -2604,7 +2604,7 @@ public class JavacParser implements Parser { * @param mods The modifiers starting the class declaration * @param dc The documentation comment for the class, or null. */ - JCClassDecl classDeclaration(JCModifiers mods, String dc) { + protected JCClassDecl classDeclaration(JCModifiers mods, String dc) { int pos = token.pos; accept(CLASS); Name name = ident(); @@ -2633,7 +2633,7 @@ public class JavacParser implements Parser { * @param mods The modifiers starting the interface declaration * @param dc The documentation comment for the interface, or null. */ - JCClassDecl interfaceDeclaration(JCModifiers mods, String dc) { + protected JCClassDecl interfaceDeclaration(JCModifiers mods, String dc) { int pos = token.pos; accept(INTERFACE); Name name = ident(); @@ -2656,7 +2656,7 @@ public class JavacParser implements Parser { * @param mods The modifiers starting the enum declaration * @param dc The documentation comment for the enum, or null. */ - JCClassDecl enumDeclaration(JCModifiers mods, String dc) { + protected JCClassDecl enumDeclaration(JCModifiers mods, String dc) { int pos = token.pos; accept(ENUM); Name name = ident(); @@ -2878,7 +2878,7 @@ public class JavacParser implements Parser { * ConstructorDeclaratorRest = * "(" FormalParameterListOpt ")" [THROWS TypeList] MethodBody */ - JCTree methodDeclaratorRest(int pos, + protected JCTree methodDeclaratorRest(int pos, JCModifiers mods, JCExpression type, Name name, From d7cfaf1336c4a76673885fc616de05cbfb469185 Mon Sep 17 00:00:00 2001 From: Kumar Srinivasan Date: Sat, 10 Dec 2011 17:44:46 -0800 Subject: [PATCH 3/4] 7119487: JavacParserTest.java test fails on Windows platforms Reviewed-by: jjg --- .../javac/parser/{netbeans => }/JavacParserTest.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) rename langtools/test/tools/javac/parser/{netbeans => }/JavacParserTest.java (99%) diff --git a/langtools/test/tools/javac/parser/netbeans/JavacParserTest.java b/langtools/test/tools/javac/parser/JavacParserTest.java similarity index 99% rename from langtools/test/tools/javac/parser/netbeans/JavacParserTest.java rename to langtools/test/tools/javac/parser/JavacParserTest.java index 264e2de15ad..7cfd0070ab8 100644 --- a/langtools/test/tools/javac/parser/netbeans/JavacParserTest.java +++ b/langtools/test/tools/javac/parser/JavacParserTest.java @@ -25,7 +25,7 @@ * @test * @bug 7073631 * @summary tests error and diagnostics positions - * @author jan.lahoda@oracle.com + * @author Jan Lahoda */ import com.sun.source.tree.BinaryTree; @@ -83,6 +83,12 @@ public class JavacParserTest extends TestCase { return text; } } + /* + * converts Windows to Unix style LFs for comparing strings + */ + private String normalize(String in) { + return in.replace(System.getProperty("line.separator"), "\n"); + } public CompilationUnitTree getCompilationUnitTree(String code) throws IOException { @@ -95,9 +101,7 @@ public class JavacParserTest extends TestCase { public List getErroneousTreeValues(ErroneousTree node) { List values = new ArrayList<>(); - if (node.getErrorTrees() != null) { - for (Tree t : node.getErrorTrees()) { values.add(t.toString()); } @@ -786,7 +790,7 @@ public class JavacParserTest extends TestCase { @Override public Void visitErroneous(ErroneousTree node, Void p) { - values.add(getErroneousTreeValues(node).toString()); + values.add(normalize(getErroneousTreeValues(node).toString())); return null; } }.scan(cut, null); From bf0106a903d5c837eb3cab91922ee5cf26bf2afd Mon Sep 17 00:00:00 2001 From: Maurizio Cimadamore Date: Sun, 11 Dec 2011 17:48:25 +0000 Subject: [PATCH 4/4] 7120266: javac fails to compile hotspot code Parser changes for method references cause bad intercation with method call syntax Reviewed-by: jjg --- .../sun/tools/javac/parser/JavacParser.java | 86 +++++++++---------- langtools/test/tools/javac/T7120266.java | 34 ++++++++ .../lambda/MethodReferenceParserTest.java | 1 + 3 files changed, 78 insertions(+), 43 deletions(-) create mode 100644 langtools/test/tools/javac/T7120266.java diff --git a/langtools/src/share/classes/com/sun/tools/javac/parser/JavacParser.java b/langtools/src/share/classes/com/sun/tools/javac/parser/JavacParser.java index fb98137708c..81d6680b11f 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/parser/JavacParser.java +++ b/langtools/src/share/classes/com/sun/tools/javac/parser/JavacParser.java @@ -1143,49 +1143,49 @@ public class JavacParser implements Parser { // typeArgs saved for next loop iteration. t = toP(F.at(pos).Select(t, ident())); break; - case LT: - if ((mode & (TYPE | NOPARAMS)) == 0) { - //could be an unbound method reference whose qualifier - //is a generic type i.e. A#m - mode = EXPR | TYPE; - JCTree.Tag op = JCTree.Tag.LT; - int pos1 = token.pos; - nextToken(); - mode |= EXPR | TYPE | TYPEARG; - JCExpression t1 = term3(); - if ((mode & TYPE) != 0 && - (token.kind == COMMA || token.kind == GT)) { - mode = TYPE; - ListBuffer args = new ListBuffer(); - args.append(t1); - while (token.kind == COMMA) { - nextToken(); - args.append(typeArgument()); - } - accept(GT); - t = toP(F.at(pos1).TypeApply(t, args.toList())); - checkGenerics(); - while (token.kind == DOT) { - nextToken(); - mode = TYPE; - t = toP(F.at(token.pos).Select(t, ident())); - t = typeArgumentsOpt(t); - } - if (token.kind != HASH) { - //method reference expected here - t = illegal(); - } - mode = EXPR; - break; - } else if ((mode & EXPR) != 0) { - //rollback - it was a binary expression - mode = EXPR; - JCExpression e = term2Rest(t1, TreeInfo.shiftPrec); - t = F.at(pos1).Binary(op, t, e); - t = termRest(term1Rest(term2Rest(t, TreeInfo.orPrec))); - } - } - break loop; +// case LT: +// if ((mode & (TYPE | NOPARAMS)) == 0) { +// //could be an unbound method reference whose qualifier +// //is a generic type i.e. A#m +// mode = EXPR | TYPE; +// JCTree.Tag op = JCTree.Tag.LT; +// int pos1 = token.pos; +// nextToken(); +// mode |= EXPR | TYPE | TYPEARG; +// JCExpression t1 = term3(); +// if ((mode & TYPE) != 0 && +// (token.kind == COMMA || token.kind == GT)) { +// mode = TYPE; +// ListBuffer args = new ListBuffer(); +// args.append(t1); +// while (token.kind == COMMA) { +// nextToken(); +// args.append(typeArgument()); +// } +// accept(GT); +// t = toP(F.at(pos1).TypeApply(t, args.toList())); +// checkGenerics(); +// while (token.kind == DOT) { +// nextToken(); +// mode = TYPE; +// t = toP(F.at(token.pos).Select(t, ident())); +// t = typeArgumentsOpt(t); +// } +// if (token.kind != HASH) { +// //method reference expected here +// t = illegal(); +// } +// mode = EXPR; +// break; +// } else if ((mode & EXPR) != 0) { +// //rollback - it was a binary expression +// mode = EXPR; +// JCExpression e = term2Rest(t1, TreeInfo.shiftPrec); +// t = F.at(pos1).Binary(op, t, e); +// t = termRest(term1Rest(term2Rest(t, TreeInfo.orPrec))); +// } +// } +// break loop; default: break loop; } diff --git a/langtools/test/tools/javac/T7120266.java b/langtools/test/tools/javac/T7120266.java new file mode 100644 index 00000000000..f33db025bfc --- /dev/null +++ b/langtools/test/tools/javac/T7120266.java @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 7120266 + * @summary javac fails to compile hotspot code + * @compile T7120266.java + */ + +class T7120266 { + void test(int i, int len) { that(i < len, "oopmap"); } + void that(boolean b, String s) { }; +} diff --git a/langtools/test/tools/javac/lambda/MethodReferenceParserTest.java b/langtools/test/tools/javac/lambda/MethodReferenceParserTest.java index 0455820063b..00f7f33923d 100644 --- a/langtools/test/tools/javac/lambda/MethodReferenceParserTest.java +++ b/langtools/test/tools/javac/lambda/MethodReferenceParserTest.java @@ -24,6 +24,7 @@ /* * @test * @bug 7115052 + * @ignore 7120266 * @summary Add parser support for method references */