diff options
author | mikaelpeltier <mikaelpeltier@google.com> | 2015-04-08 13:11:31 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2015-04-08 13:11:32 +0000 |
commit | e8b47c365059d925517fc830828f5dcd9f4d2078 (patch) | |
tree | a7dd61b22f0cca2536dd2375293005f3b09b9fd9 | |
parent | 1f97da0c733c6a525a8bd7b0f6a8325ce671586f (diff) | |
parent | 81861fd04ba4863b321de26c0852575fa7f173c3 (diff) | |
download | toolchain_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.xml | 4 | ||||
-rw-r--r-- | jack-tests/.classpath | 2 | ||||
-rw-r--r-- | jack-tests/tests/com/android/jack/AllTests.java | 2 | ||||
-rw-r--r-- | jack-tests/tests/com/android/jack/frontend/ParserTest.java | 73 | ||||
-rw-r--r-- | jack-tests/tests/com/android/jack/frontend/test005/jack/A.java | 31 | ||||
-rw-r--r-- | jack-tests/tests/com/android/jack/frontend/test005/jack/B.java | 34 | ||||
-rw-r--r-- | jack-tests/tests/com/android/jack/frontend/test006/jack/A.java | 32 | ||||
-rw-r--r-- | jack-tests/tests/com/android/jack/frontend/test006/jack/B.java | 34 | ||||
-rw-r--r-- | jack/src/com/android/jack/frontend/java/JavaParser.java | 28 | ||||
-rw-r--r-- | jack/src/com/android/jack/incremental/CommonFilter.java | 2 | ||||
-rw-r--r-- | jack/tests/com/android/jack/frontend/OrderedInputFilter.java | 117 |
11 files changed, 357 insertions, 2 deletions
@@ -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); + } +} |