From 33ef7c63f10782c148dc75475c917a925ae73baa Mon Sep 17 00:00:00 2001 From: Vineet Reynolds Date: Wed, 7 Aug 2013 20:39:41 +0530 Subject: [PATCH] FORGE-1096 Fixed spurious ArrayIndexOutOfBoundsException. The exception was thrown on rewriting the CompilationUnit, and was most likely caused due to use of a lower source level. Setting the source level to 1.7 gets rid of the exception. --- .../parser/java/impl/AbstractJavaSource.java | 9 +++++++- .../java/JavaSourceCompatibilityTest.java | 21 +++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/impl/src/main/java/org/jboss/forge/parser/java/impl/AbstractJavaSource.java b/impl/src/main/java/org/jboss/forge/parser/java/impl/AbstractJavaSource.java index 8942be0c..decde2ed 100644 --- a/impl/src/main/java/org/jboss/forge/parser/java/impl/AbstractJavaSource.java +++ b/impl/src/main/java/org/jboss/forge/parser/java/impl/AbstractJavaSource.java @@ -9,8 +9,10 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Map; import java.util.ServiceLoader; +import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.compiler.IProblem; import org.eclipse.jdt.core.dom.ASTNode; import org.eclipse.jdt.core.dom.AbstractTypeDeclaration; @@ -23,6 +25,7 @@ import org.eclipse.jdt.core.dom.PackageDeclaration; import org.eclipse.jdt.core.dom.Type; import org.eclipse.jdt.core.dom.TypeDeclaration; +import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; import org.eclipse.jface.text.Document; import org.eclipse.text.edits.TextEdit; import org.jboss.forge.parser.JavaParser; @@ -622,7 +625,11 @@ public String toString() try { - TextEdit edit = unit.rewrite(document, null); + @SuppressWarnings("rawtypes") + Map options = JavaCore.getOptions(); + options.put(CompilerOptions.OPTION_Source, CompilerOptions.VERSION_1_7); + options.put(CompilerOptions.OPTION_Encoding, "UTF-8"); + TextEdit edit = unit.rewrite(document, options); edit.apply(document); } catch (Exception e) diff --git a/impl/src/test/java/org/jboss/forge/test/parser/java/JavaSourceCompatibilityTest.java b/impl/src/test/java/org/jboss/forge/test/parser/java/JavaSourceCompatibilityTest.java index 3a5990f4..1970eada 100644 --- a/impl/src/test/java/org/jboss/forge/test/parser/java/JavaSourceCompatibilityTest.java +++ b/impl/src/test/java/org/jboss/forge/test/parser/java/JavaSourceCompatibilityTest.java @@ -13,6 +13,7 @@ public void testSupportsGenericsSource() throws Exception { JavaSource source = JavaParser.parse("public class Test{public void test() {java.util.List s = new java.util.ArrayList(); for (String item : s){}}}"); Assert.assertFalse(source.hasSyntaxErrors()); } + @Test public void testSupportsGenericsSourceFromConstructor() throws Exception { JavaSource source = JavaParser.parse("public class Test{public Test() {java.util.List s = new java.util.ArrayList(); for (String item : s){}}}"); @@ -25,4 +26,24 @@ public void testSupportsGenericsSourceFromMethod() throws Exception { source.addMethod("public void test() {java.util.List s = new java.util.ArrayList(); for (String item : s){}}"); Assert.assertFalse(source.hasSyntaxErrors()); } + + @Test + public void testSupportsGenericsSourceFromAddedConstructor() throws Exception { + JavaClass source = JavaParser.parse(JavaClass.class, "public class Test{}"); + // Add a new method to get JDT to recognize the new ASTs + source.addMethod().setConstructor(true).setBody("java.util.List s = new java.util.ArrayList(); for (String item : s){}"); + // Forces a rewrite to happen via AbstractJavaSource + source.toString(); + Assert.assertFalse(source.hasSyntaxErrors()); + } + + @Test + public void testSupportsGenericsSourceFromAddedMethod() throws Exception { + JavaClass source = JavaParser.parse(JavaClass.class, "public class Test{}"); + // Add a new method to get JDT to recognize the new ASTs + source.addMethod().setName("test").setBody("java.util.List s = new java.util.ArrayList(); for (String item : s){}"); + // Forces a rewrite to happen via AbstractJavaSource + source.toString(); + Assert.assertFalse(source.hasSyntaxErrors()); + } }