From 7fa09927c44d5f2b78e13f555300269c29b8e93a Mon Sep 17 00:00:00 2001 From: Jay Arthanareeswaran Date: Wed, 9 Oct 2024 17:08:37 +0530 Subject: [PATCH 1/2] ASTParser should detect and report when no suitable system library has been configured #3047 --- .../compiler/lookup/CompilationUnitScope.java | 1 + .../core/tests/dom/ASTConverterBugsTest.java | 63 ++++++++++++++++++- 2 files changed, 63 insertions(+), 1 deletion(-) diff --git a/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/CompilationUnitScope.java b/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/CompilationUnitScope.java index 1809520b367..efb8efd3bc1 100644 --- a/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/CompilationUnitScope.java +++ b/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/CompilationUnitScope.java @@ -791,6 +791,7 @@ ImportBinding[] getDefaultImports() { this.environment.missingClassFileLocation, false, null/*resolving j.l.O is not specific to any referencing type*/); BinaryTypeBinding missingObject = this.environment.createMissingType(null, TypeConstants.JAVA_LANG_OBJECT); importBinding = missingObject.fPackage; + return new ImportBinding[] {new ImportBinding(TypeConstants.JAVA_LANG, true, importBinding, null)}; } return this.environment.root.defaultImports = new ImportBinding[] {new ImportBinding(TypeConstants.JAVA_LANG, true, importBinding, null)}; } diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverterBugsTest.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverterBugsTest.java index 3220c21f3f9..86043af2fda 100644 --- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverterBugsTest.java +++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverterBugsTest.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2000, 2017 IBM Corporation and others. + * Copyright (c) 2000, 2024 IBM Corporation and others. * * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 @@ -14,6 +14,7 @@ package org.eclipse.jdt.core.tests.dom; import java.io.IOException; +import java.util.Hashtable; import java.util.List; import java.util.Map; import junit.framework.Test; @@ -24,8 +25,10 @@ import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.IMethod; import org.eclipse.jdt.core.IType; +import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.core.WorkingCopyOwner; +import org.eclipse.jdt.core.compiler.IProblem; import org.eclipse.jdt.core.dom.*; @SuppressWarnings("rawtypes") @@ -1324,4 +1327,62 @@ public void testBug381503() throws CoreException, IOException { deleteProject("P"); } } +public void testGH3047() throws Exception { + Hashtable options = JavaCore.getDefaultOptions(); + options.put(JavaCore.COMPILER_COMPLIANCE, JavaCore.VERSION_9); + options.put(JavaCore.COMPILER_SOURCE, JavaCore.VERSION_9); + options.put(JavaCore.COMPILER_CODEGEN_TARGET_PLATFORM, JavaCore.VERSION_9); + + createJava9Project("P"); + createFolder("P/src"); + + String srcFolderInWS = "/P/src"; + createFolder(srcFolderInWS + "/resources/examples/mockito"); + String srcFilePathInWS = srcFolderInWS + "/resources/examples/mockito/MockingFromFinder.java"; + createFile(srcFilePathInWS, + """ + package examples.mockito; + public class MockingFromFinder{}""" + ); + srcFilePathInWS = srcFolderInWS + "/resources/examples/mockito/MockingWhileAdding.java"; + createFile(srcFilePathInWS, + """ + package examples.mockito; + public class MockingWhileAdding { + public static void calculateWithAdder(int x, int y) { + IOperation adder = new Adder()::execute; + } + public interface IOperation { + int execute(int x, int y); + } + public static class Adder implements IOperation { + public int execute(int x, int y) { + return x+y; + } + } + }""" + ); + String[] paths = new String[2]; + paths[0] = getWorkspacePath() + "P/src/resources/examples/mockito/MockingFromFinder.java"; + paths[1] = getWorkspacePath() + "P/src/resources/examples/mockito/MockingWhileAdding.java"; + @SuppressWarnings("deprecation") + ASTParser parser = ASTParser.newParser(AST_INTERNAL_JLS9); + parser.setCompilerOptions(options); + parser.setResolveBindings(true); + parser.setStatementsRecovery(true); + parser.setBindingsRecovery(true); + parser.setEnvironment(null, new String[] {getWorkspacePath() + "P/src/resources"}, null, false); + parser.setKind(ASTParser.K_COMPILATION_UNIT); + class MyFileASTRequestor extends FileASTRequestor { + @Override + public void acceptAST(String sourceFilePath, CompilationUnit cu) { + IProblem[] problems = cu.getProblems(); + assertTrue("Number of problems should be at least 1", (problems.length >= 1)); + IProblem problem = problems[0]; + assertEquals("Unexpected problem in " + sourceFilePath, + "Pb(324) The type java.lang.Object cannot be resolved. It is indirectly referenced from required .class files", problem.toString()); + } + } + parser.createASTs(paths, null, new String[] {}, new MyFileASTRequestor() {}, null); +} } From 19be8b31607295fa3050e47dde7dac37b03c5355 Mon Sep 17 00:00:00 2001 From: Stephan Herrmann Date: Thu, 10 Oct 2024 12:25:05 +0200 Subject: [PATCH 2/2] ASTParser should detect and report when no suitable system library has been configured let ASTParser detect missing system library + look in classpaths and/or javaproject + first look for module java.base else for class java.lang.Object fix test setups: + converterJclMin9 lacked some relevant classes + initialization of variable CONVERTER_JCL15_LIB was missing + correction of .classpath for some converter test projects: + don't use 1.8 lib for projects > 9 + mark system libraries as modular modified the new test: + copy the original test from DOM test to a new compiler test - here we expect missing type errors instead of NPE + update test expectation in DOM to the new exception --- .../src/java/io/PrintStream.java | 35 ++++++ .../src/java/lang/AutoCloseable.java | 5 + .../src/java/lang/Override.java | 20 ++++ .../src/java/lang/System.java | 24 +++++ .../regression/ProblemTypeAndMethodTest.java | 102 ++++++++++++++++++ .../JCL/converterJclMin9.jar | Bin 12854 -> 16669 bytes .../JCL/converterJclMin9src.zip | Bin 9483 -> 11239 bytes .../core/tests/dom/ASTConverterBugsTest.java | 70 +++++++++++- .../core/tests/dom/ConverterTestSetup.java | 8 ++ .../describing/ImportRewrite_RecordTest.java | 2 +- .../workspace/Converter9/.classpath | 6 +- .../workspace/Converter_15_1/.classpath | 6 +- .../org/eclipse/jdt/core/dom/ASTParser.java | 53 +++++++-- 13 files changed, 315 insertions(+), 16 deletions(-) create mode 100644 JCL/converterJclMin9/src/java/io/PrintStream.java create mode 100644 JCL/converterJclMin9/src/java/lang/AutoCloseable.java create mode 100644 JCL/converterJclMin9/src/java/lang/Override.java create mode 100644 JCL/converterJclMin9/src/java/lang/System.java diff --git a/JCL/converterJclMin9/src/java/io/PrintStream.java b/JCL/converterJclMin9/src/java/io/PrintStream.java new file mode 100644 index 00000000000..503f080425d --- /dev/null +++ b/JCL/converterJclMin9/src/java/io/PrintStream.java @@ -0,0 +1,35 @@ +/******************************************************************************* + * Copyright (c) 2000, 2004 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package java.io; + +public class PrintStream { + + public void println() { + } + + public void println(String s) { + } + + public void println(int i) { + } + + public void println(Object o) { + } + + public void print(String s) { + } + + public void print(Object o) { + } + + public void print(int i) { + } +} diff --git a/JCL/converterJclMin9/src/java/lang/AutoCloseable.java b/JCL/converterJclMin9/src/java/lang/AutoCloseable.java new file mode 100644 index 00000000000..b6fbe467732 --- /dev/null +++ b/JCL/converterJclMin9/src/java/lang/AutoCloseable.java @@ -0,0 +1,5 @@ +package java.lang; + +public interface AutoCloseable { + void close() throws Exception; +} diff --git a/JCL/converterJclMin9/src/java/lang/Override.java b/JCL/converterJclMin9/src/java/lang/Override.java new file mode 100644 index 00000000000..e30eba7b6df --- /dev/null +++ b/JCL/converterJclMin9/src/java/lang/Override.java @@ -0,0 +1,20 @@ +/******************************************************************************* + * Copyright (c) 2005 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package java.lang; + +import java.lang.annotation.ElementType; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import java.lang.annotation.Retention; + +@Target(ElementType.METHOD) @Retention(RetentionPolicy.SOURCE) +public @interface Override { +} \ No newline at end of file diff --git a/JCL/converterJclMin9/src/java/lang/System.java b/JCL/converterJclMin9/src/java/lang/System.java new file mode 100644 index 00000000000..a13acd2404d --- /dev/null +++ b/JCL/converterJclMin9/src/java/lang/System.java @@ -0,0 +1,24 @@ +/******************************************************************************* + * Copyright (c) 2000, 2004 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package java.lang; + +import java.io.PrintStream; + +public class System { + + public static PrintStream err; + public static PrintStream out; + + public static native void arraycopy(Object src, int srcPos, Object dest, int destPos, int length); + public static String getProperty(String s) { + return null; + } +} diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/ProblemTypeAndMethodTest.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/ProblemTypeAndMethodTest.java index 812d8e49655..90f7870a193 100644 --- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/ProblemTypeAndMethodTest.java +++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/ProblemTypeAndMethodTest.java @@ -10328,4 +10328,106 @@ F test() { """; runner.runNegativeTest(); } +public void testGH3047() throws Exception { + Runner runner = new Runner(); + runner.testFiles = new String[] { + "resources/examples/mockito/MockingFromFinder.java", + """ + package examples.mockito; + public class MockingFromFinder{} + """, + "resources/examples/mockito/MockingWhileAdding.java", + """ + package examples.mockito; + public class MockingWhileAdding { + public static void calculateWithAdder(int x, int y) { + IOperation adder = new Adder()::execute; + } + public interface IOperation { + int execute(int x, int y); + } + public static class Adder implements IOperation { + public int execute(int x, int y) { + return x+y; + } + } + } + """ + }; + runner.classLibraries = new String[0]; + if (this.complianceLevel <= ClassFileConstants.JDK13) { + runner.expectedCompilerLog = + """ + ---------- + 1. ERROR in resources\\examples\\mockito\\MockingFromFinder.java (at line 1) + package examples.mockito; + ^ + The type java.lang.Object cannot be resolved. It is indirectly referenced from required .class files + ---------- + 2. ERROR in resources\\examples\\mockito\\MockingFromFinder.java (at line 2) + public class MockingFromFinder{} + ^^^^^^^^^^^^^^^^^ + Implicit super constructor Object() is undefined for default constructor. Must define an explicit constructor + ---------- + ---------- + 1. ERROR in resources\\examples\\mockito\\MockingWhileAdding.java (at line 1) + package examples.mockito; + ^ + The type java.lang.Object cannot be resolved. It is indirectly referenced from required .class files + ---------- + 2. ERROR in resources\\examples\\mockito\\MockingWhileAdding.java (at line 2) + public class MockingWhileAdding { + ^^^^^^^^^^^^^^^^^^ + Implicit super constructor Object() is undefined for default constructor. Must define an explicit constructor + ---------- + 3. ERROR in resources\\examples\\mockito\\MockingWhileAdding.java (at line 9) + public static class Adder implements IOperation { + ^^^^^ + Implicit super constructor Object() is undefined for default constructor. Must define an explicit constructor + ---------- + """; + } else { + runner.expectedCompilerLog = + """ + ---------- + 1. ERROR in resources\\examples\\mockito\\MockingFromFinder.java (at line 1) + package examples.mockito; + ^ + The type java.lang.Object cannot be resolved. It is indirectly referenced from required .class files + ---------- + 2. ERROR in resources\\examples\\mockito\\MockingFromFinder.java (at line 1) + package examples.mockito; + ^ + The type java.lang.Error cannot be resolved. It is indirectly referenced from required .class files + ---------- + 3. ERROR in resources\\examples\\mockito\\MockingFromFinder.java (at line 1) + package examples.mockito; + ^ + The type java.lang.String cannot be resolved. It is indirectly referenced from required .class files + ---------- + 4. ERROR in resources\\examples\\mockito\\MockingFromFinder.java (at line 2) + public class MockingFromFinder{} + ^^^^^^^^^^^^^^^^^ + Implicit super constructor Object() is undefined for default constructor. Must define an explicit constructor + ---------- + ---------- + 1. ERROR in resources\\examples\\mockito\\MockingWhileAdding.java (at line 1) + package examples.mockito; + ^ + The type java.lang.Object cannot be resolved. It is indirectly referenced from required .class files + ---------- + 2. ERROR in resources\\examples\\mockito\\MockingWhileAdding.java (at line 2) + public class MockingWhileAdding { + ^^^^^^^^^^^^^^^^^^ + Implicit super constructor Object() is undefined for default constructor. Must define an explicit constructor + ---------- + 3. ERROR in resources\\examples\\mockito\\MockingWhileAdding.java (at line 9) + public static class Adder implements IOperation { + ^^^^^ + Implicit super constructor Object() is undefined for default constructor. Must define an explicit constructor + ---------- + """; + } + runner.runNegativeTest(); +} } diff --git a/org.eclipse.jdt.core.tests.model/JCL/converterJclMin9.jar b/org.eclipse.jdt.core.tests.model/JCL/converterJclMin9.jar index ffedd500d726431f42eb55dbf1d795da94419f56..0fe91046f6f18f2fdcc2f6988ac0715e2cb2e842 100644 GIT binary patch literal 16669 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 diff --git a/org.eclipse.jdt.core.tests.model/JCL/converterJclMin9src.zip b/org.eclipse.jdt.core.tests.model/JCL/converterJclMin9src.zip index d04c399924b1c5ac41014ff0e49d99c27e3f6e7b..636debe16aa6af0de19299fa1a8a375844e4159f 100644 GIT binary patch delta 3274 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 diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverterBugsTest.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverterBugsTest.java index 86043af2fda..ebcef50186b 100644 --- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverterBugsTest.java +++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverterBugsTest.java @@ -14,9 +14,12 @@ package org.eclipse.jdt.core.tests.dom; import java.io.IOException; +import java.util.Arrays; +import java.util.HashSet; import java.util.Hashtable; import java.util.List; import java.util.Map; +import java.util.Set; import junit.framework.Test; import org.eclipse.core.runtime.CoreException; import org.eclipse.jdt.core.IClassFile; @@ -1373,16 +1376,73 @@ public int execute(int x, int y) { parser.setBindingsRecovery(true); parser.setEnvironment(null, new String[] {getWorkspacePath() + "P/src/resources"}, null, false); parser.setKind(ASTParser.K_COMPILATION_UNIT); + try { + parser.createASTs(paths, null, new String[] {}, null, null); + fail("Expected exception was not thrown"); + } catch (IllegalStateException ise) { + assertEquals("Missing system library", ise.getMessage()); + } +} +public void testGH3047_2() throws Exception { + Hashtable options = JavaCore.getDefaultOptions(); + options.put(JavaCore.COMPILER_COMPLIANCE, JavaCore.VERSION_9); + options.put(JavaCore.COMPILER_SOURCE, JavaCore.VERSION_9); + options.put(JavaCore.COMPILER_CODEGEN_TARGET_PLATFORM, JavaCore.VERSION_9); + + IJavaProject javaProject = createJavaProject("P", new String[] {""}, new String[] {"CONVERTER_JCL18_LIB"}, "1.8"); + createFolder("P/src"); + + String srcFolderInWS = "/P/src"; + createFolder(srcFolderInWS + "/resources/examples/mockito"); + String srcFilePathInWS = srcFolderInWS + "/resources/examples/mockito/MockingFromFinder.java"; + createFile(srcFilePathInWS, + """ + package examples.mockito; + public class MockingFromFinder{}""" + ); + srcFilePathInWS = srcFolderInWS + "/resources/examples/mockito/MockingWhileAdding.java"; + createFile(srcFilePathInWS, + """ + package examples.mockito; + public class MockingWhileAdding { + public static void calculateWithAdder(int x, int y) { + IOperation adder = new Adder()::execute; + } + public interface IOperation { + int execute(int x, int y); + } + public static class Adder implements IOperation { + public int execute(int x, int y) { + return x+y; + } + } + }""" + ); + String[] paths = new String[2]; + paths[0] = getWorkspacePath() + "P/src/resources/examples/mockito/MockingFromFinder.java"; + paths[1] = getWorkspacePath() + "P/src/resources/examples/mockito/MockingWhileAdding.java"; + @SuppressWarnings("deprecation") + ASTParser parser = ASTParser.newParser(AST_INTERNAL_JLS9); + parser.setProject(javaProject); + parser.setCompilerOptions(options); + parser.setResolveBindings(true); + parser.setStatementsRecovery(true); + parser.setBindingsRecovery(true); + parser.setEnvironment(null, new String[] {getWorkspacePath() + "P/src/resources"}, null, false); + parser.setKind(ASTParser.K_COMPILATION_UNIT); + Set expectedProblems = new HashSet<>(Arrays.asList( + "Pb(324) The type java.lang.Object cannot be resolved. It is indirectly referenced from required .class files", + "Pb(140) Implicit super constructor Object() is undefined for default constructor. Must define an explicit constructor" + )); + Set actualProblems = new HashSet<>(); class MyFileASTRequestor extends FileASTRequestor { @Override public void acceptAST(String sourceFilePath, CompilationUnit cu) { - IProblem[] problems = cu.getProblems(); - assertTrue("Number of problems should be at least 1", (problems.length >= 1)); - IProblem problem = problems[0]; - assertEquals("Unexpected problem in " + sourceFilePath, - "Pb(324) The type java.lang.Object cannot be resolved. It is indirectly referenced from required .class files", problem.toString()); + for (IProblem prob : cu.getProblems()) + actualProblems.add(prob.toString()); } } parser.createASTs(paths, null, new String[] {}, new MyFileASTRequestor() {}, null); + assertEquals(expectedProblems, actualProblems); } } diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ConverterTestSetup.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ConverterTestSetup.java index 6bd0a2a5c2b..772b0037780 100644 --- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ConverterTestSetup.java +++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ConverterTestSetup.java @@ -207,6 +207,14 @@ public void setUpJCLClasspathVariables(String compliance, boolean useFullJCL) th new IPath[] {getConverterJCLPath("14"), getConverterJCLSourcePath("14"), getConverterJCLRootSourcePath()}, null); } + } else if ("15".equals(compliance)) { + if (JavaCore.getClasspathVariable("CONVERTER_JCL15_LIB") == null) { + setupExternalJCL("converterJclMin15"); + JavaCore.setClasspathVariables( + new String[] {"CONVERTER_JCL15_LIB", "CONVERTER_JCL15_SRC", "CONVERTER_JCL15_SRCROOT"}, + new IPath[] {getConverterJCLPath("15"), getConverterJCLSourcePath("15"), getConverterJCLRootSourcePath()}, + null); + } } else if ("17".equals(compliance)) { if (JavaCore.getClasspathVariable("CONVERTER_JCL_17_LIB") == null) { setupExternalJCL("converterJclMin17"); diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/rewrite/describing/ImportRewrite_RecordTest.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/rewrite/describing/ImportRewrite_RecordTest.java index 3db4f9604fe..71248344102 100644 --- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/rewrite/describing/ImportRewrite_RecordTest.java +++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/rewrite/describing/ImportRewrite_RecordTest.java @@ -63,7 +63,7 @@ public static Test suite() { protected void setUp() throws Exception { super.setUp(); - IJavaProject proj= createJavaProject(PROJECT, new String[] {"src"}, new String[] {"JCL18_LIB"}, "bin", "15"); + IJavaProject proj= createJavaProject(PROJECT, new String[] {"src"}, new String[] {"JCL14_LIB"}, "bin", "15"); proj.setOption(DefaultCodeFormatterConstants.FORMATTER_TAB_CHAR, JavaCore.SPACE); proj.setOption(DefaultCodeFormatterConstants.FORMATTER_TAB_SIZE, "4"); proj.setOption(JavaCore.COMPILER_COMPLIANCE, JavaCore.VERSION_16); diff --git a/org.eclipse.jdt.core.tests.model/workspace/Converter9/.classpath b/org.eclipse.jdt.core.tests.model/workspace/Converter9/.classpath index 3522bc0c3f5..6da169624e4 100644 --- a/org.eclipse.jdt.core.tests.model/workspace/Converter9/.classpath +++ b/org.eclipse.jdt.core.tests.model/workspace/Converter9/.classpath @@ -1,6 +1,10 @@ - + + + + + diff --git a/org.eclipse.jdt.core.tests.model/workspace/Converter_15_1/.classpath b/org.eclipse.jdt.core.tests.model/workspace/Converter_15_1/.classpath index 3522bc0c3f5..49c53688466 100644 --- a/org.eclipse.jdt.core.tests.model/workspace/Converter_15_1/.classpath +++ b/org.eclipse.jdt.core.tests.model/workspace/Converter_15_1/.classpath @@ -1,6 +1,10 @@ - + + + + + diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTParser.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTParser.java index 9c0024e1469..a156cd00975 100644 --- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTParser.java +++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTParser.java @@ -24,21 +24,17 @@ import java.util.Map; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.SubMonitor; -import org.eclipse.jdt.core.IClassFile; -import org.eclipse.jdt.core.ICompilationUnit; -import org.eclipse.jdt.core.IJavaElement; -import org.eclipse.jdt.core.IJavaProject; -import org.eclipse.jdt.core.ITypeRoot; -import org.eclipse.jdt.core.JavaCore; -import org.eclipse.jdt.core.JavaModelException; -import org.eclipse.jdt.core.WorkingCopyOwner; +import org.eclipse.jdt.core.*; import org.eclipse.jdt.core.compiler.CategorizedProblem; import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.internal.compiler.ast.ConstructorDeclaration; import org.eclipse.jdt.internal.compiler.ast.ExplicitConstructorCall; import org.eclipse.jdt.internal.compiler.batch.FileSystem.Classpath; import org.eclipse.jdt.internal.compiler.batch.Main; +import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; import org.eclipse.jdt.internal.compiler.env.IBinaryType; +import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; +import org.eclipse.jdt.internal.compiler.lookup.TypeConstants; import org.eclipse.jdt.internal.compiler.parser.RecoveryScanner; import org.eclipse.jdt.internal.compiler.parser.RecoveryScannerData; import org.eclipse.jdt.internal.compiler.parser.Scanner; @@ -272,8 +268,49 @@ private List getClasspath() throws IllegalStateException { } catch (IllegalArgumentException e) { throw new IllegalStateException("invalid environment settings", e); //$NON-NLS-1$ } + if ((this.bits & CompilationUnitResolver.RESOLVE_BINDING) != 0) { + checkForSystemLibrary(allClasspaths); + } return allClasspaths; } + + private void checkForSystemLibrary(List allClasspaths) { + boolean hasSystemLibrary = true; // default for 1.8 setting without a valid project + boolean hasModule = false; + Throwable exception = null; + String compliance = this.compilerOptions.get(JavaCore.COMPILER_COMPLIANCE); + if (CompilerOptions.versionToJdkLevel(compliance) >= ClassFileConstants.JDK9) { + hasSystemLibrary = allClasspaths.stream().anyMatch(cp -> cp.getModule(TypeConstants.JAVA_DOT_BASE) != null); + if (!hasSystemLibrary && this.project != null) { + // not found in allClasspaths, try this.project instead: + try { + // try module java.base: + for (IPackageFragmentRoot root : this.project.getAllPackageFragmentRoots()) { + IModuleDescription moduleDescription = root.getModuleDescription(); + if (moduleDescription != null) { + hasModule = true; + if (moduleDescription.getElementName().equals(String.valueOf(TypeConstants.JAVA_DOT_BASE))) { + hasSystemLibrary = true; + break; + } + } + } + } catch (JavaModelException e) { + exception = e; + } + if (!hasModule) { + try { + // if no modules try class java.lang.Object: + hasSystemLibrary = this.project.findType(String.valueOf(TypeConstants.CharArray_JAVA_LANG_OBJECT)) != null; + } catch (JavaModelException e) { + exception = e; + } + } + } + if (!hasSystemLibrary) + throw new IllegalStateException("Missing system library", exception); //$NON-NLS-1$ + } + } /** * Sets all the setting to their default values. */