Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStephan Herrmann2020-01-05 11:56:35 +0000
committerStephan Herrmann2020-01-05 15:23:23 +0000
commitaf36a4d61d16ed2e7dc7a2bcd257172b51335524 (patch)
tree2663b1757cde9a334a058bad7f87809799b7aa69
parent16ebd125b67e3fb21848f1cf93e610e6b19bf2c0 (diff)
downloadeclipse.jdt.core-af36a4d61d16ed2e7dc7a2bcd257172b51335524.tar.gz
eclipse.jdt.core-af36a4d61d16ed2e7dc7a2bcd257172b51335524.tar.xz
eclipse.jdt.core-af36a4d61d16ed2e7dc7a2bcd257172b51335524.zip
Bug 479389 - [null] warn when annotation based null analysis is enabled
but null annotations are not on the classpath Change-Id: Ie3d2e0f84c543ed9aeaf0316b04b20bf65164fda
-rw-r--r--org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/BatchCompilerTest.java3
-rw-r--r--org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/CompilerInvocationTests.java4
-rw-r--r--org.eclipse.jdt.core.tests.model/JCL/jclMin1.8.jarbin13995 -> 14382 bytes
-rw-r--r--org.eclipse.jdt.core.tests.model/JCL/jclMin1.8src.zipbin10189 -> 11104 bytes
-rw-r--r--org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/NullAnnotationModelTests.java87
-rw-r--r--org.eclipse.jdt.core/META-INF/MANIFEST.MF2
-rw-r--r--org.eclipse.jdt.core/compiler/org/eclipse/jdt/core/compiler/IProblem.java4
-rw-r--r--org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/impl/CompilerOptions.java13
-rw-r--r--org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/impl/IrritantSet.java8
-rw-r--r--org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/AnnotationBinding.java6
-rw-r--r--org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/CompilationUnitScope.java4
-rw-r--r--org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/LookupEnvironment.java16
-rw-r--r--org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/UnresolvedReferenceBinding.java4
-rw-r--r--org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/ProblemReporter.java9
-rw-r--r--org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/messages.properties4
-rw-r--r--org.eclipse.jdt.core/model/org/eclipse/jdt/core/JavaCore.java17
-rw-r--r--org.eclipse.jdt.core/pom.xml4
17 files changed, 151 insertions, 34 deletions
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/BatchCompilerTest.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/BatchCompilerTest.java
index 4bb46891c0..39be38bd97 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/BatchCompilerTest.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/BatchCompilerTest.java
@@ -1064,7 +1064,8 @@ public void test012b(){
" <option key=\"org.eclipse.jdt.core.compiler.problem.missingJavadocTags\" value=\"ignore\"/>\n" +
" <option key=\"org.eclipse.jdt.core.compiler.problem.missingJavadocTagsMethodTypeParameters\" value=\"disabled\"/>\n" +
" <option key=\"org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding\" value=\"disabled\"/>\n" +
- " <option key=\"org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility\" value=\"public\"/>\n" +
+ " <option key=\"org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility\" value=\"public\"/>\n" +
+ " <option key=\"org.eclipse.jdt.core.compiler.problem.missingNullAnnotationImplicitlyUsed\" value=\"error\"/>\n" +
" <option key=\"org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation\" value=\"ignore\"/>\n" +
" <option key=\"org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation\" value=\"enabled\"/>\n" +
" <option key=\"org.eclipse.jdt.core.compiler.problem.missingSerialVersion\" value=\"warning\"/>\n" +
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/CompilerInvocationTests.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/CompilerInvocationTests.java
index 252ac420c8..57d402320a 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/CompilerInvocationTests.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/CompilerInvocationTests.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2006, 2019 IBM Corporation and others.
+ * Copyright (c) 2006, 2020 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -810,6 +810,7 @@ public void test011_problem_categories() {
expectedProblemAttributes.put("MissingEnumDefaultCase", new ProblemAttributes(CategorizedProblem.CAT_POTENTIAL_PROGRAMMING_PROBLEM));
expectedProblemAttributes.put("MissingNonNullByDefaultAnnotationOnPackage", new ProblemAttributes(CategorizedProblem.CAT_POTENTIAL_PROGRAMMING_PROBLEM));
expectedProblemAttributes.put("MissingNonNullByDefaultAnnotationOnType", new ProblemAttributes(CategorizedProblem.CAT_POTENTIAL_PROGRAMMING_PROBLEM));
+ expectedProblemAttributes.put("MissingNullAnnotationImplicitlyUsed", new ProblemAttributes(CategorizedProblem.CAT_BUILDPATH));
expectedProblemAttributes.put("MissingOverrideAnnotation", new ProblemAttributes(CategorizedProblem.CAT_CODE_STYLE));
expectedProblemAttributes.put("MissingOverrideAnnotationForInterfaceMethodImplementation", new ProblemAttributes(CategorizedProblem.CAT_CODE_STYLE));
expectedProblemAttributes.put("MissingRequiresTransitiveForTypeInAPI", new ProblemAttributes(CategorizedProblem.CAT_POTENTIAL_PROGRAMMING_PROBLEM));
@@ -1794,6 +1795,7 @@ public void test012_compiler_problems_tuning() {
expectedProblemAttributes.put("MissingEnumDefaultCase", new ProblemAttributes(JavaCore.COMPILER_PB_SWITCH_MISSING_DEFAULT_CASE));
expectedProblemAttributes.put("MissingNonNullByDefaultAnnotationOnPackage", new ProblemAttributes(JavaCore.COMPILER_PB_MISSING_NONNULL_BY_DEFAULT_ANNOTATION));
expectedProblemAttributes.put("MissingNonNullByDefaultAnnotationOnType", new ProblemAttributes(JavaCore.COMPILER_PB_MISSING_NONNULL_BY_DEFAULT_ANNOTATION));
+ expectedProblemAttributes.put("MissingNullAnnotationImplicitlyUsed", new ProblemAttributes(JavaCore.COMPILER_PB_MISSING_NULL_ANNOTATION_IMPLICITLY_USED));
expectedProblemAttributes.put("MissingOverrideAnnotation", new ProblemAttributes(JavaCore.COMPILER_PB_MISSING_OVERRIDE_ANNOTATION));
expectedProblemAttributes.put("MissingOverrideAnnotationForInterfaceMethodImplementation", new ProblemAttributes(JavaCore.COMPILER_PB_MISSING_OVERRIDE_ANNOTATION));
expectedProblemAttributes.put("MissingRequiresTransitiveForTypeInAPI", new ProblemAttributes(JavaCore.COMPILER_PB_API_LEAKS));
diff --git a/org.eclipse.jdt.core.tests.model/JCL/jclMin1.8.jar b/org.eclipse.jdt.core.tests.model/JCL/jclMin1.8.jar
index d7e520134e..074df0519a 100644
--- a/org.eclipse.jdt.core.tests.model/JCL/jclMin1.8.jar
+++ b/org.eclipse.jdt.core.tests.model/JCL/jclMin1.8.jar
Binary files differ
diff --git a/org.eclipse.jdt.core.tests.model/JCL/jclMin1.8src.zip b/org.eclipse.jdt.core.tests.model/JCL/jclMin1.8src.zip
index aed574c89d..1aa9c7b3ea 100644
--- a/org.eclipse.jdt.core.tests.model/JCL/jclMin1.8src.zip
+++ b/org.eclipse.jdt.core.tests.model/JCL/jclMin1.8src.zip
Binary files differ
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/NullAnnotationModelTests.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/NullAnnotationModelTests.java
index b36337b3a0..735c3bf727 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/NullAnnotationModelTests.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/NullAnnotationModelTests.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2011, 2019 GK Software AG and others.
+ * Copyright (c) 2011, 2020 GK Software AG and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -1094,4 +1094,89 @@ public class NullAnnotationModelTests extends ReconcilerTests {
IAnnotationBinding[] annotations = typeBinding.getAnnotations();
assertEquals(0, annotations.length);
}
+ public void testBug479389() throws CoreException, IOException {
+ IJavaProject project = null;
+ try {
+ project = createJavaProject("Bug479389", new String[] {"src"}, new String[] {"JCL18_LIB"}, "bin", "1.8");
+ project.setOption(JavaCore.COMPILER_ANNOTATION_NULL_ANALYSIS, JavaCore.ENABLED);
+
+ createFolder("Bug479389/src/nullAnalysis");
+ String testSource =
+ "package nullAnalysis;\n" +
+ "interface MyList<T> {\n" +
+ " public Stream<T> stream();\n" +
+ "}\n" +
+ "interface Stream<T> {\n" +
+ " T[] toArray(IntFunction<T[]> supplier);" +
+ "}\n" +
+ "interface IntFunction<T> {\n" +
+ " T apply(int i);\n" +
+ "}\n" +
+ "public class X {\n" +
+ "\n" +
+ " public String[] method(MyList<String> in) {\n" +
+ " return in.stream().toArray(String[]::new);\n" +
+ " }\n" +
+ "}\n";
+ String testSourcePath = "Bug479389/src/nullAnalysis/X.java";
+ createFile(testSourcePath, testSource);
+ char[] testSourceChars = testSource.toCharArray();
+ this.problemRequestor.initialize(testSourceChars);
+
+ getCompilationUnit(testSourcePath).getWorkingCopy(this.wcOwner, null);
+ assertProblems(
+ "Unexpected problems",
+ "----------\n" +
+ "1. ERROR in /Bug479389/src/nullAnalysis/X.java (at line 13)\n" +
+ " return in.stream().toArray(String[]::new);\n" +
+ " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
+ "Annotation type \'org.eclipse.jdt.annotation.NonNull\' cannot be found on the build path, which is implicitly needed for null analysis\n" +
+ "----------\n" );
+ } finally {
+ deleteProject(project);
+ }
+ }
+ public void testBug479389_warning() throws CoreException, IOException {
+ IJavaProject project = null;
+ try {
+ project = createJavaProject("Bug479389", new String[] {"src"}, new String[] {"JCL18_LIB"}, "bin", "1.8");
+ project.setOption(JavaCore.COMPILER_ANNOTATION_NULL_ANALYSIS, JavaCore.ENABLED);
+ project.setOption(JavaCore.COMPILER_PB_MISSING_NULL_ANNOTATION_IMPLICITLY_USED, JavaCore.WARNING);
+
+ createFolder("Bug479389/src/nullAnalysis");
+ String testSource =
+ "package nullAnalysis;\n" +
+ "interface MyList<T> {\n" +
+ " public Stream<T> stream();\n" +
+ "}\n" +
+ "interface Stream<T> {\n" +
+ " T[] toArray(IntFunction<T[]> supplier);" +
+ "}\n" +
+ "interface IntFunction<T> {\n" +
+ " T apply(int i);\n" +
+ "}\n" +
+ "public class X {\n" +
+ "\n" +
+ " public String[] method(MyList<String> in) {\n" +
+ " return in.stream().toArray(String[]::new);\n" +
+ " }\n" +
+ "}\n";
+ String testSourcePath = "Bug479389/src/nullAnalysis/X.java";
+ createFile(testSourcePath, testSource);
+ char[] testSourceChars = testSource.toCharArray();
+ this.problemRequestor.initialize(testSourceChars);
+
+ getCompilationUnit(testSourcePath).getWorkingCopy(this.wcOwner, null);
+ assertProblems(
+ "Unexpected problems",
+ "----------\n" +
+ "1. WARNING in /Bug479389/src/nullAnalysis/X.java (at line 13)\n" +
+ " return in.stream().toArray(String[]::new);\n" +
+ " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
+ "Annotation type \'org.eclipse.jdt.annotation.NonNull\' cannot be found on the build path, which is implicitly needed for null analysis\n" +
+ "----------\n" );
+ } finally {
+ deleteProject(project);
+ }
+ }
}
diff --git a/org.eclipse.jdt.core/META-INF/MANIFEST.MF b/org.eclipse.jdt.core/META-INF/MANIFEST.MF
index 594a60d7c3..257ec2f2fd 100644
--- a/org.eclipse.jdt.core/META-INF/MANIFEST.MF
+++ b/org.eclipse.jdt.core/META-INF/MANIFEST.MF
@@ -3,7 +3,7 @@ Main-Class: org.eclipse.jdt.internal.compiler.batch.Main
Bundle-ManifestVersion: 2
Bundle-Name: %pluginName
Bundle-SymbolicName: org.eclipse.jdt.core; singleton:=true
-Bundle-Version: 3.20.100.qualifier
+Bundle-Version: 3.21.0.qualifier
Bundle-Activator: org.eclipse.jdt.core.JavaCore
Bundle-Vendor: %providerName
Bundle-Localization: plugin
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/core/compiler/IProblem.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/core/compiler/IProblem.java
index 949332e962..de77baa45d 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/core/compiler/IProblem.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/core/compiler/IProblem.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2000, 2019 IBM Corporation and others.
+ * Copyright (c) 2000, 2020 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -1896,6 +1896,8 @@ void setSourceStart(int sourceStart);
int NonNullTypeVariableFromLegacyMethod = TypeRelated + 980;
/** @since 3.12 */
int NonNullMethodTypeVariableFromLegacyMethod = TypeRelated + 981;
+ /** @since 3.21 */
+ int MissingNullAnnotationImplicitlyUsed = Internal + 982;
// Java 8 work
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/impl/CompilerOptions.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/impl/CompilerOptions.java
index d3954dfd37..6089b7f0e6 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/impl/CompilerOptions.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/impl/CompilerOptions.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2000, 2019 IBM Corporation and others.
+ * Copyright (c) 2000, 2020 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -194,6 +194,7 @@ public class CompilerOptions {
public static final String OPTION_ReportNonnullParameterAnnotationDropped = "org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped"; //$NON-NLS-1$
public static final String OPTION_PessimisticNullAnalysisForFreeTypeVariables = "org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables"; //$NON-NLS-1$
public static final String OPTION_ReportNonNullTypeVariableFromLegacyInvocation = "org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation"; //$NON-NLS-1$
+ public static final String OPTION_ReportMissingNullAnnotationImplicitlyUsed = "org.eclipse.jdt.core.compiler.problem.missingNullAnnotationImplicitlyUsed"; //$NON-NLS-1$
public static final String OPTION_ReportUnlikelyCollectionMethodArgumentType = "org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType"; //$NON-NLS-1$
public static final String OPTION_ReportUnlikelyCollectionMethodArgumentTypeStrict = "org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict"; //$NON-NLS-1$
@@ -347,6 +348,7 @@ public class CompilerOptions {
public static final int UnstableAutoModuleName = IrritantSet.GROUP2 | ASTNode.Bit26;
public static final int PreviewFeatureUsed = IrritantSet.GROUP2 | ASTNode.Bit27;
public static final int SuppressWarningsNotAnalysed = IrritantSet.GROUP2 | ASTNode.Bit28;
+ public static final int MissingNullAnnotationImplicitlyUsed = IrritantSet.GROUP2 | ASTNode.Bit29;
// Severity level for handlers
@@ -783,6 +785,8 @@ public class CompilerOptions {
return OPTION_ReportPreviewFeatures;
case SuppressWarningsNotAnalysed:
return OPTION_ReportSuppressWarningNotFullyAnalysed;
+ case MissingNullAnnotationImplicitlyUsed:
+ return OPTION_ReportMissingNullAnnotationImplicitlyUsed;
}
return null;
}
@@ -1024,7 +1028,8 @@ public class CompilerOptions {
OPTION_ReportUnlikelyEqualsArgumentType,
OPTION_ReportAPILeak,
OPTION_ReportPreviewFeatures,
- OPTION_ReportSuppressWarningNotFullyAnalysed
+ OPTION_ReportSuppressWarningNotFullyAnalysed,
+ OPTION_ReportMissingNullAnnotationImplicitlyUsed
};
return result;
}
@@ -1101,6 +1106,7 @@ public class CompilerOptions {
case NonnullParameterAnnotationDropped:
case PessimisticNullAnalysisForFreeTypeVariables:
case NonNullTypeVariableFromLegacyInvocation:
+ case MissingNullAnnotationImplicitlyUsed:
return "null"; //$NON-NLS-1$
case FallthroughCase :
return "fallthrough"; //$NON-NLS-1$
@@ -1380,6 +1386,7 @@ public class CompilerOptions {
optionsMap.put(OPTION_EnablePreviews, this.enablePreviewFeatures ? ENABLED : DISABLED);
optionsMap.put(OPTION_ReportPreviewFeatures, getSeverityString(PreviewFeatureUsed));
optionsMap.put(OPTION_ReportSuppressWarningNotFullyAnalysed, getSeverityString(SuppressWarningsNotAnalysed));
+ optionsMap.put(OPTION_ReportMissingNullAnnotationImplicitlyUsed, getSeverityString(MissingNullAnnotationImplicitlyUsed));
return optionsMap;
}
@@ -1956,6 +1963,7 @@ public class CompilerOptions {
this.pessimisticNullAnalysisForFreeTypeVariablesEnabled = true;
}
if ((optionValue = optionsMap.get(OPTION_ReportNonNullTypeVariableFromLegacyInvocation)) != null) updateSeverity(NonNullTypeVariableFromLegacyInvocation, optionValue);
+ if ((optionValue = optionsMap.get(OPTION_ReportMissingNullAnnotationImplicitlyUsed)) != null) updateSeverity(MissingNullAnnotationImplicitlyUsed, optionValue);
}
// Javadoc options
@@ -2248,6 +2256,7 @@ public class CompilerOptions {
buf.append("\n\t- Unused Type Parameter: ").append(getSeverityString(UnusedTypeParameter)); //$NON-NLS-1$
buf.append("\n\t- pessimistic null analysis for free type variables: ").append(getSeverityString(PessimisticNullAnalysisForFreeTypeVariables)); //$NON-NLS-1$
buf.append("\n\t- report unsafe nonnull return from legacy method: ").append(getSeverityString(NonNullTypeVariableFromLegacyInvocation)); //$NON-NLS-1$
+ buf.append("\n\t- report missing null annotation, which is implicitly used: ").append(getSeverityString(MissingNullAnnotationImplicitlyUsed)); //$NON-NLS-1$
buf.append("\n\t- unlikely argument type for collection methods: ").append(getSeverityString(UnlikelyCollectionMethodArgumentType)); //$NON-NLS-1$
buf.append("\n\t- unlikely argument type for collection methods, strict check against expected type: ").append(this.reportUnlikelyCollectionMethodArgumentTypeStrict ? ENABLED : DISABLED); //$NON-NLS-1$
buf.append("\n\t- unlikely argument types for equals(): ").append(getSeverityString(UnlikelyEqualsArgumentType)); //$NON-NLS-1$
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/impl/IrritantSet.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/impl/IrritantSet.java
index 72ae67a1fc..fdb80eca5d 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/impl/IrritantSet.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/impl/IrritantSet.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2000, 2019 IBM Corporation and others.
+ * Copyright (c) 2000, 2020 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -141,7 +141,8 @@ public class IrritantSet {
// default errors IF AnnotationBasedNullAnalysis is enabled:
COMPILER_DEFAULT_ERRORS.set(
CompilerOptions.NullSpecViolation
- |CompilerOptions.NullAnnotationInferenceConflict);
+ |CompilerOptions.NullAnnotationInferenceConflict
+ |CompilerOptions.MissingNullAnnotationImplicitlyUsed);
ALL.setAll();
HIDING
@@ -158,7 +159,8 @@ public class IrritantSet {
.set(CompilerOptions.NonnullParameterAnnotationDropped)
.set(CompilerOptions.MissingNonNullByDefaultAnnotation)
.set(CompilerOptions.PessimisticNullAnalysisForFreeTypeVariables)
- .set(CompilerOptions.NonNullTypeVariableFromLegacyInvocation);
+ .set(CompilerOptions.NonNullTypeVariableFromLegacyInvocation)
+ .set(CompilerOptions.MissingNullAnnotationImplicitlyUsed);
RESTRICTION.set(CompilerOptions.DiscouragedReference);
STATIC_ACCESS.set(CompilerOptions.NonStaticAccessToStatic);
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/AnnotationBinding.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/AnnotationBinding.java
index 1f2618b34d..aab7eace10 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/AnnotationBinding.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/AnnotationBinding.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2000, 2017 IBM Corporation and others.
+ * Copyright (c) 2000, 2020 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -97,7 +97,7 @@ public static AnnotationBinding[] addStandardAnnotations(AnnotationBinding[] rec
}
private static AnnotationBinding buildMarkerAnnotationForMemberType(char[][] compoundName, ModuleBinding module, LookupEnvironment env) {
- ReferenceBinding type = env.getResolvedType(compoundName, module, null);
+ ReferenceBinding type = env.getResolvedType(compoundName, module, null, false);
// since this is a member type name using '$' the return binding is a
// problem reference binding with reason ProblemReasons.InternalNameProvided
if (!type.isValidBinding()) {
@@ -107,7 +107,7 @@ private static AnnotationBinding buildMarkerAnnotationForMemberType(char[][] com
}
private static AnnotationBinding buildMarkerAnnotation(char[][] compoundName, ModuleBinding module, LookupEnvironment env) {
- ReferenceBinding type = env.getResolvedType(compoundName, module, null);
+ ReferenceBinding type = env.getResolvedType(compoundName, module, null, false);
return env.createAnnotation(type, Binding.NO_ELEMENT_VALUE_PAIRS);
}
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/CompilationUnitScope.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/CompilationUnitScope.java
index 97e45e5d3b..f41bdba3a1 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/CompilationUnitScope.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/CompilationUnitScope.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2000, 2019 IBM Corporation and others.
+ * Copyright (c) 2000, 2020 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -687,7 +687,7 @@ ImportBinding[] getDefaultImports() {
problemReporter().isClassPathCorrect(
TypeConstants.JAVA_LANG_OBJECT,
this.referenceContext,
- this.environment.missingClassFileLocation);
+ this.environment.missingClassFileLocation, false);
BinaryTypeBinding missingObject = this.environment.createMissingType(null, TypeConstants.JAVA_LANG_OBJECT);
importBinding = missingObject.fPackage;
}
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/LookupEnvironment.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/LookupEnvironment.java
index 071252f1e2..31bebbc4fb 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/LookupEnvironment.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/LookupEnvironment.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2000, 2019 IBM Corporation and others.
+ * Copyright (c) 2000, 2020 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -1515,7 +1515,7 @@ public AnnotationBinding getNonNullAnnotation() {
if (this.root != this) {
return this.nonNullAnnotation = this.root.getNonNullAnnotation();
}
- ReferenceBinding nonNull = getResolvedType(this.globalOptions.nonNullAnnotationName, null);
+ ReferenceBinding nonNull = getResolvedType(this.globalOptions.nonNullAnnotationName, this.UnNamedModule, null, true);
return this.nonNullAnnotation = this.typeSystem.getAnnotationType(nonNull, true);
}
@@ -1623,11 +1623,11 @@ PackageBinding getPackage0(char[] name) {
* Fail with a classpath error if the type cannot be found.
*/
public ReferenceBinding getResolvedType(char[][] compoundName, Scope scope) {
- return getResolvedType(compoundName, scope == null ? this.UnNamedModule : scope.module(), scope);
+ return getResolvedType(compoundName, scope == null ? this.UnNamedModule : scope.module(), scope, false);
}
-public ReferenceBinding getResolvedType(char[][] compoundName, ModuleBinding moduleBinding, Scope scope) {
+public ReferenceBinding getResolvedType(char[][] compoundName, ModuleBinding moduleBinding, Scope scope, boolean implicitAnnotationUse) {
if (this.module != moduleBinding)
- return moduleBinding.environment.getResolvedType(compoundName, moduleBinding, scope);
+ return moduleBinding.environment.getResolvedType(compoundName, moduleBinding, scope, implicitAnnotationUse);
ReferenceBinding type = getType(compoundName, moduleBinding);
if (type != null) return type;
@@ -1636,11 +1636,11 @@ public ReferenceBinding getResolvedType(char[][] compoundName, ModuleBinding mod
this.problemReporter.isClassPathCorrect(
compoundName,
scope == null ? this.root.unitBeingCompleted : scope.referenceCompilationUnit(),
- this.missingClassFileLocation);
+ this.missingClassFileLocation, implicitAnnotationUse);
return createMissingType(null, compoundName);
}
public ReferenceBinding getResolvedJavaBaseType(char[][] compoundName, Scope scope) {
- return getResolvedType(compoundName, javaBaseModule(), scope);
+ return getResolvedType(compoundName, javaBaseModule(), scope, false);
}
/* Answer the top level package named name.
@@ -1757,7 +1757,7 @@ private ReferenceBinding getTypeFromCompoundName(char[][] compoundName, boolean
* misconfiguration now that did not also exist in some equivalent form while producing the class files which encode
* these missing types. So no need to bark again. Note that wasMissingType == true signals a type referenced in a .class
* file which could not be found when the binary was produced. See https://bugs.eclipse.org/bugs/show_bug.cgi?id=364450 */
- this.problemReporter.isClassPathCorrect(compoundName, this.root.unitBeingCompleted, this.missingClassFileLocation);
+ this.problemReporter.isClassPathCorrect(compoundName, this.root.unitBeingCompleted, this.missingClassFileLocation, false);
}
// create a proxy for the missing BinaryType
binding = createMissingType(null, compoundName);
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/UnresolvedReferenceBinding.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/UnresolvedReferenceBinding.java
index fd4246da7d..9e4703051d 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/UnresolvedReferenceBinding.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/UnresolvedReferenceBinding.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2000, 2019 IBM Corporation and others.
+ * Copyright (c) 2000, 2020 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -123,7 +123,7 @@ ReferenceBinding resolve(LookupEnvironment environment, boolean convertGenericTo
environment.problemReporter.isClassPathCorrect(
this.compoundName,
environment.root.unitBeingCompleted,
- environment.missingClassFileLocation);
+ environment.missingClassFileLocation, false);
}
// create a proxy for the missing BinaryType
targetType = environment.createMissingType(null, this.compoundName);
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/ProblemReporter.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/ProblemReporter.java
index 4f35cb3a01..27646d89de 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/ProblemReporter.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/ProblemReporter.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2000, 2019 IBM Corporation and others.
+ * Copyright (c) 2000, 2020 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -498,6 +498,8 @@ public static int getIrritant(int problemID) {
case IProblem.RedundantNullDefaultAnnotationLocal:
case IProblem.RedundantNullDefaultAnnotationField:
return CompilerOptions.RedundantNullAnnotation;
+ case IProblem.MissingNullAnnotationImplicitlyUsed:
+ return CompilerOptions.MissingNullAnnotationImplicitlyUsed;
case IProblem.BoxingConversion :
case IProblem.UnboxingConversion :
@@ -812,6 +814,7 @@ public static int getProblemCategory(int severity, int problemID) {
case IProblem.IsClassPathCorrect :
case IProblem.CorruptedSignature :
case IProblem.UndefinedModuleAddReads :
+ case IProblem.MissingNullAnnotationImplicitlyUsed :
return CategorizedProblem.CAT_BUILDPATH;
case IProblem.ProblemNotAnalysed :
return CategorizedProblem.CAT_UNNECESSARY_CODE;
@@ -5032,7 +5035,7 @@ public void illegalTypeAnnotationsInStaticMemberAccess(Annotation first, Annotat
first.sourceStart,
last.sourceEnd);
}
-public void isClassPathCorrect(char[][] wellKnownTypeName, CompilationUnitDeclaration compUnitDecl, Object location) {
+public void isClassPathCorrect(char[][] wellKnownTypeName, CompilationUnitDeclaration compUnitDecl, Object location, boolean implicitAnnotationUse) {
// ProblemReporter is not designed to be reentrant. Just in case, we discovered a build path problem while we are already
// in the midst of reporting some other problem, save and restore reference context thereby mimicking a stack.
// See https://bugs.eclipse.org/bugs/show_bug.cgi?id=442755.
@@ -5053,7 +5056,7 @@ public void isClassPathCorrect(char[][] wellKnownTypeName, CompilationUnitDeclar
}
try {
this.handle(
- IProblem.IsClassPathCorrect,
+ implicitAnnotationUse ? IProblem.MissingNullAnnotationImplicitlyUsed : IProblem.IsClassPathCorrect,
arguments,
arguments,
start,
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/messages.properties b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/messages.properties
index 8c4171797b..a64e5f35ec 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/messages.properties
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/messages.properties
@@ -1,5 +1,5 @@
###############################################################################
-# Copyright (c) 2000, 2019 IBM Corporation and others.
+# Copyright (c) 2000, 2020 IBM Corporation and others.
#
# This program and the accompanying materials
# are made available under the terms of the Eclipse Public License 2.0
@@ -851,7 +851,7 @@
979 = Null type safety: required ''@{0}'' but this expression has type ''{1}'', a free type variable that may represent a ''@{2}'' type
980 = Unsafe interpretation of method return type as ''@{0}'' based on the receiver type ''{1}''. Type ''{2}'' doesn''t seem to be designed with null type annotations in mind
981 = Unsafe interpretation of method return type as ''@{0}'' based on substitution ''{1}={2}''. Declaring type ''{3}'' doesn''t seem to be designed with null type annotations in mind
-
+982 = Annotation type ''{0}'' cannot be found on the build path, which is implicitly needed for null analysis
# Java 8
1001 = Syntax error, modifiers and annotations are not allowed for the lambda parameter {0} as its type is elided
diff --git a/org.eclipse.jdt.core/model/org/eclipse/jdt/core/JavaCore.java b/org.eclipse.jdt.core/model/org/eclipse/jdt/core/JavaCore.java
index 3b56560176..62e2416edc 100644
--- a/org.eclipse.jdt.core/model/org/eclipse/jdt/core/JavaCore.java
+++ b/org.eclipse.jdt.core/model/org/eclipse/jdt/core/JavaCore.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2000, 2019 IBM Corporation and others.
+ * Copyright (c) 2000, 2020 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -2070,7 +2070,20 @@ public final class JavaCore extends Plugin {
* @category CompilerOptionID
*/
public static final String COMPILER_PB_NONNULL_TYPEVAR_FROM_LEGACY_INVOCATION = JavaCore.PLUGIN_ID+".compiler.problem.nonnullTypeVariableFromLegacyInvocation"; //$NON-NLS-1$
-
+
+ /**
+ * Compiler option ID: Reporting when annotation based null analysis misses an annotation type.
+ * <p>When enabled, the compiler will issue an error or warning against some Java expressions with
+ * known nullness, if a corresponding null annotation cannot be found on the build path.</p>
+ * <dl>
+ * <dt>Option id:</dt><dd><code>"org.eclipse.jdt.core.compiler.problem.missingNullAnnotationImplicitlyUsed"</code></dd>
+ * <dt>Possible values:</dt><dd><code>{ "error", "warning", "info", "ignore" }</code></dd>
+ * <dt>Default:</dt><dd><code>"error"</code></dd>
+ * </dl>
+ * @since 3.21
+ * @category CompilerOptionID
+ */
+ public static final String COMPILER_PB_MISSING_NULL_ANNOTATION_IMPLICITLY_USED = JavaCore.PLUGIN_ID+".compiler.problem.missingNullAnnotationImplicitlyUsed"; //$NON-NLS-1$
/**
* Compiler option ID: Setting Source Compatibility Mode.
* <p>Specify whether which source level compatibility is used. From 1.4 on, <code>'assert'</code> is a keyword
diff --git a/org.eclipse.jdt.core/pom.xml b/org.eclipse.jdt.core/pom.xml
index 438863b07e..a57fe11eed 100644
--- a/org.eclipse.jdt.core/pom.xml
+++ b/org.eclipse.jdt.core/pom.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (c) 2012, 2019 Eclipse Foundation and others.
+ Copyright (c) 2012, 2020 Eclipse Foundation and others.
All rights reserved. This program and the accompanying materials
are made available under the terms of the Eclipse Distribution License v1.0
which accompanies this distribution, and is available at
@@ -18,7 +18,7 @@
</parent>
<groupId>org.eclipse.jdt</groupId>
<artifactId>org.eclipse.jdt.core</artifactId>
- <version>3.20.100-SNAPSHOT</version>
+ <version>3.21.0-SNAPSHOT</version>
<packaging>eclipse-plugin</packaging>
<properties>

Back to the top