Bug 507256 - [null] Errors following external annotations of
java.lang.reflect.Type
Change-Id: Ibe6ba50d1e2260c444558a0508b56015c7c6b848
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/ExternalAnnotations18Test.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/ExternalAnnotations18Test.java
index bc2e744..fb358e8 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/ExternalAnnotations18Test.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/ExternalAnnotations18Test.java
@@ -1839,4 +1839,41 @@
assertProblems(problems, new String[] {
"Pb(149) Dead code"
}, new int[] { 7 });
- }}
+ }
+ public void testBug507256() throws Exception {
+ myCreateJavaProject("TestLibs");
+ addLibraryWithExternalAnnotations(this.project, "lib1.jar", "annots", new String[] {
+ "/UnannotatedLib/libs/Lib1.java",
+ "package libs;\n" +
+ "\n" +
+ "public interface Lib1 {\n" +
+ " void methodWithParamAfterWildcard(Class<?> c, Object s);\n" +
+ "}\n"
+ }, null);
+ // annotations directly on a wildcard (*, +, -)
+ createFileInProject("annots/libs", "Lib1.eea",
+ "class libs/Lib1\n" +
+ "\n" +
+ "methodWithParamAfterWildcard\n" +
+ " (Ljava/lang/Class<*>;Ljava/lang/Object;)V\n" +
+ " (L1java/lang/Class<*>;L1java/lang/Object;)V\n" +
+ "\n" +
+ "\n");
+ IPackageFragment fragment = this.project.getPackageFragmentRoots()[0].createPackageFragment("tests", true, null);
+ ICompilationUnit unit = fragment.createCompilationUnit("Test1.java",
+ "package tests;\n" +
+ "import libs.Lib1;\n" +
+ "\n" +
+ "public class Test1 {\n" +
+ " void test1(Lib1 lib) {\n" +
+ " lib.methodWithParamAfterWildcard(Object.class, null);\n" + // error, second param must not be null
+ " }\n" +
+ "}\n",
+ true, new NullProgressMonitor()).getWorkingCopy(new NullProgressMonitor());
+ CompilationUnit reconciled = unit.reconcile(AST.JLS8, true, null, new NullProgressMonitor());
+ IProblem[] problems = reconciled.getProblems();
+ assertProblems(problems, new String[] {
+ "Pb(910) Null type mismatch: required '@NonNull Object' but the provided value is null"
+ }, new int[] { 6 });
+ }
+}
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/classfmt/ExternalAnnotationProvider.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/classfmt/ExternalAnnotationProvider.java
index cf7b55c..fd6da1b 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/classfmt/ExternalAnnotationProvider.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/classfmt/ExternalAnnotationProvider.java
@@ -586,7 +586,8 @@
if (an == NULLABLE || an == NONNULL)
start++;
}
- int end = wrapperWithStart(start).computeEnd();
+ SignatureWrapper wrapper1 = wrapperWithStart(start);
+ int end = wrapper1.skipAngleContents(wrapper1.computeEnd());
return end;
}