summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormikaelpeltier <mikaelpeltier@google.com>2015-04-08 13:11:31 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2015-04-08 13:11:32 +0000
commite8b47c365059d925517fc830828f5dcd9f4d2078 (patch)
treea7dd61b22f0cca2536dd2375293005f3b09b9fd9
parent1f97da0c733c6a525a8bd7b0f6a8325ce671586f (diff)
parent81861fd04ba4863b321de26c0852575fa7f173c3 (diff)
downloadtoolchain_jack-e8b47c365059d925517fc830828f5dcd9f4d2078.tar.gz
toolchain_jack-e8b47c365059d925517fc830828f5dcd9f4d2078.tar.bz2
toolchain_jack-e8b47c365059d925517fc830828f5dcd9f4d2078.zip
Merge "Fix bug into Java parser" into ub-jack
-rw-r--r--build.xml4
-rw-r--r--jack-tests/.classpath2
-rw-r--r--jack-tests/tests/com/android/jack/AllTests.java2
-rw-r--r--jack-tests/tests/com/android/jack/frontend/ParserTest.java73
-rw-r--r--jack-tests/tests/com/android/jack/frontend/test005/jack/A.java31
-rw-r--r--jack-tests/tests/com/android/jack/frontend/test005/jack/B.java34
-rw-r--r--jack-tests/tests/com/android/jack/frontend/test006/jack/A.java32
-rw-r--r--jack-tests/tests/com/android/jack/frontend/test006/jack/B.java34
-rw-r--r--jack/src/com/android/jack/frontend/java/JavaParser.java28
-rw-r--r--jack/src/com/android/jack/incremental/CommonFilter.java2
-rw-r--r--jack/tests/com/android/jack/frontend/OrderedInputFilter.java117
11 files changed, 357 insertions, 2 deletions
diff --git a/build.xml b/build.xml
index b4243095..ad4626c1 100644
--- a/build.xml
+++ b/build.xml
@@ -647,6 +647,8 @@
<exclude name="com/android/jack/java7/parser/**"/>
<exclude name="com/android/jack/jarjar/test003/dontcompile/**"/>
<exclude name="com/android/jack/lookup/test001/liboverride/**"/>
+ <exclude name="com/android/jack/frontend/test005/jack/**"/>
+ <exclude name="com/android/jack/frontend/test006/jack/**"/>
<exclude name="com/android/jack/frontend/test007/**"/>
</fileset>
</sources>
@@ -680,6 +682,8 @@
<exclude name="com/android/jack/java7/parser/**"/>
<exclude name="com/android/jack/jarjar/test003/dontcompile/**"/>
<exclude name="com/android/jack/lookup/test001/liboverride/**"/>
+ <exclude name="com/android/jack/frontend/test005/jack/**"/>
+ <exclude name="com/android/jack/frontend/test006/jack/**"/>
<exclude name="com/android/jack/frontend/test007/**"/>
<classpath>
<filelist dir="/">
diff --git a/jack-tests/.classpath b/jack-tests/.classpath
index 5aba46e5..9de67f42 100644
--- a/jack-tests/.classpath
+++ b/jack-tests/.classpath
@@ -2,7 +2,7 @@
<classpath>
<classpathentry kind="src" path="src"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
- <classpathentry excluding="com/android/jack/classpath/test002/lib1override/|com/android/jack/compiletime/test*/**|com/android/jack/enums/test003/link/Other.java|com/android/jack/enums/test003/link/Values.java|com/android/jack/error/test001/jack/A.java|com/android/jack/error/test002/jack/A.java|com/android/jack/jarjar/test003/dontcompile/|com/android/jack/java7/boxing/|com/android/jack/java7/exceptions/|com/android/jack/java7/parser/|com/android/jack/java7/switches/|com/android/jack/java7/trywithresources/|com/android/jack/lookup/test001/liboverride/|com/android/jack/nopackage/test*/**|com/android/jack/frontend/test002/jack/PackageName/ClassInConflictingPackage.java|com/android/jack/frontend/test007/jack/|com/android/jack/frontend/test007/jackduplicate/|com/android/jack/frontend/test008/jack/NoOuterContext.java|com/android/jack/frontend/test010/jack/UnusedLocalVar.java|com/android/jack/frontend/test013/jack/ExtendingInnerOnly.java|com/android/jack/frontend/test014/jack/ExtendingInnerInStaticContext.java|com/android/jack/frontend/test015/jack/WithOuterContextButStatic.java" kind="src" path="tests"/>
+ <classpathentry excluding="com/android/jack/classpath/test002/lib1override/|com/android/jack/compiletime/test*/**|com/android/jack/enums/test003/link/Other.java|com/android/jack/enums/test003/link/Values.java|com/android/jack/error/test001/jack/A.java|com/android/jack/error/test002/jack/A.java|com/android/jack/jarjar/test003/dontcompile/|com/android/jack/java7/boxing/|com/android/jack/java7/exceptions/|com/android/jack/java7/parser/|com/android/jack/java7/switches/|com/android/jack/java7/trywithresources/|com/android/jack/lookup/test001/liboverride/|com/android/jack/nopackage/test*/**|com/android/jack/frontend/test002/jack/PackageName/ClassInConflictingPackage.java|com/android/jack/frontend/test005/jack/|com/android/jack/frontend/test006/jack/|com/android/jack/frontend/test007/jack/|com/android/jack/frontend/test007/jackduplicate/|com/android/jack/frontend/test008/jack/NoOuterContext.java|com/android/jack/frontend/test010/jack/UnusedLocalVar.java|com/android/jack/frontend/test013/jack/ExtendingInnerOnly.java|com/android/jack/frontend/test014/jack/ExtendingInnerInStaticContext.java|com/android/jack/frontend/test015/jack/WithOuterContextButStatic.java" kind="src" path="tests"/>
<classpathentry kind="lib" path="libs/junit4.jar"/>
<classpathentry kind="lib" path="libs/antlr-runtime-lib.jar"/>
<classpathentry kind="lib" path="libs/dx-ref.jar"/>
diff --git a/jack-tests/tests/com/android/jack/AllTests.java b/jack-tests/tests/com/android/jack/AllTests.java
index 76dc3973..47b7a087 100644
--- a/jack-tests/tests/com/android/jack/AllTests.java
+++ b/jack-tests/tests/com/android/jack/AllTests.java
@@ -28,6 +28,7 @@ import com.android.jack.fileconflict.FileConflictTests;
import com.android.jack.flow.FlowTests;
import com.android.jack.frontend.DuplicateSourceTest;
import com.android.jack.frontend.FrontEndTests;
+import com.android.jack.frontend.ParserTest;
import com.android.jack.generic.basic.GenericTests;
import com.android.jack.ifstatement.IfstatementTests;
import com.android.jack.imports.ImportTests;
@@ -118,6 +119,7 @@ import org.junit.runners.Suite.SuiteClasses;
NoPackageTests.class,
OrderTests.class,
OpcodesTests.class,
+ ParserTest.class,
PreProcessorTests.class,
ReturnstatementTests.class,
ResourceTests.class,
diff --git a/jack-tests/tests/com/android/jack/frontend/ParserTest.java b/jack-tests/tests/com/android/jack/frontend/ParserTest.java
new file mode 100644
index 00000000..692c261b
--- /dev/null
+++ b/jack-tests/tests/com/android/jack/frontend/ParserTest.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.jack.frontend;
+
+import com.android.jack.Options;
+import com.android.jack.test.toolchain.AbstractTestTools;
+import com.android.jack.test.toolchain.JackApiToolchainBase;
+
+import junit.framework.Assert;
+
+import org.junit.Test;
+
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+
+public class ParserTest {
+
+ @Test
+ public void test001() throws Exception {
+ File outJackTmpTest = AbstractTestTools.createTempDir();
+ ByteArrayOutputStream errOut = new ByteArrayOutputStream();
+
+ JackApiToolchainBase toolchain =
+ AbstractTestTools.getCandidateToolchain(JackApiToolchainBase.class);
+ toolchain.setErrorStream(errOut);
+ toolchain.addProperty(Options.INPUT_FILTER.getName(), "ordered-filter");
+
+ try {
+ toolchain.addToClasspath(toolchain.getDefaultBootClasspath()).srcToExe(outJackTmpTest,
+ false /* zipFile */
+ , AbstractTestTools.getTestRootDir("com.android.jack.frontend.test005.jack"));
+ Assert.fail();
+ } catch (FrontendCompilationException e) {
+ Assert.assertTrue(
+ errOut.toString().contains("Syntax error on token \"}\", delete this token"));
+ }
+ }
+
+ @Test
+ public void test002() throws Exception {
+ File outJackTmpTest = AbstractTestTools.createTempDir();
+ ByteArrayOutputStream errOut = new ByteArrayOutputStream();
+
+ JackApiToolchainBase toolchain =
+ AbstractTestTools.getCandidateToolchain(JackApiToolchainBase.class);
+ toolchain.setErrorStream(errOut);
+ toolchain.addProperty(Options.INPUT_FILTER.getName(), "ordered-filter");
+
+ try {
+ toolchain.addToClasspath(toolchain.getDefaultBootClasspath()).srcToExe(outJackTmpTest,
+ false /* zipFile */
+ , AbstractTestTools.getTestRootDir("com.android.jack.frontend.test006.jack"));
+ Assert.fail();
+ } catch (FrontendCompilationException e) {
+ Assert.assertTrue(
+ errOut.toString().contains("Syntax error on token \"b5\", delete this token"));
+ }
+ }
+}
diff --git a/jack-tests/tests/com/android/jack/frontend/test005/jack/A.java b/jack-tests/tests/com/android/jack/frontend/test005/jack/A.java
new file mode 100644
index 00000000..945e6c3e
--- /dev/null
+++ b/jack-tests/tests/com/android/jack/frontend/test005/jack/A.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.jack.frontend.test005.jack;
+
+
+public final class A {
+ public interface B {
+ void test();
+ }
+
+ private final B b = new B() {
+
+ @Override
+ public void test() {}
+ }
+ };
+}
diff --git a/jack-tests/tests/com/android/jack/frontend/test005/jack/B.java b/jack-tests/tests/com/android/jack/frontend/test005/jack/B.java
new file mode 100644
index 00000000..d7f76eef
--- /dev/null
+++ b/jack-tests/tests/com/android/jack/frontend/test005/jack/B.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.jack.frontend.test005.jack;
+
+public class B {
+
+ private static class X {
+ static final Object instance1;
+ static {
+ try {
+ instance1 = new Object();
+ } catch (Throwable e) {
+ throw new AssertionError(e);
+ }
+ }
+ }
+
+ X x = new X();
+ Object o = X.instance1;
+}
diff --git a/jack-tests/tests/com/android/jack/frontend/test006/jack/A.java b/jack-tests/tests/com/android/jack/frontend/test006/jack/A.java
new file mode 100644
index 00000000..b3064897
--- /dev/null
+++ b/jack-tests/tests/com/android/jack/frontend/test006/jack/A.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.jack.frontend.test006.jack;
+
+
+public final class A {
+ public static final int foo = 1234b5;
+
+ public interface B {
+ void test();
+ }
+
+ private final B b = new B() {
+
+ @Override
+ public void test() {}
+ };
+}
diff --git a/jack-tests/tests/com/android/jack/frontend/test006/jack/B.java b/jack-tests/tests/com/android/jack/frontend/test006/jack/B.java
new file mode 100644
index 00000000..545f0459
--- /dev/null
+++ b/jack-tests/tests/com/android/jack/frontend/test006/jack/B.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.jack.frontend.test006.jack;
+
+public class B {
+
+ private static class X {
+ static final Object instance1;
+ static {
+ try {
+ instance1 = new Object();
+ } catch (Throwable e) {
+ throw new AssertionError(e);
+ }
+ }
+ }
+
+ X x = new X();
+ Object o = X.instance1;
+}
diff --git a/jack/src/com/android/jack/frontend/java/JavaParser.java b/jack/src/com/android/jack/frontend/java/JavaParser.java
index 21fa9e82..25198197 100644
--- a/jack/src/com/android/jack/frontend/java/JavaParser.java
+++ b/jack/src/com/android/jack/frontend/java/JavaParser.java
@@ -17,13 +17,17 @@
package com.android.jack.frontend.java;
import org.eclipse.jdt.core.compiler.CompilationProgress;
+import org.eclipse.jdt.internal.compiler.CompilationResult;
import org.eclipse.jdt.internal.compiler.Compiler;
import org.eclipse.jdt.internal.compiler.ICompilerRequestor;
import org.eclipse.jdt.internal.compiler.IErrorHandlingPolicy;
import org.eclipse.jdt.internal.compiler.IProblemFactory;
import org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration;
+import org.eclipse.jdt.internal.compiler.env.ICompilationUnit;
import org.eclipse.jdt.internal.compiler.env.INameEnvironment;
import org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
+import org.eclipse.jdt.internal.compiler.parser.Parser;
+import org.eclipse.jdt.internal.compiler.problem.ProblemReporter;
import java.io.PrintWriter;
@@ -32,12 +36,36 @@ import java.io.PrintWriter;
*/
public class JavaParser extends Compiler {
+ private static class JackJavaParser extends Parser {
+ public JackJavaParser(ProblemReporter problemReporter, boolean optimizeStringLiterals) {
+ super(problemReporter, optimizeStringLiterals);
+ }
+
+ @Override
+ public CompilationUnitDeclaration dietParse(ICompilationUnit sourceUnit,
+ CompilationResult compilationResult) {
+ // The same parser is reused to parse several compilation units. Diet mode is used to jump
+ // over some parts of the code/expressions like method bodies. In case of failures in a
+ // compilation unit, it can happens that dietInt is no reset to 0 for the following
+ // compilation unit that will be parsed. If this field is not reset, method bodies can be
+ // parsed but normally it must not in diet mode.
+ dietInt = 0;
+ return super.dietParse(sourceUnit, compilationResult);
+ }
+ }
+
public JavaParser(INameEnvironment environment, IErrorHandlingPolicy policy,
CompilerOptions options, ICompilerRequestor requestor, IProblemFactory problemFactory,
PrintWriter out, CompilationProgress progress) {
super(environment, policy, options, requestor, problemFactory, out, progress);
}
+ @Override
+ public void initializeParser() {
+ parser =
+ new JackJavaParser(this.problemReporter, this.options.parseLiteralExpressionsAsConstants);
+ }
+
/** Parses, resolves and analyzes the given {@link CompilationUnitDeclaration}. */
@Override
public void process(CompilationUnitDeclaration unit, int i) {
diff --git a/jack/src/com/android/jack/incremental/CommonFilter.java b/jack/src/com/android/jack/incremental/CommonFilter.java
index 758423dd..ab45a130 100644
--- a/jack/src/com/android/jack/incremental/CommonFilter.java
+++ b/jack/src/com/android/jack/incremental/CommonFilter.java
@@ -157,7 +157,7 @@ public abstract class CommonFilter {
return (javaFileNames);
}
- private void fillFiles(@Nonnull File folder, @Nonnull String fileExt,
+ protected void fillFiles(@Nonnull File folder, @Nonnull String fileExt,
@Nonnull Set<String> fileNames) {
for (File subFile : folder.listFiles()) {
if (subFile.isDirectory()) {
diff --git a/jack/tests/com/android/jack/frontend/OrderedInputFilter.java b/jack/tests/com/android/jack/frontend/OrderedInputFilter.java
new file mode 100644
index 00000000..5d1be700
--- /dev/null
+++ b/jack/tests/com/android/jack/frontend/OrderedInputFilter.java
@@ -0,0 +1,117 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.jack.frontend;
+
+import com.android.jack.Jack;
+import com.android.jack.Options;
+import com.android.jack.analysis.dependency.file.FileDependencies;
+import com.android.jack.analysis.dependency.library.LibraryDependencies;
+import com.android.jack.analysis.dependency.type.TypeDependencies;
+import com.android.jack.incremental.CommonFilter;
+import com.android.jack.incremental.InputFilter;
+import com.android.jack.ir.ast.JSession;
+import com.android.jack.library.InputLibrary;
+import com.android.jack.library.OutputJackLibrary;
+import com.android.sched.util.codec.ImplementationName;
+import com.android.sched.util.config.Config;
+import com.android.sched.util.config.ThreadConfig;
+import com.android.sched.util.file.Directory;
+import com.android.sched.util.file.FileOrDirectory;
+
+import java.util.List;
+import java.util.Set;
+import java.util.TreeSet;
+
+import javax.annotation.Nonnull;
+
+/**
+ * {@link InputFilter} that returns ordered inputs.
+ */
+@ImplementationName(iface = InputFilter.class, name = "ordered-filter")
+public class OrderedInputFilter extends CommonFilter implements InputFilter {
+
+ @Nonnull
+ private final Set<String> fileNamesToCompile;
+
+ @Nonnull
+ private final Options options;
+
+ @Nonnull
+ private final List<? extends InputLibrary> importedLibrariesFromCommandLine;
+
+ @Nonnull
+ private final List<? extends InputLibrary> librariesOnClasspathFromCommandLine;
+
+ public OrderedInputFilter(@Nonnull Options options) {
+ this.options = options;
+ this.fileNamesToCompile = getJavaFileNamesSpecifiedOnCommandLine(options);
+ JSession session = Jack.getSession();
+ session.setFileDependencies(new FileDependencies());
+ session.setTypeDependencies(new TypeDependencies());
+ importedLibrariesFromCommandLine = ThreadConfig.get(Options.IMPORTED_LIBRARIES);
+ librariesOnClasspathFromCommandLine = getInputLibrariesFromFiles(
+ ThreadConfig.get(Options.CLASSPATH),
+ ThreadConfig.get(Jack.STRICT_CLASSPATH).booleanValue());
+
+ LibraryDependencies libraryDependencies = session.getLibraryDependencies();
+ libraryDependencies.addImportedLibraries(importedLibrariesFromCommandLine);
+ libraryDependencies.addLibrariesOnClasspath(librariesOnClasspathFromCommandLine);
+ }
+
+ @Override
+ @Nonnull
+ public Set<String> getFileNamesToCompile() {
+ return fileNamesToCompile;
+ }
+
+ @Override
+ @Nonnull
+ public List<? extends InputLibrary> getClasspath() {
+ return librariesOnClasspathFromCommandLine;
+ }
+
+ @Override
+ @Nonnull
+ public List<? extends InputLibrary> getImportedLibrary() {
+ return importedLibrariesFromCommandLine;
+ }
+
+ @Override
+ @Nonnull
+ public OutputJackLibrary getOutputJackLibrary() {
+ return getOutputJackLibraryFromVfs();
+ }
+
+ @Override
+ @Nonnull
+ protected Set<String> getJavaFileNamesSpecifiedOnCommandLine(@Nonnull Options options) {
+ Config config = options.getConfig();
+ final String extension = ".java";
+
+ Set<String> javaFileNames = new TreeSet<String>();
+ for (FileOrDirectory file : config.get(Options.SOURCES)) {
+ if (file instanceof Directory) {
+ fillFiles(((Directory) file).getFile(), extension, javaFileNames);
+ } else if (file.getPath().endsWith(extension)) {
+ // File already checked by codec
+ javaFileNames.add(file.getPath());
+ }
+ }
+
+ return (javaFileNames);
+ }
+}