| /******************************************************************************* |
| * Copyright (c) 2000, 2021 IBM Corporation and others. |
| * |
| * This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License 2.0 |
| * which accompanies this distribution, and is available at |
| * https://www.eclipse.org/legal/epl-2.0/ |
| * |
| * SPDX-License-Identifier: EPL-2.0 |
| * |
| * Contributors: |
| * IBM Corporation - initial API and implementation |
| * Stephan Herrmann - Contributions for |
| * bug 295551 - Add option to automatically promote all warnings to error |
| * bug 185682 - Increment/decrement operators mark local variables as read |
| * bug 366003 - CCE in ASTNode.resolveAnnotations(ASTNode.java:639) |
| * bug 384663 - Package Based Annotation Compilation Error in JDT 3.8/4.2 (works in 3.7.2) |
| * bug 386356 - Type mismatch error with annotations and generics |
| * bug 331649 - [compiler][null] consider null annotations for fields |
| * bug 376590 - Private fields with @Inject are ignored by unused field validation |
| * Bug 392099 - [1.8][compiler][null] Apply null annotation on types for null analysis |
| * Bug 469584 - ClassCastException in Annotation.detectStandardAnnotation (320) |
| * Jesper S Moller - Contributions for |
| * bug 384567 - [1.5][compiler] Compiler accepts illegal modifiers on package declaration |
| * bug 412153 - [1.8][compiler] Check validity of annotations which may be repeatable |
| * Ulrich Grave <ulrich.grave@gmx.de> - Contributions for |
| * bug 386692 - Missing "unused" warning on "autowired" fields |
| * Pierre-Yves B. <pyvesdev@gmail.com> - Contributions for |
| * bug 542520 - [JUnit 5] Warning The method xxx from the type X is never used locally is shown when using MethodSource |
| * bug 546084 - Using Junit 5s MethodSource leads to ClassCastException |
| *******************************************************************************/ |
| package org.eclipse.jdt.core.tests.compiler.regression; |
| |
| import java.io.File; |
| import java.io.IOException; |
| import java.util.Arrays; |
| import java.util.HashMap; |
| import java.util.Hashtable; |
| import java.util.List; |
| import java.util.Locale; |
| import java.util.Map; |
| |
| import junit.framework.Test; |
| |
| import org.eclipse.jdt.core.JavaCore; |
| import org.eclipse.jdt.core.ToolFactory; |
| import org.eclipse.jdt.core.compiler.CategorizedProblem; |
| import org.eclipse.jdt.core.tests.util.Util; |
| import org.eclipse.jdt.core.util.ClassFileBytesDisassembler; |
| 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.TypeDeclaration; |
| import org.eclipse.jdt.internal.compiler.batch.CompilationUnit; |
| import org.eclipse.jdt.internal.compiler.batch.FileSystem; |
| import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; |
| import org.eclipse.jdt.internal.compiler.classfmt.ClassFileReader; |
| import org.eclipse.jdt.internal.compiler.classfmt.ClassFormatException; |
| 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.impl.IrritantSet; |
| import org.eclipse.jdt.internal.compiler.lookup.AnnotationBinding; |
| import org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding; |
| import org.eclipse.jdt.internal.compiler.problem.DefaultProblemFactory; |
| |
| @SuppressWarnings({ "unchecked", "rawtypes" }) |
| public class AnnotationTest extends AbstractComparableTest { |
| |
| // Static initializer to specify tests subset using TESTS_* static variables |
| // All specified tests which do not belong to the class are skipped... |
| static { |
| // TESTS_NAMES = new String[] { "testBug506888c" }; |
| // TESTS_NUMBERS = new int[] { 297 }; |
| // TESTS_RANGE = new int[] { 294, -1 }; |
| } |
| |
| String reportMissingJavadocComments = null; |
| private String repeatableIntroText; |
| private String repeatableTrailerText; |
| |
| public AnnotationTest(String name) { |
| super(name); |
| } |
| |
| public static Test suite() { |
| return buildComparableTestSuite(testClass()); |
| } |
| |
| public static Class testClass() { |
| return AnnotationTest.class; |
| } |
| |
| @Override |
| protected Map getCompilerOptions() { |
| Map options = super.getCompilerOptions(); |
| options.put(CompilerOptions.OPTION_DocCommentSupport, CompilerOptions.ENABLED); |
| options.put(CompilerOptions.OPTION_ReportInvalidJavadoc, CompilerOptions.ERROR); |
| options.put(CompilerOptions.OPTION_ReportInvalidJavadocTagsVisibility, CompilerOptions.PRIVATE); |
| options.put(CompilerOptions.OPTION_ReportMissingJavadocTags, CompilerOptions.ERROR); |
| options.put(CompilerOptions.OPTION_ReportMissingJavadocTagsVisibility, CompilerOptions.PRIVATE); |
| if (this.reportMissingJavadocComments != null) |
| options.put(CompilerOptions.OPTION_ReportMissingJavadocComments, this.reportMissingJavadocComments); |
| return options; |
| } |
| @Override |
| protected INameEnvironment getNameEnvironment(String[] testFiles, String[] classPaths) { |
| if (this.javaClassLib != null) { |
| this.classpaths = classPaths == null ? getDefaultClassPaths() : classPaths; |
| return new InMemoryNameEnvironment(testFiles, new INameEnvironment[] {this.javaClassLib }); |
| } |
| return super.getNameEnvironment(testFiles, classPaths); |
| } |
| |
| /* (non-Javadoc) |
| * @see junit.framework.TestCase#setUp() |
| */ |
| @Override |
| protected void setUp() throws Exception { |
| super.setUp(); |
| this.reportMissingJavadocComments = null; |
| this.repeatableIntroText = this.complianceLevel >= ClassFileConstants.JDK1_8 ? |
| "Duplicate annotation of non-repeatable type " |
| : |
| "Duplicate annotation "; |
| this.repeatableTrailerText = this.complianceLevel >= ClassFileConstants.JDK1_8 ? |
| ". Only annotation types marked @Repeatable can be used multiple times at one target.\n" |
| : |
| ". Repeated annotations are allowed only at source level 1.8 or above\n"; |
| this.javaClassLib = null; // use only in selected tests |
| } |
| |
| public void test001() { |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "public @interface X { \n" + |
| " String value(); \n" + |
| "}" |
| }, |
| ""); |
| } |
| |
| // check invalid annotation |
| public void test002() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "public @Foo class X {\n" + |
| "}\n" + |
| "\n" + |
| "@interface Foo {\n" + |
| " String value();\n" + |
| "}\n" |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 1)\n" + |
| " public @Foo class X {\n" + |
| " ^^^^\n" + |
| "The annotation @Foo must define the attribute value\n" + |
| "----------\n"); |
| } |
| |
| // check annotation method cannot indirectly return annotation type (circular ref) |
| public void test003() { |
| this.runNegativeTest( |
| new String[] { |
| "Foo.java", |
| "public @interface Foo {\n" + |
| " Bar value();\n" + |
| "}\n" + |
| "\n" + |
| "@interface Bar {\n" + |
| " Foo value();\n" + |
| "}\n" |
| }, |
| "----------\n" + |
| "1. ERROR in Foo.java (at line 2)\n" + |
| " Bar value();\n" + |
| " ^^^\n" + |
| "Cycle detected: a cycle exists between annotation attributes of Foo and Bar\n" + |
| "----------\n" + |
| "2. ERROR in Foo.java (at line 6)\n" + |
| " Foo value();\n" + |
| " ^^^\n" + |
| "Cycle detected: a cycle exists between annotation attributes of Bar and Foo\n" + |
| "----------\n"); |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=85538 |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "@interface Nested {\n" + |
| " String name() default \"Hans\";\n" + |
| " N2 nest();\n" + |
| "}\n" + |
| "@interface N2 {\n" + |
| " Nested n2() default @Nested(name=\"Haus\", nest= @N2);\n" + |
| "}\n" |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 3)\n" + |
| " N2 nest();\n" + |
| " ^^\n" + |
| "Cycle detected: a cycle exists between annotation attributes of Nested and N2\n" + |
| "----------\n" + |
| "2. ERROR in X.java (at line 6)\n" + |
| " Nested n2() default @Nested(name=\"Haus\", nest= @N2);\n" + |
| " ^^^^^^\n" + |
| "Cycle detected: a cycle exists between annotation attributes of N2 and Nested\n" + |
| "----------\n"); |
| } |
| |
| // check annotation method cannot directly return annotation type |
| public void test004() { |
| this.runNegativeTest( |
| new String[] { |
| "Foo.java", |
| "public @interface Foo {\n" + |
| " Foo value();\n" + |
| "}\n" |
| }, |
| "----------\n" + |
| "1. ERROR in Foo.java (at line 2)\n" + |
| " Foo value();\n" + |
| " ^^^\n" + |
| "Cycle detected: the annotation type Foo cannot contain attributes of the annotation type itself\n" + |
| "----------\n"); |
| } |
| |
| // check annotation type cannot have superclass |
| public void test005() { |
| this.runNegativeTest( |
| new String[] { |
| "Foo.java", |
| "public @interface Foo extends Object {\n" + |
| "}\n" |
| }, |
| "----------\n" + |
| "1. ERROR in Foo.java (at line 1)\n" + |
| " public @interface Foo extends Object {\n" + |
| " ^^^\n" + |
| "Annotation type declaration cannot have an explicit superclass\n" + |
| "----------\n"); |
| } |
| |
| // check annotation type cannot have superinterfaces |
| public void test006() { |
| this.runNegativeTest( |
| new String[] { |
| "Foo.java", |
| "public @interface Foo implements Cloneable {\n" + |
| "}\n" |
| }, |
| "----------\n" + |
| "1. ERROR in Foo.java (at line 1)\n" + |
| " public @interface Foo implements Cloneable {\n" + |
| " ^^^\n" + |
| "Annotation type declaration cannot have explicit superinterfaces\n" + |
| "----------\n"); |
| } |
| |
| // check annotation method cannot be specified parameters |
| // TODO (olivier) unoptimal syntax error -> no parameter for annotation method? |
| public void test007() { |
| this.runNegativeTest( |
| new String[] { |
| "Foo.java", |
| "public @interface Foo {\n" + |
| " String value(int i);\n" + |
| "}\n" |
| }, |
| "----------\n" + |
| "1. ERROR in Foo.java (at line 2)\n" + |
| " String value(int i);\n" + |
| " ^^^^^^^^^^^^\n" + |
| "Annotation attributes cannot have parameters\n" + |
| "----------\n"); |
| } |
| |
| // annotation method cannot be generic? |
| public void test008() { |
| this.runNegativeTest( |
| new String[] { |
| "Foo.java", |
| "public @interface Foo {\n" + |
| " <T> T value();\n" + |
| "}\n" |
| }, |
| "----------\n" + |
| "1. ERROR in Foo.java (at line 2)\n" + |
| " <T> T value();\n" + |
| " ^\n" + |
| "Invalid type T for the annotation attribute Foo.value; only primitive type, String, Class, annotation, enumeration are permitted or 1-dimensional arrays thereof\n" + |
| "----------\n" + |
| "2. ERROR in Foo.java (at line 2)\n" + |
| " <T> T value();\n" + |
| " ^^^^^^^\n" + |
| "Annotation attributes cannot be generic\n" + |
| "----------\n"); |
| } |
| |
| // check annotation method return type |
| public void test009() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "public @interface X {\n" + |
| " \n" + |
| " Runnable value();\n" + |
| "}\n" |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 3)\n" + |
| " Runnable value();\n" + |
| " ^^^^^^^^\n" + |
| "Invalid type Runnable for the annotation attribute X.value; only primitive type, String, Class, annotation, enumeration are permitted or 1-dimensional arrays thereof\n" + |
| "----------\n"); |
| } |
| |
| // check annotation method missing return type |
| // TODO (olivier) we should get rid of syntax error here (tolerate invalid constructor scenario) |
| public void test010() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "public @interface X {\n" + |
| " \n" + |
| " value();\n" + |
| "}\n" |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 3)\n" + |
| " value();\n" + |
| " ^^^^^^^\n" + |
| "Return type for the method is missing\n" + |
| "----------\n"); |
| } |
| |
| // check annotation denotes annotation type |
| public void test011() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "@Object\n" + |
| "public class X {\n" + |
| "}\n" |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 1)\n" + |
| " @Object\n" + |
| " ^^^^^^\n" + |
| "Object is not an annotation type\n" + |
| "----------\n"); |
| } |
| |
| // check for duplicate annotations |
| public void test012() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "@Foo @Foo\n" + |
| "public class X {\n" + |
| "}\n" + |
| "@interface Foo {}\n" |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 1)\n" + |
| " @Foo @Foo\n" + |
| " ^^^^\n" + |
| this.repeatableIntroText + "@Foo"+ this.repeatableTrailerText + |
| "----------\n" + |
| "2. ERROR in X.java (at line 1)\n" + |
| " @Foo @Foo\n" + |
| " ^^^^\n" + |
| this.repeatableIntroText + "@Foo"+ this.repeatableTrailerText + |
| "----------\n"); |
| } |
| |
| // check single member annotation - no need to specify value if member has default value |
| public void test013() { |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "@Foo(\"hello\") public class X {\n" + |
| "}\n" + |
| "\n" + |
| "@interface Foo {\n" + |
| " String id() default \"\";\n" + |
| " String value() default \"\";\n" + |
| "}\n" |
| }, |
| ""); |
| } |
| |
| // check single member annotation - need to speficy value if member has no default value |
| public void test014() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "@Foo(\"hello\") public class X {\n" + |
| "}\n" + |
| "\n" + |
| "@interface Foo {\n" + |
| " String id() default \"\";\n" + |
| " String value() default \"\";\n" + |
| " String foo();\n" + |
| "}\n" |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 1)\n" + |
| " @Foo(\"hello\") public class X {\n" + |
| " ^^^^\n" + |
| "The annotation @Foo must define the attribute foo\n" + |
| "----------\n"); |
| } |
| |
| // check normal annotation - need to speficy value if member has no default value |
| public void test015() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "@Foo(\n" + |
| " id = \"hello\") public class X {\n" + |
| "}\n" + |
| "\n" + |
| "@interface Foo {\n" + |
| " String id() default \"\";\n" + |
| " String value() default \"\";\n" + |
| " String foo();\n" + |
| "}\n" |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 1)\n" + |
| " @Foo(\n" + |
| " ^^^^\n" + |
| "The annotation @Foo must define the attribute foo\n" + |
| "----------\n"); |
| } |
| |
| // check normal annotation - if single member, no need to be named 'value' |
| public void test016() { |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "@interface Name {\n" + |
| " String first();\n" + |
| " String last();\n" + |
| "}\n" + |
| "@interface Author {\n" + |
| " Name name();\n" + |
| "}\n" + |
| "public class X {\n" + |
| " \n" + |
| " @Author(name = @Name(first=\"Bill\", last=\"Yboy\")) \n" + |
| " void foo() {\n" + |
| " }\n" + |
| "}\n" |
| }, |
| ""); |
| } |
| |
| // check single member annotation can only refer to 'value' member |
| public void test017() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "@interface Name {\n" + |
| " String first();\n" + |
| " String last();\n" + |
| "}\n" + |
| "@interface Author {\n" + |
| " Name name();\n" + |
| "}\n" + |
| "@Author(@Name(first=\"Joe\",last=\"Hacker\")) \n" + |
| "public class X {\n" + |
| " \n" + |
| " @Author(name = @Name(first=\"Bill\", last=\"Yboy\")) \n" + |
| " void foo() {\n" + |
| " }\n" + |
| "}\n" |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 8)\n" + |
| " @Author(@Name(first=\"Joe\",last=\"Hacker\")) \n" + |
| " ^^^^^^^\n" + |
| "The annotation @Author must define the attribute name\n" + |
| "----------\n" + |
| "2. ERROR in X.java (at line 8)\n" + |
| " @Author(@Name(first=\"Joe\",last=\"Hacker\")) \n" + |
| " ^^^^^\n" + |
| "The attribute value is undefined for the annotation type Author\n" + |
| "----------\n"); |
| } |
| |
| // check for duplicate member value pairs |
| public void test018() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "@interface Name {\n" + |
| " String first();\n" + |
| " String last();\n" + |
| "}\n" + |
| "@interface Author {\n" + |
| " Name name();\n" + |
| "}\n" + |
| "public class X {\n" + |
| " \n" + |
| " @Author(name = @Name(first=\"Bill\", last=\"Yboy\", last=\"dup\")) \n" + |
| " void foo() {\n" + |
| " }\n" + |
| "}\n" |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 10)\n" + |
| " @Author(name = @Name(first=\"Bill\", last=\"Yboy\", last=\"dup\")) \n" + |
| " ^^^^\n" + |
| "Duplicate attribute last in annotation @Name\n" + |
| "----------\n" + |
| "2. ERROR in X.java (at line 10)\n" + |
| " @Author(name = @Name(first=\"Bill\", last=\"Yboy\", last=\"dup\")) \n" + |
| " ^^^^\n" + |
| "Duplicate attribute last in annotation @Name\n" + |
| "----------\n", |
| JavacTestOptions.EclipseJustification.EclipseJustification0001); |
| } |
| |
| // check for duplicate member value pairs - simplified to check javac |
| public void test018b() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "@interface Name {\n" + |
| " String first();\n" + |
| " String last();\n" + |
| "}\n" + |
| "public class X {\n" + |
| " @Name(first=\"Bill\", last=\"Yboy\", last=\"dup\")\n" + |
| " void foo() {\n" + |
| " }\n" + |
| "}\n" |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 6)\n" + |
| " @Name(first=\"Bill\", last=\"Yboy\", last=\"dup\")\n" + |
| " ^^^^\n" + |
| "Duplicate attribute last in annotation @Name\n" + |
| "----------\n" + |
| "2. ERROR in X.java (at line 6)\n" + |
| " @Name(first=\"Bill\", last=\"Yboy\", last=\"dup\")\n" + |
| " ^^^^\n" + |
| "Duplicate attribute last in annotation @Name\n" + |
| "----------\n"); |
| } |
| // check class annotation member value must be a class literal |
| public void test019() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "@interface Foo {\n" + |
| " Class value() default X.clazz();\n" + |
| "}\n" + |
| "\n" + |
| "public class X {\n" + |
| " @Foo( clazz() )\n" + |
| " void foo() {}\n" + |
| " static Class clazz() { return X.class; }\n" + |
| "}\n" |
| }, |
| "----------\n" + |
| "1. WARNING in X.java (at line 2)\n" + |
| " Class value() default X.clazz();\n" + |
| " ^^^^^\n" + |
| "Class is a raw type. References to generic type Class<T> should be parameterized\n" + |
| "----------\n" + |
| "2. ERROR in X.java (at line 2)\n" + |
| " Class value() default X.clazz();\n" + |
| " ^^^^^^^^^\n" + |
| "The value for annotation attribute Foo.value must be a class literal\n" + |
| "----------\n" + |
| "3. ERROR in X.java (at line 6)\n" + |
| " @Foo( clazz() )\n" + |
| " ^^^^^^^\n" + |
| "The value for annotation attribute Foo.value must be a class literal\n" + |
| "----------\n" + |
| "4. WARNING in X.java (at line 8)\n" + |
| " static Class clazz() { return X.class; }\n" + |
| " ^^^^^\n" + |
| "Class is a raw type. References to generic type Class<T> should be parameterized\n" + |
| "----------\n"); |
| } |
| |
| // check primitive annotation member value must be a constant |
| public void test020() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "@interface Foo {\n" + |
| " int value() default X.val();\n" + |
| "}\n" + |
| "\n" + |
| "public class X {\n" + |
| " @Foo( val() )\n" + |
| " void foo() {}\n" + |
| " static int val() { return 0; }\n" + |
| "}\n" |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 2)\n" + |
| " int value() default X.val();\n" + |
| " ^^^^^^^\n" + |
| "The value for annotation attribute Foo.value must be a constant expression\n" + |
| "----------\n" + |
| "2. ERROR in X.java (at line 6)\n" + |
| " @Foo( val() )\n" + |
| " ^^^^^\n" + |
| "The value for annotation attribute Foo.value must be a constant expression\n" + |
| "----------\n"); |
| } |
| |
| // check String annotation member value must be a constant |
| public void test021() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "@interface Foo {\n" + |
| " String value() default X.val();\n" + |
| "}\n" + |
| "\n" + |
| "public class X {\n" + |
| " @Foo( val() )\n" + |
| " void foo() {}\n" + |
| " static String val() { return \"\"; }\n" + |
| "}\n" |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 2)\n" + |
| " String value() default X.val();\n" + |
| " ^^^^^^^\n" + |
| "The value for annotation attribute Foo.value must be a constant expression\n" + |
| "----------\n" + |
| "2. ERROR in X.java (at line 6)\n" + |
| " @Foo( val() )\n" + |
| " ^^^^^\n" + |
| "The value for annotation attribute Foo.value must be a constant expression\n" + |
| "----------\n"); |
| } |
| // check String annotation member value must be a constant |
| public void test022() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "@interface Foo {\n" + |
| " String[] value() default null;\n" + |
| "}\n" + |
| "\n" + |
| "public class X {\n" + |
| " @Foo( null )\n" + |
| " void foo() {}\n" + |
| "}\n" |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 2)\n" + |
| " String[] value() default null;\n" + |
| " ^^^^\n" + |
| "The value for annotation attribute Foo.value must be a constant expression\n" + |
| "----------\n" + |
| "2. ERROR in X.java (at line 6)\n" + |
| " @Foo( null )\n" + |
| " ^^^^\n" + |
| "The value for annotation attribute Foo.value must be a constant expression\n" + |
| "----------\n"); |
| } |
| |
| // check use of array initializer |
| public void test023() { |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "@interface Foo {\n" + |
| " String[] value() default {};\n" + |
| "}\n" + |
| "\n" + |
| "public class X {\n" + |
| " @Foo( {} )\n" + |
| " void foo() {}\n" + |
| "}\n" |
| }, |
| ""); |
| } |
| |
| // check use of binary annotation - check referencing binary annotation |
| public void test024() { |
| this.runConformTest( |
| new String[] { |
| "Foo.java", |
| "public @interface Foo {\n" + |
| " String[] value() default {};\n" + |
| "}\n" |
| }, |
| ""); |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "public class X {\n" + |
| " @Foo({})\n" + |
| " void foo() {}\n" + |
| "}\n" |
| }, |
| "", |
| null, |
| false, |
| null); |
| } |
| |
| // check use of binary annotation - check default value presence |
| public void test025() { |
| this.runConformTest( |
| new String[] { |
| "Foo.java", |
| "public @interface Foo {\n" + |
| " String[] value() default {};\n" + |
| "}\n" |
| }, |
| ""); |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "public class X {\n" + |
| " @Foo()\n" + |
| " void foo() {}\n" + |
| "}\n" |
| }, |
| "", |
| null, |
| false, |
| null); |
| } |
| |
| // check use of binary annotation - check default value presence |
| public void test026() { |
| this.runConformTest( |
| new String[] { |
| "Foo.java", |
| "public @interface Foo {\n" + |
| " int value() default 8;\n" + |
| "}\n" |
| }, |
| ""); |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "public class X {\n" + |
| " @Foo()\n" + |
| " void foo() {}\n" + |
| "}\n" |
| }, |
| "", |
| null, |
| false, |
| null); |
| } |
| |
| // check use of binary annotation - check default value presence |
| public void test027() { |
| this.runConformTest( |
| new String[] { |
| "Foo.java", |
| "public @interface Foo {\n" + |
| " byte value() default (byte)255;\n" + |
| "}\n" |
| }, |
| ""); |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "public class X {\n" + |
| " @Foo()\n" + |
| " void foo() {}\n" + |
| "}\n" |
| }, |
| "", |
| null, |
| false, |
| null); |
| } |
| |
| // check use of binary annotation - check default value presence |
| public void test028() { |
| this.runConformTest( |
| new String[] { |
| "Foo.java", |
| "public @interface Foo {\n" + |
| " boolean value() default true;\n" + |
| "}\n" |
| }, |
| ""); |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "public class X {\n" + |
| " @Foo()\n" + |
| " void foo() {}\n" + |
| "}\n" |
| }, |
| "", |
| null, |
| false, |
| null); |
| } |
| |
| // check use of binary annotation - check default value presence |
| public void test029() { |
| this.runConformTest( |
| new String[] { |
| "Foo.java", |
| "public @interface Foo {\n" + |
| " char value() default ' ';\n" + |
| "}\n" |
| }, |
| ""); |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "public class X {\n" + |
| " @Foo()\n" + |
| " void foo() {}\n" + |
| "}\n" |
| }, |
| "", |
| null, |
| false, |
| null); |
| } |
| |
| // check use of binary annotation - check default value presence |
| public void test030() { |
| this.runConformTest( |
| new String[] { |
| "Foo.java", |
| "public @interface Foo {\n" + |
| " short value() default (short)1024;\n" + |
| "}\n" |
| }, |
| ""); |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "public class X {\n" + |
| " @Foo()\n" + |
| " void foo() {}\n" + |
| "}\n" |
| }, |
| "", |
| null, |
| false, |
| null); |
| } |
| |
| // check use of binary annotation - check default value presence |
| public void test031() { |
| this.runConformTest( |
| new String[] { |
| "Foo.java", |
| "public @interface Foo {\n" + |
| " double value() default 0.0;\n" + |
| "}\n" |
| }, |
| ""); |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "public class X {\n" + |
| " @Foo()\n" + |
| " void foo() {}\n" + |
| "}\n" |
| }, |
| "", |
| null, |
| false, |
| null); |
| } |
| |
| // check use of binary annotation - check default value presence |
| public void test032() { |
| this.runConformTest( |
| new String[] { |
| "Foo.java", |
| "public @interface Foo {\n" + |
| " float value() default -0.0f;\n" + |
| "}\n" |
| }, |
| ""); |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "public class X {\n" + |
| " @Foo()\n" + |
| " void foo() {}\n" + |
| "}\n" |
| }, |
| "", |
| null, |
| false, |
| null); |
| } |
| |
| // check use of binary annotation - check default value presence |
| public void test033() { |
| this.runConformTest( |
| new String[] { |
| "Foo.java", |
| "public @interface Foo {\n" + |
| " long value() default 1234567890L;\n" + |
| "}\n" |
| }, |
| ""); |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "public class X {\n" + |
| " @Foo()\n" + |
| " void foo() {}\n" + |
| "}\n" |
| }, |
| "", |
| null, |
| false, |
| null); |
| } |
| |
| // check use of binary annotation - check default value presence |
| public void test034() { |
| this.runConformTest( |
| new String[] { |
| "Foo.java", |
| "public @interface Foo {\n" + |
| " String value() default \"Hello, World\";\n" + |
| "}\n" |
| }, |
| ""); |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "public class X {\n" + |
| " @Foo()\n" + |
| " void foo() {}\n" + |
| "}\n" |
| }, |
| "", |
| null, |
| false, |
| null); |
| } |
| |
| // check use of binary annotation - check default value presence |
| public void test035() { |
| this.runConformTest( |
| new String[] { |
| "Foo.java", |
| "enum E {\n" + |
| " CONST1\n" + |
| "}\n" + |
| "@interface Foo {\n" + |
| " E value() default E.CONST1;\n" + |
| "}" |
| }, |
| ""); |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "public class X {\n" + |
| " @Foo()\n" + |
| " void foo() {}\n" + |
| "}\n" |
| }, |
| "", |
| null, |
| false, |
| null); |
| } |
| |
| // check use of binary annotation - check default value presence |
| public void test036() { |
| this.runConformTest( |
| new String[] { |
| "Foo.java", |
| "@interface Foo {\n" + |
| " Class value() default Object.class;\n" + |
| "}" |
| }, |
| ""); |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "public class X {\n" + |
| " @Foo()\n" + |
| " void foo() {}\n" + |
| "}\n" |
| }, |
| "", |
| null, |
| false, |
| null); |
| } |
| |
| // check use of binary annotation - check default value presence |
| public void test037() { |
| this.runConformTest( |
| new String[] { |
| "Foo.java", |
| "@interface Y {\n" + |
| " int id() default 8;\n" + |
| " Class type();\n" + |
| "}\n" + |
| "public @interface Foo {\n" + |
| " Y value() default @Y(id=10,type=Object.class);\n" + |
| "}" |
| }, |
| ""); |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "public class X {\n" + |
| " @Foo()\n" + |
| " void foo() {}\n" + |
| "}\n" |
| }, |
| "", |
| null, |
| false, |
| null); |
| } |
| |
| // check use of binary annotation - check default value presence |
| public void test038() { |
| this.runConformTest( |
| new String[] { |
| "Foo.java", |
| "@interface Foo {\n" + |
| " int id() default 8;\n" + |
| " Class type();\n" + |
| "}" |
| }, |
| ""); |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "@Foo(type=String.class) public class X {\n" + |
| "}" |
| }, |
| "", |
| null, |
| false, |
| null); |
| } |
| |
| // check annotation member modifiers |
| public void test039() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "public @interface X {\n" + |
| " native int id() default 0;\n" + |
| "}" |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 2)\n" + |
| " native int id() default 0;\n" + |
| " ^^^^\n" + |
| "Illegal modifier for the annotation attribute X.id; only public & abstract are permitted\n" + |
| "----------\n"); |
| } |
| |
| // check annotation member modifiers (validity unchanged despite grammar change from JSR 335 - default methods) |
| // and https://bugs.eclipse.org/bugs/show_bug.cgi?id=3383968 |
| public void test039a() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "public @interface X {\n" + |
| " strictfp double val() default 0.1;\n" + |
| " synchronized String id() default \"zero\";\n" + |
| "}" |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 2)\n" + |
| " strictfp double val() default 0.1;\n" + |
| " ^^^^^\n" + |
| "Illegal modifier for the annotation attribute X.val; only public & abstract are permitted\n" + |
| "----------\n" + |
| "2. ERROR in X.java (at line 3)\n" + |
| " synchronized String id() default \"zero\";\n" + |
| " ^^^^\n" + |
| "Illegal modifier for the annotation attribute X.id; only public & abstract are permitted\n" + |
| "----------\n"); |
| } |
| |
| // check annotation array field initializer |
| public void test040() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "public @interface X {\n" + |
| " int[] tab;\n" + |
| " int[] value();\n" + |
| "}\n" |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 2)\n" + |
| " int[] tab;\n" + |
| " ^^^\n" + |
| "The blank final field tab may not have been initialized\n" + |
| "----------\n"); |
| } |
| |
| // check annotation array field initializer |
| public void test041() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "public @interface X {\n" + |
| " int[] tab = value();\n" + |
| " int[] value();\n" + |
| "}\n" |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 2)\n" + |
| " int[] tab = value();\n" + |
| " ^^^^^\n" + |
| "Cannot make a static reference to the non-static method value() from the type X\n" + |
| "----------\n"); |
| } |
| |
| // check annotation array field initializer |
| public void test042() { |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "public @interface X {\n" + |
| " int[] tab = { 0 , \"aaa\".length() };\n" + |
| "}\n" |
| }, |
| ""); |
| } |
| |
| // check annotation field initializer |
| public void test043() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "public @interface X {\n" + |
| " int value;\n" + |
| "}\n" |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 2)\n" + |
| " int value;\n" + |
| " ^^^^^\n" + |
| "The blank final field value may not have been initialized\n" + |
| "----------\n"); |
| } |
| |
| // check annotation field initializer |
| public void test044() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "public @interface X {\n" + |
| " protected int value = 0;\n" + |
| "}\n" |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 2)\n" + |
| " protected int value = 0;\n" + |
| " ^^^^^\n" + |
| "Illegal modifier for the annotation field X.value; only public, static & final are permitted\n" + |
| "----------\n"); |
| } |
| |
| // check incompatible default values |
| public void test045() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "@interface X {\n" + |
| " int id () default 10L; \n" + |
| " int[] ids() default { 10L };\n" + |
| " Class cls() default new Object();\n" + |
| "}\n" |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 2)\n" + |
| " int id () default 10L; \n" + |
| " ^^^\n" + |
| "Type mismatch: cannot convert from long to int\n" + |
| "----------\n" + |
| "2. ERROR in X.java (at line 3)\n" + |
| " int[] ids() default { 10L };\n" + |
| " ^^^\n" + |
| "Type mismatch: cannot convert from long to int\n" + |
| "----------\n" + |
| "3. WARNING in X.java (at line 4)\n" + |
| " Class cls() default new Object();\n" + |
| " ^^^^^\n" + |
| "Class is a raw type. References to generic type Class<T> should be parameterized\n" + |
| "----------\n" + |
| "4. ERROR in X.java (at line 4)\n" + |
| " Class cls() default new Object();\n" + |
| " ^^^^^^^^^^^^\n" + |
| "Type mismatch: cannot convert from Object to Class\n" + |
| "----------\n"); |
| } |
| |
| // check need for constant pair value |
| public void test046() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "@interface I {\n" + |
| " boolean val() default true;\n" + |
| "}\n" + |
| "\n" + |
| "public class X {\n" + |
| "\n" + |
| " boolean bar() {\n" + |
| " return false;\n" + |
| " }\n" + |
| " @I(val = bar()) void foo() {\n" + |
| " }\n" + |
| "}\n" |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 10)\n" + |
| " @I(val = bar()) void foo() {\n" + |
| " ^^^^^\n" + |
| "The value for annotation attribute I.val must be a constant expression\n" + |
| "----------\n"); |
| } |
| |
| // check array handling of singleton |
| public void test047() throws Exception { |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "@interface I {\n" + |
| " boolean[] val() default {true};\n" + |
| "}\n" + |
| "\n" + |
| "public class X {\n" + |
| " @I(val = false) void foo() {\n" + |
| " }\n" + |
| "}\n" |
| }, |
| ""); |
| |
| ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler(); |
| byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(new File(OUTPUT_DIR + File.separator +"X.class")); |
| String actualOutput = |
| disassembler.disassemble( |
| classFileBytes, |
| "\n", |
| ClassFileBytesDisassembler.DETAILED); |
| |
| String expectedOutput = |
| " // Method descriptor #6 ()V\n" + |
| " // Stack: 0, Locals: 1\n" + |
| " @I(val={false})\n" + |
| " void foo();"; |
| |
| if (actualOutput.indexOf(expectedOutput) == -1) { |
| System.out.println(org.eclipse.jdt.core.tests.util.Util.displayString(actualOutput, 2)); |
| } |
| assertTrue("unexpected bytecode sequence", actualOutput.indexOf(expectedOutput) != -1); |
| |
| ClassFileReader fileReader = ClassFileReader.read(new File(OUTPUT_DIR + File.separator +"I.class")); |
| assertEquals("Not an annotation type declaration", TypeDeclaration.ANNOTATION_TYPE_DECL, TypeDeclaration.kind(fileReader.getModifiers())); |
| } |
| |
| // check invalid constant in array initializer |
| public void test048() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "@interface I {\n" + |
| " boolean[] value();\n" + |
| "}\n" + |
| "\n" + |
| "public class X {\n" + |
| " @I(value={false, X.class != null }) void foo() {\n" + |
| " }\n" + |
| "}\n" |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 6)\n" + |
| " @I(value={false, X.class != null }) void foo() {\n" + |
| " ^^^^^^^^^^^^^^^\n" + |
| "The value for annotation attribute I.value must be a constant expression\n" + |
| "----------\n"); |
| } |
| |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=79349 |
| public void test049() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "import java.lang.annotation.*;\n" + |
| "\n" + |
| "@Documented\n" + |
| "@Retention(RetentionPolicy.RUNTIME)\n" + |
| "@Target(ElementType.TYPE)\n" + |
| "@interface MyAnn {\n" + |
| " String value() default \"Default Message\";\n" + |
| "}\n" + |
| "\n" + |
| "@MyAnn\n" + |
| "public class X {\n" + |
| " public @MyAnn void something() { } \n" + |
| "}\n" |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 12)\n" + |
| " public @MyAnn void something() { } \n" + |
| " ^^^^^^\n" + |
| "The annotation @MyAnn is disallowed for this location\n" + |
| "----------\n"); |
| } |
| |
| // check array handling of singleton |
| public void test050() throws Exception { |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "@interface I {\n" + |
| " String[] value();\n" + |
| "}\n" + |
| "\n" + |
| "public class X {\n" + |
| " @I(\"Hello\") void foo() {\n" + |
| " }\n" + |
| "}\n" |
| }, |
| ""); |
| |
| ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler(); |
| byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(new File(OUTPUT_DIR + File.separator +"X.class")); |
| String actualOutput = |
| disassembler.disassemble( |
| classFileBytes, |
| "\n", |
| ClassFileBytesDisassembler.DETAILED); |
| |
| String expectedOutput = |
| " // Method descriptor #6 ()V\n" + |
| " // Stack: 0, Locals: 1\n" + |
| " @I(value={\"Hello\"})\n" + |
| " void foo();"; |
| |
| if (actualOutput.indexOf(expectedOutput) == -1) { |
| System.out.println(org.eclipse.jdt.core.tests.util.Util.displayString(actualOutput, 2)); |
| } |
| assertTrue("unexpected bytecode sequence", actualOutput.indexOf(expectedOutput) != -1); |
| } |
| |
| public void test051() throws Exception { |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "@interface I {\n" + |
| " String value() default \"Hello\";\n" + |
| "}\n" + |
| "\n" + |
| "public class X {\n" + |
| " @I(\"Hi\") void foo() {\n" + |
| " }\n" + |
| "}\n" |
| }, |
| ""); |
| |
| ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler(); |
| byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(new File(OUTPUT_DIR + File.separator +"X.class")); |
| String actualOutput = |
| disassembler.disassemble( |
| classFileBytes, |
| "\n", |
| ClassFileBytesDisassembler.DETAILED); |
| |
| String expectedOutput = |
| " // Method descriptor #6 ()V\n" + |
| " // Stack: 0, Locals: 1\n" + |
| " @I(value=\"Hi\")\n" + |
| " void foo();"; |
| |
| if (actualOutput.indexOf(expectedOutput) == -1) { |
| System.out.println(org.eclipse.jdt.core.tests.util.Util.displayString(actualOutput, 2)); |
| } |
| assertTrue("unexpected bytecode sequence", actualOutput.indexOf(expectedOutput) != -1); |
| } |
| |
| public void test052() throws Exception { |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "@interface I {\n" + |
| " int value() default 0;\n" + |
| "}\n" + |
| "\n" + |
| "public class X {\n" + |
| " @I(2) void foo() {\n" + |
| " }\n" + |
| "}\n" |
| }, |
| ""); |
| |
| ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler(); |
| byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(new File(OUTPUT_DIR + File.separator +"X.class")); |
| String actualOutput = |
| disassembler.disassemble( |
| classFileBytes, |
| "\n", |
| ClassFileBytesDisassembler.DETAILED); |
| |
| String expectedOutput = |
| " // Method descriptor #6 ()V\n" + |
| " // Stack: 0, Locals: 1\n" + |
| " @I(value=(int) 2)\n" + |
| " void foo();"; |
| |
| if (actualOutput.indexOf(expectedOutput) == -1) { |
| System.out.println(org.eclipse.jdt.core.tests.util.Util.displayString(actualOutput, 2)); |
| } |
| assertTrue("unexpected bytecode sequence", actualOutput.indexOf(expectedOutput) != -1); |
| } |
| public void test053() throws Exception { |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "@interface I {\n" + |
| " byte value() default 0;\n" + |
| "}\n" + |
| "\n" + |
| "public class X {\n" + |
| " @I(2) void foo() {\n" + |
| " }\n" + |
| "}\n" |
| }, |
| ""); |
| |
| ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler(); |
| byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(new File(OUTPUT_DIR + File.separator +"X.class")); |
| String actualOutput = |
| disassembler.disassemble( |
| classFileBytes, |
| "\n", |
| ClassFileBytesDisassembler.DETAILED); |
| |
| String expectedOutput = |
| " // Method descriptor #6 ()V\n" + |
| " // Stack: 0, Locals: 1\n" + |
| " @I(value=(byte) 2)\n" + |
| " void foo();"; |
| |
| if (actualOutput.indexOf(expectedOutput) == -1) { |
| System.out.println(org.eclipse.jdt.core.tests.util.Util.displayString(actualOutput, 2)); |
| } |
| assertTrue("unexpected bytecode sequence", actualOutput.indexOf(expectedOutput) != -1); |
| } |
| public void test054() throws Exception { |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "@interface I {\n" + |
| " short value() default 0;\n" + |
| "}\n" + |
| "\n" + |
| "public class X {\n" + |
| " @I(2) void foo() {\n" + |
| " }\n" + |
| "}\n" |
| }, |
| ""); |
| |
| ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler(); |
| byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(new File(OUTPUT_DIR + File.separator +"X.class")); |
| String actualOutput = |
| disassembler.disassemble( |
| classFileBytes, |
| "\n", |
| ClassFileBytesDisassembler.DETAILED); |
| |
| String expectedOutput = |
| " // Method descriptor #6 ()V\n" + |
| " // Stack: 0, Locals: 1\n" + |
| " @I(value=(short) 2)\n" + |
| " void foo();"; |
| |
| if (actualOutput.indexOf(expectedOutput) == -1) { |
| System.out.println(org.eclipse.jdt.core.tests.util.Util.displayString(actualOutput, 2)); |
| } |
| assertTrue("unexpected bytecode sequence", actualOutput.indexOf(expectedOutput) != -1); |
| } |
| public void test055() throws Exception { |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "@interface I {\n" + |
| " char value() default ' ';\n" + |
| "}\n" + |
| "\n" + |
| "public class X {\n" + |
| " @I('@') void foo() {\n" + |
| " }\n" + |
| "}\n" |
| }, |
| ""); |
| |
| ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler(); |
| byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(new File(OUTPUT_DIR + File.separator +"X.class")); |
| String actualOutput = |
| disassembler.disassemble( |
| classFileBytes, |
| "\n", |
| ClassFileBytesDisassembler.DETAILED); |
| |
| String expectedOutput = |
| " // Method descriptor #6 ()V\n" + |
| " // Stack: 0, Locals: 1\n" + |
| " @I(value=\'@\')\n" + |
| " void foo();"; |
| |
| if (actualOutput.indexOf(expectedOutput) == -1) { |
| System.out.println(org.eclipse.jdt.core.tests.util.Util.displayString(actualOutput, 2)); |
| } |
| assertTrue("unexpected bytecode sequence", actualOutput.indexOf(expectedOutput) != -1); |
| } |
| public void test056() throws Exception { |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "@interface I {\n" + |
| " long value() default 6;\n" + |
| "}\n" + |
| "\n" + |
| "public class X {\n" + |
| " @I(Long.MAX_VALUE) void foo() {\n" + |
| " }\n" + |
| "}\n" |
| }, |
| ""); |
| |
| ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler(); |
| byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(new File(OUTPUT_DIR + File.separator +"X.class")); |
| String actualOutput = |
| disassembler.disassemble( |
| classFileBytes, |
| "\n", |
| ClassFileBytesDisassembler.DETAILED); |
| |
| String expectedOutput = |
| " // Method descriptor #6 ()V\n" + |
| " // Stack: 0, Locals: 1\n" + |
| " @I(value=9223372036854775807L)\n" + |
| " void foo();"; |
| |
| if (actualOutput.indexOf(expectedOutput) == -1) { |
| System.out.println(org.eclipse.jdt.core.tests.util.Util.displayString(actualOutput, 2)); |
| } |
| assertTrue("unexpected bytecode sequence", actualOutput.indexOf(expectedOutput) != -1); |
| } |
| public void test057() throws Exception { |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "@interface I {\n" + |
| " float value();\n" + |
| "}\n" + |
| "\n" + |
| "public class X {\n" + |
| " @I(-0.0f) void foo() {\n" + |
| " }\n" + |
| "}\n" |
| }, |
| ""); |
| |
| ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler(); |
| byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(new File(OUTPUT_DIR + File.separator +"X.class")); |
| String actualOutput = |
| disassembler.disassemble( |
| classFileBytes, |
| "\n", |
| ClassFileBytesDisassembler.DETAILED); |
| |
| String expectedOutput = |
| " // Method descriptor #6 ()V\n" + |
| " // Stack: 0, Locals: 1\n" + |
| " @I(value=-0.0f)\n" + |
| " void foo();"; |
| |
| if (actualOutput.indexOf(expectedOutput) == -1) { |
| System.out.println(org.eclipse.jdt.core.tests.util.Util.displayString(actualOutput, 2)); |
| } |
| assertTrue("unexpected bytecode sequence", actualOutput.indexOf(expectedOutput) != -1); |
| } |
| public void test058() throws Exception { |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "@interface I {\n" + |
| " double value();\n" + |
| "}\n" + |
| "\n" + |
| "public class X {\n" + |
| " @I(-0.0) void foo() {\n" + |
| " }\n" + |
| "}\n" |
| }, |
| ""); |
| |
| ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler(); |
| byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(new File(OUTPUT_DIR + File.separator +"X.class")); |
| String actualOutput = |
| disassembler.disassemble( |
| classFileBytes, |
| "\n", |
| ClassFileBytesDisassembler.DETAILED); |
| |
| String expectedOutput = |
| " // Method descriptor #6 ()V\n" + |
| " // Stack: 0, Locals: 1\n" + |
| " @I(value=-0.0)\n" + |
| " void foo();"; |
| |
| if (actualOutput.indexOf(expectedOutput) == -1) { |
| System.out.println(org.eclipse.jdt.core.tests.util.Util.displayString(actualOutput, 2)); |
| } |
| assertTrue("unexpected bytecode sequence", actualOutput.indexOf(expectedOutput) != -1); |
| } |
| |
| public void test059() throws Exception { |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "@interface Foo {\n" + |
| " double value() default 0.0;\n" + |
| " int id();\n" + |
| "}\n" + |
| "@interface I {\n" + |
| " Foo value();\n" + |
| "}\n" + |
| "\n" + |
| "public class X {\n" + |
| " @I(@Foo(id=5)) void foo() {\n" + |
| " }\n" + |
| "}\n" |
| }, |
| ""); |
| |
| ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler(); |
| byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(new File(OUTPUT_DIR + File.separator +"X.class")); |
| String actualOutput = |
| disassembler.disassemble( |
| classFileBytes, |
| "\n", |
| ClassFileBytesDisassembler.DETAILED); |
| |
| String expectedOutput = |
| " // Method descriptor #6 ()V\n" + |
| " // Stack: 0, Locals: 1\n" + |
| " @I(value=@Foo(id=(int) 5))\n" + |
| " void foo();"; |
| |
| if (actualOutput.indexOf(expectedOutput) == -1) { |
| System.out.println(org.eclipse.jdt.core.tests.util.Util.displayString(actualOutput, 2)); |
| } |
| assertTrue("unexpected bytecode sequence", actualOutput.indexOf(expectedOutput) != -1); |
| } |
| |
| public void test060() throws Exception { |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "enum Color {" + |
| " BLUE, RED, GREEN\n" + |
| "}\n" + |
| "@interface I {\n" + |
| " Color value() default Color.GREEN;\n" + |
| "}\n" + |
| "\n" + |
| "public class X {\n" + |
| " @I(Color.RED) void foo() {\n" + |
| " }\n" + |
| "}\n" |
| }, |
| ""); |
| |
| ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler(); |
| byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(new File(OUTPUT_DIR + File.separator +"X.class")); |
| String actualOutput = |
| disassembler.disassemble( |
| classFileBytes, |
| "\n", |
| ClassFileBytesDisassembler.DETAILED); |
| |
| String expectedOutput = |
| " // Method descriptor #6 ()V\n" + |
| " // Stack: 0, Locals: 1\n" + |
| " @I(value=Color.RED)\n" + |
| " void foo();"; |
| |
| if (actualOutput.indexOf(expectedOutput) == -1) { |
| System.out.println(org.eclipse.jdt.core.tests.util.Util.displayString(actualOutput, 2)); |
| } |
| assertTrue("unexpected bytecode sequence", actualOutput.indexOf(expectedOutput) != -1); |
| } |
| public void test061() throws Exception { |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "enum Color {" + |
| " BLUE, RED, GREEN\n" + |
| "}\n" + |
| "@interface I {\n" + |
| " Color[] value() default { Color.GREEN };\n" + |
| "}\n" + |
| "\n" + |
| "public class X {\n" + |
| " @I(Color.RED) void foo() {\n" + |
| " }\n" + |
| "}\n" |
| }, |
| ""); |
| |
| ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler(); |
| byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(new File(OUTPUT_DIR + File.separator +"X.class")); |
| String actualOutput = |
| disassembler.disassemble( |
| classFileBytes, |
| "\n", |
| ClassFileBytesDisassembler.DETAILED); |
| |
| String expectedOutput = |
| " // Method descriptor #6 ()V\n" + |
| " // Stack: 0, Locals: 1\n" + |
| " @I(value={Color.RED})\n" + |
| " void foo();"; |
| |
| if (actualOutput.indexOf(expectedOutput) == -1) { |
| System.out.println(org.eclipse.jdt.core.tests.util.Util.displayString(actualOutput, 2)); |
| } |
| assertTrue("unexpected bytecode sequence", actualOutput.indexOf(expectedOutput) != -1); |
| } |
| public void test062() throws Exception { |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "@interface Foo {\n" + |
| " double value() default 0.0;\n" + |
| " int id() default 0;\n" + |
| "}\n" + |
| "enum Color {" + |
| " BLUE, RED, GREEN\n" + |
| "}\n" + |
| "@interface I {\n" + |
| " Color[] enums() default { Color.GREEN };\n" + |
| " Foo[] annotations() default { @Foo() };\n" + |
| " int[] ints() default { 0, 1, 2, 3 };\n" + |
| " byte[] bytes() default { 0 };\n" + |
| " short[] shorts() default { 0 };\n" + |
| " long[] longs() default { Long.MIN_VALUE, Long.MAX_VALUE };\n" + |
| " String[] strings() default { \"\" };\n" + |
| " boolean[] booleans() default { true, false };\n" + |
| " float[] floats() default { Float.MAX_VALUE };\n" + |
| " double[] doubles() default { Double.MAX_VALUE };\n" + |
| "}\n" + |
| "\n" + |
| "public class X {\n" + |
| " @I(enums=Color.RED,\n" + |
| " annotations=@Foo(),\n" + |
| " ints=2,\n" + |
| " bytes=1,\n" + |
| " shorts=5,\n" + |
| " longs=Long.MIN_VALUE,\n" + |
| " strings=\"Hi\",\n" + |
| " booleans=true,\n" + |
| " floats=0.0f,\n" + |
| " doubles=-0.0) void foo() {\n" + |
| " }\n" + |
| "}\n" |
| }, |
| ""); |
| |
| ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler(); |
| byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(new File(OUTPUT_DIR + File.separator +"X.class")); |
| String actualOutput = |
| disassembler.disassemble( |
| classFileBytes, |
| "\n", |
| ClassFileBytesDisassembler.DETAILED); |
| |
| String expectedOutput = |
| " @I(enums={Color.RED},\n" + |
| " annotations={@Foo},\n" + |
| " ints={(int) 2},\n" + |
| " bytes={(byte) 1},\n" + |
| " shorts={(short) 5},\n" + |
| " longs={-9223372036854775808L},\n" + |
| " strings={\"Hi\"},\n" + |
| " booleans={true},\n" + |
| " floats={0.0f},\n" + |
| " doubles={-0.0})\n" + |
| " void foo();"; |
| |
| int index = actualOutput.indexOf(expectedOutput); |
| if (index == -1 || expectedOutput.length() == 0) { |
| System.out.println(Util.displayString(actualOutput, 3)); |
| } |
| if (index == -1) { |
| assertEquals("unexpected bytecode sequence", expectedOutput, actualOutput); |
| } |
| } |
| public void test063() throws Exception { |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "@interface Foo {\n" + |
| " double value() default 0.0;\n" + |
| " int id() default 0;\n" + |
| "}\n" + |
| "enum Color {" + |
| " BLUE, RED, GREEN\n" + |
| "}\n" + |
| "@interface I {\n" + |
| " Color enums() default Color.GREEN;\n" + |
| " Foo annotations() default @Foo();\n" + |
| " int ints() default 0;\n" + |
| " byte bytes() default 0;\n" + |
| " short shorts() default 0;\n" + |
| " long longs() default Long.MIN_VALUE;\n" + |
| " String strings() default \"\";\n" + |
| " boolean booleans() default true;\n" + |
| " float floats() default Float.MAX_VALUE;\n" + |
| " double doubles() default Double.MAX_VALUE;\n" + |
| "}\n" + |
| "\n" + |
| "public class X {\n" + |
| " @I(enums=Color.RED,\n" + |
| " annotations=@Foo(),\n" + |
| " ints=2,\n" + |
| " bytes=1,\n" + |
| " shorts=5,\n" + |
| " longs=Long.MIN_VALUE,\n" + |
| " strings=\"Hi\",\n" + |
| " booleans=true,\n" + |
| " floats=0.0f,\n" + |
| " doubles=-0.0) void foo() {\n" + |
| " }\n" + |
| "}\n" |
| }, |
| ""); |
| |
| ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler(); |
| byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(new File(OUTPUT_DIR + File.separator +"X.class")); |
| String actualOutput = |
| disassembler.disassemble( |
| classFileBytes, |
| "\n", |
| ClassFileBytesDisassembler.DETAILED); |
| |
| String expectedOutput = |
| " @I(enums=Color.RED,\n" + |
| " annotations=@Foo,\n" + |
| " ints=(int) 2,\n" + |
| " bytes=(byte) 1,\n" + |
| " shorts=(short) 5,\n" + |
| " longs=-9223372036854775808L,\n" + |
| " strings=\"Hi\",\n" + |
| " booleans=true,\n" + |
| " floats=0.0f,\n" + |
| " doubles=-0.0)\n" + |
| " void foo();"; |
| |
| int index = actualOutput.indexOf(expectedOutput); |
| if (index == -1 || expectedOutput.length() == 0) { |
| System.out.println(Util.displayString(actualOutput, 3)); |
| } |
| if (index == -1) { |
| assertEquals("unexpected bytecode sequence", expectedOutput, actualOutput); |
| } |
| } |
| |
| public void test064() throws Exception { |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "@interface I {\n" + |
| " String[] names();\n" + |
| "}\n" + |
| "\n" + |
| "public class X {\n" + |
| " @I(names={\"Hello\"}) void foo() {\n" + |
| " }\n" + |
| "}\n" |
| }, |
| ""); |
| |
| ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler(); |
| byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(new File(OUTPUT_DIR + File.separator +"X.class")); |
| String actualOutput = |
| disassembler.disassemble( |
| classFileBytes, |
| "\n", |
| ClassFileBytesDisassembler.DETAILED); |
| |
| String expectedOutput = |
| " // Method descriptor #6 ()V\n" + |
| " // Stack: 0, Locals: 1\n" + |
| " @I(names={\"Hello\"})\n" + |
| " void foo();"; |
| |
| if (actualOutput.indexOf(expectedOutput) == -1) { |
| System.out.println(org.eclipse.jdt.core.tests.util.Util.displayString(actualOutput, 2)); |
| } |
| assertTrue("unexpected bytecode sequence", actualOutput.indexOf(expectedOutput) != -1); |
| } |
| |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=79848 |
| public void test065() throws Exception { |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "@interface I {\n" + |
| " Class[] classes();\n" + |
| "}\n" + |
| "\n" + |
| "public class X {\n" + |
| " @I(classes = {X.class, I.class}) public void foo(){\n" + |
| " }\n" + |
| "}\n" |
| }, |
| ""); |
| |
| ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler(); |
| byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(new File(OUTPUT_DIR + File.separator +"X.class")); |
| String actualOutput = |
| disassembler.disassemble( |
| classFileBytes, |
| "\n", |
| ClassFileBytesDisassembler.DETAILED); |
| |
| String expectedOutput = |
| " // Method descriptor #6 ()V\n" + |
| " // Stack: 0, Locals: 1\n" + |
| " @I(classes={X,I})\n" + |
| " public void foo();"; |
| |
| if (actualOutput.indexOf(expectedOutput) == -1) { |
| System.out.println(org.eclipse.jdt.core.tests.util.Util.displayString(actualOutput, 2)); |
| } |
| assertTrue("unexpected bytecode sequence", actualOutput.indexOf(expectedOutput) != -1); |
| } |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=79844 |
| public void test066() { |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "@interface I {\n" + |
| " short value() default 0;\n" + |
| "}\n" + |
| "\n" + |
| "public class X {\n" + |
| " @I(2) void foo() {\n" + |
| " }\n" + |
| "}\n" + |
| "\n" |
| }, |
| ""); |
| } |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=79844 - variation |
| public void test067() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "@interface I {\n" + |
| " int value() default 0L;\n" + |
| "}\n" + |
| "\n" + |
| "public class X {\n" + |
| " @I(2) void foo() {\n" + |
| " }\n" + |
| "}\n" + |
| "\n" |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 2)\n" + |
| " int value() default 0L;\n" + |
| " ^^\n" + |
| "Type mismatch: cannot convert from long to int\n" + |
| "----------\n"); |
| } |
| // 79844 - variation |
| public void test068() { |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "@interface I {\n" + |
| " short[] value() default 2;\n" + |
| "}\n" + |
| "\n" + |
| "public class X {\n" + |
| " @I(2) void foo() {\n" + |
| " }\n" + |
| "}\n" |
| }, |
| ""); |
| } |
| |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=79844 - variation |
| public void test069() { |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "@interface I {\n" + |
| " short[] value() default { 2 };\n" + |
| "}\n" + |
| "\n" + |
| "public class X {\n" + |
| " @I(2) void foo() {\n" + |
| " }\n" + |
| "}\n" |
| }, |
| ""); |
| } |
| |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=79847 |
| public void test070() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "@interface I {\n" + |
| " int[][] ids();\n" + |
| " Object[][] obs();\n" + |
| "}\n" + |
| "\n" + |
| "public class X {\n" + |
| "\n" + |
| " @I(ids = {{1 , 2}, { 3 }}) public void foo(){\n" + |
| " }\n" + |
| "}\n" |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 2)\n" + |
| " int[][] ids();\n" + |
| " ^^^^^^^\n" + |
| "Invalid type int[][] for the annotation attribute I.ids; only primitive type, String, Class, annotation, enumeration are permitted or 1-dimensional arrays thereof\n" + |
| "----------\n" + |
| "2. ERROR in X.java (at line 3)\n" + |
| " Object[][] obs();\n" + |
| " ^^^^^^^^^^\n" + |
| "Invalid type Object[][] for the annotation attribute I.obs; only primitive type, String, Class, annotation, enumeration are permitted or 1-dimensional arrays thereof\n" + |
| "----------\n" + |
| "3. ERROR in X.java (at line 8)\n" + |
| " @I(ids = {{1 , 2}, { 3 }}) public void foo(){\n" + |
| " ^^\n" + |
| "The annotation @I must define the attribute obs\n" + |
| "----------\n" + |
| "4. ERROR in X.java (at line 8)\n" + |
| " @I(ids = {{1 , 2}, { 3 }}) public void foo(){\n" + |
| " ^^^^^^^\n" + |
| "The value for annotation attribute I.ids must be a constant expression\n" + |
| "----------\n" + |
| "5. ERROR in X.java (at line 8)\n" + |
| " @I(ids = {{1 , 2}, { 3 }}) public void foo(){\n" + |
| " ^^^^^\n" + |
| "The value for annotation attribute I.ids must be a constant expression\n" + |
| "----------\n"); |
| } |
| |
| public void test071() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "@interface I {\n" + |
| " int hashCode();\n" + |
| " Object clone();\n" + |
| "}\n" + |
| "\n" + |
| "public class X {\n" + |
| " @I(hashCode = 0) public void foo(){\n" + |
| " }\n" + |
| "}\n" |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 2)\n" + |
| " int hashCode();\n" + |
| " ^^^^^^^^^^\n" + |
| "The annotation type I cannot override the method Annotation.hashCode()\n" + |
| "----------\n" + |
| "2. ERROR in X.java (at line 3)\n" + |
| " Object clone();\n" + |
| " ^^^^^^\n" + |
| "Invalid type Object for the annotation attribute I.clone; only primitive type, String, Class, annotation, enumeration are permitted or 1-dimensional arrays thereof\n" + |
| "----------\n" + |
| "3. ERROR in X.java (at line 3)\n" + |
| " Object clone();\n" + |
| " ^^^^^^^\n" + |
| "The annotation type I cannot override the method Object.clone()\n" + |
| "----------\n" + |
| "4. ERROR in X.java (at line 7)\n" + |
| " @I(hashCode = 0) public void foo(){\n" + |
| " ^^\n" + |
| "The annotation @I must define the attribute clone\n" + |
| "----------\n"); |
| } |
| |
| // check annotation cannot refer to inherited methods as attributes |
| public void test072() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "@interface I {\n" + |
| "}\n" + |
| "\n" + |
| "public class X {\n" + |
| " @I(hashCode = 0) public void foo(){\n" + |
| " }\n" + |
| "}\n" |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 5)\n" + |
| " @I(hashCode = 0) public void foo(){\n" + |
| " ^^^^^^^^\n" + |
| "The attribute hashCode is undefined for the annotation type I\n" + |
| "----------\n"); |
| } |
| |
| // check code generation of annotation default attribute (autowrapping) |
| public void test073() throws Exception { |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "@interface Foo {\n" + |
| " double value() default 0.0;\n" + |
| " int id() default 0;\n" + |
| "}\n" + |
| "enum Color {" + |
| " BLUE, RED, GREEN\n" + |
| "}\n" + |
| "@interface I {\n" + |
| " Color[] enums() default Color.GREEN;\n" + |
| " Foo[] annotations() default @Foo();\n" + |
| " int[] ints() default 0;\n" + |
| " byte[] bytes() default 1;\n" + |
| " short[] shorts() default 3;\n" + |
| " long[] longs() default Long.MIN_VALUE;\n" + |
| " String[] strings() default \"\";\n" + |
| " boolean[] booleans() default true;\n" + |
| " float[] floats() default Float.MAX_VALUE;\n" + |
| " double[] doubles() default Double.MAX_VALUE;\n" + |
| " Class[] classes() default I.class;\n" + |
| "}\n" + |
| "\n" + |
| "public class X {\n" + |
| " @I(enums=Color.RED,\n" + |
| " annotations=@Foo(),\n" + |
| " ints=2,\n" + |
| " bytes=1,\n" + |
| " shorts=5,\n" + |
| " longs=Long.MIN_VALUE,\n" + |
| " strings=\"Hi\",\n" + |
| " booleans=true,\n" + |
| " floats=0.0f,\n" + |
| " doubles=-0.0) void foo() {\n" + |
| " }\n" + |
| "}\n" |
| }, |
| ""); |
| |
| ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler(); |
| byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(new File(OUTPUT_DIR + File.separator +"I.class")); |
| String actualOutput = |
| disassembler.disassemble( |
| classFileBytes, |
| "\n", |
| ClassFileBytesDisassembler.DETAILED); |
| |
| String expectedOutput = |
| "abstract @interface I extends java.lang.annotation.Annotation {\n" + |
| " \n" + |
| " // Method descriptor #8 ()[LColor;\n" + |
| " public abstract Color[] enums() default {Color.GREEN};\n" + |
| " \n" + |
| " // Method descriptor #13 ()[LFoo;\n" + |
| " public abstract Foo[] annotations() default {@Foo};\n" + |
| " \n" + |
| " // Method descriptor #16 ()[I\n" + |
| " public abstract int[] ints() default {(int) 0};\n" + |
| " \n" + |
| " // Method descriptor #19 ()[B\n" + |
| " public abstract byte[] bytes() default {(byte) 1};\n" + |
| " \n" + |
| " // Method descriptor #22 ()[S\n" + |
| " public abstract short[] shorts() default {(short) 3};\n" + |
| " \n" + |
| " // Method descriptor #25 ()[J\n" + |
| " public abstract long[] longs() default {-9223372036854775808L};\n" + |
| " \n" + |
| " // Method descriptor #29 ()[Ljava/lang/String;\n" + |
| " public abstract java.lang.String[] strings() default {\"\"};\n" + |
| " \n" + |
| " // Method descriptor #32 ()[Z\n" + |
| " public abstract boolean[] booleans() default {true};\n" + |
| " \n" + |
| " // Method descriptor #34 ()[F\n" + |
| " public abstract float[] floats() default {3.4028235E38f};\n" + |
| " \n" + |
| " // Method descriptor #37 ()[D\n" + |
| " public abstract double[] doubles() default {1.7976931348623157E308};\n" + |
| " \n" + |
| " // Method descriptor #41 ()[Ljava/lang/Class;\n" + |
| " public abstract java.lang.Class[] classes() default {I};\n"; |
| |
| int index = actualOutput.indexOf(expectedOutput); |
| if (index == -1 || expectedOutput.length() == 0) { |
| System.out.println(Util.displayString(actualOutput, 3)); |
| } |
| if (index == -1) { |
| assertEquals("unexpected bytecode sequence", expectedOutput, actualOutput); |
| } |
| } |
| // check code generation of annotation default attribute non array types |
| public void test074() throws Exception { |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "@interface Foo {\n" + |
| " double value() default 0.0;\n" + |
| " int id() default 0;\n" + |
| "}\n" + |
| "enum Color {" + |
| " BLUE, RED, GREEN\n" + |
| "}\n" + |
| "@interface I {\n" + |
| " Color _enum() default Color.GREEN;\n" + |
| " Foo _annotation() default @Foo;\n" + |
| " int _int() default 0;\n" + |
| " byte _byte() default 1;\n" + |
| " short _short() default 3;\n" + |
| " long _long() default Long.MIN_VALUE;\n" + |
| " String _string() default \"\";\n" + |
| " boolean _boolean() default true;\n" + |
| " float _float() default Float.MAX_VALUE;\n" + |
| " double _double() default Double.MAX_VALUE;\n" + |
| " Class _class() default I.class;\n" + |
| "}\n" + |
| "public class X {\n" + |
| " @I(_enum=Color.RED,\n" + |
| " _annotation=@Foo(),\n" + |
| " _int=2,\n" + |
| " _byte=1,\n" + |
| " _short=5,\n" + |
| " _long=Long.MIN_VALUE,\n" + |
| " _string=\"Hi\",\n" + |
| " _boolean=true,\n" + |
| " _float=0.0f,\n" + |
| " _double=-0.0) void foo() {\n" + |
| " }\n" + |
| "}\n" |
| }, |
| ""); |
| |
| ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler(); |
| byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(new File(OUTPUT_DIR + File.separator +"I.class")); |
| String actualOutput = |
| disassembler.disassemble( |
| classFileBytes, |
| "\n", |
| ClassFileBytesDisassembler.DETAILED); |
| |
| String expectedOutput = |
| "abstract @interface I extends java.lang.annotation.Annotation {\n" + |
| " \n" + |
| " // Method descriptor #8 ()LColor;\n" + |
| " public abstract Color _enum() default Color.GREEN;\n" + |
| " \n" + |
| " // Method descriptor #13 ()LFoo;\n" + |
| " public abstract Foo _annotation() default @Foo;\n" + |
| " \n" + |
| " // Method descriptor #16 ()I\n" + |
| " public abstract int _int() default (int) 0;\n" + |
| " \n" + |
| " // Method descriptor #19 ()B\n" + |
| " public abstract byte _byte() default (byte) 1;\n" + |
| " \n" + |
| " // Method descriptor #22 ()S\n" + |
| " public abstract short _short() default (short) 3;\n" + |
| " \n" + |
| " // Method descriptor #25 ()J\n" + |
| " public abstract long _long() default -9223372036854775808L;\n" + |
| " \n" + |
| " // Method descriptor #29 ()Ljava/lang/String;\n" + |
| " public abstract java.lang.String _string() default \"\";\n" + |
| " \n" + |
| " // Method descriptor #32 ()Z\n" + |
| " public abstract boolean _boolean() default true;\n" + |
| " \n" + |
| " // Method descriptor #34 ()F\n" + |
| " public abstract float _float() default 3.4028235E38f;\n" + |
| " \n" + |
| " // Method descriptor #37 ()D\n" + |
| " public abstract double _double() default 1.7976931348623157E308;\n" + |
| " \n" + |
| " // Method descriptor #41 ()Ljava/lang/Class;\n" + |
| " public abstract java.lang.Class _class() default I;\n"; |
| |
| int index = actualOutput.indexOf(expectedOutput); |
| if (index == -1 || expectedOutput.length() == 0) { |
| System.out.println(Util.displayString(actualOutput, 3)); |
| } |
| if (index == -1) { |
| assertEquals("unexpected bytecode sequence", expectedOutput, actualOutput); |
| } |
| } |
| // check detection of duplicate target element specification |
| public void test075() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "import java.lang.annotation.Target;\n" + |
| "import static java.lang.annotation.ElementType.*;\n" + |
| "\n" + |
| "@Target ({FIELD, FIELD})\n" + |
| "@interface Tgt {\n" + |
| " E[] foo();\n" + |
| " int[] bar();\n" + |
| "}\n" + |
| "enum E {\n" + |
| " BLEU, BLANC, ROUGE\n" + |
| "}\n" + |
| "\n" + |
| "@Tgt( foo = { E.BLEU, E.BLEU}, bar = { 0, 0} )\n" + |
| "public class X {\n" + |
| "}\n" |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 4)\n" + |
| " @Target ({FIELD, FIELD})\n" + |
| " ^^^^^\n" + |
| "Duplicate element FIELD specified in annotation @Target\n" + |
| "----------\n" + |
| "2. ERROR in X.java (at line 13)\n" + |
| " @Tgt( foo = { E.BLEU, E.BLEU}, bar = { 0, 0} )\n" + |
| " ^^^^\n" + |
| "The annotation @Tgt is disallowed for this location\n" + |
| "----------\n"); |
| } |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=77463 |
| public void test076() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "private @interface TestAnnot {\n" + |
| "}\n" |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 1)\n" + |
| " private @interface TestAnnot {\n" + |
| " ^^^^^^^^^\n" + |
| "Illegal modifier for the annotation type TestAnnot; only public & abstract are permitted\n" + |
| "----------\n"); |
| } |
| // check @Override annotation - strictly for superclasses (overrides) and not interfaces (implements) |
| public void test077() { |
| String expectedOutput = new CompilerOptions(getCompilerOptions()).sourceLevel < ClassFileConstants.JDK1_6 |
| ? "----------\n" + |
| "1. ERROR in X.java (at line 14)\n" + |
| " void foo() {}\n" + |
| " ^^^^^\n" + |
| "The method foo() of type X must override a superclass method\n" + |
| "----------\n" + |
| "2. ERROR in X.java (at line 18)\n" + |
| " public void baz() {}\n" + |
| " ^^^^^\n" + |
| "The method baz() of type X must override a superclass method\n" + |
| "----------\n" |
| : "----------\n" + |
| "1. ERROR in X.java (at line 14)\n" + |
| " void foo() {}\n" + |
| " ^^^^^\n" + |
| "The method foo() of type X must override or implement a supertype method\n" + |
| "----------\n"; |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "class Further {\n" + |
| " void bar() {}\n" + |
| "}\n" + |
| "\n" + |
| "class Other extends Further {\n" + |
| "}\n" + |
| "\n" + |
| "interface Baz {\n" + |
| " void baz();\n" + |
| "}\n" + |
| "\n" + |
| "public class X extends Other implements Baz {\n" + |
| " @Override\n" + |
| " void foo() {}\n" + |
| " @Override\n" + |
| " void bar() {}\n" + |
| " @Override\n" + |
| " public void baz() {}\n" + |
| "}\n" |
| }, |
| expectedOutput); |
| } |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=80114 |
| public void test078() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "public @interface X {\n" + |
| " X() {}\n" + |
| "}" |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 2)\n" + |
| " X() {}\n" + |
| " ^^^\n" + |
| "Annotation type declaration cannot have a constructor\n" + |
| "----------\n"); |
| } |
| |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=80014 |
| public void test079() { |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "import java.lang.annotation.Retention;\n" + |
| "import java.lang.annotation.Target;\n" + |
| "import static java.lang.annotation.RetentionPolicy.*;\n" + |
| "import static java.lang.annotation.ElementType.*;\n" + |
| "\n" + |
| "@Retention(RUNTIME)\n" + |
| "@Target({TYPE})\n" + |
| "@interface Attr {\n" + |
| " public int tst() default -1;\n" + |
| "}\n" + |
| "\n" + |
| "@Attr \n" + |
| "public class X {\n" + |
| " public static void main(String args[]) {\n" + |
| " Object e = X.class.getAnnotation(Attr.class);\n" + |
| " System.out.print(e);\n" + |
| " }\n" + |
| "}" |
| }, |
| "@Attr(tst=-1)"); |
| } |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=80014 |
| public void test080() { |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "import java.lang.annotation.Retention;\n" + |
| "import java.lang.annotation.Target;\n" + |
| "import static java.lang.annotation.RetentionPolicy.*;\n" + |
| "import static java.lang.annotation.ElementType.*;\n" + |
| "\n" + |
| "@Retention(CLASS)\n" + |
| "@Target({TYPE})\n" + |
| "@interface Attr {\n" + |
| " public int tst() default -1;\n" + |
| "}\n" + |
| "\n" + |
| "@Attr \n" + |
| "public class X {\n" + |
| " public static void main(String args[]) {\n" + |
| " Object e = X.class.getAnnotation(Attr.class);\n" + |
| " System.out.print(e);\n" + |
| " }\n" + |
| "}" |
| }, |
| "null"); |
| } |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=80014 |
| public void test081() { |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "import java.lang.annotation.Retention;\n" + |
| "import java.lang.annotation.Target;\n" + |
| "import static java.lang.annotation.RetentionPolicy.*;\n" + |
| "import static java.lang.annotation.ElementType.*;\n" + |
| "\n" + |
| "@Retention(SOURCE)\n" + |
| "@Target({TYPE})\n" + |
| "@interface Attr {\n" + |
| " public int tst() default -1;\n" + |
| "}\n" + |
| "\n" + |
| "@Attr \n" + |
| "public class X {\n" + |
| " public static void main(String args[]) {\n" + |
| " Object e = X.class.getAnnotation(Attr.class);\n" + |
| " System.out.print(e);\n" + |
| " }\n" + |
| "}" |
| }, |
| "null"); |
| } |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=80014 |
| public void test082() { |
| this.runConformTest( |
| new String[] { |
| "Attr.java", |
| "import java.lang.annotation.Retention;\n" + |
| "import java.lang.annotation.Target;\n" + |
| "import static java.lang.annotation.RetentionPolicy.*;\n" + |
| "import static java.lang.annotation.ElementType.*;\n" + |
| "\n" + |
| "@Retention(SOURCE)\n" + |
| "@Target({TYPE})\n" + |
| "@interface Attr {\n" + |
| " public int tst() default -1;\n" + |
| "}", |
| }, |
| ""); |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "@Attr \n" + |
| "public class X {\n" + |
| " public static void main(String args[]) {\n" + |
| " Object e = X.class.getAnnotation(Attr.class);\n" + |
| " System.out.print(e);\n" + |
| " }\n" + |
| "}" |
| }, |
| "null", |
| null, |
| false, |
| null); |
| } |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=80014 |
| public void test083() { |
| this.runConformTest( |
| new String[] { |
| "Attr.java", |
| "import java.lang.annotation.Retention;\n" + |
| "import java.lang.annotation.Target;\n" + |
| "import static java.lang.annotation.RetentionPolicy.*;\n" + |
| "import static java.lang.annotation.ElementType.*;\n" + |
| "\n" + |
| "@Retention(CLASS)\n" + |
| "@Target({TYPE})\n" + |
| "@interface Attr {\n" + |
| " public int tst() default -1;\n" + |
| "}", |
| }, |
| ""); |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "@Attr \n" + |
| "public class X {\n" + |
| " public static void main(String args[]) {\n" + |
| " Object e = X.class.getAnnotation(Attr.class);\n" + |
| " System.out.print(e);\n" + |
| " }\n" + |
| "}" |
| }, |
| "null", |
| null, |
| false, |
| null); |
| } |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=80014 |
| public void test084() { |
| this.runConformTest( |
| new String[] { |
| "Attr.java", |
| "import java.lang.annotation.Retention;\n" + |
| "import java.lang.annotation.Target;\n" + |
| "import static java.lang.annotation.RetentionPolicy.*;\n" + |
| "import static java.lang.annotation.ElementType.*;\n" + |
| "\n" + |
| "@Retention(RUNTIME)\n" + |
| "@Target({TYPE})\n" + |
| "@interface Attr {\n" + |
| " public int tst() default -1;\n" + |
| "}", |
| }, |
| ""); |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "@Attr \n" + |
| "public class X {\n" + |
| " public static void main(String args[]) {\n" + |
| " Object e = X.class.getAnnotation(Attr.class);\n" + |
| " System.out.print(e);\n" + |
| " }\n" + |
| "}" |
| }, |
| "@Attr(tst=-1)", |
| null, |
| false, |
| null); |
| } |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=76751 |
| public void test085() { |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "import java.lang.annotation.ElementType;\n" + |
| "import java.lang.annotation.RetentionPolicy;\n" + |
| "import java.lang.annotation.Target;\n" + |
| "import java.lang.annotation.Retention;\n" + |
| "\n" + |
| "public class X {\n" + |
| "\n" + |
| " @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) @interface\n" + |
| "TestAnnotation {\n" + |
| "\n" + |
| " String testAttribute();\n" + |
| "\n" + |
| " }\n" + |
| " @TestAnnotation(testAttribute = \"test\") class A {\n" + |
| " }\n" + |
| "\n" + |
| " public static void main(String[] args) {\n" + |
| " System.out.print(A.class.isAnnotationPresent(TestAnnotation.class));\n" + |
| " }\n" + |
| "\n" + |
| "}" |
| }, |
| "true"); |
| } |
| // check handling of empty array initializer |
| public void test086() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "import java.lang.annotation.Target;\n" + |
| "\n" + |
| "@Target({}) @interface I {}\n" + |
| "@I public class X {}" |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 4)\n" + |
| " @I public class X {}\n" + |
| " ^^\n" + |
| "The annotation @I is disallowed for this location\n" + |
| "----------\n"); |
| } |
| |
| // check type targeting annotation also allowed for annotation type |
| public void test087() { |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "import java.lang.annotation.Target;\n" + |
| "import static java.lang.annotation.ElementType.*;\n" + |
| "\n" + |
| "@Target(TYPE)\n" + |
| "@interface Annot {\n" + |
| "}\n" + |
| "\n" + |
| "@Annot\n" + |
| "public @interface X {\n" + |
| "}\n" |
| }, |
| ""); |
| } |
| |
| // check parameter/local target for annotation |
| public void test088() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "import java.lang.annotation.Target;\n" + |
| "import static java.lang.annotation.ElementType.*;\n" + |
| "\n" + |
| "@Target(LOCAL_VARIABLE)\n" + |
| "@interface Annot {\n" + |
| "}\n" + |
| "\n" + |
| "public class X {\n" + |
| " void foo(@Annot int i) {\n" + |
| " @Annot int j;\n" + |
| " }\n" + |
| "}\n" |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 9)\n" + |
| " void foo(@Annot int i) {\n" + |
| " ^^^^^^\n" + |
| "The annotation @Annot is disallowed for this location\n" + |
| "----------\n"); |
| } |
| |
| // Add check for parameter |
| public void test089() { |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "import java.lang.annotation.Target;\n" + |
| "import java.lang.annotation.ElementType;\n" + |
| "\n" + |
| "public class X {\n" + |
| "\n" + |
| " @Target(ElementType.PARAMETER) @interface I {}\n" + |
| " \n" + |
| " void m(@I int i){\n" + |
| " }\n" + |
| "}" |
| }, |
| ""); |
| } |
| // Add check that type includes annotation type |
| public void test090() { |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "import java.lang.annotation.Target;\n" + |
| "import java.lang.annotation.ElementType;\n" + |
| "\n" + |
| "public class X {\n" + |
| "\n" + |
| " @Target(ElementType.TYPE) @interface Annot1 {}\n" + |
| " \n" + |
| " @Annot1 @interface Annot2 {}\n" + |
| "}" |
| }, |
| ""); |
| } |
| // Add check that a field cannot have an annotation targetting TYPE |
| public void test091() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "import java.lang.annotation.Target;\n" + |
| "import java.lang.annotation.ElementType;\n" + |
| "\n" + |
| "public class X {\n" + |
| "\n" + |
| " @Target(ElementType.TYPE) @interface Marker {}\n" + |
| " \n" + |
| " @Marker static int i = 123;\n" + |
| "}" |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 8)\n" + |
| " @Marker static int i = 123;\n" + |
| " ^^^^^^^\n" + |
| "The annotation @X.Marker is disallowed for this location\n" + |
| "----------\n"); |
| } |
| // Add check that a field cannot have an annotation targetting FIELD |
| public void test092() { |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "import java.lang.annotation.Target;\n" + |
| "import java.lang.annotation.ElementType;\n" + |
| "\n" + |
| "public class X {\n" + |
| "\n" + |
| " @Target(ElementType.FIELD) @interface Marker {}\n" + |
| " \n" + |
| " @Marker static int i = 123;\n" + |
| "}" |
| }, |
| ""); |
| } |
| // @Inherited can only be used on annotation types |
| public void test093() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "import java.lang.annotation.Inherited;\n" + |
| "\n" + |
| "@Deprecated\n" + |
| "@Inherited\n" + |
| "class A {\n" + |
| "}\n" + |
| "\n" + |
| "class B extends A {\n" + |
| "}\n" + |
| "\n" + |
| "class C extends B {\n" + |
| "}\n" + |
| "\n" + |
| "public class X {\n" + |
| " C c;\n" + |
| "}\n" |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 4)\n" + |
| " @Inherited\n" + |
| " ^^^^^^^^^^\n" + |
| "The annotation @Inherited is disallowed for this location\n" + |
| "----------\n"); |
| } |
| // check handling of empty array initializer (binary check) |
| public void test094() { |
| this.runConformTest( |
| new String[] { |
| "I.java", |
| "import java.lang.annotation.Target;\n" + |
| "\n" + |
| "@Target({}) @interface I {}", |
| }, |
| ""); |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "@I public class X {}" |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 1)\n" + |
| " @I public class X {}\n" + |
| " ^^\n" + |
| "The annotation @I is disallowed for this location\n" + |
| "----------\n", |
| null, |
| false, |
| null); |
| } |
| |
| // check no interaction between Retention and Target (switch fall-thru) |
| public void test095() { |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "import java.lang.annotation.*;\n" + |
| "\n" + |
| "@Retention(RetentionPolicy.RUNTIME)\n" + |
| "@interface Ann {}\n" + |
| "\n" + |
| "public class X {\n" + |
| " @Ann\n" + |
| " void foo() {}\n" + |
| "}\n", |
| }, |
| ""); |
| } |
| |
| // check attributes for parameters |
| public void test096() { |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "import static java.lang.annotation.RetentionPolicy.*;\n" + |
| "import java.lang.annotation.Retention;\n" + |
| "import java.lang.annotation.Annotation;\n" + |
| "import java.lang.reflect.Method;\n" + |
| "\n" + |
| "@Retention(CLASS) @interface Attr {\n" + |
| "}\n" + |
| "\n" + |
| "@Retention(RUNTIME) @interface Foo {\n" + |
| " int id() default 0;\n" + |
| "}\n" + |
| "@Foo(id=5) @Attr public class X {\n" + |
| " public void foo(@Foo(id=5) @Attr final int j, @Attr final int k, int n) {\n" + |
| " }\n" + |
| " \n" + |
| " public static void main(String[] args) {\n" + |
| " try {\n" + |
| " Class c = X.class;\n" + |
| " Annotation[] annots = c.getAnnotations();\n" + |
| " System.out.print(annots.length);\n" + |
| " Method method = c.getMethod(\"foo\", Integer.TYPE, Integer.TYPE, Integer.TYPE);\n" + |
| " Annotation[][] annotations = method.getParameterAnnotations();\n" + |
| " final int length = annotations.length;\n" + |
| " System.out.print(length);\n" + |
| " if (length == 3) {\n" + |
| " System.out.print(annotations[0].length);\n" + |
| " System.out.print(annotations[1].length);\n" + |
| " System.out.print(annotations[2].length);\n" + |
| " }\n" + |
| " } catch(NoSuchMethodException e) {\n" + |
| " }\n" + |
| " }\n" + |
| "}", |
| }, |
| "13100"); |
| } |
| |
| public void test097() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "@interface I {\n" + |
| " int id default 0;\n" + |
| "}\n" + |
| "\n" + |
| "@I() public class X {\n" + |
| " public static void main(String[] s) {\n" + |
| " System.out.println(X.class.getAnnotation(I.class));\n" + |
| " }\n" + |
| "}" |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 2)\n" + |
| " int id default 0;\n" + |
| " ^^^^^^^\n" + |
| "Syntax error on token \"default\", = expected\n" + |
| "----------\n"); |
| } |
| |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=80328 |
| public void test098() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "@interface I {\n" + |
| " int id default 0;\n" + |
| "}\n" + |
| "\n" + |
| "@I() public class X {\n" + |
| " public static void main(String[] s) {\n" + |
| " System.out.println(X.class.getAnnotation(I.class));\n" + |
| " }\n" + |
| "}" |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 2)\n" + |
| " int id default 0;\n" + |
| " ^^^^^^^\n" + |
| "Syntax error on token \"default\", = expected\n" + |
| "----------\n"); |
| } |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=80780 |
| public void test099() throws Exception { |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "import java.lang.annotation.*;\n" + |
| "import java.lang.reflect.Method;\n" + |
| "\n" + |
| "public class X {\n" + |
| " public static void main(String[] args) {\n" + |
| " Object o = new X();\n" + |
| " for (Method m : o.getClass().getMethods()) {\n" + |
| " if (m.isAnnotationPresent(MyAnon.class)) {\n" + |
| " System.out.println(m.getAnnotation(MyAnon.class).c());\n" + |
| " }\n" + |
| " }\n" + |
| " }\n" + |
| " @MyAnon(c = X.class) \n" + |
| " public void foo() {}\n" + |
| "\n" + |
| " @Retention(RetentionPolicy.RUNTIME) \n" + |
| " public @interface MyAnon {\n" + |
| " Class c();\n" + |
| " }\n" + |
| " public interface I {\n" + |
| " }\n" + |
| "}" |
| }, |
| "class X"); |
| |
| ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler(); |
| byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(new File(OUTPUT_DIR + File.separator +"X.class")); |
| String actualOutput = |
| disassembler.disassemble( |
| classFileBytes, |
| "\n", |
| ClassFileBytesDisassembler.DETAILED); |
| |
| CompilerOptions options = new CompilerOptions(getCompilerOptions()); |
| String expectedOutput = null; |
| if (options.targetJDK == ClassFileConstants.JDK1_5) { |
| expectedOutput = |
| " Inner classes:\n" + |
| " [inner class info: #66 X$I, outer class info: #1 X\n" + |
| " inner name: #68 I, accessflags: 1545 public abstract static],\n" + |
| " [inner class info: #27 X$MyAnon, outer class info: #1 X\n" + |
| " inner name: #69 MyAnon, accessflags: 9737 public abstract static]\n"; |
| } else if (options.targetJDK == ClassFileConstants.JDK1_6) { |
| expectedOutput = |
| " Inner classes:\n" + |
| " [inner class info: #70 X$I, outer class info: #1 X\n" + |
| " inner name: #72 I, accessflags: 1545 public abstract static],\n" + |
| " [inner class info: #27 X$MyAnon, outer class info: #1 X\n" + |
| " inner name: #73 MyAnon, accessflags: 9737 public abstract static]\n"; |
| } else { |
| return; |
| } |
| |
| int index = actualOutput.indexOf(expectedOutput); |
| if (index == -1 || expectedOutput.length() == 0) { |
| System.out.println(Util.displayString(actualOutput, 3)); |
| } |
| if (index == -1) { |
| assertEquals("unexpected bytecode sequence", expectedOutput, actualOutput); |
| } |
| } |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=80544 |
| public void test100() { |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "abstract class Foo {\n" + |
| " abstract protected boolean accept(Object o);\n" + |
| "}\n" + |
| "\n" + |
| "public class X extends Foo {\n" + |
| " @Override \n" + |
| " protected boolean accept(Object o) { return false; }\n" + |
| "}\n", |
| }, |
| ""); |
| } |
| |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=81148 |
| public void test101() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "import java.lang.annotation.Target;\n" + |
| "\n" + |
| "@Target(Element)\n" + |
| "public @interface X {\n" + |
| " \n" + |
| " boolean UML() default false;\n" + |
| " boolean platformDependent() default true;\n" + |
| " boolean OSDependent() default true;\n" + |
| "}\n", |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 3)\n" + |
| " @Target(Element)\n" + |
| " ^^^^^^^\n" + |
| "Element cannot be resolved to a variable\n" + |
| "----------\n"); |
| } |
| |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=80964 |
| public void test102() { |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "public class X {\n" + |
| " @TestAnnotation(testAttribute = \"test\") class A {\n" + |
| " }\n" + |
| " public static void main(String[] args) {\n" + |
| " System.out.print(A.class.isAnnotationPresent(TestAnnotation.class));\n" + |
| " }\n" + |
| "}", |
| "TestAnnotation.java", |
| "import java.lang.annotation.ElementType;\n" + |
| "import java.lang.annotation.RetentionPolicy;\n" + |
| "import java.lang.annotation.Target;\n" + |
| "import java.lang.annotation.Retention;\n" + |
| "@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) public @interface\n" + |
| "TestAnnotation {\n" + |
| " String testAttribute();\n" + |
| "}\n" |
| }, |
| "true"); |
| } |
| |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=80964 |
| public void test103() { |
| this.runConformTest( |
| new String[] { |
| "TestAnnotation.java", |
| "import java.lang.annotation.ElementType;\n" + |
| "import java.lang.annotation.RetentionPolicy;\n" + |
| "import java.lang.annotation.Target;\n" + |
| "import java.lang.annotation.Retention;\n" + |
| "@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) public @interface\n" + |
| "TestAnnotation {\n" + |
| " String testAttribute();\n" + |
| "}\n" |
| }, |
| ""); |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "public class X {\n" + |
| " @TestAnnotation(testAttribute = \"test\") class A {\n" + |
| " }\n" + |
| " public static void main(String[] args) {\n" + |
| " System.out.print(A.class.isAnnotationPresent(TestAnnotation.class));\n" + |
| " }\n" + |
| "}", |
| }, |
| "true", |
| null, |
| false, |
| null); |
| } |
| |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=81825 |
| public void test104() { |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "@interface ValuesAnnotation {\n" + |
| " byte[] byteArrayValue();\n" + |
| " char[] charArrayValue();\n" + |
| " boolean[] booleanArrayValue();\n" + |
| " int[] intArrayValue();\n" + |
| " short[] shortArrayValue();\n" + |
| " long[] longArrayValue();\n" + |
| " float[] floatArrayValue();\n" + |
| " double[] doubleArrayValue();\n" + |
| " String[] stringArrayValue();\n" + |
| " ValuesEnum[] enumArrayValue();\n" + |
| " ValueAttrAnnotation[] annotationArrayValue();\n" + |
| " Class[] classArrayValue();\n" + |
| " byte byteValue();\n" + |
| " char charValue();\n" + |
| " boolean booleanValue();\n" + |
| " int intValue();\n" + |
| " short shortValue();\n" + |
| " long longValue();\n" + |
| " float floatValue();\n" + |
| " double doubleValue();\n" + |
| " String stringValue();\n" + |
| " ValuesEnum enumValue();\n" + |
| " ValueAttrAnnotation annotationValue();\n" + |
| " Class classValue();\n" + |
| "}\n" + |
| "enum ValuesEnum {\n" + |
| " ONE, TWO;\n" + |
| "}\n" + |
| "\n" + |
| "@interface ValueAttrAnnotation {\n" + |
| " String value() default \"\";\n" + |
| "}\n" + |
| "@interface ValueAttrAnnotation1 {\n" + |
| " String value();\n" + |
| "}\n" + |
| "@interface ValueAttrAnnotation2 {\n" + |
| " String value();\n" + |
| "}\n" + |
| "@ValuesAnnotation(\n" + |
| " byteValue = 1,\n" + |
| " charValue = \'A\',\n" + |
| " booleanValue = true,\n" + |
| " intValue = 1,\n" + |
| " shortValue = 1,\n" + |
| " longValue = 1L,\n" + |
| " floatValue = 1.0f,\n" + |
| " doubleValue = 1.0d,\n" + |
| " stringValue = \"A\",\n" + |
| "\n" + |
| " enumValue = ValuesEnum.ONE,\n" + |
| " annotationValue = @ValueAttrAnnotation( \"annotation\"),\n" + |
| " classValue = X.class,\n" + |
| "\n" + |
| " byteArrayValue = { 1, -1},\n" + |
| " charArrayValue = { \'c\', \'b\', (char)-1},\n" + |
| " booleanArrayValue = {true, false},\n" + |
| " intArrayValue = { 1, -1},\n" + |
| " shortArrayValue = { (short)1, (short)-1},\n" + |
| " longArrayValue = { 1L, -1L},\n" + |
| " floatArrayValue = { 1.0f, -1.0f},\n" + |
| " doubleArrayValue = { 1.0d, -1.0d},\n" + |
| " stringArrayValue = { \"aa\", \"bb\"},\n" + |
| "\n" + |
| " enumArrayValue = {ValuesEnum.ONE, ValuesEnum.TWO},\n" + |
| " annotationArrayValue = {@ValueAttrAnnotation( \"annotation1\"),\n" + |
| "@ValueAttrAnnotation( \"annotation2\")},\n" + |
| " classArrayValue = {X.class, X.class}\n" + |
| ")\n" + |
| "@ValueAttrAnnotation1( \"classAnnotation1\")\n" + |
| "@ValueAttrAnnotation2( \"classAnnotation2\")\n" + |
| "public class X {\n" + |
| "\n" + |
| " @ValueAttrAnnotation1( \"fieldAnnotation1\")\n" + |
| " @ValueAttrAnnotation2( \"fieldAnnotation2\")\n" + |
| " public String testfield = \"test\";\n" + |
| "\n" + |
| " @ValueAttrAnnotation1( \"methodAnnotation1\")\n" + |
| " @ValueAttrAnnotation2( \"methodAnnotation2\")\n" + |
| " @ValueAttrAnnotation()\n" + |
| " public void testMethod( \n" + |
| " @ValueAttrAnnotation1( \"param1Annotation1\") \n" + |
| " @ValueAttrAnnotation2( \"param1Annotation2\") String param1, \n" + |
| " @ValueAttrAnnotation1( \"param2Annotation1\") \n" + |
| " @ValueAttrAnnotation2( \"param2Annotation2\") int param2) {\n" + |
| " // @ValueAttrAnnotation( \"codeAnnotation\")\n" + |
| " }\n" + |
| "}\n" |
| }, |
| ""); |
| } |
| |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=82136 |
| public void test105() { |
| this.runConformTest( |
| new String[] { |
| "Property.java", |
| "import java.lang.annotation.Documented;\n" + |
| "import java.lang.annotation.Retention;\n" + |
| "import java.lang.annotation.RetentionPolicy;\n" + |
| "\n" + |
| "@Documented\n" + |
| "@Retention(RetentionPolicy.RUNTIME)\n" + |
| "public @interface Property\n" + |
| "{\n" + |
| " String property();\n" + |
| " String identifier() default \"\";\n" + |
| "}", |
| "Properties.java", |
| "import java.lang.annotation.Documented;\n" + |
| "import java.lang.annotation.Retention;\n" + |
| "import java.lang.annotation.RetentionPolicy;\n" + |
| "\n" + |
| "@Documented\n" + |
| "@Retention(RetentionPolicy.RUNTIME)\n" + |
| "public @interface Properties {\n" + |
| " Property[] value();\n" + |
| "}", |
| "X.java", |
| "@Properties({\n" + |
| " @Property(property = \"prop\", identifier = \"someIdentifier\"),\n" + |
| " @Property(property = \"type\")\n" + |
| "})\n" + |
| "public interface X {\n" + |
| " void setName();\n" + |
| " String getName();\n" + |
| "}" |
| }, |
| ""); |
| try { |
| byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(new File(OUTPUT_DIR + File.separator +"X.class")); |
| new ClassFileReader(classFileBytes, "X.java".toCharArray(), true); |
| } catch (ClassFormatException e) { |
| assertTrue("ClassFormatException", false); |
| } catch (IOException e) { |
| assertTrue("IOException", false); |
| } |
| } |
| |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=83939 |
| public void test106() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "public @interface X {\n" + |
| " int[] bar() default null;\n" + |
| "}", |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 2)\n" + |
| " int[] bar() default null;\n" + |
| " ^^^^\n" + |
| "The value for annotation attribute X.bar must be a constant expression\n" + |
| "----------\n"); |
| } |
| |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=83939 |
| public void test107() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "@interface Ann {\n" + |
| " int[] bar();\n" + |
| "}\n" + |
| "@Ann(bar=null) class X {}", |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 4)\n" + |
| " @Ann(bar=null) class X {}\n" + |
| " ^^^^\n" + |
| "The value for annotation attribute Ann.bar must be a constant expression\n" + |
| "----------\n"); |
| } |
| |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=83939 - variation |
| public void test108() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "@interface Foo {}\n" + |
| "\n" + |
| "@interface Bar {\n" + |
| " Foo[] foo() default null;\n" + |
| "}\n" + |
| "\n" + |
| "@Bar(foo=null)\n" + |
| "public class X { \n" + |
| "}\n", |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 4)\n" + |
| " Foo[] foo() default null;\n" + |
| " ^^^^\n" + |
| "The value for annotation attribute Bar.foo must be some @Foo annotation \n" + |
| "----------\n" + |
| "2. ERROR in X.java (at line 7)\n" + |
| " @Bar(foo=null)\n" + |
| " ^^^^\n" + |
| "The value for annotation attribute Bar.foo must be some @Foo annotation \n" + |
| "----------\n"); |
| } |
| |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=83939 - variation |
| public void test109() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "@interface Foo {}\n" + |
| "\n" + |
| "@interface Bar {\n" + |
| " Foo[] foo() default \"\";\n" + |
| "}\n" + |
| "\n" + |
| "@Bar(foo=\"\")\n" + |
| "public class X { \n" + |
| "}\n", |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 4)\n" + |
| " Foo[] foo() default \"\";\n" + |
| " ^^\n" + |
| "The value for annotation attribute Bar.foo must be some @Foo annotation \n" + |
| "----------\n" + |
| "2. ERROR in X.java (at line 7)\n" + |
| " @Bar(foo=\"\")\n" + |
| " ^^\n" + |
| "The value for annotation attribute Bar.foo must be some @Foo annotation \n" + |
| "----------\n"); |
| } |
| |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=84791 |
| public void test110() { |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "import java.lang.annotation.Annotation;\n" + |
| "import java.util.Arrays;\n" + |
| "\n" + |
| "@interface Ann {\n" + |
| "}\n" + |
| "\n" + |
| "interface Iface extends Ann {\n" + |
| "}\n" + |
| "\n" + |
| "abstract class Klass implements Ann {\n" + |
| "}\n" + |
| "\n" + |
| "class SubKlass extends Klass {\n" + |
| " public Class<? extends Annotation> annotationType() {\n" + |
| " return null;\n" + |
| " }\n" + |
| "}\n" + |
| "\n" + |
| "public class X {\n" + |
| " public static void main(String[] args) {\n" + |
| " Class c = SubKlass.class;\n" + |
| " System.out.print(\"Classes:\");\n" + |
| " while (c != Object.class) {\n" + |
| " System.out.print(\"-> \" + c.getName());\n" + |
| " c = c.getSuperclass();\n" + |
| " }\n" + |
| "\n" + |
| " System.out.print(\", Interfaces:\");\n" + |
| " c = SubKlass.class;\n" + |
| " while (c != Object.class) {\n" + |
| " Class[] i = c.getInterfaces();\n" + |
| " System.out.print(\"-> \" + Arrays.asList(i));\n" + |
| " c = c.getSuperclass();\n" + |
| " }\n" + |
| " }\n" + |
| "}\n", |
| }, |
| "Classes:-> SubKlass-> Klass, Interfaces:-> []-> [interface Ann]"); |
| } |
| |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=84791 - variation |
| public void test111() { |
| Map customOptions = getCompilerOptions(); |
| customOptions.put( |
| CompilerOptions.OPTION_ReportMissingOverrideAnnotation, |
| CompilerOptions.ERROR); |
| customOptions.put( |
| CompilerOptions.OPTION_ReportMissingOverrideAnnotationForInterfaceMethodImplementation, |
| CompilerOptions.DISABLED); |
| |
| String expectedOutput = |
| "----------\n" + |
| "1. WARNING in X.java (at line 8)\n" + |
| " interface Iface extends Ann {\n" + |
| " ^^^\n" + |
| "The annotation type Ann should not be used as a superinterface for Iface\n" + |
| "----------\n" + |
| "2. WARNING in X.java (at line 11)\n" + |
| " abstract class Klass implements Ann {\n" + |
| " ^^^\n" + |
| "The annotation type Ann should not be used as a superinterface for Klass\n" + |
| "----------\n" + |
| "3. ERROR in X.java (at line 14)\n" + |
| " class SubKlass extends Klass {\n" + |
| " ^^^^^^^^\n" + |
| "The type SubKlass must implement the inherited abstract method Ann.foo()\n" + |
| "----------\n" + |
| "4. WARNING in X.java (at line 20)\n" + |
| " class AnnImpl implements Ann {\n" + |
| " ^^^\n" + |
| "The annotation type Ann should not be used as a superinterface for AnnImpl\n" + |
| "----------\n" + |
| "5. ERROR in X.java (at line 21)\n" + |
| " public boolean equals(Object obj) { return false; }\n" + |
| " ^^^^^^^^^^^^^^^^^^\n" + |
| "The method equals(Object) of type AnnImpl should be tagged with @Override since it actually overrides a superclass method\n" + |
| "----------\n" + |
| "6. ERROR in X.java (at line 22)\n" + |
| " public int hashCode() { return 0; }\n" + |
| " ^^^^^^^^^^\n" + |
| "The method hashCode() of type AnnImpl should be tagged with @Override since it actually overrides a superclass method\n" + |
| "----------\n" + |
| "7. ERROR in X.java (at line 23)\n" + |
| " public String toString() { return null; }\n" + |
| " ^^^^^^^^^^\n" + |
| "The method toString() of type AnnImpl should be tagged with @Override since it actually overrides a superclass method\n" + |
| "----------\n" + |
| "8. WARNING in X.java (at line 30)\n" + |
| " Class c = SubKlass.class;\n" + |
| " ^^^^^\n" + |
| "Class is a raw type. References to generic type Class<T> should be parameterized\n" + |
| "----------\n" + |
| "9. WARNING in X.java (at line 41)\n" + |
| " Class[] i = c.getInterfaces();\n" + |
| " ^^^^^\n" + |
| "Class is a raw type. References to generic type Class<T> should be parameterized\n" + |
| "----------\n"; |
| |
| this.runNegativeTest( |
| true, |
| new String[] { |
| "X.java", |
| "import java.lang.annotation.Annotation;\n" + |
| "import java.util.Arrays;\n" + |
| "\n" + |
| "@interface Ann {\n" + |
| " int foo();\n" + |
| "}\n" + |
| "\n" + |
| "interface Iface extends Ann {\n" + |
| "}\n" + |
| "\n" + |
| "abstract class Klass implements Ann {\n" + |
| "}\n" + |
| "\n" + |
| "class SubKlass extends Klass {\n" + |
| " public Class<? extends Annotation> annotationType() {\n" + |
| " return null;\n" + |
| " }\n" + |
| "}\n" + |
| "\n" + |
| "class AnnImpl implements Ann {\n" + |
| " public boolean equals(Object obj) { return false; }\n" + |
| " public int hashCode() { return 0; }\n" + |
| " public String toString() { return null; }\n" + |
| " public Class<? extends Annotation> annotationType() { return null; }\n" + |
| " public int foo() { return 0; }\n" + |
| "}\n" + |
| "\n" + |
| "public class X {\n" + |
| " public static void main(String[] args) {\n" + |
| " Class c = SubKlass.class;\n" + |
| " System.out.println(\"Classes:\");\n" + |
| " while (c != Object.class) {\n" + |
| " System.out.println(\"-> \" + c.getName());\n" + |
| " c = c.getSuperclass();\n" + |
| " }\n" + |
| "\n" + |
| " System.out.println();\n" + |
| " System.out.println(\"Interfaces:\");\n" + |
| " c = SubKlass.class;\n" + |
| " while (c != Object.class) {\n" + |
| " Class[] i = c.getInterfaces();\n" + |
| " System.out.println(\"-> \" + Arrays.asList(i));\n" + |
| " c = c.getSuperclass();\n" + |
| " }\n" + |
| " }\n" + |
| "}\n", |
| }, |
| null, customOptions, |
| expectedOutput, |
| JavacTestOptions.SKIP); |
| } |
| |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=86291 |
| public void test112() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "@interface Annot {\n" + |
| " String foo1() default \"\";\n" + |
| "}\n" + |
| "@Annot(foo1=zzz)\n" + |
| "public class X {\n" + |
| " static final String zzz = \"\";\n" + |
| "}\n", |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 4)\n" + |
| " @Annot(foo1=zzz)\n" + |
| " ^^^\n" + |
| "zzz cannot be resolved to a variable\n" + |
| "----------\n"); |
| } |
| public void test113() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "@interface Annot {\n" + |
| " String foo();\n" + |
| "}\n" + |
| "@Annot( foo = new String(){} )\n" + |
| "public class X {\n" + |
| " \n" + |
| " \n" + |
| "}\n", |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 4)\n" + |
| " @Annot( foo = new String(){} )\n" + |
| " ^^^^^^\n" + |
| "An anonymous class cannot subclass the final class String\n" + |
| "----------\n"); |
| } |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=86291 - variation |
| public void test114() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "@interface Annot {\n" + |
| " Class foo();\n" + |
| "}\n" + |
| "@Annot( foo = M.class )\n" + |
| "public class X {\n" + |
| " class M {}\n" + |
| " \n" + |
| "}\n", |
| }, |
| "----------\n" + |
| "1. WARNING in X.java (at line 2)\n" + |
| " Class foo();\n" + |
| " ^^^^^\n" + |
| "Class is a raw type. References to generic type Class<T> should be parameterized\n" + |
| "----------\n" + |
| "2. ERROR in X.java (at line 4)\n" + |
| " @Annot( foo = M.class )\n" + |
| " ^\n" + |
| "M cannot be resolved to a type\n" + |
| "----------\n"); |
| } |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=86291 - variation |
| public void test115() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "@interface Annot {\n" + |
| " Class foo();\n" + |
| " String bar() default \"\";\n" + |
| "}\n" + |
| "@Annot(foo = M.class, bar = baz()+s)\n" + |
| "public class X {\n" + |
| " class M {\n" + |
| " }\n" + |
| " final static String s = \"\";\n" + |
| " String baz() { return null; }\n" + |
| " @Annot(foo = T.class, bar = s)\n" + |
| " <T> T foo(T t, String s) {\n" + |
| " return null;\n" + |
| " }\n" + |
| "}\n", |
| }, |
| "----------\n" + |
| "1. WARNING in X.java (at line 2)\n" + |
| " Class foo();\n" + |
| " ^^^^^\n" + |
| "Class is a raw type. References to generic type Class<T> should be parameterized\n" + |
| "----------\n" + |
| "2. ERROR in X.java (at line 5)\n" + |
| " @Annot(foo = M.class, bar = baz()+s)\n" + |
| " ^\n" + |
| "M cannot be resolved to a type\n" + |
| "----------\n" + |
| "3. ERROR in X.java (at line 5)\n" + |
| " @Annot(foo = M.class, bar = baz()+s)\n" + |
| " ^^^\n" + |
| "The method baz() is undefined for the type X\n" + |
| "----------\n" + |
| "4. ERROR in X.java (at line 5)\n" + |
| " @Annot(foo = M.class, bar = baz()+s)\n" + |
| " ^\n" + |
| "s cannot be resolved to a variable\n" + |
| "----------\n" + |
| "5. ERROR in X.java (at line 11)\n" + |
| " @Annot(foo = T.class, bar = s)\n" + |
| " ^^^^^^^\n" + |
| "Illegal class literal for the type parameter T\n" + |
| "----------\n" + |
| "6. WARNING in X.java (at line 12)\n" + |
| " <T> T foo(T t, String s) {\n" + |
| " ^\n" + |
| "The parameter s is hiding a field from type X\n" + |
| "----------\n"); |
| } |
| // check @Deprecated support |
| public void test116() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "/** @deprecated */\n" + |
| "@Deprecated\n" + |
| "public class X {\n" + |
| "}\n", |
| "Y.java", |
| "public class Y {\n" + |
| " X x;\n" + |
| " Zork z;\n" + |
| "}\n", |
| }, |
| "----------\n" + |
| "1. WARNING in Y.java (at line 2)\n" + |
| " X x;\n" + |
| " ^\n" + |
| "The type X is deprecated\n" + |
| "----------\n" + |
| "2. ERROR in Y.java (at line 3)\n" + |
| " Zork z;\n" + |
| " ^^^^\n" + |
| "Zork cannot be resolved to a type\n" + |
| "----------\n"); |
| } |
| // check @Deprecated support |
| public void test117() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "@Deprecated\n" + |
| "public class X {\n" + |
| "}\n", |
| "Y.java", |
| "public class Y {\n" + |
| " X x;\n" + |
| " Zork z;\n" + |
| "}\n", |
| }, |
| "----------\n" + |
| "1. WARNING in Y.java (at line 2)\n" + |
| " X x;\n" + |
| " ^\n" + |
| "The type X is deprecated\n" + |
| "----------\n" + |
| "2. ERROR in Y.java (at line 3)\n" + |
| " Zork z;\n" + |
| " ^^^^\n" + |
| "Zork cannot be resolved to a type\n" + |
| "----------\n"); |
| } |
| // check @Deprecated support |
| public void test118() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "@interface Deprecated {}\n" + |
| "\n" + |
| "@Deprecated // not the real @Deprecated interface\n" + |
| "public class X {\n" + |
| "}\n", |
| "Y.java", |
| "public class Y {\n" + |
| " X x;\n" + |
| " Zork z;\n" + |
| "}\n", |
| }, |
| "----------\n" + |
| "1. ERROR in Y.java (at line 3)\n" + |
| " Zork z;\n" + |
| " ^^^^\n" + |
| "Zork cannot be resolved to a type\n" + |
| "----------\n"); |
| } |
| // check @Deprecated support |
| public void test119() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "@Deprecated\n" + |
| "public class X {\n" + |
| " void foo(){}\n" + |
| "}\n", |
| "Y.java", |
| "public class Y extends X {\n" + |
| " void foo(){ super.foo(); }\n" + |
| " Zork z;\n" + |
| "}\n", |
| }, |
| "----------\n" + |
| "1. WARNING in Y.java (at line 1)\n" + |
| " public class Y extends X {\n" + |
| " ^\n" + |
| "The type X is deprecated\n" + |
| "----------\n" + |
| "2. WARNING in Y.java (at line 2)\n" + |
| " void foo(){ super.foo(); }\n" + |
| " ^^^^^\n" + |
| "The method foo() of type Y should be tagged with @Override since it actually overrides a superclass method\n" + |
| "----------\n" + |
| "3. WARNING in Y.java (at line 2)\n" + |
| " void foo(){ super.foo(); }\n" + |
| " ^^^^^\n" + |
| "The method foo() from the type X is deprecated\n" + |
| "----------\n" + |
| "4. ERROR in Y.java (at line 3)\n" + |
| " Zork z;\n" + |
| " ^^^^\n" + |
| "Zork cannot be resolved to a type\n" + |
| "----------\n"); |
| } |
| // check @Deprecated support |
| public void test120() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "@Deprecated\n" + |
| "public class X {\n" + |
| " void foo(){}\n" + |
| "}\n", |
| "Y.java", |
| "public class Y extends X {\n" + |
| " void foo(){ super.foo(); }\n" + |
| " Zork z;\n" + |
| "}\n", |
| }, |
| "----------\n" + |
| "1. WARNING in Y.java (at line 1)\n" + |
| " public class Y extends X {\n" + |
| " ^\n" + |
| "The type X is deprecated\n" + |
| "----------\n" + |
| "2. WARNING in Y.java (at line 2)\n" + |
| " void foo(){ super.foo(); }\n" + |
| " ^^^^^\n" + |
| "The method foo() of type Y should be tagged with @Override since it actually overrides a superclass method\n" + |
| "----------\n" + |
| "3. WARNING in Y.java (at line 2)\n" + |
| " void foo(){ super.foo(); }\n" + |
| " ^^^^^\n" + |
| "The method foo() from the type X is deprecated\n" + |
| "----------\n" + |
| "4. ERROR in Y.java (at line 3)\n" + |
| " Zork z;\n" + |
| " ^^^^\n" + |
| "Zork cannot be resolved to a type\n" + |
| "----------\n"); |
| } |
| // check missing @Deprecated detection |
| public void test121() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "/** @deprecated */\n" + |
| "public class X {\n" + |
| " /** @deprecated */\n" + |
| " public static class Y {\n" + |
| " }\n" + |
| " /** @deprecated */\n" + |
| " int i;\n" + |
| " /** @deprecated */\n" + |
| " public void flag() {}\n" + |
| " void doNotFlag() {}\n" + |
| " Zork z;\n" + |
| "} \n", |
| }, |
| "----------\n" + |
| "1. WARNING in X.java (at line 2)\n" + |
| " public class X {\n" + |
| " ^\n" + |
| "The deprecated type X should be annotated with @Deprecated\n" + |
| "----------\n" + |
| "2. WARNING in X.java (at line 4)\n" + |
| " public static class Y {\n" + |
| " ^\n" + |
| "The deprecated type X.Y should be annotated with @Deprecated\n" + |
| "----------\n" + |
| "3. WARNING in X.java (at line 7)\n" + |
| " int i;\n" + |
| " ^\n" + |
| "The deprecated field X.i should be annotated with @Deprecated\n" + |
| "----------\n" + |
| "4. WARNING in X.java (at line 9)\n" + |
| " public void flag() {}\n" + |
| " ^^^^^^\n" + |
| "The deprecated method flag() of type X should be annotated with @Deprecated\n" + |
| "----------\n" + |
| "5. ERROR in X.java (at line 11)\n" + |
| " Zork z;\n" + |
| " ^^^^\n" + |
| "Zork cannot be resolved to a type\n" + |
| "----------\n"); |
| } |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=88446 |
| public void test122() { |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "import java.lang.annotation.Annotation;\n" + |
| "import java.lang.reflect.Method;\n" + |
| "import java.lang.annotation.ElementType;\n" + |
| "import java.lang.annotation.Retention;\n" + |
| "import java.lang.annotation.RetentionPolicy;\n" + |
| "import java.lang.annotation.Target;\n" + |
| "class GenericWithInnerAnnotation<T> {\n" + |
| " @Retention(RetentionPolicy.RUNTIME)\n" + |
| " @Target(ElementType.METHOD)\n" + |
| " public @interface MyAnnotation {\n" + |
| " }\n" + |
| "}\n" + |
| "public class X extends GenericWithInnerAnnotation<Integer> {\n" + |
| " @MyAnnotation\n" + |
| " public void aMethod() {\n" + |
| " }\n" + |
| " \n" + |
| " public static void main(String[] args) {\n" + |
| " try {\n" + |
| " Method method = X.class.getDeclaredMethod(\"aMethod\", new Class[]{});\n" + |
| " System.out.print(method.getName());\n" + |
| " Annotation[] annotations = method.getAnnotations();\n" + |
| " System.out.println(annotations.length);\n" + |
| " } catch(NoSuchMethodException e) {\n" + |
| " }\n" + |
| " }\n" + |
| "}", |
| }, |
| "aMethod1"); |
| } |
| |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=90110 |
| public void test123() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "class SuperX {\n" + |
| "\n" + |
| " static void notOverridden() {\n" + |
| " return;\n" + |
| " }\n" + |
| "}\n" + |
| "\n" + |
| "public class X extends SuperX {\n" + |
| "\n" + |
| " static void notOverridden() {\n" + |
| " return;\n" + |
| " }\n" + |
| " Zork z;\n" + |
| "} \n", |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 13)\n" + |
| " Zork z;\n" + |
| " ^^^^\n" + |
| "Zork cannot be resolved to a type\n" + |
| "----------\n"); |
| } |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=90110 - variation |
| public void test124() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "class SuperX {\n" + |
| "\n" + |
| " void notOverridden() {\n" + |
| " return;\n" + |
| " }\n" + |
| "}\n" + |
| "\n" + |
| "public class X extends SuperX {\n" + |
| "\n" + |
| " void notOverridden() {\n" + |
| " return;\n" + |
| " }\n" + |
| " Zork z;\n" + |
| "} \n", |
| }, |
| "----------\n" + |
| "1. WARNING in X.java (at line 10)\n" + |
| " void notOverridden() {\n" + |
| " ^^^^^^^^^^^^^^^\n" + |
| "The method notOverridden() of type X should be tagged with @Override since it actually overrides a superclass method\n" + |
| "----------\n" + |
| "2. ERROR in X.java (at line 13)\n" + |
| " Zork z;\n" + |
| " ^^^^\n" + |
| "Zork cannot be resolved to a type\n" + |
| "----------\n"); |
| } |
| public void test125() { |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "import java.lang.annotation.*;\n" + |
| "\n" + |
| "public class X implements Ann {\n" + |
| " \n" + |
| " Ann ann = new X();\n" + |
| " public Class<? extends Annotation> annotationType() {\n" + |
| " return null;\n" + |
| " }\n" + |
| "}\n" + |
| "\n" + |
| "@interface Ann {}\n" + |
| "\n", |
| }, |
| ""); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=90484 - check no missing @Override warning |
| public void test126() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "public interface X {\n" + |
| " Zork z;\n" + |
| " X clone();\n" + |
| "}\n", |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 2)\n" + |
| " Zork z;\n" + |
| " ^^^^\n" + |
| "Zork cannot be resolved to a type\n" + |
| "----------\n"); |
| } |
| // check @SuppressWarning support |
| public void test127() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "@Deprecated\n" + |
| "public class X {\n" + |
| " void foo(){}\n" + |
| "}\n", |
| "Y.java", |
| "public class Y extends X {\n" + |
| " @SuppressWarnings(\"all\")\n" + |
| " void foo(){ super.foo(); }\n" + |
| " Zork z;\n" + |
| "}\n", |
| }, |
| "----------\n" + |
| "1. WARNING in Y.java (at line 1)\n" + |
| " public class Y extends X {\n" + |
| " ^\n" + |
| "The type X is deprecated\n" + |
| "----------\n" + |
| "2. ERROR in Y.java (at line 4)\n" + |
| " Zork z;\n" + |
| " ^^^^\n" + |
| "Zork cannot be resolved to a type\n" + |
| "----------\n"); |
| } |
| // check @SuppressWarning support |
| public void test128() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "import java.util.List;\n" + |
| "\n" + |
| "public class X {\n" + |
| " void foo(List list) {\n" + |
| " List<String> ls1 = list;\n" + |
| " }\n" + |
| " @SuppressWarnings({\"unchecked\", \"rawtypes\"})\n" + |
| " void bar(List list) {\n" + |
| " List<String> ls2 = list;\n" + |
| " }\n" + |
| " Zork z;\n" + |
| "}\n", |
| }, |
| "----------\n" + |
| "1. WARNING in X.java (at line 4)\n" + |
| " void foo(List list) {\n" + |
| " ^^^^\n" + |
| "List is a raw type. References to generic type List<E> should be parameterized\n" + |
| "----------\n" + |
| "2. WARNING in X.java (at line 5)\n" + |
| " List<String> ls1 = list;\n" + |
| " ^^^^\n" + |
| "Type safety: The expression of type List needs unchecked conversion to conform to List<String>\n" + |
| "----------\n" + |
| "3. ERROR in X.java (at line 11)\n" + |
| " Zork z;\n" + |
| " ^^^^\n" + |
| "Zork cannot be resolved to a type\n" + |
| "----------\n"); |
| } |
| // check @SuppressWarning support |
| public void test129() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "import java.util.*;\n" + |
| "@SuppressWarnings(\"unchecked\")\n" + |
| "public class X {\n" + |
| " void foo() {\n" + |
| " Map<String, String>[] map = new HashMap[10];\n" + |
| " }\n" + |
| " Zork z;\n" + |
| "}\n", |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 7)\n" + |
| " Zork z;\n" + |
| " ^^^^\n" + |
| "Zork cannot be resolved to a type\n" + |
| "----------\n"); |
| } |
| // check @SuppressWarning support |
| public void test130() { |
| Map customOptions = new Hashtable(); |
| String[] warnings = CompilerOptions.warningOptionNames(); |
| for (int i = 0, ceil = warnings.length; i < ceil; i++) { |
| customOptions.put(warnings[i], CompilerOptions.WARNING); |
| } |
| this.runConformTest( |
| true, |
| new String[] { |
| "X.java", |
| "public class X {\n" + |
| " public static void main(String[] args) {\n" + |
| " }\n" + |
| "}\n", |
| }, |
| null, |
| customOptions, |
| "----------\n" + |
| "1. WARNING in X.java (at line 1)\n" + |
| " public class X {\n" + |
| " ^\n" + |
| "Javadoc: Missing comment for public declaration\n" + |
| "----------\n" + |
| "2. WARNING in X.java (at line 2)\n" + |
| " public static void main(String[] args) {\n" + |
| " ^^^^^^^^^^^^^^^^^^^\n" + |
| "Javadoc: Missing comment for public declaration\n" + |
| "----------\n" + |
| "3. WARNING in X.java (at line 2)\n" + |
| " public static void main(String[] args) {\n" + |
| " }\n" + |
| " ^^^^^\n" + |
| "Empty block should be documented\n" + |
| "----------\n", |
| null, null, |
| JavacTestOptions.Excuse.EclipseHasSomeMoreWarnings); |
| } |
| // check @SuppressWarning support |
| public void test131() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "@SuppressWarnings(\"all\")\n" + |
| "public class X {\n" + |
| " public static void main(String[] args) {\n" + |
| " Zork z;\n" + |
| " }\n" + |
| "}\n", |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 4)\n" + |
| " Zork z;\n" + |
| " ^^^^\n" + |
| "Zork cannot be resolved to a type\n" + |
| "----------\n"); |
| } |
| // check @SuppressWarning support |
| public void test132() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "import java.io.Serializable;\n" + |
| "import java.util.List;\n" + |
| "import java.util.Vector;\n" + |
| "\n" + |
| "public class X {\n" + |
| " public static void main(String[] args) {\n" + |
| " W.deprecated();\n" + |
| " List<X> l = new Vector();\n" + |
| " l.size();\n" + |
| " try {\n" + |
| " // do nothing\n" + |
| " } finally {\n" + |
| " throw new Error();\n" + |
| " }\n" + |
| " // Zork z;\n" + |
| " }\n" + |
| "\n" + |
| " class S implements Serializable {\n" + |
| " String dummy;\n" + |
| " }\n" + |
| "}", |
| "W.java", |
| "public class W {\n" + |
| " // @deprecated\n" + |
| " @Deprecated\n" + |
| " static void deprecated() {\n" + |
| " // do nothing\n" + |
| " }\n" + |
| "}\n" |
| }, |
| "----------\n" + |
| "1. WARNING in X.java (at line 7)\n" + |
| " W.deprecated();\n" + |
| " ^^^^^^^^^^^^\n" + |
| "The method deprecated() from the type W is deprecated\n" + |
| "----------\n" + |
| "2. WARNING in X.java (at line 8)\n" + |
| " List<X> l = new Vector();\n" + |
| " ^^^^^^^^^^^^\n" + |
| "Type safety: The expression of type Vector needs unchecked conversion to conform to List<X>\n" + |
| "----------\n" + |
| "3. WARNING in X.java (at line 8)\n" + |
| " List<X> l = new Vector();\n" + |
| " ^^^^^^\n" + |
| "Vector is a raw type. References to generic type Vector<E> should be parameterized\n" + |
| "----------\n" + |
| "4. WARNING in X.java (at line 12)\n" + |
| " } finally {\n" + |
| " throw new Error();\n" + |
| " }\n" + |
| " ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + |
| "finally block does not complete normally\n" + |
| "----------\n" + |
| "5. WARNING in X.java (at line 18)\n" + |
| " class S implements Serializable {\n" + |
| " ^\n" + |
| "The serializable class S does not declare a static final serialVersionUID field of type long\n" + |
| "----------\n", |
| null, |
| true, |
| null, |
| "java.lang.Error"); |
| } |
| // check @SuppressWarning support |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=89436 |
| public void test133() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "import java.io.Serializable;\n" + |
| "import java.util.List;\n" + |
| "import java.util.Vector;\n" + |
| "\n" + |
| "@SuppressWarnings( { \"deprecation\",//$NON-NLS-1$\n" + |
| " \"finally\",//$NON-NLS-1$\n" + |
| " \"rawtypes\",//$NON-NLS-1$\n" + |
| " \"serial\",//$NON-NLS-1$\n" + |
| " \"unchecked\"//$NON-NLS-1$\n" + |
| "})\n" + |
| "public class X {\n" + |
| " public static void main(String[] args) {\n" + |
| " W.deprecated();\n" + |
| " List<X> l = new Vector();\n" + |
| " l.size();\n" + |
| " try {\n" + |
| " // do nothing\n" + |
| " } finally {\n" + |
| " throw new Error();\n" + |
| " }\n" + |
| " }\n" + |
| "\n" + |
| " class S implements Serializable {\n" + |
| " Zork dummy;\n" + |
| " }\n" + |
| "}", |
| "W.java", |
| "public class W {\n" + |
| " // @deprecated\n" + |
| " @Deprecated\n" + |
| " static void deprecated() {\n" + |
| " // do nothing\n" + |
| " }\n" + |
| "}\n" |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 24)\n" + |
| " Zork dummy;\n" + |
| " ^^^^\n" + |
| "Zork cannot be resolved to a type\n" + |
| "----------\n"); |
| } |
| // check @SuppressWarning support |
| public void test134() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "import java.io.Serializable;\n" + |
| "import java.util.List;\n" + |
| "import java.util.Vector;\n" + |
| "\n" + |
| "public class X {\n" + |
| " @SuppressWarnings( { \"deprecation\",//$NON-NLS-1$\n" + |
| " \"finally\",//$NON-NLS-1$\n" + |
| " \"rawtypes\",//$NON-NLS-1$\n" + |
| " \"unchecked\"//$NON-NLS-1$\n" + |
| " })\n" + |
| " public static void main(String[] args) {\n" + |
| " W.deprecated();\n" + |
| " List<X> l = new Vector();\n" + |
| " l.size();\n" + |
| " try {\n" + |
| " // do nothing\n" + |
| " } finally {\n" + |
| " throw new Error();\n" + |
| " }\n" + |
| " }\n" + |
| "\n" + |
| " @SuppressWarnings({\"unchecked\", \"rawtypes\"}//$NON-NLS-1$//$NON-NLS-2$\n" + |
| " )\n" + |
| " List<X> l = new Vector();\n" + |
| "\n" + |
| " @SuppressWarnings(\"serial\"//$NON-NLS-1$\n" + |
| " )\n" + |
| " class S implements Serializable {\n" + |
| " Zork dummy;\n" + |
| " }\n" + |
| "}", |
| "W.java", |
| "public class W {\n" + |
| " // @deprecated\n" + |
| " @Deprecated\n" + |
| " static void deprecated() {\n" + |
| " // do nothing\n" + |
| " }\n" + |
| "}\n" |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 29)\n" + |
| " Zork dummy;\n" + |
| " ^^^^\n" + |
| "Zork cannot be resolved to a type\n" + |
| "----------\n"); |
| } |
| // check @SuppressWarning support |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=69505 -- NOT READY YET: "all" only so far, no file support -- |
| // hence no import support |
| public void test135() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "@SuppressWarnings(\"all\")//$NON-NLS-1$\n" + |
| "import java.util.List;\n" + |
| "\n" + |
| "public class X {\n" + |
| " public static void main(String[] args) {\n" + |
| " if (false) {\n" + |
| " ;\n" + |
| " } else {\n" + |
| " }\n" + |
| " Zork z;\n" + |
| " }\n" + |
| "}" |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 2)\n" + |
| " import java.util.List;\n" + |
| " ^^^^^^\n" + |
| "Syntax error on token \"import\", package expected\n" + |
| "----------\n" + |
| "2. ERROR in X.java (at line 10)\n" + |
| " Zork z;\n" + |
| " ^^^^\n" + |
| "Zork cannot be resolved to a type\n" + |
| "----------\n"); |
| } |
| // check @SuppressWarning support |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=71968 |
| public void test136() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "public class X {\n" + |
| " @SuppressWarnings(\"unused\"//$NON-NLS-1$\n" + |
| " )\n" + |
| " private static final String marker = \"never used mark\"; //$NON-NLS-1$\n" + |
| "\n" + |
| " public static void main(String[] args) {\n" + |
| " Zork z;\n" + |
| " }\n" + |
| "}" |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 7)\n" + |
| " Zork z;\n" + |
| " ^^^^\n" + |
| "Zork cannot be resolved to a type\n" + |
| "----------\n"); |
| } |
| // check @SuppressWarning support |
| public void test137() { |
| Map customOptions = new Hashtable(); |
| String[] warnings = CompilerOptions.warningOptionNames(); |
| for (int i = 0, ceil = warnings.length; i < ceil; i++) { |
| customOptions.put(warnings[i], CompilerOptions.WARNING); |
| } |
| customOptions.put(CompilerOptions.OPTION_SuppressWarnings, CompilerOptions.DISABLED); |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "import java.io.Serializable;\n" + |
| "import java.util.List;\n" + |
| "import java.util.Vector;\n" + |
| "\n" + |
| "@SuppressWarnings(\"all\")\n" + |
| "public class X {\n" + |
| " public static void main(String[] args) {\n" + |
| " W.deprecated();\n" + |
| " List<X> l = new Vector();\n" + |
| " l.size();\n" + |
| " try {\n" + |
| " // do nothing\n" + |
| " } finally {\n" + |
| " throw new Error();\n" + |
| " }\n" + |
| " Zork z;\n" + |
| " }\n" + |
| "\n" + |
| " class S implements Serializable {\n" + |
| " String dummy;\n" + |
| " }\n" + |
| "}", |
| "W.java", |
| "public class W {\n" + |
| " // @deprecated\n" + |
| " @Deprecated\n" + |
| " static void deprecated() {\n" + |
| " // do nothing\n" + |
| " }\n" + |
| "}\n" |
| }, |
| "----------\n" + |
| "1. WARNING in X.java (at line 6)\n" + |
| " public class X {\n" + |
| " ^\n" + |
| "Javadoc: Missing comment for public declaration\n" + |
| "----------\n" + |
| "2. WARNING in X.java (at line 7)\n" + |
| " public static void main(String[] args) {\n" + |
| " ^^^^^^^^^^^^^^^^^^^\n" + |
| "Javadoc: Missing comment for public declaration\n" + |
| "----------\n" + |
| "3. WARNING in X.java (at line 8)\n" + |
| " W.deprecated();\n" + |
| " ^^^^^^^^^^^^\n" + |
| "The method deprecated() from the type W is deprecated\n" + |
| "----------\n" + |
| "4. WARNING in X.java (at line 9)\n" + |
| " List<X> l = new Vector();\n" + |
| " ^^^^^^^^^^^^\n" + |
| "Type safety: The expression of type Vector needs unchecked conversion to conform to List<X>\n" + |
| "----------\n" + |
| "5. WARNING in X.java (at line 9)\n" + |
| " List<X> l = new Vector();\n" + |
| " ^^^^^^\n" + |
| "Vector is a raw type. References to generic type Vector<E> should be parameterized\n" + |
| "----------\n" + |
| "6. ERROR in X.java (at line 16)\n" + |
| " Zork z;\n" + |
| " ^^^^\n" + |
| "Zork cannot be resolved to a type\n" + |
| "----------\n" + |
| "7. WARNING in X.java (at line 19)\n" + |
| " class S implements Serializable {\n" + |
| " ^\n" + |
| "The serializable class S does not declare a static final serialVersionUID field of type long\n" + |
| "----------\n" + |
| "----------\n" + |
| "1. WARNING in W.java (at line 1)\n" + |
| " public class W {\n" + |
| " ^\n" + |
| "Javadoc: Missing comment for public declaration\n" + |
| "----------\n", |
| null, true, customOptions); |
| } |
| // check @SuppressWarning support |
| public void test138() { |
| Map customOptions = new Hashtable(); |
| customOptions.put(CompilerOptions.OPTION_ReportUnhandledWarningToken, CompilerOptions.WARNING); |
| this.runNegativeTest( |
| |
| new String[] { |
| "X.java", |
| "@SuppressWarnings(\"zork\")//$NON-NLS-1$\n" + |
| "public class X {\n" + |
| " Zork z;\n" + |
| "}\n" |
| }, |
| "----------\n" + |
| "1. WARNING in X.java (at line 1)\n" + |
| " @SuppressWarnings(\"zork\")//$NON-NLS-1$\n" + |
| " ^^^^^^\n" + |
| "Unsupported @SuppressWarnings(\"zork\")\n" + |
| "----------\n" + |
| "2. ERROR in X.java (at line 3)\n" + |
| " Zork z;\n" + |
| " ^^^^\n" + |
| "Zork cannot be resolved to a type\n" + |
| "----------\n", |
| null, true, customOptions); |
| } |
| // check @SuppressWarning support |
| public void test139() { |
| Map customOptions = new Hashtable(); |
| customOptions.put(CompilerOptions.OPTION_ReportUnhandledWarningToken, CompilerOptions.WARNING); |
| this.runNegativeTest( |
| |
| new String[] { |
| "X.java", |
| "@SuppressWarnings({\"zork\", \"warningToken\"})//$NON-NLS-1$//$NON-NLS-2$\n" + |
| "public class X {\n" + |
| " Zork z;\n" + |
| "}\n" |
| }, |
| "----------\n" + |
| "1. WARNING in X.java (at line 1)\n" + |
| " @SuppressWarnings({\"zork\", \"warningToken\"})//$NON-NLS-1$//$NON-NLS-2$\n" + |
| " ^^^^^^\n" + |
| "Unsupported @SuppressWarnings(\"zork\")\n" + |
| "----------\n" + |
| "2. WARNING in X.java (at line 1)\n" + |
| " @SuppressWarnings({\"zork\", \"warningToken\"})//$NON-NLS-1$//$NON-NLS-2$\n" + |
| " ^^^^^^^^^^^^^^\n" + |
| "Unsupported @SuppressWarnings(\"warningToken\")\n" + |
| "----------\n" + |
| "3. ERROR in X.java (at line 3)\n" + |
| " Zork z;\n" + |
| " ^^^^\n" + |
| "Zork cannot be resolved to a type\n" + |
| "----------\n", |
| null, true, customOptions); |
| } |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=90111 - variation |
| public void test140() { |
| String expectedOutput = new CompilerOptions(getCompilerOptions()).sourceLevel < ClassFileConstants.JDK1_6 |
| ? "----------\n" + |
| "1. ERROR in X.java (at line 6)\n" + |
| " static void foo(){} \n" + |
| " ^^^^^\n" + |
| "The method foo() of type Bar must override a superclass method\n" + |
| "----------\n" |
| : "----------\n" + |
| "1. ERROR in X.java (at line 6)\n" + |
| " static void foo(){} \n" + |
| " ^^^^^\n" + |
| "The method foo() of type Bar must override or implement a supertype method\n" + |
| "----------\n"; |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "public class X {\n" + |
| " static void foo(){}\n" + |
| "}\n" + |
| "class Bar extends X {\n" + |
| " @Override\n" + |
| " static void foo(){} \n" + |
| "}\n" + |
| "\n" |
| }, |
| expectedOutput, |
| JavacTestOptions.JavacHasABug.JavacBugFixed_6_10); |
| } |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=94867 |
| public void test141() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "@interface X1 {\n" + |
| " Class<? extends Throwable>[] expected1() default {};\n" + |
| " Class<? super Throwable>[] expected2() default {};\n" + |
| " Class<?>[] expected3() default {};\n" + |
| "}\n" + |
| "\n" + |
| "public class X {\n" + |
| " @X1(expected1=Throwable.class, expected2={})\n" + |
| " public static void main(String[] args) {\n" + |
| " \n" + |
| " }\n" + |
| " void foo() {\n" + |
| " Class<? extends Throwable>[] c1 = {};\n" + |
| " Class<? super Throwable>[] c2 = {};\n" + |
| " Class<?>[] c3 = {};\n" + |
| " }\n" + |
| "}\n" |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 13)\n" + |
| " Class<? extends Throwable>[] c1 = {};\n" + |
| " ^^\n" + |
| "Cannot create a generic array of Class<? extends Throwable>\n" + |
| "----------\n" + |
| "2. ERROR in X.java (at line 14)\n" + |
| " Class<? super Throwable>[] c2 = {};\n" + |
| " ^^\n" + |
| "Cannot create a generic array of Class<? super Throwable>\n" + |
| "----------\n"); |
| } |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=94308 |
| public void test142() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "@SuppressWarnings(\"deprecation\")\n" + |
| "public class X extends p.OldStuff {\n" + |
| " /**\n" + |
| " * @see p.OldStuff#foo()\n" + |
| " */\n" + |
| " @Override\n" + |
| " public void foo() {\n" + |
| " super.foo();\n" + |
| " }\n" + |
| "}\n", |
| "p/OldStuff.java", |
| "package p;\n" + |
| "@Deprecated\n" + |
| "public class OldStuff {\n" + |
| " public void foo() {\n" + |
| " } \n" + |
| " Zork z;\n" + |
| "}\n", |
| }, |
| "----------\n" + |
| "1. ERROR in p\\OldStuff.java (at line 6)\n" + |
| " Zork z;\n" + |
| " ^^^^\n" + |
| "Zork cannot be resolved to a type\n" + |
| "----------\n", |
| null, |
| true, |
| null); |
| } |
| public void test142b() { |
| Map raiseInvalidJavadocSeverity = |
| new HashMap(2); |
| raiseInvalidJavadocSeverity.put( |
| CompilerOptions.OPTION_ReportInvalidJavadoc, CompilerOptions.ERROR); |
| // admittingly, when these are errors, SuppressWarnings is not enough to |
| // filter them out *but* the deprecation level being WARNING, we get them |
| // out anyway |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "@SuppressWarnings(\"deprecation\")\n" + |
| "public class X extends p.OldStuff {\n" + |
| " /**\n" + |
| " * @see p.OldStuff#foo()\n" + |
| " */\n" + |
| " @Override\n" + |
| " public void foo() {\n" + |
| " super.foo();\n" + |
| " }\n" + |
| "}\n", |
| "p/OldStuff.java", |
| "package p;\n" + |
| "@Deprecated\n" + |
| "public class OldStuff {\n" + |
| " public void foo() {\n" + |
| " } \n" + |
| " Zork z;\n" + |
| "}\n", |
| }, |
| "----------\n" + |
| "1. ERROR in p\\OldStuff.java (at line 6)\n" + |
| " Zork z;\n" + |
| " ^^^^\n" + |
| "Zork cannot be resolved to a type\n" + |
| "----------\n", |
| null, |
| true, |
| raiseInvalidJavadocSeverity); |
| } |
| // check that @SuppressWarning is reported as unused when corresponding warning is moved from |
| // warning to error |
| public void test142c() { |
| Map raiseDeprecationReduceInvalidJavadocSeverity = |
| new HashMap(2); |
| raiseDeprecationReduceInvalidJavadocSeverity.put( |
| CompilerOptions.OPTION_ReportDeprecation, CompilerOptions.ERROR); |
| raiseDeprecationReduceInvalidJavadocSeverity.put( |
| CompilerOptions.OPTION_ReportInvalidJavadoc, CompilerOptions.WARNING); |
| this.runNegativeTest( |
| true, |
| new String[] { |
| "X.java", |
| "@SuppressWarnings(\"deprecation\")\n" + |
| "public class X extends p.OldStuff {\n" + |
| " /**\n" + |
| " * @see p.OldStuff#foo()\n" + |
| " */\n" + |
| " @Override\n" + |
| " public void foo() {\n" + |
| " super.foo();\n" + |
| " }\n" + |
| "}\n", |
| "p/OldStuff.java", |
| "package p;\n" + |
| "@Deprecated\n" + |
| "public class OldStuff {\n" + |
| " public void foo() {\n" + |
| " } \n" + |
| "}\n", |
| }, |
| null, |
| raiseDeprecationReduceInvalidJavadocSeverity, |
| "----------\n" + |
| "1. WARNING in X.java (at line 1)\n" + |
| " @SuppressWarnings(\"deprecation\")\n" + |
| " ^^^^^^^^^^^^^\n" + |
| "Unnecessary @SuppressWarnings(\"deprecation\")\n" + |
| "----------\n" + |
| "2. ERROR in X.java (at line 2)\n" + |
| " public class X extends p.OldStuff {\n" + |
| " ^^^^^^^^\n" + |
| "The type OldStuff is deprecated\n" + |
| "----------\n" + |
| "3. ERROR in X.java (at line 8)\n" + |
| " super.foo();\n" + |
| " ^^^^^\n" + |
| "The method foo() from the type OldStuff is deprecated\n" + |
| "----------\n", |
| JavacTestOptions.Excuse.EclipseWarningConfiguredAsError); |
| } |
| public void test143() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "public class X extends p.OldStuff {\n" + |
| " @SuppressWarnings(\"all\")\n" + |
| " public void foo() {\n" + |
| " super.foo();\n" + |
| " }\n" + |
| "}\n", |
| "p/OldStuff.java", |
| "package p;\n" + |
| "@Deprecated\n" + |
| "public class OldStuff {\n" + |
| " public void foo() {\n" + |
| " } \n" + |
| " Zork z;\n" + |
| "}\n", |
| }, |
| "----------\n" + |
| "1. WARNING in X.java (at line 1)\n" + |
| " public class X extends p.OldStuff {\n" + |
| " ^^^^^^^^\n" + |
| "The type OldStuff is deprecated\n" + |
| "----------\n" + |
| "----------\n" + |
| "1. ERROR in p\\OldStuff.java (at line 6)\n" + |
| " Zork z;\n" + |
| " ^^^^\n" + |
| "Zork cannot be resolved to a type\n" + |
| "----------\n"); |
| } |
| public void test144() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "import java.util.*;\n" + |
| "public class X {\n" + |
| " Zork z;\n" + |
| " @SuppressWarnings(\"all\") \n" + |
| " public static class EverythingWrong {\n" + |
| " private EverythingWrong() {}\n" + |
| " @BeforeClass public void notStaticBC() {}\n" + |
| " @BeforeClass static void notPublicBC() {}\n" + |
| " @BeforeClass public static int nonVoidBC() { return 0; }\n" + |
| " @BeforeClass public static void argumentsBC(int i) {}\n" + |
| " @BeforeClass public static void fineBC() {}\n" + |
| " @AfterClass public void notStaticAC() {}\n" + |
| " @AfterClass static void notPublicAC() {}\n" + |
| " @AfterClass public static int nonVoidAC() { return 0; }\n" + |
| " @AfterClass public static void argumentsAC(int i) {}\n" + |
| " @AfterClass public static void fineAC() {}\n" + |
| " @After public static void staticA() {}\n" + |
| " @After void notPublicA() {}\n" + |
| " @After public int nonVoidA() { return 0; }\n" + |
| " @After public void argumentsA(int i) {}\n" + |
| " @After public void fineA() {}\n" + |
| " @Before public static void staticB() {}\n" + |
| " @Before void notPublicB() {}\n" + |
| " @Before public int nonVoidB() { return 0; }\n" + |
| " @Before public void argumentsB(int i) {}\n" + |
| " @Before public void fineB() {}\n" + |
| " @Test public static void staticT() {}\n" + |
| " @Test void notPublicT() {}\n" + |
| " @Test public int nonVoidT() { return 0; }\n" + |
| " @Test public void argumentsT(int i) {}\n" + |
| " @Test public void fineT() {}\n" + |
| " }\n" + |
| " @Test public void testFailures() throws Exception {\n" + |
| " List<Exception> problems= new TestIntrospector(EverythingWrong.class).validateTestMethods();\n" + |
| " int errorCount= 1 + 4 * 5; // missing constructor plus four invalid methods for each annotation */\n" + |
| " assertEquals(errorCount, problems.size());\n" + |
| " }\n" + |
| " public static junit.framework.Test suite() {\n" + |
| " return null; // new JUnit4TestAdapter(TestMethodTest.class);\n" + |
| " }\n" + |
| " void assertEquals(int i, int j) {\n" + |
| " }\n" + |
| "}\n" + |
| "@interface BeforeClass {}\n" + |
| "@interface AfterClass {}\n" + |
| "@interface Test {}\n" + |
| "@interface After {}\n" + |
| "@interface Before {}\n" + |
| "class TestIntrospector {\n" + |
| " TestIntrospector(Class c) {}\n" + |
| " List validateTestMethods() { return null; }\n" + |
| "}\n", |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 3)\n" + |
| " Zork z;\n" + |
| " ^^^^\n" + |
| "Zork cannot be resolved to a type\n" + |
| "----------\n" + |
| "2. WARNING in X.java (at line 34)\n" + |
| " List<Exception> problems= new TestIntrospector(EverythingWrong.class).validateTestMethods();\n" + |
| " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + |
| "Type safety: The expression of type List needs unchecked conversion to conform to List<Exception>\n" + |
| "----------\n" + |
| "3. ERROR in X.java (at line 38)\n" + |
| " public static junit.framework.Test suite() {\n" + |
| " ^^^^^\n" + |
| "junit cannot be resolved to a type\n" + |
| "----------\n" + |
| "4. WARNING in X.java (at line 50)\n" + |
| " TestIntrospector(Class c) {}\n" + |
| " ^^^^^\n" + |
| "Class is a raw type. References to generic type Class<T> should be parameterized\n" + |
| "----------\n" + |
| "5. WARNING in X.java (at line 51)\n" + |
| " List validateTestMethods() { return null; }\n" + |
| " ^^^^\n" + |
| "List is a raw type. References to generic type List<E> should be parameterized\n" + |
| "----------\n"); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=89937 |
| public void test145() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "@interface Annot {\n" + |
| " int foo();\n" + |
| " int bar();\n" + |
| "}\n" + |
| "\n" + |
| "public class X {\n" + |
| " static final int yyy = 0;\n" + |
| " @Annot(foo=zzz, bar = yyy)\n" + |
| " static final int zzz = 0;\n" + |
| "}\n" + |
| "\n", |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 8)\n" + |
| " @Annot(foo=zzz, bar = yyy)\n" + |
| " ^^^\n" + |
| "Cannot reference a field before it is defined\n" + |
| "----------\n"); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=96631 |
| public void test146() { |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "@SuppressWarnings(value={})\n" + |
| "public class X {\n" + |
| "}\n", |
| }, |
| ""); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=96974 |
| public void test147() { |
| Map options = getCompilerOptions(); |
| options.put(CompilerOptions.OPTION_ReportNonExternalizedStringLiteral, CompilerOptions.WARNING); |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "@SuppressWarnings({\"nls\"})\n" + |
| "public class X<T> {\n" + |
| " String test= \"\";\n" + |
| "}", |
| }, |
| "", |
| null, |
| true, |
| options |
| ); |
| } |
| |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=97466 |
| public void test148() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "public class X {\n" + |
| " private static void foo() {\n" + |
| " @interface Bar {\n" + |
| " public String bar = \"BUG\";\n" + |
| " }\n" + |
| " }\n" + |
| "}", |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 3)\n" + |
| " @interface Bar {\n" + |
| " ^^^\n" + |
| "The member annotation Bar can only be defined inside a top-level class or interface or in a static context\n" + |
| "----------\n"); |
| } |
| |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=96991 |
| public void test149() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "public class X {\n" + |
| " void bar() {\n" + |
| " @Annot(foo = zzz)\n" + |
| " final int zzz = 0;\n" + |
| "\n" + |
| " @Annot(foo = kkk)\n" + |
| " int kkk = 1;\n" + |
| "\n" + |
| " }\n" + |
| " @Annot(foo = fff)\n" + |
| " final int fff = 0;\n" + |
| " \n" + |
| " @Annot(foo = Member.ttt)\n" + |
| " static class Member {\n" + |
| " final static int ttt = 2;\n" + |
| " }\n" + |
| "}\n" + |
| "@interface Annot {\n" + |
| " int foo();\n" + |
| "}\n", |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 6)\n" + |
| " @Annot(foo = kkk)\n" + |
| " ^^^\n" + |
| "The value for annotation attribute Annot.foo must be a constant expression\n" + |
| "----------\n" + |
| "2. ERROR in X.java (at line 10)\n" + |
| " @Annot(foo = fff)\n" + |
| " ^^^\n" + |
| "Cannot reference a field before it is defined\n" + |
| "----------\n"); |
| } |
| |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=98091 |
| public void test150() { |
| this.runConformTest( |
| true, |
| new String[] { |
| "X.java", |
| "@SuppressWarnings(\"assertIdentifier\")\n" + |
| "class X {}", |
| }, |
| "----------\n" + |
| "1. WARNING in X.java (at line 1)\n" + |
| " @SuppressWarnings(\"assertIdentifier\")\n" + |
| " ^^^^^^^^^^^^^^^^^^\n" + |
| "Unsupported @SuppressWarnings(\"assertIdentifier\")\n" + |
| "----------\n", |
| null, null, |
| JavacTestOptions.Excuse.EclipseHasSomeMoreWarnings); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=99009 |
| public void test151() { |
| Map options = getCompilerOptions(); |
| options.put(CompilerOptions.OPTION_ReportAutoboxing, CompilerOptions.WARNING); |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "@SuppressWarnings({\"boxing\"})\n" + |
| "public class X {\n" + |
| " static void foo(int i) {}\n" + |
| " public static void main(String[] args) {\n" + |
| " foo(Integer.valueOf(0));\n" + |
| " }\n" + |
| "}", |
| }, |
| "", |
| null, |
| true, |
| options |
| ); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=99009 |
| public void test152() { |
| Map options = getCompilerOptions(); |
| options.put(CompilerOptions.OPTION_ReportAutoboxing, CompilerOptions.WARNING); |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "@SuppressWarnings({\"boxing\"})\n" + |
| "public class X {\n" + |
| " static void foo(Integer i) {}\n" + |
| " public static void main(String[] args) {\n" + |
| " foo(0);\n" + |
| " }\n" + |
| "}", |
| }, |
| "", |
| null, |
| true, |
| options |
| ); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=99009 |
| public void test153() { |
| Map options = getCompilerOptions(); |
| options.put(CompilerOptions.OPTION_ReportIncompleteEnumSwitch, CompilerOptions.WARNING); |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "enum E { A, B, C }\n" + |
| "public class X {\n" + |
| " @SuppressWarnings({\"incomplete-switch\"})\n" + |
| " public static void main(String[] args) {\n" + |
| " for (E e : E.values()) {\n" + |
| " switch(e) {\n" + |
| " case A :\n" + |
| " System.out.println(e);\n" + |
| " break;\n" + |
| " }\n" + |
| " }\n" + |
| " }\n" + |
| "}", |
| }, |
| options |
| ); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=99009 |
| public void test154() { |
| Map options = getCompilerOptions(); |
| options.put(CompilerOptions.OPTION_ReportFieldHiding, CompilerOptions.WARNING); |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "public class X {\n" + |
| " static int i;\n" + |
| " @SuppressWarnings({\"hiding\"})\n" + |
| " public static void main(String[] args) {\n" + |
| " for (int i = 0, max = args.length; i < max; i++) {\n" + |
| " System.out.println(args[i]);\n" + |
| " }\n" + |
| " }\n" + |
| "}", |
| }, |
| "", |
| null, |
| true, |
| options |
| ); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=99009 |
| public void test155() { |
| Map options = getCompilerOptions(); |
| options.put(CompilerOptions.OPTION_ReportLocalVariableHiding, CompilerOptions.WARNING); |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "@SuppressWarnings({\"hiding\"})\n" + |
| "public class X { \n"+ |
| " { int x = \n"+ |
| " new Object() { \n"+ |
| " int foo() { \n"+ |
| " int x = 0;\n" + |
| " return x; \n"+ |
| " } \n"+ |
| " }.foo(); \n"+ |
| " } \n"+ |
| "}\n", |
| }, |
| "", |
| null, |
| true, |
| options |
| ); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=99009 |
| public void test156() { |
| Map options = getCompilerOptions(); |
| options.put(CompilerOptions.OPTION_ReportTypeParameterHiding, CompilerOptions.WARNING); |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "class T {}\n" + |
| "@SuppressWarnings({\"hiding\"})\n" + |
| "public class X<T> {\n"+ |
| "}\n", |
| }, |
| "", |
| null, |
| true, |
| options |
| ); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=99009 |
| public void test157() { |
| Runner runner = new Runner(); |
| runner.customOptions = getCompilerOptions(); |
| runner.customOptions.put(CompilerOptions.OPTION_ReportHiddenCatchBlock, CompilerOptions.WARNING); |
| runner.testFiles = |
| new String[] { |
| "X.java", |
| "public class X {\n" + |
| " @SuppressWarnings({\"hiding\"})\n" + |
| " public static void main(String[] args) {\n" + |
| " try {\n" + |
| " throw new BX();\n" + |
| " } catch(BX e) {\n" + |
| " } catch(AX e) {\n" + |
| " }\n" + |
| " }\n" + |
| "} \n" + |
| "@SuppressWarnings({\"serial\"})\n" + |
| "class AX extends Exception {}\n" + |
| "@SuppressWarnings({\"serial\"})\n" + |
| "class BX extends AX {}\n" |
| }; |
| runner.javacTestOptions = JavacTestOptions.SKIP; // javac doesn't support @SW("hiding") here, see test157b |
| runner.runConformTest(); |
| } |
| public void test157b() { |
| Runner runner = new Runner(); |
| runner.customOptions = getCompilerOptions(); |
| runner.customOptions.put(CompilerOptions.OPTION_ReportHiddenCatchBlock, CompilerOptions.WARNING); |
| runner.testFiles = |
| new String[] { |
| "X.java", |
| "public class X {\n" + |
| " public static void main(String[] args) {\n" + |
| " try {\n" + |
| " throw new BX();\n" + |
| " } catch(BX e) {\n" + |
| " } catch(AX e) {\n" + |
| " }\n" + |
| " }\n" + |
| "} \n" + |
| "@SuppressWarnings({\"serial\"})\n" + |
| "class AX extends Exception {}\n" + |
| "@SuppressWarnings({\"serial\"})\n" + |
| "class BX extends AX {}\n" |
| }; |
| runner.expectedCompilerLog = |
| "----------\n" + |
| "1. WARNING in X.java (at line 6)\n" + |
| " } catch(AX e) {\n" + |
| " ^^\n" + |
| "Unreachable catch block for AX. Only more specific exceptions are thrown and they are handled by previous catch block(s).\n" + |
| "----------\n"; |
| runner.runWarningTest(); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=99009 |
| public void test158() { |
| Map options = getCompilerOptions(); |
| options.put(CompilerOptions.OPTION_ReportFinallyBlockNotCompletingNormally, CompilerOptions.WARNING); |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "public class X {\n" + |
| " @SuppressWarnings({\"finally\"})\n" + |
| " public static void main(String[] args) {\n" + |
| " try {\n" + |
| " throw new AX();\n" + |
| " } finally {\n" + |
| " return;\n" + |
| " }\n" + |
| " }\n" + |
| "} \n" + |
| "@SuppressWarnings({\"serial\"})\n" + |
| "class AX extends Exception {}" |
| }, |
| "", |
| null, |
| true, |
| options |
| ); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=99009 |
| public void test159() { |
| Runner runner = new Runner(); |
| runner.customOptions = getCompilerOptions(); |
| runner.customOptions.put(CompilerOptions.OPTION_ReportIndirectStaticAccess, CompilerOptions.WARNING); |
| runner.testFiles = |
| new String[] { |
| "X.java", |
| "@SuppressWarnings({\"static-access\"})\n" + |
| "public class X extends XZ {\n" + |
| " \n" + |
| " void foo() {\n" + |
| " int j = X.S;\n" + |
| " int k = super.S;\n" + |
| " int l = XZ.S;\n" + |
| " int m = XY.S;\n" + |
| " \n" + |
| " bar();\n" + |
| " X.bar();\n" + |
| " XY.bar();\n" + |
| " XZ.bar();\n" + |
| " }\n" + |
| "}\n" + |
| "class XY {\n" + |
| " static int S = 10;\n" + |
| " static void bar(){}\n" + |
| "}\n" + |
| "class XZ extends XY {\n" + |
| "}" |
| }; |
| runner.javacTestOptions = JavacTestOptions.SKIP; // only testing Eclipse-specific @SW |
| runner.runConformTest(); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=99009 |
| public void test160() { |
| Runner runner = new Runner(); |
| runner.customOptions = getCompilerOptions(); |
| runner.customOptions.put(CompilerOptions.OPTION_ReportNonStaticAccessToStatic, CompilerOptions.WARNING); |
| runner.testFiles = |
| new String[] { |
| "X.java", |
| "@SuppressWarnings(\"static-access\")\n" + |
| "public class X {\n" + |
| " void foo() {\n" + |
| " int m = new XY().S;\n" + |
| " }\n" + |
| "}\n" + |
| "class XY {\n" + |
| " static int S = 10;\n" + |
| "}" |
| }; |
| runner.javacTestOptions = JavacTestOptions.SKIP; // only testing Eclipse-specific @SW |
| runner.runConformTest(); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=99009 |
| public void test161() { |
| Map options = getCompilerOptions(); |
| options.put(CompilerOptions.OPTION_ReportUnqualifiedFieldAccess, CompilerOptions.WARNING); |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "@SuppressWarnings(\"unqualified-field-access\")\n" + |
| "public class X {\n" + |
| " int i;\n" + |
| " int foo() {\n" + |
| " return i;\n" + |
| " }\n" + |
| "}" |
| }, |
| "", |
| null, |
| true, |
| options |
| ); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=99009 |
| public void test162() { |
| Map options = getCompilerOptions(); |
| options.put(CompilerOptions.OPTION_ReportUncheckedTypeOperation, CompilerOptions.WARNING); |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "@SuppressWarnings({\"unchecked\", \"rawtypes\"})\n" + |
| "public class X<T> {\n" + |
| " \n" + |
| " public static void main(String[] args) {\n" + |
| " AX ax = new AX();\n" + |
| " AX ax2 = ax.p;\n" + |
| " ax.p = new AX<String>();\n" + |
| " ax.q = new AX<String>();\n" + |
| " ax.r = new AX<Object>();\n" + |
| " System.out.println(ax2);\n" + |
| " }\n" + |
| "}\n" + |
| "\n" + |
| "class AX <P> {\n" + |
| " AX<P> p;\n" + |
| " AX<Object> q;\n" + |
| " AX<String> r;\n" + |
| " BX<String> s;\n" + |
| "}\n" + |
| "\n" + |
| "class BX<Q> {\n" + |
| "}\n", |
| }, |
| "", |
| null, |
| true, |
| options |
| ); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=99009 |
| public void test163() { |
| Map options = getCompilerOptions(); |
| options.put(CompilerOptions.OPTION_ReportUnusedImport, CompilerOptions.WARNING); |
| options.put(CompilerOptions.OPTION_ReportUnusedLocal, CompilerOptions.WARNING); |
| options.put(CompilerOptions.OPTION_ReportUnusedParameter, CompilerOptions.WARNING); |
| options.put(CompilerOptions.OPTION_ReportUnusedPrivateMember, CompilerOptions.WARNING); |
| options.put(CompilerOptions.OPTION_ReportUnusedDeclaredThrownException, CompilerOptions.WARNING); |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "import java.io.*;\n" + |
| "@SuppressWarnings(\"unused\")\n" + |
| "public class X<T> {\n" + |
| " \n" + |
| " public void foo(int i) throws java.io.IOException {\n" + |
| " int j = 0;\n" + |
| " class C {\n" + |
| " private void bar() {}\n" + |
| " }\n" + |
| " }\n" + |
| "}", |
| "Y.java", // ================= |
| "public class Y extends Zork {\n" + |
| "}\n", // ================= |
| }, |
| "----------\n" + |
| "1. ERROR in Y.java (at line 1)\n" + |
| " public class Y extends Zork {\n" + |
| " ^^^^\n" + |
| "Zork cannot be resolved to a type\n" + |
| "----------\n", |
| null, |
| true, |
| options |
| ); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=99009 |
| public void test164() { |
| String[] testFiles = new String[] { |
| "X.java", |
| "@SuppressWarnings({\"synthetic-access\", \"unused\"})\n" + |
| "public class X {\n" + |
| " private int i;\n" + |
| " private void bar() {}\n" + |
| " public void foo() {\n" + |
| " class C {\n" + |
| " private void bar() {\n" + |
| " System.out.println(i);\n" + |
| " i = 0;\n" + |
| " bar();\n" + |
| " }\n" + |
| " };\n" + |
| " new C().bar();\n" + |
| " }\n" + |
| "}" |
| }; |
| Map options = getCompilerOptions(); |
| options.put(CompilerOptions.OPTION_ReportSyntheticAccessEmulation, CompilerOptions.WARNING); |
| if (isMinimumCompliant(ClassFileConstants.JDK11)) { // no synthetic due to nestmate |
| this.runConformTest(testFiles); |
| return; |
| } |
| this.runNegativeTest( |
| testFiles, |
| "", |
| null, |
| true, |
| options |
| ); |
| } |
| |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=99009 |
| public void test165() { |
| Map options = getCompilerOptions(); |
| options.put(CompilerOptions.OPTION_ReportMissingDeprecatedAnnotation, CompilerOptions.IGNORE); |
| options.put(CompilerOptions.OPTION_ReportInvalidJavadocTagsDeprecatedRef, CompilerOptions.ENABLED); |
| options.put(CompilerOptions.OPTION_ReportDeprecationInDeprecatedCode, CompilerOptions.ENABLED); |
| options.put(CompilerOptions.OPTION_ReportDeprecation, CompilerOptions.WARNING); |
| options.put(CompilerOptions.OPTION_ReportMissingOverrideAnnotation, CompilerOptions.IGNORE); |
| options.put(CompilerOptions.OPTION_ReportInvalidJavadoc, CompilerOptions.WARNING); |
| options.put(CompilerOptions.OPTION_DocCommentSupport, CompilerOptions.ENABLED); |
| options.put(CompilerOptions.OPTION_ReportInvalidJavadocTagsVisibility, CompilerOptions.PRIVATE); |
| this.runConformTest( |
| true, |
| new String[] { |
| "X.java", |
| "/**\n" + |
| " * @see Y\n" + |
| " */\n" + |
| "@SuppressWarnings(\"deprecation\")\n" + |
| "public class X extends Y {\n" + |
| " /**\n" + |
| " * @see Y#foo()\n" + |
| " * @see Y#j\n" + |
| " */\n" + |
| " public void foo() {\n" + |
| " super.foo();\n" + |
| " }\n" + |
| "}", |
| "Y.java", |
| "/**\n" + |
| " * @deprecated\n" + |
| " */\n" + |
| "public class Y {\n" + |
| " /**\n" + |
| " * @deprecated\n" + |
| " */\n" + |
| " public void foo() {}\n" + |
| " /**\n" + |
| " * @deprecated\n" + |
| " */\n" + |
| " public int j;\n" + |
| "}" |
| }, |
| null, |
| options, |
| "", |
| null, null, |
| JavacTestOptions.SKIP /* suppressed deprecation related warnings */ |
| ); |
| } |
| |
| // check array handling of singleton |
| public void test166() throws Exception { |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "import java.lang.annotation.Retention;\n" + |
| "import java.lang.annotation.RetentionPolicy;\n" + |
| "import java.lang.annotation.Inherited;\n" + |
| "\n" + |
| "@Retention(RetentionPolicy.RUNTIME)\n" + |
| "@Inherited()\n" + |
| "@interface ParameterAnnotation {\n" + |
| " String value() default \"Default\";\n" + |
| "}\n"+ |
| "@interface ClassAnnotation {\n" + |
| " String value() default \"Default\";\n" + |
| "}\n" + |
| "\n" + |
| "enum EnumClass{\n" + |
| " Value1, Value2, Value3\n" + |
| "}\n" + |
| "\n" + |
| "@Retention(RetentionPolicy.RUNTIME)\n" + |
| "@Inherited()\n" + |
| "@interface ValueAnnotation {\n" + |
| " String value() default \"Default\";\n" + |
| " boolean booleanValue() default true;\n" + |
| " char charValue() default \'q\';\n" + |
| " byte byteValue() default 123;\n" + |
| " short shortValue() default 12345;\n" + |
| " int intValue() default 1234567890;\n" + |
| " float floatValue() default 12345.6789f;\n" + |
| " double doubleValue() default 12345.6789;\n" + |
| " long longValue() default 1234567890123456789l;\n" + |
| " String stringValue() default \"stringValue\";\n" + |
| " EnumClass enumValue() default EnumClass.Value1;\n" + |
| " Class classValue() default EnumClass.class;\n" + |
| " ClassAnnotation annotationValue() default @ClassAnnotation();\n" + |
| " boolean[] booleanArrayValue() default {true, false};\n" + |
| " char[] charArrayValue() default {\'q\', \'m\'};\n" + |
| " byte[] byteArrayValue() default {123, -123};\n" + |
| " short[] shortArrayValue() default {12345, -12345};\n" + |
| " int[] intArrayValue() default {1234567890, -1234567890};\n" + |
| " float[] floatArrayValue() default {12345.6789f, -12345.6789f};\n" + |
| " double[] doubleArrayValue() default {12345.6789, -12345.6789};\n" + |
| " long[] longArrayValue() default {1234567890123456789l, -1234567890123456789l};\n" + |
| " String[] stringArrayValue() default {\"stringValue\", \"valueString\"};\n" + |
| " EnumClass[] enumArrayValue() default {EnumClass.Value1, EnumClass.Value2};\n" + |
| " Class[] classArrayValue() default {X.class, EnumClass.class};\n" + |
| " ClassAnnotation[] annotationArrayValue() default {@ClassAnnotation(), @ClassAnnotation()};\n" + |
| "}\n" + |
| "\n" + |
| "public class X {\n" + |
| " @ValueAnnotation(\n" + |
| " value=\"ValueAnnotation\",\n" + |
| " booleanValue=true,\n" + |
| " charValue=\'m\',\n" + |
| " byteValue=-123,\n" + |
| " shortValue=-12345,\n" + |
| " intValue=-1234567890,\n" + |
| " floatValue=-12345.6789f,\n" + |
| " doubleValue=-12345.6789,\n" + |
| " longValue=-1234567890123456789l,\n" + |
| " stringValue=\"valueString\",\n" + |
| " enumValue=EnumClass.Value3,\n" + |
| " classValue=X.class,\n" + |
| " annotationValue=@ClassAnnotation(value=\"ClassAnnotation\"),\n" + |
| " booleanArrayValue={\n" + |
| " false,\n" + |
| " true\n" + |
| " },\n" + |
| " charArrayValue={\n" + |
| " \'m\',\n" + |
| " \'q\'\n" + |
| " },\n" + |
| " byteArrayValue={\n" + |
| " -123,\n" + |
| " 123\n" + |
| " },\n" + |
| " shortArrayValue={\n" + |
| " -12345,\n" + |
| " 12345\n" + |
| " },\n" + |
| " intArrayValue={\n" + |
| " -1234567890,\n" + |
| " 1234567890\n" + |
| " },\n" + |
| " floatArrayValue={\n" + |
| " -12345.6789f,\n" + |
| " 12345.6789f\n" + |
| " },\n" + |
| " doubleArrayValue={\n" + |
| " -12345.6789,\n" + |
| " 12345.6789\n" + |
| " },\n" + |
| " longArrayValue={\n" + |
| " -1234567890123456789l,\n" + |
| " 1234567890123456789l\n" + |
| " },\n" + |
| " stringArrayValue={\n" + |
| " \"valueString\",\n" + |
| " \"stringValue\"\n" + |
| " },\n" + |
| " enumArrayValue={\n" + |
| " EnumClass.Value2,\n" + |
| " EnumClass.Value1\n" + |
| " },\n" + |
| " classArrayValue={\n" + |
| " EnumClass.class,\n" + |
| " X.class\n" + |
| " },\n" + |
| " annotationArrayValue={\n" + |
| " @ClassAnnotation(value=\"ClassAnnotation1\"),\n" + |
| " @ClassAnnotation(value=\"ClassAnnotation2\")\n" + |
| " })\n" + |
| " public String field;\n" + |
| " @ValueAnnotation(\n" + |
| " value=\"ValueAnnotation\",\n" + |
| " booleanValue=true,\n" + |
| " charValue=\'m\',\n" + |
| " byteValue=-123,\n" + |
| " shortValue=-12345,\n" + |
| " intValue=-1234567890,\n" + |
| " floatValue=-12345.6789f,\n" + |
| " doubleValue=-12345.6789,\n" + |
| " longValue=-1234567890123456789l,\n" + |
| " stringValue=\"valueString\",\n" + |
| " enumValue=EnumClass.Value3,\n" + |
| " classValue=X.class,\n" + |
| " annotationValue=@ClassAnnotation(value=\"ClassAnnotation\"),\n" + |
| " booleanArrayValue={\n" + |
| " false,\n" + |
| " true\n" + |
| " },\n" + |
| " charArrayValue={\n" + |
| " \'m\',\n" + |
| " \'q\'\n" + |
| " },\n" + |
| " byteArrayValue={\n" + |
| " -123,\n" + |
| " 123\n" + |
| " },\n" + |
| " shortArrayValue={\n" + |
| " -12345,\n" + |
| " 12345\n" + |
| " },\n" + |
| " intArrayValue={\n" + |
| " -1234567890,\n" + |
| " 1234567890\n" + |
| " },\n" + |
| " floatArrayValue={\n" + |
| " -12345.6789f,\n" + |
| " 12345.6789f\n" + |
| " },\n" + |
| " doubleArrayValue={\n" + |
| " -12345.6789,\n" + |
| " 12345.6789\n" + |
| " },\n" + |
| " longArrayValue={\n" + |
| " -1234567890123456789l,\n" + |
| " 1234567890123456789l\n" + |
| " },\n" + |
| " stringArrayValue={\n" + |
| " \"valueString\",\n" + |
| " \"stringValue\"\n" + |
| " },\n" + |
| " enumArrayValue={\n" + |
| " EnumClass.Value2,\n" + |
| " EnumClass.Value1\n" + |
| " },\n" + |
| " classArrayValue={\n" + |
| " EnumClass.class,\n" + |
| " X.class\n" + |
| " },\n" + |
| " annotationArrayValue={\n" + |
| " @ClassAnnotation(value=\"ClassAnnotation1\"),\n" + |
| " @ClassAnnotation(value=\"ClassAnnotation2\")\n" + |
| " })\n" + |
| " public X(@ParameterAnnotation(value=\"ParameterAnnotation\") @Deprecated() String param1, @ParameterAnnotation(value=\"ParameterAnnotation\") String param2) {\n" + |
| " }\n" + |
| " @ValueAnnotation(\n" + |
| " value=\"ValueAnnotation\",\n" + |
| " booleanValue=true,\n" + |
| " charValue=\'m\',\n" + |
| " byteValue=-123,\n" + |
| " shortValue=-12345,\n" + |
| " intValue=-1234567890,\n" + |
| " floatValue=-12345.6789f,\n" + |
| " doubleValue=-12345.6789,\n" + |
| " longValue=-1234567890123456789l,\n" + |
| " stringValue=\"valueString\",\n" + |
| " enumValue=EnumClass.Value3,\n" + |
| " classValue=X.class,\n" + |
| " annotationValue=@ClassAnnotation(value=\"ClassAnnotation\"),\n" + |
| " booleanArrayValue={\n" + |
| " false,\n" + |
| " true\n" + |
| " },\n" + |
| " charArrayValue={\n" + |
| " \'m\',\n" + |
| " \'q\'\n" + |
| " },\n" + |
| " byteArrayValue={\n" + |
| " -123,\n" + |
| " 123\n" + |
| " },\n" + |
| " shortArrayValue={\n" + |
| " -12345,\n" + |
| " 12345\n" + |
| " },\n" + |
| " intArrayValue={\n" + |
| " -1234567890,\n" + |
| " 1234567890\n" + |
| " },\n" + |
| " floatArrayValue={\n" + |
| " -12345.6789f,\n" + |
| " 12345.6789f\n" + |
| " },\n" + |
| " doubleArrayValue={\n" + |
| " -12345.6789,\n" + |
| " 12345.6789\n" + |
| " },\n" + |
| " longArrayValue={\n" + |
| " -1234567890123456789l,\n" + |
| " 1234567890123456789l\n" + |
| " },\n" + |
| " stringArrayValue={\n" + |
| " \"valueString\",\n" + |
| " \"stringValue\"\n" + |
| " },\n" + |
| " enumArrayValue={\n" + |
| " EnumClass.Value2,\n" + |
| " EnumClass.Value1\n" + |
| " },\n" + |
| " classArrayValue={\n" + |
| " EnumClass.class,\n" + |
| " X.class\n" + |
| " },\n" + |
| " annotationArrayValue={\n" + |
| " @ClassAnnotation(value=\"ClassAnnotation1\"),\n" + |
| " @ClassAnnotation(value=\"ClassAnnotation2\")\n" + |
| " })\n" + |
| " public void method(@ParameterAnnotation(value=\"ParameterAnnotation\") @Deprecated() String param1, @ParameterAnnotation(value=\"ParameterAnnotation\") String param2){\n" + |
| " }\n" + |
| "}" |
| }, |
| ""); |
| |
| ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler(); |
| final byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(new File(OUTPUT_DIR + File.separator +"X.class")); |
| new ClassFileReader(classFileBytes, "X.java".toCharArray(), true); |
| disassembler.disassemble( |
| classFileBytes, |
| "\n", |
| ClassFileBytesDisassembler.DETAILED); |
| } |
| |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=99469 |
| public void test167() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "public class X {\n" + |
| " public foo(@Deprecated() String s) {\n" + |
| " }\n" + |
| "}\n", |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 2)\n" + |
| " public foo(@Deprecated() String s) {\n" + |
| " ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + |
| "Return type for the method is missing\n" + |
| "----------\n"); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=94759 |
| public void test168() { |
| String expectedOutput = new CompilerOptions(getCompilerOptions()).sourceLevel < ClassFileConstants.JDK1_6 |
| ? "----------\n" + |
| "1. ERROR in X.java (at line 2)\n" + |
| " @Override I clone();\n" + |
| " ^^^^^^^\n" + |
| "The method clone() of type I must override a superclass method\n" + |
| "----------\n" + |
| "2. ERROR in X.java (at line 7)\n" + |
| " @Override void foo();\n" + |
| " ^^^^^\n" + |
| "The method foo() of type J must override a superclass method\n" + |
| "----------\n" |
| : "----------\n" + |
| "1. ERROR in X.java (at line 2)\n" + |
| " @Override I clone();\n" + |
| " ^^^^^^^\n" + |
| "The method clone() of type I must override or implement a supertype method\n" + |
| "----------\n"; |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "interface I {\n" + |
| " @Override I clone();\n" + |
| " void foo();\n" + |
| "}\n" + |
| "\n" + |
| "interface J extends I {\n" + |
| " @Override void foo();\n" + |
| "}\n", |
| }, |
| expectedOutput); |
| } |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=97220 |
| public void test169() { |
| Map customOptions = getCompilerOptions(); |
| customOptions.put(CompilerOptions.OPTION_ReportNonExternalizedStringLiteral, CompilerOptions.WARNING); |
| this.runConformTest( |
| true, |
| new String[] { |
| "X.java", |
| "@SuppressWarnings(\"serial\")\n" + |
| "public class X extends Exception {\n" + |
| " String s = \"Hello\"; \n" + |
| "}" |
| }, |
| null, |
| customOptions, |
| "----------\n" + |
| "1. WARNING in X.java (at line 3)\n" + |
| " String s = \"Hello\"; \n" + |
| " ^^^^^^^\n" + |
| "Non-externalized string literal; it should be followed by //$NON-NLS-<n>$\n" + |
| "----------\n", |
| null, null, |
| JavacTestOptions.Excuse.EclipseHasSomeMoreWarnings); |
| } |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=97220 - variation |
| public void test170() { |
| Map customOptions = getCompilerOptions(); |
| customOptions.put(CompilerOptions.OPTION_ReportNonExternalizedStringLiteral, CompilerOptions.WARNING); |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "public class X extends Exception {\n" + |
| " @SuppressWarnings(\"nls\")\n" + |
| " String s = \"Hello\"; \n" + |
| "}" |
| }, |
| "", |
| null, true, null, customOptions, null); |
| } |
| |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=97220 - variation |
| public void test171() { |
| Map customOptions = getCompilerOptions(); |
| customOptions.put(CompilerOptions.OPTION_ReportNonExternalizedStringLiteral, CompilerOptions.WARNING); |
| this.runConformTest( |
| true, |
| new String[] { |
| "X.java", |
| "public class X extends Exception {\n" + |
| " @SuppressWarnings(\"nls\")\n" + |
| " String s = \"Hello\"; \n" + |
| " @SuppressWarnings(\"serial\")\n" + // no nls-warning here |
| " String s2 = \"Hello2\"; \n" + // but an nls-warning here |
| "}" |
| }, |
| null, customOptions, |
| "----------\n" + |
| "1. WARNING in X.java (at line 1)\n" + |
| " public class X extends Exception {\n" + |
| " ^\n" + |
| "The serializable class X does not declare a static final serialVersionUID field of type long\n" + |
| "----------\n" + |
| "2. WARNING in X.java (at line 4)\n" + |
| " @SuppressWarnings(\"serial\")\n" + |
| " ^^^^^^^^\n" + |
| "Unnecessary @SuppressWarnings(\"serial\")\n" + |
| "----------\n" + |
| "3. WARNING in X.java (at line 5)\n" + |
| " String s2 = \"Hello2\"; \n" + |
| " ^^^^^^^^\n" + |
| "Non-externalized string literal; it should be followed by //$NON-NLS-<n>$\n" + |
| "----------\n", |
| null, null, JavacTestOptions.SKIP); // nls-warnings are specific to Eclipse - special-casing this special case is irrelevant for javac |
| } |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=97220 - variation |
| public void test172() { |
| Map customOptions = getCompilerOptions(); |
| customOptions.put(CompilerOptions.OPTION_ReportNonExternalizedStringLiteral, CompilerOptions.WARNING); |
| this.runConformTest( |
| true, |
| new String[] { |
| "X.java", |
| "@SuppressWarnings(\"serial\")\n" + |
| "public class X extends Exception {\n" + |
| " @SuppressWarnings(\"nls\")\n" + |
| " String s = \"Hello\"; \n" + |
| " @SuppressWarnings(\"serial\")\n" + |
| " String s2 = \"Hello2\"; \n" + |
| "}" |
| }, |
| null, customOptions, |
| "----------\n" + |
| "1. WARNING in X.java (at line 5)\n" + |
| " @SuppressWarnings(\"serial\")\n" + |
| " ^^^^^^^^\n" + |
| "Unnecessary @SuppressWarnings(\"serial\")\n" + |
| "----------\n" + |
| "2. WARNING in X.java (at line 6)\n" + |
| " String s2 = \"Hello2\"; \n" + |
| " ^^^^^^^^\n" + |
| "Non-externalized string literal; it should be followed by //$NON-NLS-<n>$\n" + |
| "----------\n", |
| null, null, JavacTestOptions.Excuse.EclipseHasSomeMoreWarnings); |
| } |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=97220 - variation |
| public void test173() { |
| Map customOptions = getCompilerOptions(); |
| customOptions.put(CompilerOptions.OPTION_ReportNonExternalizedStringLiteral, CompilerOptions.WARNING); |
| this.runConformTest( |
| true, |
| new String[] { |
| "X.java", |
| "@interface Annot {\n" + |
| " String value() default \"NONE\";\n" + |
| "}\n" + |
| "@Annot(\"serial\")\n" + |
| "public class X extends Exception {\n" + |
| " @SuppressWarnings(\"nls\")\n" + |
| " String s = \"Hello\"; \n" + |
| " @SuppressWarnings(\"serial\")\n" + |
| " String s2 = \"Hello2\"; \n" + |
| "}" |
| }, |
| null, |
| customOptions, |
| "----------\n" + |
| "1. WARNING in X.java (at line 5)\n" + |
| " public class X extends Exception {\n" + |
| " ^\n" + |
| "The serializable class X does not declare a static final serialVersionUID field of type long\n" + |
| "----------\n" + |
| "2. WARNING in X.java (at line 8)\n" + |
| " @SuppressWarnings(\"serial\")\n" + |
| " ^^^^^^^^\n" + |
| "Unnecessary @SuppressWarnings(\"serial\")\n" + |
| "----------\n" + |
| "3. WARNING in X.java (at line 9)\n" + |
| " String s2 = \"Hello2\"; \n" + |
| " ^^^^^^^^\n" + |
| "Non-externalized string literal; it should be followed by //$NON-NLS-<n>$\n" + |
| "----------\n", |
| null, null, JavacTestOptions.SKIP); // nls-warnings are specific to Eclipse - special-casing this special case is irrelevant for javac |
| } |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=97220 - variation |
| public void test174() { |
| Map customOptions = getCompilerOptions(); |
| customOptions.put(CompilerOptions.OPTION_ReportNonExternalizedStringLiteral, CompilerOptions.WARNING); |
| final String source = "@interface Annot {\n" + |
| " int value() default 0;\n" + |
| "}\n" + |
| "@interface Annot2 {\n" + |
| " String value();\n" + |
| "}\n" + |
| "@Annot(value=5)\n" + |
| "public class X {\n" + |
| " @Annot2(value=\"nls\")\n" + |
| " String s = null; \n" + |
| " @SuppressWarnings(\"serial\")\n" + |
| " String s2 = \"Hello2\"; \n" + |
| "}"; |
| this.runConformTest( |
| true, |
| new String[] { |
| "X.java", |
| source |
| }, |
| null, customOptions, |
| "----------\n" + |
| "1. WARNING in X.java (at line 11)\n" + |
| " @SuppressWarnings(\"serial\")\n" + |
| " ^^^^^^^^\n" + |
| "Unnecessary @SuppressWarnings(\"serial\")\n" + |
| "----------\n" + |
| "2. WARNING in X.java (at line 12)\n" + |
| " String s2 = \"Hello2\"; \n" + |
| " ^^^^^^^^\n" + |
| "Non-externalized string literal; it should be followed by //$NON-NLS-<n>$\n" + |
| "----------\n", |
| null, null, JavacTestOptions.Excuse.EclipseHasSomeMoreWarnings); |
| } |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=97220 - variation |
| public void test175() { |
| Map customOptions = getCompilerOptions(); |
| customOptions.put(CompilerOptions.OPTION_ReportNonExternalizedStringLiteral, CompilerOptions.WARNING); |
| final String source = "@interface Annot {\n" + |
| " int value() default 0;\n" + |
| "}\n" + |
| "@interface Annot2 {\n" + |
| " String value();\n" + |
| "}\n" + |
| "@Annot(value=5)\n" + |
| "public class X {\n" + |
| " @Annot2(value=\"nls\") String s = \"value\"; \n" + |
| " @SuppressWarnings(\"serial\")\n" + |
| " String s2 = \"Hello2\"; \n" + |
| "}"; |
| this.runConformTest( |
| true, |
| new String[] { |
| "X.java", |
| source |
| }, |
| null, customOptions, |
| "----------\n" + |
| "1. WARNING in X.java (at line 9)\n" + |
| " @Annot2(value=\"nls\") String s = \"value\"; \n" + |
| " ^^^^^^^\n" + |
| "Non-externalized string literal; it should be followed by //$NON-NLS-<n>$\n" + |
| "----------\n" + |
| "2. WARNING in X.java (at line 10)\n" + |
| " @SuppressWarnings(\"serial\")\n" + |
| " ^^^^^^^^\n" + |
| "Unnecessary @SuppressWarnings(\"serial\")\n" + |
| "----------\n" + |
| "3. WARNING in X.java (at line 11)\n" + |
| " String s2 = \"Hello2\"; \n" + |
| " ^^^^^^^^\n" + |
| "Non-externalized string literal; it should be followed by //$NON-NLS-<n>$\n" + |
| "----------\n", |
| null, null, JavacTestOptions.Excuse.EclipseHasSomeMoreWarnings); |
| } |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=97220 - variation |
| public void test176() { |
| Map customOptions = getCompilerOptions(); |
| customOptions.put(CompilerOptions.OPTION_ReportNonExternalizedStringLiteral, CompilerOptions.WARNING); |
| final String source = "@interface Annot {\n" + |
| " int value() default 0;\n" + |
| "}\n" + |
| "@interface Annot2 {\n" + |
| " String value();\n" + |
| "}\n" + |
| "@Annot(value=5)\n" + |
| "public class X {\n" + |
| " @Annot2(value=\"nls\") String s = \"value\"; \n" + |
| " @SuppressWarnings({\"serial\", \"nls\"})\n" + |
| " String s2 = \"Hello2\"; \n" + |
| " @Annot(value=5) void foo() {}\n" + |
| "}"; |
| this.runConformTest( |
| true, |
| new String[] { |
| "X.java", |
| source |
| }, |
| null, customOptions, |
| "----------\n" + |
| "1. WARNING in X.java (at line 9)\n" + |
| " @Annot2(value=\"nls\") String s = \"value\"; \n" + |
| " ^^^^^^^\n" + |
| "Non-externalized string literal; it should be followed by //$NON-NLS-<n>$\n" + |
| "----------\n" + |
| "2. WARNING in X.java (at line 10)\n" + |
| " @SuppressWarnings({\"serial\", \"nls\"})\n" + |
| " ^^^^^^^^\n" + |
| "Unnecessary @SuppressWarnings(\"serial\")\n" + |
| "----------\n", |
| null, null, JavacTestOptions.Excuse.EclipseHasSomeMoreWarnings); |
| } |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=108263 |
| public void test177() { |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "public @interface X {\n" + |
| " public static final Integer foo = B.zzz; \n" + |
| " public static final int foo3 = B.zzz2; \n" + |
| "}\n" + |
| "class B {\n" + |
| " public static final Integer zzz = new Integer(0);\n" + |
| " public static final int zzz2 = 0;\n" + |
| "}\n", |
| }, |
| ""); |
| } |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=111076 |
| public void test178() { |
| runConformTest( |
| true, |
| new String[] { |
| "X.java", |
| "import java.util.*;\n" + |
| "public class X {\n" + |
| " private void testme(boolean check) {\n" + |
| " ArrayList<Integer> aList = new ArrayList<Integer>();\n" + |
| " for (@SuppressWarnings(\"unusedLocal\")\n" + |
| " Integer i : aList) {\n" + |
| " System.out.println(\"checking\");\n" + |
| " }\n" + |
| " }\n" + |
| "}\n", |
| }, |
| null, |
| "", |
| null, |
| JavacTestOptions.JavacHasABug.JavacBugFixed_6_10); |
| } |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=112433 |
| public void test179() { |
| this.runConformTest( |
| true, |
| new String[] { |
| "X.java", |
| "import static java.lang.annotation.ElementType.*;\n" + |
| "import static java.lang.annotation.RetentionPolicy.*;\n" + |
| "import java.lang.annotation.Retention;\n" + |
| "import java.lang.annotation.Target;\n" + |
| "@Target({TYPE, FIELD, METHOD,\n" + |
| " PARAMETER, CONSTRUCTOR,\n" + |
| " LOCAL_VARIABLE, PACKAGE,})\n" + |
| "@Retention(CLASS)\n" + |
| "public @interface X {}" |
| }, |
| "", |
| "", |
| null, |
| JavacTestOptions.JavacHasABug.JavacBug6337964); |
| } |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=116028 |
| public void test180() { |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "import java.lang.reflect.Field;\n" + |
| "\n" + |
| "public class X {\n" + |
| " @Deprecated public static Object x, y, z;\n" + |
| "\n" + |
| " public static void main(String[] args) {\n" + |
| " Class c = X.class;\n" + |
| " int counter = 0;\n" + |
| " for (Field f : c.getFields()) {\n" + |
| " counter += f.getDeclaredAnnotations().length;\n" + |
| " }\n" + |
| " System.out.print(counter);\n" + |
| " }\n" + |
| "}" |
| }, |
| "3"); |
| } |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=116028 |
| public void test181() { |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "import java.lang.reflect.Field;\n" + |
| "\n" + |
| "public class X {\n" + |
| " public static Object x, y, z;\n" + |
| "\n" + |
| " public static void main(String[] args) {\n" + |
| " Class c = X.class;\n" + |
| " int counter = 0;\n" + |
| " for (Field f : c.getFields()) {\n" + |
| " counter += f.getDeclaredAnnotations().length;\n" + |
| " }\n" + |
| " System.out.print(counter);\n" + |
| " }\n" + |
| "}" |
| }, |
| "0"); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=110593 |
| public void test182() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", // ================= |
| "public class X {\n" + |
| " void foo(Y y) {\n" + |
| " y.initialize(null, null, null);\n" + |
| " }\n" + |
| "}\n" + |
| "\n" + |
| "\n", // ================= |
| "Y.java", // ================= |
| "public class Y {\n" + |
| "\n" + |
| " /**\n" + |
| " * @deprecated\n" + |
| " */\n" + |
| " public void initialize(Zork z, String s) {\n" + |
| " }\n" + |
| "\n" + |
| " public void initialize(Zork z, String s, Thread t) {\n" + |
| " }\n" + |
| "}\n" + |
| "\n" + |
| "\n", // ================= |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 3)\n" + |
| " y.initialize(null, null, null);\n" + |
| " ^^^^^^^^^^\n" + |
| "The method initialize(Zork, String, Thread) from the type Y refers to the missing type Zork\n" + |
| "----------\n" + |
| "----------\n" + |
| "1. WARNING in Y.java (at line 6)\n" + |
| " public void initialize(Zork z, String s) {\n" + |
| " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + |
| "The deprecated method initialize(Zork, String) of type Y should be annotated with @Deprecated\n" + |
| "----------\n" + |
| "2. ERROR in Y.java (at line 6)\n" + |
| " public void initialize(Zork z, String s) {\n" + |
| " ^^^^\n" + |
| "Zork cannot be resolved to a type\n" + |
| "----------\n" + |
| "3. ERROR in Y.java (at line 6)\n" + |
| " public void initialize(Zork z, String s) {\n" + |
| " ^\n" + |
| "Javadoc: Missing tag for parameter z\n" + |
| "----------\n" + |
| "4. ERROR in Y.java (at line 6)\n" + |
| " public void initialize(Zork z, String s) {\n" + |
| " ^\n" + |
| "Javadoc: Missing tag for parameter s\n" + |
| "----------\n" + |
| "5. ERROR in Y.java (at line 9)\n" + |
| " public void initialize(Zork z, String s, Thread t) {\n" + |
| " ^^^^\n" + |
| "Zork cannot be resolved to a type\n" + |
| "----------\n"); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=110593 - variation |
| public void test183() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", // ================= |
| "public class X {\n" + |
| " void foo(Y y) {\n" + |
| " int i = y.initialize;\n" + |
| " }\n" + |
| "}\n" + |
| "\n", // ================= |
| "Y.java", // ================= |
| "public class Y {\n" + |
| "\n" + |
| " /**\n" + |
| " * @deprecated\n" + |
| " */\n" + |
| " public Zork initialize;\n" + |
| "}\n" + |
| "\n", // ================= |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 3)\n" + |
| " int i = y.initialize;\n" + |
| " ^^^^^^^^^^^^\n" + |
| "Zork cannot be resolved to a type\n" + |
| "----------\n" + |
| "2. WARNING in X.java (at line 3)\n" + |
| " int i = y.initialize;\n" + |
| " ^^^^^^^^^^\n" + |
| "The field Y.initialize is deprecated\n" + |
| "----------\n" + |
| "----------\n" + |
| "1. ERROR in Y.java (at line 6)\n" + |
| " public Zork initialize;\n" + |
| " ^^^^\n" + |
| "Zork cannot be resolved to a type\n" + |
| "----------\n" + |
| "2. WARNING in Y.java (at line 6)\n" + |
| " public Zork initialize;\n" + |
| " ^^^^^^^^^^\n" + |
| "The deprecated field Y.initialize should be annotated with @Deprecated\n" + |
| "----------\n"); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=110593 - variation |
| public void test184() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", // ================= |
| "public class X {\n" + |
| " void foo() {\n" + |
| " Y.initialize i;\n" + |
| " }\n" + |
| "}\n" + |
| "\n" + |
| "\n", // ================= |
| "Y.java", // ================= |
| "public class Y {\n" + |
| "\n" + |
| " /**\n" + |
| " * @deprecated\n" + |
| " */\n" + |
| " public class initialize extends Zork {\n" + |
| " }\n" + |
| "}\n" + |
| "\n" + |
| "\n", // ================= |
| }, |
| "----------\n" + |
| "1. WARNING in X.java (at line 3)\n" + |
| " Y.initialize i;\n" + |
| " ^^^^^^^^^^\n" + |
| "The type Y.initialize is deprecated\n" + |
| "----------\n" + |
| "----------\n" + |
| "1. WARNING in Y.java (at line 6)\n" + |
| " public class initialize extends Zork {\n" + |
| " ^^^^^^^^^^\n" + |
| "The deprecated type Y.initialize should be annotated with @Deprecated\n" + |
| "----------\n" + |
| "2. ERROR in Y.java (at line 6)\n" + |
| " public class initialize extends Zork {\n" + |
| " ^^^^\n" + |
| "Zork cannot be resolved to a type\n" + |
| "----------\n"); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=123522 |
| public void test185() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", // ================= |
| "import p.A;\n" + |
| "@SuppressWarnings(\"all\")\n" + |
| "public class X {\n" + |
| " void foo(A a) {\n" + |
| " Zork z;\n" + |
| " }\n" + |
| "}\n" + |
| "\n" + |
| "class Y {\n" + |
| " A a;\n" + |
| "}\n", // ================= |
| "p/A.java", // ================= |
| "package p;\n" + |
| "@Deprecated\n" + |
| "public class A {\n" + |
| "}\n", // ================= |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 5)\n" + |
| " Zork z;\n" + |
| " ^^^^\n" + |
| "Zork cannot be resolved to a type\n" + |
| "----------\n" + |
| "2. WARNING in X.java (at line 10)\n" + |
| " A a;\n" + |
| " ^\n" + |
| "The type A is deprecated\n" + |
| "----------\n"); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=124346 |
| public void test186() { |
| this.runNegativeTest( |
| new String[] { |
| "p1/X.java", // ================= |
| "package p1;\n" + |
| "public class X {\n" + |
| " @Deprecated\n" + |
| " class Y implements p2.I {\n" + |
| " Zork z;\n" + |
| " }\n" + |
| "}\n", // ================= |
| "p2/I.java", // ================= |
| "package p2;\n" + |
| "@Deprecated\n" + |
| "public interface I {\n" + |
| "}\n", // ================= |
| }, |
| "----------\n" + |
| "1. ERROR in p1\\X.java (at line 5)\n" + |
| " Zork z;\n" + |
| " ^^^^\n" + |
| "Zork cannot be resolved to a type\n" + |
| "----------\n"); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=124346 - variation |
| public void test187() { |
| this.runNegativeTest( |
| new String[] { |
| "p1/X.java", // ================= |
| "package p1;\n" + |
| "import p2.I;\n" + |
| "@Deprecated\n" + |
| "public class X {\n" + |
| " Zork z;\n" + |
| "}\n", // ================= |
| "p2/I.java", // ================= |
| "package p2;\n" + |
| "@Deprecated\n" + |
| "public interface I {\n" + |
| "}\n", // ================= |
| }, |
| "----------\n" + |
| "1. ERROR in p1\\X.java (at line 5)\n" + |
| " Zork z;\n" + |
| " ^^^^\n" + |
| "Zork cannot be resolved to a type\n" + |
| "----------\n"); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=126332 |
| public void test188() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "@interface A1 {\n" + |
| " int[] values();\n" + |
| "}\n" + |
| "@A1(values = new int[] { 1, 2 })\n" + |
| "public class X {\n" + |
| " public static void main(String[] args) {\n" + |
| " }\n" + |
| "}", |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 4)\n" + |
| " @A1(values = new int[] { 1, 2 })\n" + |
| " ^^^^^^^^^^^^^^^^^^\n" + |
| "The value for annotation attribute A1.values must be an array initializer\n" + |
| "----------\n"); |
| } |
| // partial recompile - keep a binary |
| public void test189() { |
| this.runConformTest( |
| true, |
| new String[] { |
| "A1.java", |
| "@A2(@A1(m1 = \"u\"))\n" + |
| "public @interface A1 {\n" + |
| " String m1();\n" + |
| " String m2() default \"v\";\n" + |
| "}\n", |
| "A2.java", |
| "@A2(@A1(m1 = \"u\", m2 = \"w\"))\n" + |
| "public @interface A2 {\n" + |
| " A1[] value();\n" + |
| "}\n", |
| }, |
| "", |
| "", |
| null, |
| JavacTestOptions.DEFAULT); |
| // keep A2 binary, recompile A1 with a name change |
| this.runConformTest( |
| false, // do not flush A2.class |
| new String[] { |
| "A1.java", |
| "@A2(@A1(m1 = \"u\"))\n" + |
| "public @interface A1 {\n" + |
| " String m1();\n" + |
| " String m3() default \"v\";\n" + |
| "}\n", |
| }, |
| null, |
| "", |
| null, |
| JavacTestOptions.JavacHasABug.JavacBugFixed_6_10); |
| } |
| // transitive closure on binary types does not need to include annotations |
| public void test190() { |
| this.runConformTest( |
| new String[] { |
| "A.java", |
| "public @interface A {\n" + |
| " int value();\n" + |
| "}\n" |
| }, |
| ""); |
| String binName1 = OUTPUT_DIR + File.separator + "bin1"; |
| File bin1 = new File(binName1); |
| bin1.mkdir(); |
| String [] javaClassLibs = Util.getJavaClassLibs(); |
| int javaClassLibsLength; |
| String [] xClassLibs = new String[(javaClassLibsLength = javaClassLibs.length) + 2]; |
| System.arraycopy(javaClassLibs, 0, xClassLibs, 0, javaClassLibsLength); |
| xClassLibs[javaClassLibsLength] = OUTPUT_DIR; |
| xClassLibs[javaClassLibsLength + 1] = binName1; |
| (new File(OUTPUT_DIR + File.separator + "A.class")).renameTo(new File(binName1 + File.separator + "A.class")); |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "public class X {\n" + |
| " @A(0)\n" + |
| " void foo() {\n" + |
| " System.out.println(\"SUCCESS\");\n" + |
| " }\n" + |
| " public static void main(String args[]) {\n" + |
| " new X().foo();\n" + |
| " }\n" + |
| "}", |
| }, |
| "SUCCESS", |
| xClassLibs, |
| false, // do not flush |
| null); |
| String binName2 = OUTPUT_DIR + File.separator + "bin2"; |
| File bin2 = new File(binName2); |
| bin2.mkdir(); |
| (new File(OUTPUT_DIR + File.separator + "X.class")).renameTo(new File(binName2 + File.separator + "X.class")); |
| String [] yClassLibs = new String[javaClassLibsLength + 2]; |
| System.arraycopy(javaClassLibs, 0, yClassLibs, 0, javaClassLibsLength); |
| yClassLibs[javaClassLibsLength] = OUTPUT_DIR; |
| yClassLibs[javaClassLibsLength + 1] = binName2; |
| // Y compiles despite the fact that A is not on the classpath |
| this.runConformTest( |
| new String[] { |
| "Y.java", |
| "public class Y {\n" + |
| " public static void main(String args[]) {\n" + |
| " new X().foo();\n" + |
| " }\n" + |
| "}", |
| }, |
| "SUCCESS", |
| yClassLibs, |
| false, // do not flush |
| null); |
| } |
| |
| // transitive closure on binary types does not need to include annotations - variant |
| public void test191() { |
| this.runConformTest( |
| new String[] { |
| "A.java", |
| "@java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME)\n" + |
| "public @interface A {\n" + |
| " int value();\n" + |
| "}\n" |
| }, |
| ""); |
| String binName1 = OUTPUT_DIR + File.separator + "bin1"; |
| File bin1 = new File(binName1); |
| bin1.mkdir(); |
| String [] javaClassLibs = Util.getJavaClassLibs(); |
| int javaClassLibsLength; |
| String [] xClassLibs = new String[(javaClassLibsLength = javaClassLibs.length) + 2]; |
| System.arraycopy(javaClassLibs, 0, xClassLibs, 0, javaClassLibsLength); |
| xClassLibs[javaClassLibsLength] = OUTPUT_DIR; |
| xClassLibs[javaClassLibsLength + 1] = binName1; |
| (new File(OUTPUT_DIR + File.separator + "A.class")).renameTo(new File(binName1 + File.separator + "A.class")); |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "public class X {\n" + |
| " @A(0)\n" + |
| " void foo() {\n" + |
| " System.out.println(\"SUCCESS\");\n" + |
| " }\n" + |
| " public static void main(String args[]) {\n" + |
| " new X().foo();\n" + |
| " }\n" + |
| "}", |
| }, |
| "SUCCESS", |
| xClassLibs, |
| false, // do not flush |
| null); |
| String binName2 = OUTPUT_DIR + File.separator + "bin2"; |
| File bin2 = new File(binName2); |
| bin2.mkdir(); |
| (new File(OUTPUT_DIR + File.separator + "X.class")).renameTo(new File(binName2 + File.separator + "X.class")); |
| String [] yClassLibs = new String[javaClassLibsLength + 2]; |
| System.arraycopy(javaClassLibs, 0, yClassLibs, 0, javaClassLibsLength); |
| yClassLibs[javaClassLibsLength] = OUTPUT_DIR; |
| yClassLibs[javaClassLibsLength + 1] = binName2; |
| // Y compiles despite the fact that A is not on the classpath |
| this.runConformTest( |
| new String[] { |
| "Y.java", |
| "public class Y {\n" + |
| " public static void main(String args[]) {\n" + |
| " new X().foo();\n" + |
| " }\n" + |
| "}", |
| }, |
| "SUCCESS", |
| yClassLibs, |
| false, // do not flush |
| null); |
| } |
| |
| public void test192() { |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "public class X {\n" + |
| " @ATest(groups={\"a\",\"b\"})\n" + |
| " void foo(){\n" + |
| " }\n" + |
| " @ATest(groups=\"c\")\n" + |
| " void bar(){\n" + |
| " }\n" + |
| "}\n" + |
| "@interface ATest {\n" + |
| " String[] groups();\n" + |
| "}\n" |
| }, |
| ""); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=102160 |
| public void test193() { |
| this.runNegativeTest( |
| new String[] { |
| "A.java", |
| "public @interface A {\n" + |
| " A circular1();\n" + |
| "}\n" + |
| "@interface B {\n" + |
| " A circular2();\n" + |
| "}" |
| }, |
| "----------\n" + |
| "1. ERROR in A.java (at line 2)\n" + |
| " A circular1();\n" + |
| " ^\n" + |
| "Cycle detected: the annotation type A cannot contain attributes of the annotation type itself\n" + |
| "----------\n" |
| ); |
| this.runNegativeTest( |
| new String[] { |
| "A.java", |
| "public @interface A {\n" + |
| " B circular2();\n" + |
| " A circular1();\n" + |
| "}\n" + |
| "@interface B {\n" + |
| " A circular();\n" + |
| "}" |
| }, |
| "----------\n" + |
| "1. ERROR in A.java (at line 2)\n" + |
| " B circular2();\n" + |
| " ^\n" + |
| "Cycle detected: a cycle exists between annotation attributes of A and B\n" + |
| "----------\n" + |
| "2. ERROR in A.java (at line 3)\n" + |
| " A circular1();\n" + |
| " ^\n" + |
| "Cycle detected: the annotation type A cannot contain attributes of the annotation type itself\n" + |
| "----------\n" + |
| "3. ERROR in A.java (at line 6)\n" + |
| " A circular();\n" + |
| " ^\n" + |
| "Cycle detected: a cycle exists between annotation attributes of B and A\n" + |
| "----------\n" |
| ); |
| this.runNegativeTest( |
| new String[] { |
| "A.java", |
| "public @interface A {\n" + |
| " A circular1();\n" + |
| " B circular2();\n" + |
| "}\n" + |
| "@interface B {\n" + |
| " A circular();\n" + |
| "}" |
| }, |
| "----------\n" + |
| "1. ERROR in A.java (at line 2)\n" + |
| " A circular1();\n" + |
| " ^\n" + |
| "Cycle detected: the annotation type A cannot contain attributes of the annotation type itself\n" + |
| "----------\n" + |
| "2. ERROR in A.java (at line 3)\n" + |
| " B circular2();\n" + |
| " ^\n" + |
| "Cycle detected: a cycle exists between annotation attributes of A and B\n" + |
| "----------\n" + |
| "3. ERROR in A.java (at line 6)\n" + |
| " A circular();\n" + |
| " ^\n" + |
| "Cycle detected: a cycle exists between annotation attributes of B and A\n" + |
| "----------\n" |
| ); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=130017 |
| public void test194() { |
| String expectedOutput = new CompilerOptions(getCompilerOptions()).sourceLevel < ClassFileConstants.JDK1_6 |
| ? "----------\n" + |
| "1. ERROR in X.java (at line 5)\n" + |
| " @Override\n" + |
| " ^^^^^^^^^\n" + |
| "The annotation @Override is disallowed for this location\n" + |
| "----------\n" + |
| "2. ERROR in X.java (at line 9)\n" + |
| " public static void foo() {}\n" + |
| " ^^^^^\n" + |
| "The method foo() of type X must override a superclass method\n" + |
| "----------\n" |
| : "----------\n" + |
| "1. ERROR in X.java (at line 5)\n" + |
| " @Override\n" + |
| " ^^^^^^^^^\n" + |
| "The annotation @Override is disallowed for this location\n" + |
| "----------\n" + |
| "2. ERROR in X.java (at line 9)\n" + |
| " public static void foo() {}\n" + |
| " ^^^^^\n" + |
| "The method foo() of type X must override or implement a supertype method\n" + |
| "----------\n"; |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "class Base {\n" + |
| " public static void foo() {}\n" + |
| "}\n" + |
| "public class X extends Base {\n" + |
| " @Override\n" + |
| " X(){}\n" + |
| " \n" + |
| " @Override\n" + |
| " public static void foo() {}\n" + |
| "}\n" |
| }, |
| expectedOutput); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=130516 |
| public void test195() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "public class X {\n" + |
| " @SuppressWarnings(\"cast\")\n" + |
| " void foo() {\n" + |
| " String s = (String) \"hello\";\n" + |
| " }\n" + |
| " void bar() {\n" + |
| " String s = (String) \"hello\";\n" + |
| " }\n" + |
| " Zork z;\n" + |
| "}\n" |
| }, |
| "----------\n" + |
| "1. WARNING in X.java (at line 7)\n" + |
| " String s = (String) \"hello\";\n" + |
| " ^^^^^^^^^^^^^^^^\n" + |
| "Unnecessary cast from String to String\n" + |
| "----------\n" + |
| "2. ERROR in X.java (at line 9)\n" + |
| " Zork z;\n" + |
| " ^^^^\n" + |
| "Zork cannot be resolved to a type\n" + |
| "----------\n"); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=133440 |
| public void test196() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "public @interface X {\n" + |
| " enum MyEnum {\n" + |
| " VAL_1, VAL_2\n" + |
| " }\n" + |
| " public MyEnum theValue() default null;\n" + |
| "}" |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 5)\n" + |
| " public MyEnum theValue() default null;\n" + |
| " ^^^^\n" + |
| "The value for annotation attribute X.theValue must be an enum constant expression\n" + |
| "----------\n"); |
| } |
| // no override between package private methods |
| public void test197() { |
| String expectedOutput = new CompilerOptions(getCompilerOptions()).sourceLevel < ClassFileConstants.JDK1_6 |
| ? "----------\n" + |
| "1. WARNING in p\\X.java (at line 4)\n" + |
| " void foo() {\n" + |
| " ^^^^^\n" + |
| "The method X.foo() does not override the inherited method from OldStuff since it is private to a different package\n" + |
| "----------\n" + |
| "2. ERROR in p\\X.java (at line 4)\n" + |
| " void foo() {\n" + |
| " ^^^^^\n" + |
| "The method foo() of type X must override a superclass method\n" + |
| "----------\n" |
| : "----------\n" + |
| "1. WARNING in p\\X.java (at line 4)\n" + |
| " void foo() {\n" + |
| " ^^^^^\n" + |
| "The method X.foo() does not override the inherited method from OldStuff since it is private to a different package\n" + |
| "----------\n" + |
| "2. ERROR in p\\X.java (at line 4)\n" + |
| " void foo() {\n" + |
| " ^^^^^\n" + |
| "The method foo() of type X must override or implement a supertype method\n" + |
| "----------\n"; |
| this.runNegativeTest( |
| new String[] { |
| "p/X.java", |
| "package p;\n" + |
| "public class X extends q.OldStuff {\n" + |
| " @Override\n" + |
| " void foo() {\n" + |
| " }\n" + |
| "}\n", |
| "q/OldStuff.java", |
| "package q;\n" + |
| "public class OldStuff {\n" + |
| " void foo() {\n" + |
| " } \n" + |
| "}\n", |
| }, |
| expectedOutput); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=134129 |
| public void test198() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "@interface Anno {\n" + |
| " boolean b() default false;\n" + |
| " String[] c() default \"\";\n" + |
| "}\n" + |
| "@Anno(b = {})\n" + |
| "public class X {\n" + |
| " @Anno(c = { 0 })\n" + |
| " void foo(){}\n" + |
| "}\n", |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 5)\n" + |
| " @Anno(b = {})\n" + |
| " ^^\n" + |
| "Type mismatch: cannot convert from Object[] to boolean\n" + |
| "----------\n" + |
| "2. ERROR in X.java (at line 7)\n" + |
| " @Anno(c = { 0 })\n" + |
| " ^\n" + |
| "Type mismatch: cannot convert from int to String\n" + |
| "----------\n"); |
| } |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=138443 |
| public void test199() { |
| this.runConformTest( |
| true, |
| new String[] { |
| "X.java", |
| "@interface AttributeOverrides {\n" + |
| " AttributeOverride[] value();\n" + |
| "}\n" + |
| "@interface AttributeOverride {\n" + |
| " String name();\n" + |
| " Column column();\n" + |
| "}\n" + |
| "@interface Column {\n" + |
| " String name();\n" + |
| "}\n" + |
| "@AttributeOverrides({\n" + |
| " @AttributeOverride( name=\"city\", column=@Column( name=\"DIAB99C_TXCTY\" )),\n" + |
| " @AttributeOverride( name=\"state\", column=@Column( name=\"DIAB99C_TXSTAT\" )),\n" + |
| " @AttributeOverride( name=\"zipCode\", column=@Column( name=\"DIAB99C_TXZIP\")),\n" + |
| "}) public class X {}" |
| }, |
| "", |
| "", |
| null, |
| JavacTestOptions.JavacHasABug.JavacBug6337964); |
| } |
| // JLS 3 - 9.6: cannot override Object's methods |
| public void test200() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "@interface X {\n" + |
| " int clone();\n" + |
| " String finalize();\n" + |
| " boolean getClass();\n" + |
| " long notify();\n" + |
| " double notifyAll();\n" + |
| " float wait();\n" + |
| "}\n", |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 2)\n" + |
| " int clone();\n" + |
| " ^^^^^^^\n" + |
| "The annotation type X cannot override the method Object.clone()\n" + |
| "----------\n" + |
| "2. ERROR in X.java (at line 3)\n" + |
| " String finalize();\n" + |
| " ^^^^^^^^^^\n" + |
| "The annotation type X cannot override the method Object.finalize()\n" + |
| "----------\n" + |
| "3. ERROR in X.java (at line 4)\n" + |
| " boolean getClass();\n" + |
| " ^^^^^^^^^^\n" + |
| "The annotation type X cannot override the method Object.getClass()\n" + |
| "----------\n" + |
| "4. ERROR in X.java (at line 5)\n" + |
| " long notify();\n" + |
| " ^^^^^^^^\n" + |
| "The annotation type X cannot override the method Object.notify()\n" + |
| "----------\n" + |
| "5. ERROR in X.java (at line 6)\n" + |
| " double notifyAll();\n" + |
| " ^^^^^^^^^^^\n" + |
| "The annotation type X cannot override the method Object.notifyAll()\n" + |
| "----------\n" + |
| "6. ERROR in X.java (at line 7)\n" + |
| " float wait();\n" + |
| " ^^^^^^\n" + |
| "The annotation type X cannot override the method Object.wait()\n" + |
| "----------\n"); |
| } |
| //JLS 3 - 9.6: cannot override Annotation's methods |
| public void test201() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "@interface X {\n" + |
| " char hashCode();\n" + |
| " int annotationType();\n" + |
| " Class toString();\n" + |
| "}\n", |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 2)\n" + |
| " char hashCode();\n" + |
| " ^^^^^^^^^^\n" + |
| "The annotation type X cannot override the method Annotation.hashCode()\n" + |
| "----------\n" + |
| "2. ERROR in X.java (at line 3)\n" + |
| " int annotationType();\n" + |
| " ^^^^^^^^^^^^^^^^\n" + |
| "The annotation type X cannot override the method Annotation.annotationType()\n" + |
| "----------\n" + |
| "3. WARNING in X.java (at line 4)\n" + |
| " Class toString();\n" + |
| " ^^^^^\n" + |
| "Class is a raw type. References to generic type Class<T> should be parameterized\n" + |
| "----------\n" + |
| "4. ERROR in X.java (at line 4)\n" + |
| " Class toString();\n" + |
| " ^^^^^^^^^^\n" + |
| "The annotation type X cannot override the method Annotation.toString()\n" + |
| "----------\n"); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=143259 |
| public void test202() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| " public class X {\n" + |
| " @Ann(m=Object)\n" + |
| " private int foo;\n" + |
| " private NonExisting bar;\n" + |
| " }\n" + |
| " @interface Ann {\n" + |
| " String m();\n" + |
| " }\n", |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 2)\n" + |
| " @Ann(m=Object)\n" + |
| " ^^^^^^\n" + |
| "Object cannot be resolved to a variable\n" + |
| "----------\n" + |
| "2. ERROR in X.java (at line 4)\n" + |
| " private NonExisting bar;\n" + |
| " ^^^^^^^^^^^\n" + |
| "NonExisting cannot be resolved to a type\n" + |
| "----------\n"); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=143259 - variation |
| public void test203() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "public class X {\n" + |
| " @Ann(m=Object())\n" + |
| " private void foo(){}\n" + |
| " private NonExisting bar(){}\n" + |
| "}\n" + |
| "@interface Ann {\n" + |
| " String m();\n" + |
| "}\n", |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 2)\n" + |
| " @Ann(m=Object())\n" + |
| " ^^^^^^\n" + |
| "The method Object() is undefined for the type X\n" + |
| "----------\n" + |
| "2. ERROR in X.java (at line 4)\n" + |
| " private NonExisting bar(){}\n" + |
| " ^^^^^^^^^^^\n" + |
| "NonExisting cannot be resolved to a type\n" + |
| "----------\n"); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=143259 - variation |
| public void test204() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "public class X {\n" + |
| " @Ann(m=bar(null))\n" + |
| " private void foo(){}\n" + |
| " private NonExisting bar(NonExisting ne){}\n" + |
| "}\n" + |
| "@interface Ann {\n" + |
| " String m();\n" + |
| "}\n", |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 2)\n" + |
| " @Ann(m=bar(null))\n" + |
| " ^^^\n" + |
| "The method bar(NonExisting) from the type X refers to the missing type NonExisting\n" + |
| "----------\n" + |
| "2. ERROR in X.java (at line 4)\n" + |
| " private NonExisting bar(NonExisting ne){}\n" + |
| " ^^^^^^^^^^^\n" + |
| "NonExisting cannot be resolved to a type\n" + |
| "----------\n" + |
| "3. ERROR in X.java (at line 4)\n" + |
| " private NonExisting bar(NonExisting ne){}\n" + |
| " ^^^^^^^^^^^\n" + |
| "NonExisting cannot be resolved to a type\n" + |
| "----------\n"); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=143259 - variation |
| public void test205() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "public class X {\n" + |
| " @Ann(m=foo())\n" + |
| " private void foo(){}\n" + |
| " private NonExisting bar(NonExisting ne){}\n" + |
| "}\n" + |
| "@interface Ann {\n" + |
| " String m();\n" + |
| "}\n", |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 2)\n" + |
| " @Ann(m=foo())\n" + |
| " ^^^^^\n" + |
| "Type mismatch: cannot convert from void to String\n" + |
| "----------\n" + |
| "2. ERROR in X.java (at line 4)\n" + |
| " private NonExisting bar(NonExisting ne){}\n" + |
| " ^^^^^^^^^^^\n" + |
| "NonExisting cannot be resolved to a type\n" + |
| "----------\n" + |
| "3. ERROR in X.java (at line 4)\n" + |
| " private NonExisting bar(NonExisting ne){}\n" + |
| " ^^^^^^^^^^^\n" + |
| "NonExisting cannot be resolved to a type\n" + |
| "----------\n"); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=143259 - variation |
| public void test206() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "public class X {\n" + |
| " @Ann(m=bar())\n" + |
| " private void foo(){}\n" + |
| " private NonExisting bar(){}\n" + |
| "}\n" + |
| "@interface Ann {\n" + |
| " String m();\n" + |
| "}\n", |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 2)\n" + |
| " @Ann(m=bar())\n" + |
| " ^^^\n" + |
| "The method bar() from the type X refers to the missing type NonExisting\n" + |
| "----------\n" + |
| "2. ERROR in X.java (at line 4)\n" + |
| " private NonExisting bar(){}\n" + |
| " ^^^^^^^^^^^\n" + |
| "NonExisting cannot be resolved to a type\n" + |
| "----------\n"); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=143259 - variation |
| public void test207() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| " public class X {\n" + |
| "@Ann(m=foo)\n" + |
| " private NonExisting foo;\n" + |
| " private NonExisting bar;\n" + |
| " }\n" + |
| " @interface Ann {\n" + |
| " String m();\n" + |
| " }\n", |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 2)\n" + |
| " @Ann(m=foo)\n" + |
| " ^^^\n" + |
| "Cannot reference a field before it is defined\n" + |
| "----------\n" + |
| "2. ERROR in X.java (at line 2)\n" + |
| " @Ann(m=foo)\n" + |
| " ^^^\n" + |
| "NonExisting cannot be resolved to a type\n" + |
| "----------\n" + |
| "3. ERROR in X.java (at line 3)\n" + |
| " private NonExisting foo;\n" + |
| " ^^^^^^^^^^^\n" + |
| "NonExisting cannot be resolved to a type\n" + |
| "----------\n" + |
| "4. ERROR in X.java (at line 4)\n" + |
| " private NonExisting bar;\n" + |
| " ^^^^^^^^^^^\n" + |
| "NonExisting cannot be resolved to a type\n" + |
| "----------\n"); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=149751 |
| public void test208() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "import java.lang.annotation.Retention;\n" + |
| "import static java.lang.annotation.RetentionPolicy.RUNTIME;\n" + |
| "@Retention(RUNTIME) @interface MyAnnotation {\n" + |
| " public MyEnum value();\n" + |
| "}\n" + |
| "enum MyEnum {\n" + |
| " ONE, TWO, THREE\n" + |
| "}\n" + |
| "@MyAnnotation(X.FOO) class MyClass {\n" + |
| "}\n" + |
| "public class X {\n" + |
| " public static final MyEnum FOO = MyEnum.TWO;\n" + |
| " public static void main(String[] args) {\n" + |
| " MyAnnotation annotation =\n" + |
| " MyClass.class.getAnnotation(MyAnnotation.class);\n" + |
| " System.out.println(annotation.value().toString());\n" + |
| " }\n" + |
| "}", |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 9)\n" + |
| " @MyAnnotation(X.FOO) class MyClass {\n" + |
| " ^^^^^\n" + |
| "The value for annotation attribute MyAnnotation.value must be an enum constant expression\n" + |
| "----------\n"); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=149751 |
| public void test209() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "import java.lang.annotation.Retention;\n" + |
| "import static java.lang.annotation.RetentionPolicy.RUNTIME;\n" + |
| "@Retention(RUNTIME) @interface MyAnnotation {\n" + |
| " public MyEnum value();\n" + |
| "}\n" + |
| "enum MyEnum {\n" + |
| " ONE, TWO, THREE\n" + |
| "}\n" + |
| "@MyAnnotation(value=X.FOO) class MyClass {\n" + |
| "}\n" + |
| "public class X {\n" + |
| " public static final MyEnum FOO = MyEnum.TWO;\n" + |
| " public static void main(String[] args) {\n" + |
| " MyAnnotation annotation =\n" + |
| " MyClass.class.getAnnotation(MyAnnotation.class);\n" + |
| " System.out.println(annotation.value().toString());\n" + |
| " }\n" + |
| "}", |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 9)\n" + |
| " @MyAnnotation(value=X.FOO) class MyClass {\n" + |
| " ^^^^^\n" + |
| "The value for annotation attribute MyAnnotation.value must be an enum constant expression\n" + |
| "----------\n"); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=149751 |
| public void test210() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "import java.lang.annotation.Retention;\n" + |
| "import static java.lang.annotation.RetentionPolicy.RUNTIME;\n" + |
| "@Retention(RUNTIME) @interface MyAnnotation {\n" + |
| " public MyEnum[] value();\n" + |
| "}\n" + |
| "enum MyEnum {\n" + |
| " ONE, TWO, THREE\n" + |
| "}\n" + |
| "@MyAnnotation(value= { X.FOO }) class MyClass {\n" + |
| "}\n" + |
| "public class X {\n" + |
| " public static final MyEnum FOO = MyEnum.TWO;\n" + |
| " public static void main(String[] args) {\n" + |
| " MyAnnotation annotation =\n" + |
| " MyClass.class.getAnnotation(MyAnnotation.class);\n" + |
| " System.out.println(annotation.value().toString());\n" + |
| " }\n" + |
| "}", |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 9)\n" + |
| " @MyAnnotation(value= { X.FOO }) class MyClass {\n" + |
| " ^^^^^\n" + |
| "The value for annotation attribute MyAnnotation.value must be an enum constant expression\n" + |
| "----------\n"); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=149751 |
| public void test211() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "import java.lang.annotation.Retention;\n" + |
| "import static java.lang.annotation.RetentionPolicy.RUNTIME;\n" + |
| "@Retention(RUNTIME) @interface MyAnnotation {\n" + |
| " public MyEnum[] value();\n" + |
| "}\n" + |
| "enum MyEnum {\n" + |
| " ONE, TWO, THREE\n" + |
| "}\n" + |
| "@MyAnnotation(value= { null }) class MyClass {\n" + |
| "}\n" + |
| "public class X {\n" + |
| " public static final MyEnum FOO = MyEnum.TWO;\n" + |
| " public static void main(String[] args) {\n" + |
| " MyAnnotation annotation =\n" + |
| " MyClass.class.getAnnotation(MyAnnotation.class);\n" + |
| " System.out.println(annotation.value().toString());\n" + |
| " }\n" + |
| "}", |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 9)\n" + |
| " @MyAnnotation(value= { null }) class MyClass {\n" + |
| " ^^^^\n" + |
| "The value for annotation attribute MyAnnotation.value must be an enum constant expression\n" + |
| "----------\n"); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=156891 |
| public void test212() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "import java.lang.annotation.Retention;\n" + |
| "import static java.lang.annotation.RetentionPolicy.RUNTIME;\n" + |
| "@Retention(RUNTIME) @interface MyAnnotation {\n" + |
| " public MyEnum[] values();\n" + |
| "}\n" + |
| "enum MyEnum {\n" + |
| " ONE, TWO, THREE\n" + |
| "}\n" + |
| "public class X {\n" + |
| "\n" + |
| " private static final MyEnum[] myValues = { MyEnum.ONE, MyEnum.TWO };\n" + |
| " @MyAnnotation(values=myValues) \n" + |
| " public void dothetrick(){} \n" + |
| "\n" + |
| " public static void main(String[] args)throws Exception {\n" + |
| " MyAnnotation sluck = X.class.getMethod(\"dothetrick\", new Class[0]).getAnnotation(MyAnnotation.class);\n" + |
| " System.out.println(sluck.values().length);\n" + |
| " }\n" + |
| "}", |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 12)\n" + |
| " @MyAnnotation(values=myValues) \n" + |
| " ^^^^^^^^\n" + |
| "The value for annotation attribute MyAnnotation.values must be an array initializer\n" + |
| "----------\n"); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=156891 |
| public void test213() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "import java.lang.annotation.Retention;\n" + |
| "import static java.lang.annotation.RetentionPolicy.RUNTIME;\n" + |
| "@Retention(RUNTIME) @interface MyAnnotation {\n" + |
| " public int[] values();\n" + |
| "}\n" + |
| "public class X {\n" + |
| "\n" + |
| " private static final int[] myValues = { 1, 2, 3 };\n" + |
| " @MyAnnotation(values=myValues) \n" + |
| " public void dothetrick(){} \n" + |
| "\n" + |
| " public static void main(String[] args)throws Exception {\n" + |
| " MyAnnotation sluck = X.class.getMethod(\"dothetrick\", new Class[0]).getAnnotation(MyAnnotation.class);\n" + |
| " System.out.println(sluck.values().length);\n" + |
| " }\n" + |
| "}", |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 9)\n" + |
| " @MyAnnotation(values=myValues) \n" + |
| " ^^^^^^^^\n" + |
| "The value for annotation attribute MyAnnotation.values must be an array initializer\n" + |
| "----------\n"); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=141931 |
| public void test214() { |
| Map customOptions = getCompilerOptions(); |
| customOptions.put( |
| CompilerOptions.OPTION_ReportMissingOverrideAnnotation, |
| CompilerOptions.ERROR); |
| customOptions.put( |
| CompilerOptions.OPTION_ReportMissingOverrideAnnotationForInterfaceMethodImplementation, |
| CompilerOptions.DISABLED); |
| |
| String expectedOutput = new CompilerOptions(getCompilerOptions()).sourceLevel < ClassFileConstants.JDK1_6 |
| ? "----------\n" + |
| "1. ERROR in X.java (at line 3)\n" + |
| " void foo();\n" + |
| " ^^^^^\n" + |
| "The method foo() of type I must override a superclass method\n" + |
| "----------\n" + |
| "2. ERROR in X.java (at line 8)\n" + |
| " public void foo() {}\n" + |
| " ^^^^^\n" + |
| "The method foo() of type X must override a superclass method\n" + |
| "----------\n" + |
| "3. ERROR in X.java (at line 13)\n" + |
| " void foo();\n" + |
| " ^^^^^\n" + |
| "The method foo() of type J must override a superclass method\n" + |
| "----------\n" |
| : "----------\n" + |
| "1. ERROR in X.java (at line 3)\n" + |
| " void foo();\n" + |
| " ^^^^^\n" + |
| "The method foo() of type I must override or implement a supertype method\n" + |
| "----------\n"; |
| this.runNegativeTest( |
| true, |
| new String[] { |
| "X.java", |
| "interface I {\n" + |
| " @Override\n" + |
| " void foo();\n" + |
| " void bar();\n" + |
| "}\n" + |
| "public class X implements I {\n" + |
| " @Override\n" + |
| " public void foo() {}\n" + |
| " public void bar() {}\n" + |
| "}\n" + |
| "interface J extends I {\n" + |
| " @Override\n" + |
| " void foo();\n" + |
| "}\n", |
| }, |
| null, |
| customOptions, |
| expectedOutput, |
| JavacTestOptions.SKIP); |
| } |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=141931 |
| // variant |
| public void test215() { |
| String sources[] = new String[] { |
| "I.java", |
| "public interface I {\n" + |
| " void foo();\n" + |
| "}\n", |
| "X.java", |
| "abstract class X implements I {\n" + |
| "}\n", |
| "Y.java", |
| "class Y extends X {\n" + |
| " @Override\n" + |
| " public void foo() {}\n" + |
| "}\n"}; |
| if (new CompilerOptions(getCompilerOptions()).sourceLevel < ClassFileConstants.JDK1_6) { |
| this.runNegativeTest(sources, |
| "----------\n" + |
| "1. ERROR in Y.java (at line 3)\n" + |
| " public void foo() {}\n" + |
| " ^^^^^\n" + |
| "The method foo() of type Y must override a superclass method\n" + |
| "----------\n"); |
| } else { |
| this.runConformTest(sources, |
| ""); |
| } |
| } |
| // extending java.lang.annotation.Annotation |
| public void test216() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "import java.lang.annotation.Annotation;\n" + |
| "public class X {\n" + |
| " void bar(MyConstructor constructor, Class<Ann> ann) {\n" + |
| " constructor.getAnnotation(ann).message();\n" + |
| " }\n" + |
| "}\n" + |
| "@interface Ann {\n" + |
| " String message();\n" + |
| "}\n" + |
| "class MyConstructor<V> {\n" + |
| " public <T extends Annotation> T getAnnotation(Class<T> c) { return null; }\n" + |
| "}\n", |
| }, |
| "----------\n" + |
| "1. WARNING in X.java (at line 3)\n" + |
| " void bar(MyConstructor constructor, Class<Ann> ann) {\n" + |
| " ^^^^^^^^^^^^^\n" + |
| "MyConstructor is a raw type. References to generic type MyConstructor<V> should be parameterized\n" + |
| "----------\n" + |
| "2. WARNING in X.java (at line 4)\n" + |
| " constructor.getAnnotation(ann).message();\n" + |
| " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + |
| "Type safety: The method getAnnotation(Class) belongs to the raw type MyConstructor. References to generic type MyConstructor<V> should be parameterized\n" + |
| "----------\n" + |
| "3. ERROR in X.java (at line 4)\n" + |
| " constructor.getAnnotation(ann).message();\n" + |
| " ^^^^^^^\n" + |
| "The method message() is undefined for the type Annotation\n" + |
| "----------\n"); |
| } |
| // extending java.lang.annotation.Annotation |
| public void test217() { |
| Map customOptions = getCompilerOptions(); |
| customOptions.put( |
| CompilerOptions.OPTION_ReportMissingOverrideAnnotation, |
| CompilerOptions.ERROR); |
| customOptions.put( |
| CompilerOptions.OPTION_ReportMissingOverrideAnnotationForInterfaceMethodImplementation, |
| CompilerOptions.DISABLED); |
| String expectedOutput = |
| "----------\n" + |
| "1. WARNING in X.java (at line 3)\n" + |
| " void bar(MyConstructor constructor, Class<Ann> ann) {\n" + |
| " ^^^^^^^^^^^^^\n" + |
| "MyConstructor is a raw type. References to generic type MyConstructor<V> should be parameterized\n" + |
| "----------\n" + |
| "2. WARNING in X.java (at line 4)\n" + |
| " constructor.getAnnotation(ann).message();\n" + |
| " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + |
| "Type safety: The method getAnnotation(Class) belongs to the raw type MyConstructor. References to generic type MyConstructor<V> should be parameterized\n" + |
| "----------\n" + |
| "3. ERROR in X.java (at line 4)\n" + |
| " constructor.getAnnotation(ann).message();\n" + |
| " ^^^^^^^\n" + |
| "The method message() is undefined for the type Annotation\n" + |
| "----------\n"; |
| this.runNegativeTest( |
| true, |
| new String[] { |
| "X.java", |
| "import java.lang.annotation.Annotation;\n" + |
| "public class X {\n" + |
| " void bar(MyConstructor constructor, Class<Ann> ann) {\n" + |
| " constructor.getAnnotation(ann).message();\n" + |
| " }\n" + |
| "}\n" + |
| "@interface Ann {\n" + |
| " String message();\n" + |
| "}\n" + |
| "interface Z {\n" + |
| " <T extends Annotation> T getAnnotation(Class<T> c);\n" + |
| "}\n" + |
| "class MyAccessibleObject implements Z {\n" + |
| " public <T extends Annotation> T getAnnotation(Class<T> c) { return null; }\n" + |
| "}\n" + |
| "class MyConstructor<V> {\n" + |
| " public <T extends Annotation> T getAnnotation(Class<T> c) { return null; }\n" + |
| "}\n", |
| }, |
| null, |
| customOptions, |
| expectedOutput, |
| JavacTestOptions.SKIP); |
| } |
| // extending java.lang.annotation.Annotation |
| public void test218() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "import java.lang.annotation.Annotation;\n" + |
| "import java.lang.reflect.Constructor;\n" + |
| "public class X {\n" + |
| " void bar(Constructor constructor, Class<Ann> ann) {\n" + |
| " constructor.getAnnotation(ann).message();\n" + |
| " }\n" + |
| "}\n" + |
| "@interface Ann {\n" + |
| " String message();\n" + |
| "}\n", |
| }, |
| "----------\n" + |
| "1. WARNING in X.java (at line 4)\n" + |
| " void bar(Constructor constructor, Class<Ann> ann) {\n" + |
| " ^^^^^^^^^^^\n" + |
| "Constructor is a raw type. References to generic type Constructor<T> should be parameterized\n" + |
| "----------\n" + |
| "2. WARNING in X.java (at line 5)\n" + |
| " constructor.getAnnotation(ann).message();\n" + |
| " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + |
| "Type safety: The method getAnnotation(Class) belongs to the raw type Constructor. References to generic type Constructor<T> should be parameterized\n" + |
| "----------\n" + |
| "3. ERROR in X.java (at line 5)\n" + |
| " constructor.getAnnotation(ann).message();\n" + |
| " ^^^^^^^\n" + |
| "The method message() is undefined for the type Annotation\n" + |
| "----------\n", |
| JavacTestOptions.JavacHasABug.JavacBug6400189); |
| } |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=167217 |
| public void test219() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "public class X {\n" + |
| " @MyB1(MyA2.XX)\n" + |
| " public void foo(){}\n" + |
| "}", |
| "MyA1.java", |
| "import static java.lang.annotation.ElementType.TYPE;\n" + |
| "import java.lang.annotation.Target;\n" + |
| "\n" + |
| "@Target( {\n" + |
| " TYPE\n" + |
| "})\n" + |
| "public @interface MyA1 {\n" + |
| "}", |
| "MyA2.java", |
| "import static java.lang.annotation.ElementType.TYPE;\n" + |
| "import java.lang.annotation.Target;\n" + |
| "\n" + |
| "@Target( {\n" + |
| " TYPE\n" + |
| "})\n" + |
| "public @interface MyA2 {\n" + |
| " public static final MyA1 XX = null;\n" + |
| "}", |
| "MyB1.java", |
| "import static java.lang.annotation.ElementType.*;\n" + |
| "import java.lang.annotation.Target;\n" + |
| "\n" + |
| "@Target( {\n" + |
| " TYPE, METHOD\n" + |
| "})\n" + |
| "public @interface MyB1 {\n" + |
| " MyA1 value();\n" + |
| "}" |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 2)\n" + |
| " @MyB1(MyA2.XX)\n" + |
| " ^^^^^^^\n" + |
| "The value for annotation attribute MyB1.value must be some @MyA1 annotation \n" + |
| "----------\n"); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=167217 |
| public void test220() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "public class X {\n" + |
| " @MyB1({MyA2.XX})\n" + |
| " public void foo(){}\n" + |
| "}", |
| "MyA1.java", |
| "import static java.lang.annotation.ElementType.TYPE;\n" + |
| "import java.lang.annotation.Target;\n" + |
| "\n" + |
| "@Target( {\n" + |
| " TYPE\n" + |
| "})\n" + |
| "public @interface MyA1 {\n" + |
| "}", |
| "MyA2.java", |
| "import static java.lang.annotation.ElementType.TYPE;\n" + |
| "import java.lang.annotation.Target;\n" + |
| "\n" + |
| "@Target( {\n" + |
| " TYPE\n" + |
| "})\n" + |
| "public @interface MyA2 {\n" + |
| " public static final MyA1 XX = null;\n" + |
| "}", |
| "MyB1.java", |
| "import static java.lang.annotation.ElementType.*;\n" + |
| "import java.lang.annotation.Target;\n" + |
| "\n" + |
| "@Target( {\n" + |
| " TYPE, METHOD\n" + |
| "})\n" + |
| "public @interface MyB1 {\n" + |
| " MyA1[] value();\n" + |
| "}" |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 2)\n" + |
| " @MyB1({MyA2.XX})\n" + |
| " ^^^^^^^\n" + |
| "The value for annotation attribute MyB1.value must be some @MyA1 annotation \n" + |
| "----------\n"); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=167217 |
| public void test221() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "public class X {\n" + |
| " @MyB1(null)\n" + |
| " public void foo(){}\n" + |
| "}", |
| "MyA1.java", |
| "import static java.lang.annotation.ElementType.TYPE;\n" + |
| "import java.lang.annotation.Target;\n" + |
| "\n" + |
| "@Target( {\n" + |
| " TYPE\n" + |
| "})\n" + |
| "public @interface MyA1 {\n" + |
| "}", |
| "MyA2.java", |
| "import static java.lang.annotation.ElementType.TYPE;\n" + |
| "import java.lang.annotation.Target;\n" + |
| "\n" + |
| "@Target( {\n" + |
| " TYPE\n" + |
| "})\n" + |
| "public @interface MyA2 {\n" + |
| " public static final MyA1 XX = null;\n" + |
| "}", |
| "MyB1.java", |
| "import static java.lang.annotation.ElementType.*;\n" + |
| "import java.lang.annotation.Target;\n" + |
| "\n" + |
| "@Target( {\n" + |
| " TYPE, METHOD\n" + |
| "})\n" + |
| "public @interface MyB1 {\n" + |
| " MyA1 value();\n" + |
| "}" |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 2)\n" + |
| " @MyB1(null)\n" + |
| " ^^^^\n" + |
| "The value for annotation attribute MyB1.value must be some @MyA1 annotation \n" + |
| "----------\n"); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=167217 |
| public void test222() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "public class X {\n" + |
| " @MyB1({null})\n" + |
| " public void foo(){}\n" + |
| "}", |
| "MyA1.java", |
| "import static java.lang.annotation.ElementType.TYPE;\n" + |
| "import java.lang.annotation.Target;\n" + |
| "\n" + |
| "@Target( {\n" + |
| " TYPE\n" + |
| "})\n" + |
| "public @interface MyA1 {\n" + |
| "}", |
| "MyA2.java", |
| "import static java.lang.annotation.ElementType.TYPE;\n" + |
| "import java.lang.annotation.Target;\n" + |
| "\n" + |
| "@Target( {\n" + |
| " TYPE\n" + |
| "})\n" + |
| "public @interface MyA2 {\n" + |
| " public static final MyA1 XX = null;\n" + |
| "}", |
| "MyB1.java", |
| "import static java.lang.annotation.ElementType.*;\n" + |
| "import java.lang.annotation.Target;\n" + |
| "\n" + |
| "@Target( {\n" + |
| " TYPE, METHOD\n" + |
| "})\n" + |
| "public @interface MyB1 {\n" + |
| " MyA1[] value();\n" + |
| "}" |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 2)\n" + |
| " @MyB1({null})\n" + |
| " ^^^^\n" + |
| "The value for annotation attribute MyB1.value must be some @MyA1 annotation \n" + |
| "----------\n"); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=167217 |
| public void test223() { |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "public class X {\n" + |
| " @MyB1(@MyA1())\n" + |
| " public void foo(){}\n" + |
| "}", |
| "MyA1.java", |
| "import static java.lang.annotation.ElementType.TYPE;\n" + |
| "import java.lang.annotation.Target;\n" + |
| "\n" + |
| "@Target( {\n" + |
| " TYPE\n" + |
| "})\n" + |
| "public @interface MyA1 {\n" + |
| "}", |
| "MyA2.java", |
| "import static java.lang.annotation.ElementType.TYPE;\n" + |
| "import java.lang.annotation.Target;\n" + |
| "\n" + |
| "@Target( {\n" + |
| " TYPE\n" + |
| "})\n" + |
| "public @interface MyA2 {\n" + |
| " public static final MyA1 XX = null;\n" + |
| "}", |
| "MyB1.java", |
| "import static java.lang.annotation.ElementType.*;\n" + |
| "import java.lang.annotation.Target;\n" + |
| "\n" + |
| "@Target( {\n" + |
| " TYPE, METHOD\n" + |
| "})\n" + |
| "public @interface MyB1 {\n" + |
| " MyA1 value();\n" + |
| "}" |
| }, |
| ""); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=167217 |
| public void test224() { |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "public class X {\n" + |
| " @MyB1({@MyA1(), @MyA1})\n" + |
| " public void foo(){}\n" + |
| "}", |
| "MyA1.java", |
| "import static java.lang.annotation.ElementType.TYPE;\n" + |
| "import java.lang.annotation.Target;\n" + |
| "\n" + |
| "@Target( {\n" + |
| " TYPE\n" + |
| "})\n" + |
| "public @interface MyA1 {\n" + |
| "}", |
| "MyA2.java", |
| "import static java.lang.annotation.ElementType.TYPE;\n" + |
| "import java.lang.annotation.Target;\n" + |
| "\n" + |
| "@Target( {\n" + |
| " TYPE\n" + |
| "})\n" + |
| "public @interface MyA2 {\n" + |
| " public static final MyA1 XX = null;\n" + |
| "}", |
| "MyB1.java", |
| "import static java.lang.annotation.ElementType.*;\n" + |
| "import java.lang.annotation.Target;\n" + |
| "\n" + |
| "@Target( {\n" + |
| " TYPE, METHOD\n" + |
| "})\n" + |
| "public @interface MyB1 {\n" + |
| " MyA1[] value();\n" + |
| "}" |
| }, |
| ""); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=XXXXX |
| public void test225() { |
| runNegativeTest( |
| new String[] { |
| "X.java", |
| "public class X {\n"+ |
| " public void myMethod() {\n"+ |
| " @MyAnnot1()\n"+ |
| " }\n"+ |
| "}\n"+ |
| "@interface MyAnnot1 {\n"+ |
| "}" |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 3)\n" + |
| " @MyAnnot1()\n" + |
| " ^\n" + |
| "Syntax error, insert \"enum Identifier\" to complete EnumHeader\n" + |
| "----------\n" + |
| "2. ERROR in X.java (at line 3)\n" + |
| " @MyAnnot1()\n" + |
| " ^\n" + |
| "Syntax error, insert \"EnumBody\" to complete BlockStatements\n" + |
| "----------\n", |
| null, |
| true, |
| null /* no custom options */, |
| false /* do not generate output */, |
| false /* do not show category */, |
| false /* do not show warning token */, |
| false /* do not skip javac for this peculiar test */, |
| true /* do not perform statements recovery */); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=179477 - variation |
| public void test226() { |
| runNegativeTest( |
| new String[] { |
| "X.java", |
| "public class X {\n" + |
| " public @interface Annot {\n" + |
| " float[] value();\n" + |
| " Class<X>[] classe();\n" + |
| " }\n" + |
| " @Annot(value={x}, classe={Zork.class,zork})\n" + |
| " class Inner {\n" + |
| " }\n" + |
| "}\n" |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 6)\n" + |
| " @Annot(value={x}, classe={Zork.class,zork})\n" + |
| " ^\n" + |
| "x cannot be resolved to a variable\n" + |
| "----------\n" + |
| "2. ERROR in X.java (at line 6)\n" + |
| " @Annot(value={x}, classe={Zork.class,zork})\n" + |
| " ^^^^\n" + |
| "Zork cannot be resolved to a type\n" + |
| "----------\n" + |
| "3. ERROR in X.java (at line 6)\n" + |
| " @Annot(value={x}, classe={Zork.class,zork})\n" + |
| " ^^^^^^^^^^\n" + |
| "Class<Zork> cannot be resolved to a type\n" + |
| "----------\n" + |
| "4. ERROR in X.java (at line 6)\n" + |
| " @Annot(value={x}, classe={Zork.class,zork})\n" + |
| " ^^^^\n" + |
| "zork cannot be resolved to a variable\n" + |
| "----------\n" + |
| "5. ERROR in X.java (at line 6)\n" + |
| " @Annot(value={x}, classe={Zork.class,zork})\n" + |
| " ^^^^\n" + |
| "The value for annotation attribute X.Annot.classe must be a class literal\n" + |
| "----------\n"); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=186822 |
| public void test227() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "public @interface X<T> {}", |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 1)\n" + |
| " public @interface X<T> {}\n" + |
| " ^\n" + |
| "Syntax error, annotation declaration cannot have type parameters\n" + |
| "----------\n"); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=127533 |
| public void test228() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "public class X {\n" + |
| " @SuppressWarnings(\"unchecked\") //unused\n" + |
| " void doNoEvil(){\n" + |
| " }\n" + |
| "}\n", |
| "Y.java", |
| "public class Y {\n" + |
| " Zork z;\n" + |
| "}\n", |
| }, |
| "----------\n" + |
| "1. WARNING in X.java (at line 2)\n" + |
| " @SuppressWarnings(\"unchecked\") //unused\n" + |
| " ^^^^^^^^^^^\n" + |
| "Unnecessary @SuppressWarnings(\"unchecked\")\n" + |
| "----------\n" + |
| "----------\n" + |
| "1. ERROR in Y.java (at line 2)\n" + |
| " Zork z;\n" + |
| " ^^^^\n" + |
| "Zork cannot be resolved to a type\n" + |
| "----------\n"); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=127533 |
| public void test229() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "public class X {\n" + |
| " @SuppressWarnings({\"unchecked\",\"all\"})\n" + |
| " void doNoEvil(){\n" + |
| " }\n" + |
| " Zork z;\n" + |
| "}\n", |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 5)\n" + |
| " Zork z;\n" + |
| " ^^^^\n" + |
| "Zork cannot be resolved to a type\n" + |
| "----------\n"); |
| } |
| |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=127533 - variation |
| public void test230() { |
| Map options = getCompilerOptions(); |
| options.put(CompilerOptions.OPTION_ReportUnusedWarningToken, CompilerOptions.ERROR); |
| enableAllWarningsForIrritants(options, IrritantSet.UNUSED); |
| this.runNegativeTest( |
| true, |
| new String[] { |
| "X.java", |
| "public class X {\n" + |
| " @SuppressWarnings({\"zork\", \"unused\" })\n" + |
| " void foo() {}\n" + |
| "}\n" + |
| "@SuppressWarnings({\"all\"})\n" + |
| "class X2 {\n" + |
| " @SuppressWarnings({\"zork\", \"unused\" })\n" + |
| " void foo() {}\n" + |
| "}\n", |
| }, |
| null, options, |
| "----------\n" + |
| "1. WARNING in X.java (at line 2)\n" + |
| " @SuppressWarnings({\"zork\", \"unused\" })\n" + |
| " ^^^^^^\n" + |
| "Unsupported @SuppressWarnings(\"zork\")\n" + |
| "----------\n" + |
| "2. ERROR in X.java (at line 2)\n" + |
| " @SuppressWarnings({\"zork\", \"unused\" })\n" + |
| " ^^^^^^^^\n" + |
| "Unnecessary @SuppressWarnings(\"unused\")\n" + |
| "----------\n" + |
| "3. ERROR in X.java (at line 7)\n" + |
| " @SuppressWarnings({\"zork\", \"unused\" })\n" + |
| " ^^^^^^^^\n" + |
| "Unnecessary @SuppressWarnings(\"unused\")\n" + |
| "----------\n", |
| null, null, JavacTestOptions.Excuse.EclipseWarningConfiguredAsError); |
| } |
| |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=127533 - variation |
| public void test231() { |
| Map options = getCompilerOptions(); |
| options.put(CompilerOptions.OPTION_ReportUnusedWarningToken, CompilerOptions.ERROR); |
| enableAllWarningsForIrritants(options, IrritantSet.UNUSED); |
| this.runNegativeTest( |
| true, |
| new String[] { |
| "X.java", |
| "public class X {\n" + |
| " @SuppressWarnings({\"zork\", \"unused\",\"all\"})\n" + |
| " void foo() {}\n" + |
| "}\n" + |
| "\n" + |
| "@SuppressWarnings({\"all\"})\n" + |
| "class X2 {\n" + |
| " @SuppressWarnings(\"unused\")\n" + |
| " void foo() {}\n" + |
| " Object z;\n" + |
| "}\n", |
| }, |
| null, options, |
| "----------\n" + |
| "1. ERROR in X.java (at line 2)\n" + |
| " @SuppressWarnings({\"zork\", \"unused\",\"all\"})\n" + |
| " ^^^^^^^^\n" + |
| "Unnecessary @SuppressWarnings(\"unused\")\n" + |
| "----------\n" + |
| "2. ERROR in X.java (at line 8)\n" + |
| " @SuppressWarnings(\"unused\")\n" + |
| " ^^^^^^^^\n" + |
| "Unnecessary @SuppressWarnings(\"unused\")\n" + |
| "----------\n", |
| JavacTestOptions.Excuse.EclipseWarningConfiguredAsError); |
| } |
| |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=127533 - variation |
| public void test232() { |
| Map options = getCompilerOptions(); |
| options.put(CompilerOptions.OPTION_ReportUnusedWarningToken, CompilerOptions.ERROR); |
| this.runNegativeTest( |
| true, |
| new String[] { |
| "X.java", |
| "public class X {\n" + |
| " @SuppressWarnings({\"finally\",\"finally\"})\n" + |
| " public int test(int p) {\n" + |
| " try {\n" + |
| " return 1;\n" + |
| " } finally {\n" + |
| " return 2;\n" + |
| " }\n" + |
| " }\n" + |
| "}\n" + |
| "class Y {}", |
| }, |
| null, options, |
| "----------\n" + |
| "1. ERROR in X.java (at line 2)\n" + |
| " @SuppressWarnings({\"finally\",\"finally\"})\n" + |
| " ^^^^^^^^^\n" + |
| "Unnecessary @SuppressWarnings(\"finally\")\n" + |
| "----------\n", |
| JavacTestOptions.Excuse.EclipseWarningConfiguredAsError); |
| } |
| |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=127533 - variation |
| public void test233() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "public class X {\n" + |
| " @SuppressWarnings({\"finally\",\"finally\"})\n" + |
| " public int test(int p) {\n" + |
| " try {\n" + |
| " return Zork;\n" + |
| " } finally {\n" + |
| " return 2;\n" + |
| " }\n" + |
| " }\n" + |
| "}\n", |
| }, |
| "----------\n" + |
| "1. WARNING in X.java (at line 2)\n" + |
| " @SuppressWarnings({\"finally\",\"finally\"})\n" + |
| " ^^^^^^^^^\n" + |
| "Unnecessary @SuppressWarnings(\"finally\")\n" + |
| "----------\n" + |
| "2. ERROR in X.java (at line 5)\n" + |
| " return Zork;\n" + |
| " ^^^^\n" + |
| "Zork cannot be resolved to a variable\n" + |
| "----------\n"); |
| } |
| |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=127533 - variation |
| public void test234() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "public class X {\n" + |
| " @SuppressWarnings(\"finally\")\n" + // unused but no complaint since an error is nested (can't tell for sure) |
| " public int test(int p) {\n" + |
| " return Zork;\n" + |
| " }\n" + |
| "}\n", |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 4)\n" + |
| " return Zork;\n" + |
| " ^^^^\n" + |
| "Zork cannot be resolved to a variable\n" + |
| "----------\n"); |
| } |
| |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=207758 |
| public void test235() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "import java.util.List;\n" + |
| "public class X {\n" + |
| " void foo() {\n" + |
| " ArrayList al = null;\n" + |
| " @SuppressWarnings(\"unchecked\")\n" + |
| " List<String> ls = al;\n" + |
| " }\n" + |
| "}", |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 4)\n" + |
| " ArrayList al = null;\n" + |
| " ^^^^^^^^^\n" + |
| "ArrayList cannot be resolved to a type\n" + |
| "----------\n"); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=207758 - variation |
| public void test236() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "import java.util.List;\n" + |
| "public class X {\n" + |
| " void foo() {\n" + |
| " @SuppressWarnings(\"unchecked\")\n" + |
| " List<String> ls = bar();\n" + |
| " }\n" + |
| " ArrayList bar() {\n" + |
| " return null;\n" + |
| " }\n" + |
| "}", |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 5)\n" + |
| " List<String> ls = bar();\n" + |
| " ^^^\n" + |
| "The method bar() from the type X refers to the missing type ArrayList\n" + |
| "----------\n" + |
| "2. ERROR in X.java (at line 7)\n" + |
| " ArrayList bar() {\n" + |
| " ^^^^^^^^^\n" + |
| "ArrayList cannot be resolved to a type\n" + |
| "----------\n"); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=207758 - variation |
| public void test237() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "import java.util.List;\n" + |
| "public class X<B extends ArrayList> {\n" + |
| " B get() { return null; }\n" + |
| " void foo() {\n" + |
| " @SuppressWarnings(\"unchecked\")\n" + |
| " List<String> ls = get();\n" + |
| " }\n" + |
| "}", |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 2)\n" + |
| " public class X<B extends ArrayList> {\n" + |
| " ^^^^^^^^^\n" + |
| "ArrayList cannot be resolved to a type\n" + |
| "----------\n" + |
| "2. ERROR in X.java (at line 6)\n" + |
| " List<String> ls = get();\n" + |
| " ^^^^^\n" + |
| "Type mismatch: cannot convert from B to List<String>\n" + |
| "----------\n"); |
| } |
| public void test238() { |
| // check that if promoted to ERROR, unhandled warning token shouldn't be suppressed by @SuppressWarnings("all") |
| Map options = getCompilerOptions(); |
| options.put(CompilerOptions.OPTION_ReportUnhandledWarningToken, CompilerOptions.ERROR); |
| this.runNegativeTest( |
| true, |
| new String[] { |
| "X.java", |
| "public class X {\n" + |
| " @SuppressWarnings({\"zork\",\"all\"})\n" + |
| " void foo() {}\n" + |
| "}\n", |
| }, |
| null, options, |
| "----------\n" + |
| "1. ERROR in X.java (at line 2)\n" + |
| " @SuppressWarnings({\"zork\",\"all\"})\n" + |
| " ^^^^^^\n" + |
| "Unsupported @SuppressWarnings(\"zork\")\n" + |
| "----------\n", |
| JavacTestOptions.Excuse.EclipseWarningConfiguredAsError); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=77918 |
| public void test239() { |
| Map options = getCompilerOptions(); |
| options.put(CompilerOptions.OPTION_ReportRedundantSuperinterface, CompilerOptions.WARNING); |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "class X implements I {}\n" + |
| "@SuppressWarnings(\"unused\")\n" + |
| "class Y extends X implements I {\n" + |
| " Zork z;\n" + |
| "}\n" + |
| "class Z extends X implements I {}\n" + |
| "interface I {}" |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 4)\n" + |
| " Zork z;\n" + |
| " ^^^^\n" + |
| "Zork cannot be resolved to a type\n" + |
| "----------\n" + |
| "2. WARNING in X.java (at line 6)\n" + |
| " class Z extends X implements I {}\n" + |
| " ^\n" + |
| "Redundant superinterface I for the type Z, already defined by X\n" + |
| "----------\n", |
| null, |
| false, |
| options); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=207411 |
| public void test240() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "@Deprecated @Zork\n" + |
| "public class X {\n" + |
| "}\n", |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 1)\n" + |
| " @Deprecated @Zork\n" + |
| " ^^^^\n" + |
| "Zork cannot be resolved to a type\n" + |
| "----------\n"); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=210213 |
| public void test241() { |
| Map options = getCompilerOptions(); |
| options.put(CompilerOptions.OPTION_ReportUnusedWarningToken, CompilerOptions.ERROR); |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "public class X {\n" + |
| "\n" + |
| " @SuppressWarnings(\"unchecked\")\n" + |
| " public static <T> T asClassUnchecked(Object object, T requiredClassObject) {\n" + |
| " return (T) object;\n" + |
| " }\n" + |
| " public static void main(String... args) {\n" + |
| " try {\n" + |
| " X[] xs = X.asClassUnchecked(\"abc\", (X[])null);\n" + |
| " System.out.println(xs.length);\n" + |
| " } catch(ClassCastException e) {\n" + |
| " System.out.println(\"SUCCESS\");\n" + |
| " }\n" + |
| " }\n" + |
| "}\n", |
| }, |
| "SUCCESS", |
| null, |
| false, |
| null, |
| options, |
| null); |
| } |
| ///https://bugs.eclipse.org/bugs/show_bug.cgi?id=210422 - variation |
| public void test242() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "import java.io.Serializable;\n" + |
| "public final class X implements Serializable {\n" + |
| " class SMember extends String {} \n" + |
| " @Annot(value = new SMember())\n" + |
| " void bar() {}\n" + |
| " @Annot(value = \n" + |
| " new X(){\n" + |
| " ZorkAnonymous1 z;\n" + |
| " void foo() {\n" + |
| " this.bar();\n" + |
| " Zork2 z;\n" + |
| " }\n" + |
| " })\n" + |
| " void foo() {}\n" + |
| "}\n" + |
| "@interface Annot {\n" + |
| " String value();\n" + |
| "}\n", |
| }, |
| "----------\n" + |
| "1. WARNING in X.java (at line 2)\n" + |
| " public final class X implements Serializable {\n" + |
| " ^\n" + |
| "The serializable class X does not declare a static final serialVersionUID field of type long\n" + |
| "----------\n" + |
| "2. ERROR in X.java (at line 3)\n" + |
| " class SMember extends String {} \n" + |
| " ^^^^^^\n" + |
| "The type SMember cannot subclass the final class String\n" + |
| "----------\n" + |
| "3. ERROR in X.java (at line 4)\n" + |
| " @Annot(value = new SMember())\n" + |
| " ^^^^^^^^^^^^^\n" + |
| "Type mismatch: cannot convert from X.SMember to String\n" + |
| "----------\n" + |
| "4. ERROR in X.java (at line 7)\n" + |
| " new X(){\n" + |
| " ^\n" + |
| "An anonymous class cannot subclass the final class X\n" + |
| "----------\n" + |
| "5. ERROR in X.java (at line 8)\n" + |
| " ZorkAnonymous1 z;\n" + |
| " ^^^^^^^^^^^^^^\n" + |
| "ZorkAnonymous1 cannot be resolved to a type\n" + |
| "----------\n"); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=210213 - variation |
| public void test243() { |
| Map options = getCompilerOptions(); |
| options.put(CompilerOptions.OPTION_ReportUnusedWarningToken, CompilerOptions.ERROR); |
| options.put(CompilerOptions.OPTION_ReportUncheckedTypeOperation, CompilerOptions.IGNORE); |
| options.put(CompilerOptions.OPTION_ReportRawTypeReference, CompilerOptions.IGNORE); |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "public class X {\n" + |
| " \n" + |
| " @SuppressWarnings(\"unchecked\")\n" + |
| " void foo() {\n" + |
| " \n" + |
| " }\n" + |
| "} \n", |
| }, |
| "", |
| null, |
| false, |
| null, |
| options, |
| null); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=210213 - variation |
| public void test244() { |
| Map options = getCompilerOptions(); |
| options.put(CompilerOptions.OPTION_ReportUnusedWarningToken, CompilerOptions.ERROR); |
| options.put(CompilerOptions.OPTION_ReportUncheckedTypeOperation, CompilerOptions.WARNING); |
| options.put(CompilerOptions.OPTION_ReportRawTypeReference, CompilerOptions.WARNING); |
| this.runNegativeTest( |
| true, |
| new String[] { |
| "X.java", |
| "public class X {\n" + |
| " \n" + |
| " @SuppressWarnings(\"unchecked\")\n" + |
| " void foo() {\n" + |
| " \n" + |
| " }\n" + |
| "} \n", |
| }, |
| null, options, |
| "----------\n" + |
| "1. ERROR in X.java (at line 3)\n" + |
| " @SuppressWarnings(\"unchecked\")\n" + |
| " ^^^^^^^^^^^\n" + |
| "Unnecessary @SuppressWarnings(\"unchecked\")\n" + |
| "----------\n", |
| JavacTestOptions.Excuse.EclipseWarningConfiguredAsError); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=210213 - variation |
| public void test245() { |
| Map options = getCompilerOptions(); |
| options.put(CompilerOptions.OPTION_ReportUnusedWarningToken, CompilerOptions.ERROR); |
| options.put(CompilerOptions.OPTION_ReportUncheckedTypeOperation, CompilerOptions.IGNORE); |
| options.put(CompilerOptions.OPTION_ReportRawTypeReference, CompilerOptions.IGNORE); |
| options.put(CompilerOptions.OPTION_ReportUnnecessaryTypeCheck, CompilerOptions.WARNING); |
| enableAllWarningsForIrritants(options, IrritantSet.UNUSED); |
| this.runNegativeTest( |
| true, |
| new String[] { |
| "X.java", |
| "public class X {\n" + |
| " \n" + |
| " @SuppressWarnings({\"unchecked\",\"unused\"})\n" + |
| " void foo() {\n" + |
| " \n" + |
| " }\n" + |
| "} \n", |
| }, |
| null, options, |
| "----------\n" + |
| "1. INFO in X.java (at line 3)\n" + |
| " @SuppressWarnings({\"unchecked\",\"unused\"})\n" + |
| " ^^^^^^^^^^^\n" + |
| "At least one of the problems in category \'unchecked\' is not analysed due to a compiler option being ignored\n" + |
| "----------\n" + |
| "2. ERROR in X.java (at line 3)\n" + |
| " @SuppressWarnings({\"unchecked\",\"unused\"})\n" + |
| " ^^^^^^^^\n" + |
| "Unnecessary @SuppressWarnings(\"unused\")\n" + |
| "----------\n", |
| JavacTestOptions.Excuse.EclipseWarningConfiguredAsError); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=210213 - variation |
| public void test245_ignored() { |
| Map options = getCompilerOptions(); |
| options.put(CompilerOptions.OPTION_ReportUnusedWarningToken, CompilerOptions.ERROR); |
| options.put(CompilerOptions.OPTION_ReportUncheckedTypeOperation, CompilerOptions.IGNORE); |
| options.put(CompilerOptions.OPTION_ReportRawTypeReference, CompilerOptions.IGNORE); |
| options.put(CompilerOptions.OPTION_ReportUnnecessaryTypeCheck, CompilerOptions.WARNING); |
| options.put(CompilerOptions.OPTION_ReportSuppressWarningNotFullyAnalysed, CompilerOptions.IGNORE); |
| enableAllWarningsForIrritants(options, IrritantSet.UNUSED); |
| this.runNegativeTest( |
| true, |
| new String[] { |
| "X.java", |
| "public class X {\n" + |
| " \n" + |
| " @SuppressWarnings({\"unchecked\",\"unused\"})\n" + |
| " void foo() {\n" + |
| " \n" + |
| " }\n" + |
| "} \n", |
| }, |
| null, options, |
| "----------\n" + |
| "1. ERROR in X.java (at line 3)\n" + |
| " @SuppressWarnings({\"unchecked\",\"unused\"})\n" + |
| " ^^^^^^^^\n" + |
| "Unnecessary @SuppressWarnings(\"unused\")\n" + |
| "----------\n", |
| JavacTestOptions.Excuse.EclipseWarningConfiguredAsError); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=210213 - variation |
| public void test245_error() { |
| Map options = getCompilerOptions(); |
| options.put(CompilerOptions.OPTION_ReportUnusedWarningToken, CompilerOptions.ERROR); |
| options.put(CompilerOptions.OPTION_ReportUncheckedTypeOperation, CompilerOptions.IGNORE); |
| options.put(CompilerOptions.OPTION_ReportRawTypeReference, CompilerOptions.IGNORE); |
| options.put(CompilerOptions.OPTION_ReportUnnecessaryTypeCheck, CompilerOptions.WARNING); |
| options.put(CompilerOptions.OPTION_ReportSuppressWarningNotFullyAnalysed, CompilerOptions.ERROR); |
| enableAllWarningsForIrritants(options, IrritantSet.UNUSED); |
| this.runNegativeTest( |
| true, |
| new String[] { |
| "X.java", |
| "public class X {\n" + |
| " \n" + |
| " @SuppressWarnings({\"unchecked\",\"unused\"})\n" + |
| " void foo() {\n" + |
| " \n" + |
| " }\n" + |
| "} \n", |
| }, |
| null, options, |
| "----------\n" + |
| "1. ERROR in X.java (at line 3)\n" + |
| " @SuppressWarnings({\"unchecked\",\"unused\"})\n" + |
| " ^^^^^^^^^^^\n" + |
| "At least one of the problems in category \'unchecked\' is not analysed due to a compiler option being ignored\n" + |
| "----------\n" + |
| "2. ERROR in X.java (at line 3)\n" + |
| " @SuppressWarnings({\"unchecked\",\"unused\"})\n" + |
| " ^^^^^^^^\n" + |
| "Unnecessary @SuppressWarnings(\"unused\")\n" + |
| "----------\n", |
| JavacTestOptions.Excuse.EclipseWarningConfiguredAsError); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=210213 - variation |
| public void test246() { |
| Map options = getCompilerOptions(); |
| options.put(CompilerOptions.OPTION_ReportUnusedWarningToken, CompilerOptions.ERROR); |
| options.put(CompilerOptions.OPTION_ReportUncheckedTypeOperation, CompilerOptions.WARNING); |
| options.put(CompilerOptions.OPTION_ReportRawTypeReference, CompilerOptions.WARNING); |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "public class X {\n" + |
| " \n" + |
| " @SuppressWarnings(\"all\")\n" + |
| " void foo() {\n" + |
| " \n" + |
| " }\n" + |
| "} \n", |
| }, |
| "", |
| null, |
| false, |
| null, |
| options, |
| null); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=211609 |
| public void test247() { |
| if (this.complianceLevel < ClassFileConstants.JDK1_6) { |
| return; |
| } |
| // only enable in 1.6 mode |
| Map options = getCompilerOptions(); |
| options.put(CompilerOptions.OPTION_Process_Annotations, CompilerOptions.ENABLED); |
| this.runConformTest( |
| new String[] { |
| "TestAnnotation.java", |
| "public @interface TestAnnotation {\n" + |
| " Class targetItem() default void.class;\n" + |
| "}" |
| }, |
| ""); |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "public class X {\n" + |
| " @TestAnnotation\n" + |
| " private String foo;\n" + |
| "}", |
| }, |
| "", |
| null, |
| false, |
| null, |
| options, |
| null); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=211609 |
| public void test248() { |
| this.runNegativeTest( |
| new String[] { |
| "TestAnnotation.java", |
| "public @interface TestAnnotation {\n" + |
| " String targetItem() default void.class;\n" + |
| "}" |
| }, |
| "----------\n" + |
| "1. ERROR in TestAnnotation.java (at line 2)\n" + |
| " String targetItem() default void.class;\n" + |
| " ^^^^^^^^^^\n" + |
| "Type mismatch: cannot convert from Class<Void> to String\n" + |
| "----------\n"); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=191090 |
| public void test249() throws Exception { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", //----------------------------------------------------------------------- |
| "@Zork\n" + |
| "public class X {}", |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 1)\n" + |
| " @Zork\n" + |
| " ^^^^\n" + |
| "Zork cannot be resolved to a type\n" + |
| "----------\n", |
| null, |
| true, // flush output |
| null, |
| true, // generate output |
| false, |
| false); |
| String expectedOutput = "public class X {"; |
| checkDisassembledClassFile(OUTPUT_DIR + File.separator + "X.class", "X", expectedOutput); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=191090 |
| public void test250() throws Exception { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", //----------------------------------------------------------------------- |
| "@Deprecated\n" + |
| "@Zork\n" + |
| "@Annot(1)\n" + |
| "public class X {}", |
| "Annot.java", |
| "import java.lang.annotation.Retention;\n" + |
| "import static java.lang.annotation.RetentionPolicy.*;\n" + |
| "@Retention(RUNTIME)\n" + |
| "@interface Annot {\n" + |
| " int value() default -1;\n" + |
| "}" |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 2)\n" + |
| " @Zork\n" + |
| " ^^^^\n" + |
| "Zork cannot be resolved to a type\n" + |
| "----------\n", |
| null, |
| true, // flush output |
| null, |
| true, // generate output |
| false, |
| false); |
| String expectedOutput = |
| "@java.lang.Deprecated\n" + |
| "@Annot(value=(int) 1)\n" + |
| "public class X {"; |
| checkDisassembledClassFile(OUTPUT_DIR + File.separator + "X.class", "X", expectedOutput); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=191090 |
| public void test251() throws Exception { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", //----------------------------------------------------------------------- |
| "@Deprecated\n" + |
| "@Zork\n" + |
| "@Annot(1)\n" + |
| "public class X {}", |
| "Annot.java", |
| "import java.lang.annotation.Retention;\n" + |
| "import static java.lang.annotation.RetentionPolicy.*;\n" + |
| "@Retention(CLASS)\n" + |
| "@interface Annot {\n" + |
| " int value() default -1;\n" + |
| "}" |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 2)\n" + |
| " @Zork\n" + |
| " ^^^^\n" + |
| "Zork cannot be resolved to a type\n" + |
| "----------\n", |
| null, |
| true, // flush output |
| null, |
| true, // generate output |
| false, |
| false); |
| String expectedOutput = |
| "@Annot(value=(int) 1)\n" + |
| "@java.lang.Deprecated\n" + |
| "public class X {"; |
| checkDisassembledClassFile(OUTPUT_DIR + File.separator + "X.class", "X", expectedOutput); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=191090 |
| public void test252() throws Exception { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", //----------------------------------------------------------------------- |
| "public class X {\n" + |
| " public void foo(@Deprecated @Zork @Annot(2) int i) {}\n" + |
| "}", |
| "Annot.java", |
| "import java.lang.annotation.Retention;\n" + |
| "import static java.lang.annotation.RetentionPolicy.*;\n" + |
| "@Retention(CLASS)\n" + |
| "@interface Annot {\n" + |
| " int value() default -1;\n" + |
| "}" |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 2)\n" + |
| " public void foo(@Deprecated @Zork @Annot(2) int i) {}\n" + |
| " ^^^^\n" + |
| "Zork cannot be resolved to a type\n" + |
| "----------\n", |
| null, |
| true, // flush output |
| null, |
| true, // generate output |
| false, |
| false); |
| String expectedOutput = |
| " RuntimeVisibleParameterAnnotations: \n" + |
| " Number of annotations for parameter 0: 1\n" + |
| " #22 @java.lang.Deprecated(\n" + |
| " )\n" + |
| " RuntimeInvisibleParameterAnnotations: \n" + |
| " Number of annotations for parameter 0: 2\n" + |
| " #17 @Zork(\n" + |
| " )\n" + |
| " #18 @Annot(\n" + |
| " #19 value=(int) 2 (constant type)\n" + |
| " )\n"; |
| checkDisassembledClassFile(OUTPUT_DIR + File.separator + "X.class", "X", expectedOutput, ClassFileBytesDisassembler.SYSTEM); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=191090 |
| public void test253() throws Exception { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", //----------------------------------------------------------------------- |
| "public class X {\n" + |
| " public void foo(@Deprecated @Zork @Annot(2) int i) {}\n" + |
| "}", |
| "Annot.java", |
| "import java.lang.annotation.Retention;\n" + |
| "import static java.lang.annotation.RetentionPolicy.*;\n" + |
| "@Retention(RUNTIME)\n" + |
| "@interface Annot {\n" + |
| " int value() default -1;\n" + |
| "}" |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 2)\n" + |
| " public void foo(@Deprecated @Zork @Annot(2) int i) {}\n" + |
| " ^^^^\n" + |
| "Zork cannot be resolved to a type\n" + |
| "----------\n", |
| null, |
| true, // flush output |
| null, |
| true, // generate output |
| false, |
| false); |
| String expectedOutput = |
| " RuntimeVisibleParameterAnnotations: \n" + |
| " Number of annotations for parameter 0: 2\n" + |
| " #19 @java.lang.Deprecated(\n" + |
| " )\n" + |
| " #20 @Annot(\n" + |
| " #21 value=(int) 2 (constant type)\n" + |
| " )\n" + |
| " RuntimeInvisibleParameterAnnotations: \n" + |
| " Number of annotations for parameter 0: 1\n" + |
| " #17 @Zork(\n" + |
| " )\n"; |
| checkDisassembledClassFile(OUTPUT_DIR + File.separator + "X.class", "X", expectedOutput, ClassFileBytesDisassembler.SYSTEM); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=191090 |
| public void test254() throws Exception { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", //----------------------------------------------------------------------- |
| "public class X {\n" + |
| " public void foo(@Deprecated int j, @Zork @Annot(3) int i) {}\n" + |
| "}", |
| "Annot.java", |
| "import java.lang.annotation.Retention;\n" + |
| "import static java.lang.annotation.RetentionPolicy.*;\n" + |
| "@Retention(RUNTIME)\n" + |
| "@interface Annot {\n" + |
| " int value() default -1;\n" + |
| "}" |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 2)\n" + |
| " public void foo(@Deprecated int j, @Zork @Annot(3) int i) {}\n" + |
| " ^^^^\n" + |
| "Zork cannot be resolved to a type\n" + |
| "----------\n", |
| null, |
| true, // flush output |
| null, |
| true, // generate output |
| false, |
| false); |
| String expectedOutput = |
| " RuntimeVisibleParameterAnnotations: \n" + |
| " Number of annotations for parameter 0: 1\n" + |
| " #19 @java.lang.Deprecated(\n" + |
| " )\n" + |
| " Number of annotations for parameter 1: 1\n" + |
| " #20 @Annot(\n" + |
| " #21 value=(int) 3 (constant type)\n" + |
| " )\n" + |
| " RuntimeInvisibleParameterAnnotations: \n" + |
| " Number of annotations for parameter 0: 0\n" + |
| " Number of annotations for parameter 1: 1\n" + |
| " #17 @Zork(\n" + |
| " )\n"; |
| checkDisassembledClassFile(OUTPUT_DIR + File.separator + "X.class", "X", expectedOutput, ClassFileBytesDisassembler.SYSTEM); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=191090 |
| public void test255() throws Exception { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", //----------------------------------------------------------------------- |
| "public class X {\n" + |
| " public void foo(@Deprecated int j, @Annot(\"\") @Deprecated int i) {}\n" + |
| "}", |
| "Annot.java", |
| "import java.lang.annotation.Retention;\n" + |
| "import static java.lang.annotation.RetentionPolicy.*;\n" + |
| "@Retention(RUNTIME)\n" + |
| "@interface Annot {\n" + |
| " int value() default -1;\n" + |
| "}" |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 2)\n" + |
| " public void foo(@Deprecated int j, @Annot(\"\") @Deprecated int i) {}\n" + |
| " ^^\n" + |
| "Type mismatch: cannot convert from String to int\n" + |
| "----------\n", |
| null, |
| true, // flush output |
| null, |
| true, // generate output |
| false, |
| false); |
| String expectedOutput = |
| " RuntimeVisibleParameterAnnotations: \n" + |
| " Number of annotations for parameter 0: 1\n" + |
| " #17 @java.lang.Deprecated(\n" + |
| " )\n" + |
| " Number of annotations for parameter 1: 1\n" + |
| " #17 @java.lang.Deprecated(\n" + |
| " )\n"; |
| checkDisassembledClassFile(OUTPUT_DIR + File.separator + "X.class", "X", expectedOutput, ClassFileBytesDisassembler.SYSTEM); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=191090 |
| public void test256() throws Exception { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", //----------------------------------------------------------------------- |
| "public class X {\n" + |
| " public void foo(@Deprecated int j, @Annot(\"\") @Deprecated int i) {}\n" + |
| "}", |
| "Annot.java", |
| "import java.lang.annotation.Retention;\n" + |
| "import static java.lang.annotation.RetentionPolicy.*;\n" + |
| "@Retention(CLASS)\n" + |
| "@interface Annot {\n" + |
| " int value() default -1;\n" + |
| "}" |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 2)\n" + |
| " public void foo(@Deprecated int j, @Annot(\"\") @Deprecated int i) {}\n" + |
| " ^^\n" + |
| "Type mismatch: cannot convert from String to int\n" + |
| "----------\n", |
| null, |
| true, // flush output |
| null, |
| true, // generate output |
| false, |
| false); |
| String expectedOutput = |
| " RuntimeVisibleParameterAnnotations: \n" + |
| " Number of annotations for parameter 0: 1\n" + |
| " #20 @java.lang.Deprecated(\n" + |
| " )\n" + |
| " Number of annotations for parameter 1: 1\n" + |
| " #20 @java.lang.Deprecated(\n" + |
| " )"; |
| checkDisassembledClassFile(OUTPUT_DIR + File.separator + "X.class", "X", expectedOutput, ClassFileBytesDisassembler.SYSTEM); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=216570 |
| public void test257() { |
| if (new CompilerOptions(getCompilerOptions()).sourceLevel < ClassFileConstants.JDK1_6) { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "public class X {\n" + |
| " static interface IFoo {\n" + |
| " public boolean eval(String s);\n" + |
| " }\n" + |
| " static class Foo implements IFoo {\n" + |
| " @Override\n" + |
| " public boolean eval(String s) {\n" + |
| " return true;\n" + |
| " }\n" + |
| " }\n" + |
| "}\n" |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 7)\n" + |
| " public boolean eval(String s) {\n" + |
| " ^^^^^^^^^^^^^^\n" + |
| "The method eval(String) of type X.Foo must override a superclass method\n" + |
| "----------\n"); |
| return; |
| } |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "public class X {\n" + |
| " static interface IFoo {\n" + |
| " public boolean eval(String s);\n" + |
| " }\n" + |
| " static class Foo implements IFoo {\n" + |
| " @Override\n" + |
| " public boolean eval(String s) {\n" + |
| " return true;\n" + |
| " }\n" + |
| " }\n" + |
| "}\n" |
| }, |
| ""); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=167262 |
| public void test258() { |
| String expectedOutput = new CompilerOptions(getCompilerOptions()).sourceLevel < ClassFileConstants.JDK1_6 |
| ? "----------\n" + |
| "1. ERROR in X.java (at line 9)\n" + |
| " void bar();//3\n" + |
| " ^^^^^\n" + |
| "The method bar() of type Bar must override a superclass method\n" + |
| "----------\n" + |
| "2. ERROR in X.java (at line 13)\n" + |
| " public void bar() {}//4\n" + |
| " ^^^^^\n" + |
| "The method bar() of type BarImpl must override a superclass method\n" + |
| "----------\n" |
| : "----------\n" + |
| "1. ERROR in X.java (at line 9)\n" + |
| " void bar();//3\n" + |
| " ^^^^^\n" + |
| "The method bar() of type Bar must override or implement a supertype method\n" + |
| "----------\n"; |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "interface Foo {\n" + |
| " @Override\n" + |
| " String toString();//1\n" + |
| "}\n" + |
| "interface Bar extends Foo {\n" + |
| " @Override\n" + |
| " String toString();//2\n" + |
| " @Override\n" + |
| " void bar();//3\n" + |
| "}\n" + |
| "class BarImpl implements Bar {\n" + |
| " @Override\n" + |
| " public void bar() {}//4\n" + |
| "}\n" |
| }, |
| expectedOutput); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=239273 |
| public void test259() { |
| this.runConformTest( |
| new String[] { |
| "Jpf.java", |
| "public class Jpf {\n" + |
| " @interface Action {\n" + |
| " Forward[] forwards();\n" + |
| " }\n" + |
| " @interface Forward {\n" + |
| " String name();\n" + |
| " String path();\n" + |
| " ActionOutput[] actionOutputs();\n" + |
| " }\n" + |
| " @interface ActionOutput {\n" + |
| " String name();\n" + |
| " Class type();\n" + |
| " }\n" + |
| " @Jpf.Action( \n" + |
| " forwards = { \n" + |
| " @Jpf.Forward(\n" + |
| " name = \"success\", \n" + |
| " path = \"results.jsp\", \n" + |
| " actionOutputs = { \n" + |
| " @Jpf.ActionOutput(\n" + |
| " name = \"mybeanmethodResult\", \n" + |
| " type = java.lang.String[].class) }) })\n" + |
| " public Forward mybeanmethod() {\n" + |
| " return null;\n" + |
| " }\n" + |
| "}\n" |
| }, |
| ""); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=245435 |
| public void test260() { |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "@X.StringAnnotation(X.CONSTANT_EXPRESSION)\n" + |
| "public class X {\n" + |
| " public @interface StringAnnotation {\n" + |
| " String value();\n" + |
| " }\n" + |
| " public final static String CONSTANT = \"Constant\";\n" + |
| " public final static String CONSTANT_EXPRESSION = CONSTANT + \"Expression\";\n" + |
| "}\n" |
| }, |
| ""); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=239273 |
| public void test261() { |
| Map options = getCompilerOptions(); |
| options.put(CompilerOptions.OPTION_Process_Annotations, CompilerOptions.ENABLED); |
| this.runConformTest( |
| new String[] { |
| "X.java",//===================== |
| "public class X {\n" + |
| " public static void main(String[] args) {\n" + |
| " new Other().foo();\n" + |
| " }\n" + |
| "}\n", |
| "Annot.java",//===================== |
| "public @interface Annot {\n" + |
| " Class value();\n" + |
| "}\n", |
| "Other.java",//===================== |
| "public class Other {\n" + |
| " @Annot(value = Other[].class)\n" + |
| " void foo() {\n" + |
| " System.out.println(\"SUCCESS\");\n" + |
| " }\n" + |
| "}\n" |
| }, |
| "SUCCESS", |
| null, |
| true, |
| null, |
| options, |
| null); |
| this.runConformTest( |
| new String[] { |
| "X.java",//===================== |
| "public class X {\n" + |
| " public static void main(String[] args) {\n" + |
| " new Other().foo();\n" + |
| " }\n" + |
| "}\n", |
| }, |
| "SUCCESS", |
| null, |
| false, |
| null, |
| options, |
| null); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=239273 - variation |
| public void test262() { |
| Map options = getCompilerOptions(); |
| options.put(CompilerOptions.OPTION_Process_Annotations, CompilerOptions.ENABLED); |
| this.runConformTest( |
| new String[] { |
| "X.java",//===================== |
| "public class X {\n" + |
| " public static void main(String[] args) {\n" + |
| " new Other().foo();\n" + |
| " }\n" + |
| "}\n", |
| "Annot.java",//===================== |
| "public @interface Annot {\n" + |
| " String[] values();\n" + |
| "}\n", |
| "Other.java",//===================== |
| "public class Other {\n" + |
| " @Annot(values = {\"foo\",\"bar\"})\n" + |
| " void foo() {\n" + |
| " System.out.println(\"SUCCESS\");\n" + |
| " }\n" + |
| "}\n" |
| }, |
| "SUCCESS", |
| null, |
| true, |
| null, |
| options, |
| null); |
| this.runConformTest( |
| new String[] { |
| "X.java",//===================== |
| "public class X {\n" + |
| " public static void main(String[] args) {\n" + |
| " new Other().foo();\n" + |
| " }\n" + |
| "}\n", |
| }, |
| "SUCCESS", |
| null, |
| false, |
| null, |
| options, |
| null); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=239273 - variation |
| public void test263() { |
| Map options = getCompilerOptions(); |
| options.put(CompilerOptions.OPTION_Process_Annotations, CompilerOptions.ENABLED); |
| this.runConformTest( |
| new String[] { |
| "X.java",//===================== |
| "public class X {\n" + |
| " public static void main(String[] args) {\n" + |
| " new Other().foo();\n" + |
| " }\n" + |
| "}\n", |
| "Annot.java",//===================== |
| "public @interface Annot {\n" + |
| " String[] values();\n" + |
| "}\n", |
| "Other.java",//===================== |
| "public class Other {\n" + |
| " @Annot(values = {\"foo\",\"bar\"})\n" + |
| " void foo() {\n" + |
| " System.out.println(\"SUCCESS\");\n" + |
| " }\n" + |
| "}\n" |
| }, |
| "SUCCESS", |
| null, |
| true, |
| null, |
| options, |
| null); |
| this.runConformTest( |
| new String[] { |
| "X.java",//===================== |
| "public class X {\n" + |
| " public static void main(String[] args) {\n" + |
| " new Other().foo();\n" + |
| " }\n" + |
| "}\n", |
| }, |
| "SUCCESS", |
| null, |
| false, |
| null, |
| options, |
| null); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=256035 |
| public void test264() { |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "@interface Anno {\n" + |
| " String value();\n" + |
| "}\n" + |
| "\n" + |
| "@Anno(X.B)\n" + |
| "public class X {\n" + |
| " public static final String A = \"a\";\n" + |
| " public static final String B = A + \"b\";\n" + |
| "}\n" |
| }, |
| ""); |
| } |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=258906 |
| public void test265() { |
| |
| INameEnvironment nameEnvironment = new FileSystem(Util.getJavaClassLibs(), new String[] {}, null); |
| IErrorHandlingPolicy errorHandlingPolicy = new IErrorHandlingPolicy() { |
| public boolean proceedOnErrors() { return true; } |
| public boolean stopOnFirstError() { return false; } |
| public boolean ignoreAllErrors() { return false; } |
| }; |
| Map options = getCompilerOptions(); |
| options.put(CompilerOptions.OPTION_Process_Annotations, CompilerOptions.ENABLED); |
| CompilerOptions compilerOptions = new CompilerOptions(options); |
| compilerOptions.performMethodsFullRecovery = false; |
| compilerOptions.performStatementsRecovery = false; |
| Requestor requestor = new Requestor(false, null /*no custom requestor*/, false, /* show category */ false /* show warning token*/); |
| requestor.outputPath = "bin/"; |
| IProblemFactory problemFactory = new DefaultProblemFactory(Locale.getDefault()); |
| |
| Compiler compiler = new Compiler(nameEnvironment, errorHandlingPolicy, compilerOptions, requestor, problemFactory); |
| compiler.options.produceReferenceInfo = true; |
| |
| String code = "@javax.xml.bind.annotation.XmlSchema(namespace = \"test\")\npackage testpack;\n"; |
| ICompilationUnit source = new CompilationUnit(code.toCharArray(), "testpack/package-info.java", null); |
| |
| // don't call compile as would be normally expected since that wipes out the lookup environment |
| // before we could query it. Use internal API resolve instead which can run a subset of the |
| // compilation steps for us. |
| |
| compiler.resolve (source, |
| true, // verifyMethods, |
| true, // boolean analyzeCode, |
| false // generateCode |
| ); |
| char [][] compoundName = new char [][] { "testpack".toCharArray(), "package-info".toCharArray()}; |
| ReferenceBinding type = compiler.lookupEnvironment.getType(compoundName); |
| AnnotationBinding[] annotations = null; |
| if (type != null && type.isValidBinding()) { |
| annotations = type.getAnnotations(); |
| } |
| assertTrue ("Annotations missing on package-info interface", annotations != null && annotations.length == 1); |
| assertEquals("Wrong annotation on package-info interface ", "@XmlSchema(namespace = (String)\"test\")", annotations[0].toString()); |
| nameEnvironment.cleanup(); |
| if (requestor.hasErrors) |
| System.err.print(requestor.problemLog); // problem log empty if no problems |
| compiler = null; |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=220311 |
| public void test266() { |
| this.runNegativeTest( |
| new String[] { |
| "p/package-info.java", |
| "@Deprecated\n" + |
| "@Deprecated\n" + |
| "package p;" |
| }, |
| "----------\n" + |
| "1. ERROR in p\\package-info.java (at line 1)\n" + |
| " @Deprecated\n" + |
| " ^^^^^^^^^^^\n" + |
| this.repeatableIntroText + "@Deprecated"+ this.repeatableTrailerText + |
| "----------\n" + |
| "2. ERROR in p\\package-info.java (at line 2)\n" + |
| " @Deprecated\n" + |
| " ^^^^^^^^^^^\n" + |
| this.repeatableIntroText + "@Deprecated"+ this.repeatableTrailerText + |
| "----------\n" |
| ); |
| } |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=261323. |
| // Test to make sure that the use of a static import as an annotation value counts as a use |
| // (and consequently that there is no unused static import warning) |
| public void test267() { |
| Map customOptions = getCompilerOptions(); |
| customOptions.put(CompilerOptions.OPTION_ReportUnusedImport, CompilerOptions.ERROR); |
| customOptions.put(CompilerOptions.OPTION_SuppressWarnings, CompilerOptions.ENABLED); |
| customOptions.put(CompilerOptions.OPTION_ReportUnusedWarningToken, CompilerOptions.ERROR); |
| |
| runNegativeTest( |
| true, |
| new String[] { |
| "com/SomeTest.java", |
| "package com;\n" + |
| "import static com.SomeTest.UNCHECKED;\n" + |
| "@SuppressWarnings(UNCHECKED)\n" + |
| "public class SomeTest {\n" + |
| " public static final String UNCHECKED = \"unchecked\";\n" + |
| "}\n" |
| }, |
| null, customOptions, |
| "----------\n" + |
| "1. ERROR in com\\SomeTest.java (at line 3)\n" + |
| " @SuppressWarnings(UNCHECKED)\n" + |
| " ^^^^^^^^^\n" + |
| "Unnecessary @SuppressWarnings(\"unchecked\")\n" + |
| "----------\n", |
| JavacTestOptions.Excuse.EclipseWarningConfiguredAsError); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=262304 |
| public void test268() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", // ================= |
| "public class X {\n" + |
| " protected enum E {\n" + |
| " E1, E2\n" + |
| " }\n" + |
| " protected @interface Anno1 { E value(); }\n" + |
| " protected @interface Anno2 { E value(); }\n" + |
| " protected @interface Anno3 { E value(); }\n" + |
| " @Anno1(true ? E.E1 : E.E2)\n" + |
| " @Anno2(bar())\n" + |
| " @Anno3(((E.E1)))\n" + |
| " public void foo() {\n" + |
| " }\n" + |
| " public E bar() { return E.E1; }\n" + |
| "}\n", // ================= |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 8)\n" + |
| " @Anno1(true ? E.E1 : E.E2)\n" + |
| " ^^^^^^^^^^^^^^^^^^\n" + |
| "The value for annotation attribute X.Anno1.value must be an enum constant expression\n" + |
| "----------\n" + |
| "2. ERROR in X.java (at line 9)\n" + |
| " @Anno2(bar())\n" + |
| " ^^^^^\n" + |
| "The value for annotation attribute X.Anno2.value must be an enum constant expression\n" + |
| "----------\n"); |
| } |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=274917 |
| public void test269() { |
| Map customOptions = new Hashtable(); |
| String[] warnings = CompilerOptions.warningOptionNames(); |
| for (int i = 0, ceil = warnings.length; i < ceil; i++) { |
| customOptions.put(warnings[i], CompilerOptions.WARNING); |
| } |
| this.runConformTest( |
| true, |
| new String[] { |
| "X.java", |
| "@interface X {}", |
| }, |
| null, |
| customOptions, |
| "----------\n" + |
| "1. WARNING in X.java (at line 1)\n" + |
| " @interface X {}\n" + |
| " ^^\n" + |
| "Empty block should be documented\n" + |
| "----------\n", |
| null, null, |
| JavacTestOptions.Excuse.EclipseHasSomeMoreWarnings); |
| } |
| |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=287009 |
| public void test270() { |
| this.runNegativeTest( |
| new String[] { |
| "Test.java", |
| "public class Test<T> {\n" + |
| " @interface Anno {\n" + |
| " Anno value();\n" + |
| " }\n" + |
| "}\n", |
| }, |
| "----------\n" + |
| "1. ERROR in Test.java (at line 3)\n" + |
| " Anno value();\n" + |
| " ^^^^\n" + |
| "Cycle detected: the annotation type Test.Anno cannot contain attributes of the annotation type itself\n" + |
| "----------\n"); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=289576 |
| public void test271() throws Exception { |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "@interface A {}\n" + |
| "public class X {\n" + |
| " @SuppressWarnings(\"unused\")\n" + |
| " private void foo(@A Object o) {}\n" + |
| "}" |
| }, |
| ""); |
| |
| String expectedOutput = |
| " // Method descriptor #15 (Ljava/lang/Object;)V\n" + |
| " // Stack: 0, Locals: 2\n" + |
| " private void foo(@A java.lang.Object o);\n"; |
| |
| checkDisassembledClassFile(OUTPUT_DIR + File.separator +"X.class", "X", expectedOutput, ClassFileBytesDisassembler.DETAILED); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=289516 |
| public void test272() throws Exception { |
| if (this.complianceLevel != ClassFileConstants.JDK1_5) { |
| return; |
| } |
| Map options = getCompilerOptions(); |
| options.put(CompilerOptions.OPTION_Source, CompilerOptions.VERSION_1_5); |
| options.put(CompilerOptions.OPTION_TargetPlatform, CompilerOptions.VERSION_1_4); |
| options.put(CompilerOptions.OPTION_Compliance, CompilerOptions.VERSION_1_5); |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "@interface A {}\n" + |
| "public class X {\n" + |
| " @SuppressWarnings(\"unused\")\n" + |
| " private void foo(@A Object o) {}\n" + |
| "}" |
| }, |
| "", |
| null, |
| true, |
| null, |
| options, |
| null, |
| true); |
| |
| String expectedOutput = |
| " // Method descriptor #15 (Ljava/lang/Object;)V\n" + |
| " // Stack: 0, Locals: 2\n" + |
| " private void foo(@A java.lang.Object o);\n"; |
| |
| checkDisassembledClassFile(OUTPUT_DIR + File.separator +"X.class", "X", expectedOutput, ClassFileBytesDisassembler.DETAILED); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=289576 |
| public void test273() throws Exception { |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "@interface A {}\n" + |
| "public class X {\n" + |
| " @SuppressWarnings(\"unused\")\n" + |
| " private X(@A Object o) {}\n" + |
| "}" |
| }, |
| ""); |
| |
| String expectedOutput = |
| " // Method descriptor #6 (Ljava/lang/Object;)V\n" + |
| " // Stack: 1, Locals: 2\n" + |
| " private X(@A java.lang.Object o);\n"; |
| |
| checkDisassembledClassFile(OUTPUT_DIR + File.separator +"X.class", "X", expectedOutput, ClassFileBytesDisassembler.DETAILED); |
| } |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=163194 |
| // To check Missing override annotation error when a method implements |
| // and also overrides a method in a superclass |
| public void test274a() { |
| String testString [] = new String[] { |
| "T.java", |
| "public interface T {\n" + |
| " void m();\n" + |
| "}\n" + |
| "abstract class A implements T {\n" + |
| "}\n" + |
| "class B extends A {\n" + |
| " public void m() {}\n" + |
| "}\n" |
| }; |
| Map customOptions = getCompilerOptions(); |
| customOptions.put( |
| CompilerOptions.OPTION_ReportMissingOverrideAnnotation, |
| CompilerOptions.ERROR); |
| customOptions.put( |
| CompilerOptions.OPTION_ReportMissingOverrideAnnotationForInterfaceMethodImplementation, |
| CompilerOptions.ENABLED); |
| if (new CompilerOptions(customOptions).sourceLevel >= ClassFileConstants.JDK1_6) { |
| String expectedOutput = |
| "----------\n" + |
| "1. ERROR in T.java (at line 7)\n" + |
| " public void m() {}\n" + |
| " ^^^\n" + |
| "The method m() of type B should be tagged with @Override since it actually overrides a superinterface method\n" + |
| "----------\n"; |
| this.runNegativeTest( |
| true, |
| testString, |
| null, customOptions, |
| expectedOutput, |
| JavacTestOptions.Excuse.EclipseWarningConfiguredAsError); |
| } else { |
| this.runConformTest( |
| true, testString, |
| null, |
| customOptions, |
| null, |
| null, null, |
| JavacTestOptions.Excuse.EclipseWarningConfiguredAsError); |
| } |
| } |
| |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=163194 |
| // To check Missing override annotation error when a method implements but |
| // doesn't overrides |
| public void test274b() { |
| String testString [] = new String[] { |
| "Over.java", |
| "interface I {\n" + |
| " void m();\n" + |
| "}\n" + |
| "public class Over implements I {\n" + |
| " public void m() {}\n" + |
| "}\n" |
| }; |
| Map customOptions = getCompilerOptions(); |
| customOptions.put( |
| CompilerOptions.OPTION_ReportMissingOverrideAnnotation, |
| CompilerOptions.ERROR); |
| customOptions.put( |
| CompilerOptions.OPTION_ReportMissingOverrideAnnotationForInterfaceMethodImplementation, |
| CompilerOptions.ENABLED); |
| if (new CompilerOptions(customOptions).sourceLevel >= ClassFileConstants.JDK1_6) { |
| String expectedOutput = |
| "----------\n" + |
| "1. ERROR in Over.java (at line 5)\n" + |
| " public void m() {}\n" + |
| " ^^^\n" + |
| "The method m() of type Over should be tagged with @Override since it actually overrides a superinterface method\n" + |
| "----------\n"; |
| this.runNegativeTest( |
| true, |
| testString, |
| null, customOptions, |
| expectedOutput, |
| JavacTestOptions.Excuse.EclipseWarningConfiguredAsError); |
| } else { |
| this.runConformTest( |
| true, testString, |
| null, |
| customOptions, |
| null, |
| null, null, |
| JavacTestOptions.Excuse.EclipseWarningConfiguredAsError); |
| } |
| } |
| |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=163194 |
| // To check Missing override annotation error when a method simply overrides |
| public void test274c() { |
| String testString [] = new String[] { |
| "B.java", |
| "interface A {\n" + |
| " void m();\n" + |
| "}\n" + |
| "public interface B extends A {\n" + |
| " void m();\n" + |
| "}\n" |
| }; |
| Map customOptions = getCompilerOptions(); |
| customOptions.put( |
| CompilerOptions.OPTION_ReportMissingOverrideAnnotation, |
| CompilerOptions.ERROR); |
| customOptions.put( |
| CompilerOptions.OPTION_ReportMissingOverrideAnnotationForInterfaceMethodImplementation, |
| CompilerOptions.ENABLED); |
| if (new CompilerOptions(customOptions).sourceLevel >= ClassFileConstants.JDK1_6) { |
| String expectedOutput = |
| "----------\n" + |
| "1. ERROR in B.java (at line 5)\n" + |
| " void m();\n" + |
| " ^^^\n" + |
| "The method m() of type B should be tagged with @Override since it actually overrides a superinterface method\n" + |
| "----------\n"; |
| this.runNegativeTest( |
| true, |
| testString, |
| null, customOptions, |
| expectedOutput, |
| JavacTestOptions.Excuse.EclipseWarningConfiguredAsError); |
| } else { |
| this.runConformTest( |
| true, testString, |
| null, |
| customOptions, |
| null, |
| null, null, |
| JavacTestOptions.Excuse.EclipseWarningConfiguredAsError); |
| } |
| } |
| |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=163194 |
| // To check missing override annotation if the method has a signature |
| // that is override-equivalent to that of any public method declared in Object. |
| public void test274d() { |
| String testString [] = new String[] { |
| "A.java", |
| "public interface A {\n" + |
| " String toString();\n" + |
| "}\n" |
| }; |
| Map customOptions = getCompilerOptions(); |
| customOptions.put( |
| CompilerOptions.OPTION_ReportMissingOverrideAnnotation, |
| CompilerOptions.ERROR); |
| customOptions.put( |
| CompilerOptions.OPTION_ReportMissingOverrideAnnotationForInterfaceMethodImplementation, |
| CompilerOptions.ENABLED); |
| if (new CompilerOptions(customOptions).sourceLevel >= ClassFileConstants.JDK1_6) { |
| String expectedOutput = |
| "----------\n" + |
| "1. ERROR in A.java (at line 2)\n" + |
| " String toString();\n" + |
| " ^^^^^^^^^^\n" + |
| "The method toString() of type A should be tagged with @Override since it actually overrides a superinterface method\n" + |
| "----------\n"; |
| this.runNegativeTest( |
| true, |
| testString, |
| null, customOptions, |
| expectedOutput, |
| JavacTestOptions.Excuse.EclipseWarningConfiguredAsError); |
| } else { |
| this.runConformTest( |
| true, testString, |
| null, |
| customOptions, |
| null, |
| null, null, |
| JavacTestOptions.Excuse.EclipseWarningConfiguredAsError); |
| } |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=282770. |
| public void test275() { |
| Map customOptions = getCompilerOptions(); |
| customOptions.put(CompilerOptions.OPTION_ReportDeadCodeInTrivialIfStatement, CompilerOptions.ENABLED); |
| |
| runConformTest( |
| true, |
| new String[] { |
| "X.java", |
| "public class X {\n" + |
| " public static final boolean DEBUG = false;\n" + |
| "// @SuppressWarnings(\"unused\")\n" + |
| " public void foo() {\n" + |
| " if (DEBUG)\n" + |
| " System.out.println(\"true\");\n" + |
| " else\n" + |
| " System.out.println(\"false\");\n" + |
| " \n" + |
| " }\n" + |
| "}\n" |
| }, |
| null, |
| customOptions, |
| "----------\n" + |
| "1. WARNING in X.java (at line 6)\n" + |
| " System.out.println(\"true\");\n" + |
| " ^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + |
| "Dead code\n" + |
| "----------\n", |
| "", |
| "", |
| JavacTestOptions.SKIP); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=282770. |
| public void test276() { |
| Map customOptions = getCompilerOptions(); |
| customOptions.put(CompilerOptions.OPTION_ReportDeadCodeInTrivialIfStatement, CompilerOptions.ENABLED); |
| |
| runConformTest( |
| true, |
| new String[] { |
| "X.java", |
| "public class X {\n" + |
| " public static final boolean DEBUG = false;\n" + |
| " @SuppressWarnings(\"unused\")\n" + |
| " public void foo() {\n" + |
| " if (DEBUG)\n" + |
| " System.out.println(\"true\");\n" + |
| " else\n" + |
| " System.out.println(\"false\");\n" + |
| " \n" + |
| " }\n" + |
| "}\n" |
| }, |
| null, |
| customOptions, |
| "", |
| "", |
| "", |
| JavacTestOptions.SKIP); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=282770. |
| public void test277() { |
| Map customOptions = getCompilerOptions(); |
| customOptions.put(CompilerOptions.OPTION_ReportDeadCodeInTrivialIfStatement, CompilerOptions.DISABLED); |
| |
| runConformTest( |
| true, |
| new String[] { |
| "X.java", |
| "public class X {\n" + |
| " public static final boolean DEBUG = false;\n" + |
| " @SuppressWarnings(\"unused\")\n" + |
| " public void foo() {\n" + |
| " if (0 < 1)\n" + |
| " System.out.println(\"true\");\n" + |
| " else\n" + |
| " System.out.println(\"false\");\n" + |
| " \n" + |
| " }\n" + |
| "}\n" |
| }, |
| null, |
| customOptions, |
| "", |
| "", |
| "", |
| JavacTestOptions.SKIP); |
| } |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=293777 |
| // To verify that a misleading warning against @Override annotation is not |
| // issued in case the method signature has not been resolved properly. |
| public void test278() { |
| String testString [] = new String[] { |
| "A.java", |
| "import javax.swing.JComponent;\n" + |
| "public class A extends JComponent {\n" + |
| " @Override\n" + |
| " protected void paintComponent(Graphics g) {" + |
| " }\n" + |
| "}\n" |
| }; |
| String expectedOutput = |
| "----------\n" + |
| "1. WARNING in A.java (at line 2)\n" + |
| " public class A extends JComponent {\n" + |
| " ^\n" + |
| "The serializable class A does not declare a static final serialVersionUID field of type long\n" + |
| "----------\n" + |
| "2. ERROR in A.java (at line 4)\n" + |
| " protected void paintComponent(Graphics g) { }\n" + |
| " ^^^^^^^^\n" + |
| "Graphics cannot be resolved to a type\n" + |
| "----------\n"; |
| this.runNegativeTest( |
| testString, |
| expectedOutput); |
| } |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=301683 |
| public void test279() { |
| String testString [] = new String[] { |
| "A.java", |
| "public class A {\n" + |
| " public @interface Inline {\n" + |
| " String value();\n" + |
| " }\n" + |
| " @Inline(\"foo\")\n" + |
| " public Zork test;\n" + |
| " public native void method();\n" + |
| "}" |
| }; |
| String expectedOutput = |
| "----------\n" + |
| "1. ERROR in A.java (at line 6)\n" + |
| " public Zork test;\n" + |
| " ^^^^\n" + |
| "Zork cannot be resolved to a type\n" + |
| "----------\n"; |
| this.runNegativeTest( |
| testString, |
| expectedOutput); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=295551 |
| public void test280() { |
| Map customOptions = getCompilerOptions(); |
| customOptions.put(CompilerOptions.OPTION_ReportUnusedPrivateMember, CompilerOptions.ERROR); |
| customOptions.put(CompilerOptions.OPTION_SuppressOptionalErrors, CompilerOptions.ENABLED); |
| String testFiles [] = new String[] { |
| "A.java", |
| "public class A {\n" + |
| " @SuppressWarnings(\"unused\")\n" + |
| " private int i;\n" + // problem configured as warning but still suppressed |
| "}\n" |
| }; |
| runConformTest( |
| testFiles, |
| null, |
| null, |
| true, |
| null, |
| customOptions, |
| null); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=295551 |
| public void test281() { |
| Map customOptions = getCompilerOptions(); |
| customOptions.put(CompilerOptions.OPTION_ReportUnusedPrivateMember, CompilerOptions.ERROR); |
| customOptions.put(CompilerOptions.OPTION_SuppressWarnings, CompilerOptions.DISABLED); // this option overrides the next |
| customOptions.put(CompilerOptions.OPTION_SuppressOptionalErrors, CompilerOptions.ENABLED); |
| String testFiles [] = new String[] { |
| "A.java", |
| "public class A {\n" + |
| " @SuppressWarnings(\"unused\")\n" + |
| " private int i;\n" + |
| "}\n" |
| }; |
| String expectedErrorString = |
| "----------\n" + |
| "1. ERROR in A.java (at line 3)\n" + |
| " private int i;\n" + |
| " ^\n" + |
| "The value of the field A.i is not used\n" + |
| "----------\n"; |
| runNegativeTest( |
| true, |
| testFiles, |
| null, |
| customOptions, |
| expectedErrorString, |
| JavacTestOptions.Excuse.EclipseWarningConfiguredAsError); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=295551 |
| public void test282() { |
| Map customOptions = getCompilerOptions(); |
| customOptions.put(CompilerOptions.OPTION_ReportUnusedPrivateMember, CompilerOptions.ERROR); |
| customOptions.put(CompilerOptions.OPTION_SuppressOptionalErrors, CompilerOptions.ENABLED); |
| String testFiles [] = new String[] { |
| "A.java", |
| "import java.util.Map;\n" + |
| "public class A {\n" + |
| " @SuppressWarnings({\"rawtypes\", \"unused\"})\n" + //suppress a warning and an error |
| " private Map i;\n" + |
| "}\n" |
| }; |
| runConformTest( |
| testFiles, |
| null, |
| null, |
| true, |
| null, |
| customOptions, |
| null); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=295551 |
| public void test283() { |
| Map customOptions = getCompilerOptions(); |
| customOptions.put(CompilerOptions.OPTION_ReportUnusedPrivateMember, CompilerOptions.ERROR); |
| customOptions.put(CompilerOptions.OPTION_SuppressOptionalErrors, CompilerOptions.ENABLED); |
| String testFiles [] = new String[] { |
| "A.java", |
| "public class A {\n" + |
| " @SuppressWarnings(\"all\")\n" + |
| " private void i;\n" + // cannot suppress mandatory error |
| "}\n" |
| }; |
| String expectedErrorString = |
| "----------\n" + |
| "1. ERROR in A.java (at line 3)\n" + |
| " private void i;\n" + |
| " ^\n" + |
| "void is an invalid type for the variable i\n" + |
| "----------\n"; |
| runNegativeTest( |
| true, |
| testFiles, |
| null, |
| customOptions, |
| expectedErrorString, |
| JavacTestOptions.SKIP); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=304031 |
| public void test284() { |
| Map customOptions = getCompilerOptions(); |
| customOptions.put(CompilerOptions.OPTION_ReportUnnecessaryTypeCheck, CompilerOptions.WARNING); |
| customOptions.put(CompilerOptions.OPTION_ReportUnusedWarningToken, CompilerOptions.ERROR); |
| customOptions.put(CompilerOptions.OPTION_SuppressOptionalErrors, CompilerOptions.ENABLED); |
| String testFiles [] = new String[] { |
| "X.java", |
| "public class X {\n" + |
| " void m() {\n" + |
| " @SuppressWarnings(\"cast\")\n" + |
| " int i= (int) 0;\n" + |
| " @SuppressWarnings(\"cast\")\n" + |
| " byte b= (byte) i;\n" + |
| " System.out.println(b);\n" + |
| " }\n" + |
| "}" |
| }; |
| String expectedErrorString = |
| "----------\n" + |
| "1. ERROR in X.java (at line 5)\n" + |
| " @SuppressWarnings(\"cast\")\n" + |
| " ^^^^^^\n" + |
| "Unnecessary @SuppressWarnings(\"cast\")\n" + |
| "----------\n"; |
| runNegativeTest( |
| true, |
| testFiles, |
| null, |
| customOptions, |
| expectedErrorString, |
| JavacTestOptions.SKIP); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=304031 |
| public void test285() { |
| Map customOptions = getCompilerOptions(); |
| customOptions.put(CompilerOptions.OPTION_ReportUnnecessaryTypeCheck, CompilerOptions.ERROR); |
| customOptions.put(CompilerOptions.OPTION_ReportUnusedWarningToken, CompilerOptions.ERROR); |
| customOptions.put(CompilerOptions.OPTION_SuppressOptionalErrors, CompilerOptions.ENABLED); |
| String testFiles [] = new String[] { |
| "X.java", |
| "public class X {\n" + |
| " void m() {\n" + |
| " @SuppressWarnings(\"cast\")\n" + |
| " int i= (int) 0;\n" + |
| " @SuppressWarnings(\"cast\")\n" + |
| " byte b= (byte) i;\n" + |
| " System.out.println(b);\n" + |
| " }\n" + |
| "}" |
| }; |
| String expectedErrorString = |
| "----------\n" + |
| "1. ERROR in X.java (at line 5)\n" + |
| " @SuppressWarnings(\"cast\")\n" + |
| " ^^^^^^\n" + |
| "Unnecessary @SuppressWarnings(\"cast\")\n" + |
| "----------\n"; |
| runNegativeTest( |
| true, |
| testFiles, |
| null, |
| customOptions, |
| expectedErrorString, |
| JavacTestOptions.SKIP); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=304031 |
| public void test286() { |
| Map raiseDeprecationReduceInvalidJavadocSeverity = |
| new HashMap(2); |
| raiseDeprecationReduceInvalidJavadocSeverity.put( |
| CompilerOptions.OPTION_ReportDeprecation, CompilerOptions.ERROR); |
| raiseDeprecationReduceInvalidJavadocSeverity.put( |
| CompilerOptions.OPTION_SuppressOptionalErrors, CompilerOptions.ENABLED); |
| raiseDeprecationReduceInvalidJavadocSeverity.put( |
| CompilerOptions.OPTION_ReportInvalidJavadoc, CompilerOptions.WARNING); |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "@SuppressWarnings(\"deprecation\")\n" + |
| "public class X extends p.OldStuff {\n" + |
| " /**\n" + |
| " * @see p.OldStuff#foo()\n" + |
| " */\n" + |
| " @Override\n" + |
| " public void foo() {\n" + |
| " super.foo();\n" + |
| " }\n" + |
| "}\n", |
| "p/OldStuff.java", |
| "package p;\n" + |
| "@Deprecated\n" + |
| "public class OldStuff {\n" + |
| " public void foo() {\n" + |
| " } \n" + |
| "}\n", |
| }, |
| "", |
| null, |
| true, |
| null, |
| raiseDeprecationReduceInvalidJavadocSeverity, |
| null); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=311849 |
| public void test287() { |
| Map options = getCompilerOptions(); |
| options.put(CompilerOptions.OPTION_ReportUncheckedTypeOperation, CompilerOptions.ERROR); |
| options.put(CompilerOptions.OPTION_SuppressOptionalErrors, CompilerOptions.ENABLED); |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "import java.util.ArrayList;\n" + |
| "\n" + |
| "public class X {\n" + |
| " @SuppressWarnings(\"rawtypes\")\n" + |
| " void foo(ArrayList arg) {\n" + |
| " for (\n" + |
| " @SuppressWarnings(\"unchecked\")\n" + |
| " boolean a= arg.add(1), b= arg.add(1);\n" + |
| " Boolean.FALSE;\n" + |
| " ) {\n" + |
| " System.out.println(a && b);\n" + |
| " }\n" + |
| " }\n" + |
| "}", |
| }, |
| "", |
| null, |
| true, |
| null, |
| options, |
| null); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=311849 |
| public void test288() { |
| Map options = getCompilerOptions(); |
| options.put(CompilerOptions.OPTION_ReportUncheckedTypeOperation, CompilerOptions.ERROR); |
| options.put(CompilerOptions.OPTION_SuppressOptionalErrors, CompilerOptions.ENABLED); |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "import java.util.ArrayList;\n" + |
| "\n" + |
| "public class X {\n" + |
| " @SuppressWarnings(\"rawtypes\")\n" + |
| " ArrayList arg;\n" + |
| " @SuppressWarnings(\"unchecked\")\n" + |
| " boolean a= arg.add(1), b= arg.add(1);\n" + |
| "}", |
| }, |
| "", |
| null, |
| true, |
| null, |
| options, |
| null); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=311849 |
| public void test289() { |
| Map options = getCompilerOptions(); |
| options.put(CompilerOptions.OPTION_ReportUncheckedTypeOperation, CompilerOptions.ERROR); |
| options.put(CompilerOptions.OPTION_ReportRawTypeReference, CompilerOptions.IGNORE); |
| options.put(CompilerOptions.OPTION_SuppressOptionalErrors, CompilerOptions.ENABLED); |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "import java.util.ArrayList;\n" + |
| "\n" + |
| "public class X {\n" + |
| " void foo(ArrayList arg) {\n" + |
| " for (\n" + |
| " @Deprecated\n" + |
| " @Other\n" + |
| " @SuppressWarnings(\"unchecked\")\n" + |
| " boolean a= arg.add(1), b= arg.add(1);\n" + |
| " Boolean.FALSE;\n" + |
| " ) {\n" + |
| " System.out.println(a && b);\n" + |
| " }\n" + |
| " }\n" + |
| "}", |
| "Other.java", |
| "@interface Other {}" |
| }, |
| "", |
| null, |
| true, |
| null, |
| options, |
| null); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=313109 |
| public void test290() { |
| Map options = getCompilerOptions(); |
| options.put(CompilerOptions.OPTION_ReportUncheckedTypeOperation, CompilerOptions.ERROR); |
| options.put(CompilerOptions.OPTION_ReportRawTypeReference, CompilerOptions.ERROR); |
| options.put(CompilerOptions.OPTION_SuppressOptionalErrors, CompilerOptions.ENABLED); |
| options.put(CompilerOptions.OPTION_ReportUnusedWarningToken, CompilerOptions.ERROR); |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "import java.util.ArrayList;\n" + |
| "class X {\n" + |
| " @SuppressWarnings(\"rawtypes\")\n" + |
| " void foo(ArrayList arg) {\n" + |
| " @SuppressWarnings(\"unchecked\")\n" + |
| " boolean aa = arg.add(1), bb = arg.add(1);\n" + |
| " if (bb)\n" + |
| " System.out.println(\"hi\");\n" + |
| " }\n" + |
| "}" |
| }, |
| "", |
| null, |
| true, |
| null, |
| options, |
| null); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=313109 |
| public void test291() { |
| Map options = getCompilerOptions(); |
| options.put(CompilerOptions.OPTION_ReportUncheckedTypeOperation, CompilerOptions.ERROR); |
| options.put(CompilerOptions.OPTION_ReportRawTypeReference, CompilerOptions.ERROR); |
| options.put(CompilerOptions.OPTION_SuppressOptionalErrors, CompilerOptions.ENABLED); |
| options.put(CompilerOptions.OPTION_ReportUnusedWarningToken, CompilerOptions.ERROR); |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "import java.util.ArrayList;\n" + |
| "class X {\n" + |
| " @SuppressWarnings(\"rawtypes\")\n" + |
| " void foo(ArrayList arg) {\n" + |
| " @SuppressWarnings(\"unchecked\")\n" + |
| " boolean aa = arg.add(1), bb = arg.add(1);\n" + |
| " if (aa)\n" + |
| " System.out.println(\"hi\");\n" + |
| " }\n" + |
| "}" |
| }, |
| "", |
| null, |
| true, |
| null, |
| options, |
| null); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=313109 |
| public void test292() { |
| Map options = getCompilerOptions(); |
| options.put(CompilerOptions.OPTION_ReportUncheckedTypeOperation, CompilerOptions.ERROR); |
| options.put(CompilerOptions.OPTION_ReportRawTypeReference, CompilerOptions.ERROR); |
| options.put(CompilerOptions.OPTION_SuppressOptionalErrors, CompilerOptions.ENABLED); |
| options.put(CompilerOptions.OPTION_ReportUnusedWarningToken, CompilerOptions.ERROR); |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "import java.util.ArrayList;\n" + |
| "class X {\n" + |
| " @SuppressWarnings(\"rawtypes\")\n" + |
| " void foo(ArrayList arg) {\n" + |
| " @SuppressWarnings(\"unchecked\")\n" + |
| " boolean aa = arg.add(1), bb = arg.add(1);\n" + |
| " }\n" + |
| "}" |
| }, |
| "", |
| null, |
| true, |
| null, |
| options, |
| null); |
| } |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=316456 |
| public void test293() { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "@A(name = X.QUERY_NAME, query = X.QUERY)\n" + |
| "public class X {\n" + |
| " public static final String QUERY_NAME = \"client.query.name\";\n" + |
| " private static final String QUERY = \"from Client\";\n" + |
| "}\n" + |
| "@interface A{\n" + |
| " String name();\n" + |
| " String query();\n" + |
| "}\n" |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 1)\n" + |
| " @A(name = X.QUERY_NAME, query = X.QUERY)\n" + |
| " ^^^^^\n" + |
| "The field X.QUERY is not visible\n" + |
| "----------\n"); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=179566 |
| public void test294() { |
| Map customOptions = getCompilerOptions(); |
| customOptions.put(CompilerOptions.OPTION_ReportInvalidJavadoc, CompilerOptions.ERROR); |
| customOptions.put(CompilerOptions.OPTION_ReportMissingJavadocTags, CompilerOptions.ERROR); |
| customOptions.put(CompilerOptions.OPTION_ReportMissingJavadocComments, CompilerOptions.ERROR); |
| customOptions.put(CompilerOptions.OPTION_SuppressOptionalErrors, CompilerOptions.ENABLED); |
| String testFiles [] = new String[] { |
| "A.java", |
| "/** */\n" + |
| "public class A {\n" + |
| " @SuppressWarnings(\"javadoc\")\n" + |
| " public int foo(int i) { return 0; }\n" + |
| "}\n" |
| }; |
| runConformTest( |
| testFiles, |
| null, |
| null, |
| true, |
| null, |
| customOptions, |
| null); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=179566 |
| public void test295() { |
| Map customOptions = getCompilerOptions(); |
| customOptions.put(CompilerOptions.OPTION_ReportInvalidJavadoc, CompilerOptions.ERROR); |
| customOptions.put(CompilerOptions.OPTION_ReportMissingJavadocTags, CompilerOptions.ERROR); |
| customOptions.put(CompilerOptions.OPTION_ReportMissingJavadocComments, CompilerOptions.ERROR); |
| customOptions.put(CompilerOptions.OPTION_SuppressOptionalErrors, CompilerOptions.ENABLED); |
| String testFiles [] = new String[] { |
| "A.java", |
| "/** */\n" + |
| "public class A {\n" + |
| " /**\n" + |
| " * @param j the given param/\n" + |
| " */\n" + |
| " @SuppressWarnings(\"javadoc\")\n" + |
| " public int foo(int i) { return 0; }\n" + |
| "}\n" |
| }; |
| runConformTest( |
| testFiles, |
| null, |
| null, |
| true, |
| null, |
| customOptions, |
| null); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=179566 |
| public void test296() { |
| Map customOptions = getCompilerOptions(); |
| customOptions.put(CompilerOptions.OPTION_ReportInvalidJavadoc, CompilerOptions.ERROR); |
| customOptions.put(CompilerOptions.OPTION_ReportMissingJavadocTags, CompilerOptions.ERROR); |
| customOptions.put(CompilerOptions.OPTION_ReportMissingJavadocComments, CompilerOptions.ERROR); |
| customOptions.put(CompilerOptions.OPTION_SuppressOptionalErrors, CompilerOptions.ENABLED); |
| String testFiles [] = new String[] { |
| "A.java", |
| "/** */\n" + |
| "public class A {\n" + |
| " /**\n" + |
| " * @param i/\n" + |
| " */\n" + |
| " @SuppressWarnings(\"javadoc\")\n" + |
| " public int foo(int i) { return 0; }\n" + |
| "}\n" |
| }; |
| runConformTest( |
| testFiles, |
| null, |
| null, |
| true, |
| null, |
| customOptions, |
| null); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=343621 |
| public void test297() { |
| Runner runner = new Runner(); |
| runner.customOptions = getCompilerOptions(); |
| runner.customOptions.put(CompilerOptions.OPTION_SuppressWarnings, CompilerOptions.ENABLED); |
| runner.customOptions.put(CompilerOptions.OPTION_ReportUnhandledWarningToken, CompilerOptions.WARNING); |
| runner.customOptions.put(CompilerOptions.OPTION_SuppressOptionalErrors, CompilerOptions.ENABLED); |
| runner.customOptions.put(CompilerOptions.OPTION_ReportUnusedLocal, CompilerOptions.WARNING); |
| runner.customOptions.put(CompilerOptions.OPTION_ReportComparingIdentical, CompilerOptions.ERROR); |
| runner.customOptions.put(CompilerOptions.OPTION_ReportUncheckedTypeOperation, CompilerOptions.ERROR); |
| |
| runner.expectedCompilerLog = |
| "----------\n" + |
| "1. ERROR in A.java (at line 15)\n" + |
| " return i == i;\n" + |
| " ^^^^^^\n" + |
| "Comparing identical expressions\n" + |
| "----------\n"; |
| |
| if (this.complianceLevel >= ClassFileConstants.JDK1_7) { |
| runner.expectedCompilerLog = |
| "----------\n" + |
| "1. ERROR in A.java (at line 10)\n" + |
| " public final Object build(Class<? super Object>... objects) {\n" + |
| " ^^^^^^^\n" + |
| "Type safety: Potential heap pollution via varargs parameter objects\n" + |
| "----------\n" + |
| "2. ERROR in A.java (at line 15)\n" + |
| " return i == i;\n" + |
| " ^^^^^^\n" + |
| "Comparing identical expressions\n" + |
| "----------\n"; |
| } |
| runner.testFiles = new String[] { |
| "A.java", |
| "public class A {\n" + |
| " public void one() {\n" + |
| " @SuppressWarnings(\"unused\")\n" + |
| " Object object = new Object();\n" + |
| " }\n" + |
| " public void two() {\n" + |
| " @SuppressWarnings({ \"unchecked\", \"unused\" })\n" + |
| " Object object = build();\n" + |
| " }\n" + |
| " public final Object build(Class<? super Object>... objects) {\n" + |
| " return null;\n" + |
| " }\n" + |
| " public boolean bar() {\n" + |
| " int i = 0;\n" + |
| " return i == i;\n" + |
| " }\n" + |
| "}" |
| }; |
| runner.javacTestOptions = JavacTestOptions.Excuse.EclipseWarningConfiguredAsError; |
| runner.runNegativeTest(); |
| } |
| // Bug 366003 - CCE in ASTNode.resolveAnnotations(ASTNode.java:639) |
| // many syntax errors fixed, does not trigger CCE |
| public void testBug366003() { |
| runNegativeTest( |
| new String[] { |
| "snippet/Bug366003.java", |
| "package snippet;\n" + |
| "public class Bug366003 {\n" + |
| " public void foo(@NonNull Object o1) {\n" + |
| " System.out.println(o1.toString()); // OK: o1 cannot be null\n" + |
| " } \n" + |
| " @NonNull Object bar(@Nullable String s1) {\n" + |
| " foo(null); // cannot pass null argument\n" + |
| " @NonNull String s= null; // cannot assign null value\n" + |
| " @NonNull String t= s1; // cannot assign potentially null value\n" + |
| " return null; // cannot return null value\n" + |
| " }\n" + |
| "}\n" + |
| "org.eclipse.User.User(@NonNull String name, int uid, @Nullable String email)\n" + |
| "" |
| }, |
| "----------\n" + |
| "1. ERROR in snippet\\Bug366003.java (at line 3)\n" + |
| " public void foo(@NonNull Object o1) {\n" + |
| " ^^^^^^^\n" + |
| "NonNull cannot be resolved to a type\n" + |
| "----------\n" + |
| "2. ERROR in snippet\\Bug366003.java (at line 6)\n" + |
| " @NonNull Object bar(@Nullable String s1) {\n" + |
| " ^^^^^^^\n" + |
| "NonNull cannot be resolved to a type\n" + |
| "----------\n" + |
| "3. ERROR in snippet\\Bug366003.java (at line 6)\n" + |
| " @NonNull Object bar(@Nullable String s1) {\n" + |
| " ^^^^^^^^\n" + |
| "Nullable cannot be resolved to a type\n" + |
| "----------\n" + |
| "4. ERROR in snippet\\Bug366003.java (at line 8)\n" + |
| " @NonNull String s= null; // cannot assign null value\n" + |
| " ^^^^^^^\n" + |
| "NonNull cannot be resolved to a type\n" + |
| "----------\n" + |
| "5. ERROR in snippet\\Bug366003.java (at line 9)\n" + |
| " @NonNull String t= s1; // cannot assign potentially null value\n" + |
| " ^^^^^^^\n" + |
| "NonNull cannot be resolved to a type\n" + |
| "----------\n" + |
| "6. ERROR in snippet\\Bug366003.java (at line 12)\n" + |
| " }\n" + |
| " ^\n" + |
| "Syntax error on token \"}\", delete this token\n" + |
| "----------\n" + |
| "7. ERROR in snippet\\Bug366003.java (at line 13)\n" + |
| " org.eclipse.User.User(@NonNull String name, int uid, @Nullable String email)\n" + |
| " ^^^^\n" + |
| "Syntax error, insert \"Identifier (\" to complete MethodHeaderName\n" + |
| "----------\n" + |
| "8. ERROR in snippet\\Bug366003.java (at line 13)\n" + |
| " org.eclipse.User.User(@NonNull String name, int uid, @Nullable String email)\n" + |
| " ^^^^\n" + |
| "Syntax error, insert \")\" to complete MethodDeclaration\n" + |
| "----------\n" + |
| "9. ERROR in snippet\\Bug366003.java (at line 13)\n" + |
| " org.eclipse.User.User(@NonNull String name, int uid, @Nullable String email)\n" + |
| " ^^^^\n" + |
| "Syntax error, insert \";\" to complete MethodDeclaration\n" + |
| "----------\n" + |
| "10. ERROR in snippet\\Bug366003.java (at line 13)\n" + |
| " org.eclipse.User.User(@NonNull String name, int uid, @Nullable String email)\n" + |
| " ^^^^\n" + |
| "Syntax error, insert \"}\" to complete ClassBody\n" + |
| "----------\n" + |
| "11. ERROR in snippet\\Bug366003.java (at line 13)\n" + |
| " org.eclipse.User.User(@NonNull String name, int uid, @Nullable String email)\n" + |
| " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + |
| "Return type for the method is missing\n" + |
| "----------\n" + |
| "12. ERROR in snippet\\Bug366003.java (at line 13)\n" + |
| " org.eclipse.User.User(@NonNull String name, int uid, @Nullable String email)\n" + |
| " ^^^^^^^\n" + |
| "NonNull cannot be resolved to a type\n" + |
| "----------\n" + |
| "13. ERROR in snippet\\Bug366003.java (at line 13)\n" + |
| " org.eclipse.User.User(@NonNull String name, int uid, @Nullable String email)\n" + |
| " ^^^^^^^^\n" + |
| "Nullable cannot be resolved to a type\n" + |
| "----------\n" + |
| "14. ERROR in snippet\\Bug366003.java (at line 13)\n" + |
| " org.eclipse.User.User(@NonNull String name, int uid, @Nullable String email)\n" + |
| " ^\n" + |
| "Syntax error, insert \";\" to complete ConstructorDeclaration\n" + |
| "----------\n"); |
| } |
| // Bug 366003 - CCE in ASTNode.resolveAnnotations(ASTNode.java:639) |
| // code is garbage, triggers CCE |
| public void testBug366003b() { |
| runNegativeTest( |
| new String[] { |
| "snippet/Bug366003.java", |
| "package snippet;\n" + |
| "public class Bug366003 {\n" + |
| " public void foo(@Blah Object o1) { \n" + |
| "System.out.println(o1.toString()); // OK: o1 cannot be null } \n" + |
| "@Blah Object bar(@BlahBlah String s1) { foo(null); // cannot pass\n" + |
| "null argument @Blah String s= null; // cannot assign null value \n" + |
| " @Blah String t= s1; // cannot assign potentially null value \n" + |
| "return null; // cannot return null value }\n" + |
| "}\n" + |
| "\n" + |
| "org.eclipse.User.User(@NonNull String name, int uid, @Nullable String email)\n" + |
| "" |
| }, |
| "----------\n" + |
| "1. ERROR in snippet\\Bug366003.java (at line 3)\n" + |
| " public void foo(@Blah Object o1) { \n" + |
| " ^^^^\n" + |
| "Blah cannot be resolved to a type\n" + |
| "----------\n" + |
| "2. ERROR in snippet\\Bug366003.java (at line 4)\n" + |
| " System.out.println(o1.toString()); // OK: o1 cannot be null } \n" + |
| " ^\n" + |
| "Syntax error, insert \"}\" to complete MethodBody\n" + |
| "----------\n" + |
| "3. ERROR in snippet\\Bug366003.java (at line 5)\n" + |
| " @Blah Object bar(@BlahBlah String s1) { foo(null); // cannot pass\n" + |
| " ^^^^\n" + |
| "Blah cannot be resolved to a type\n" + |
| "----------\n" + |
| "4. ERROR in snippet\\Bug366003.java (at line 5)\n" + |
| " @Blah Object bar(@BlahBlah String s1) { foo(null); // cannot pass\n" + |
| " ^^^^^^^^\n" + |
| "BlahBlah cannot be resolved to a type\n" + |
| "----------\n" + |
| "5. ERROR in snippet\\Bug366003.java (at line 6)\n" + |
| " null argument @Blah String s= null; // cannot assign null value \n" + |
| " ^^^^\n" + |
| "Syntax error on token \"null\", @ expected\n" + |
| "----------\n" + |
| "6. ERROR in snippet\\Bug366003.java (at line 11)\n" + |
| " org.eclipse.User.User(@NonNull String name, int uid, @Nullable String email)\n" + |
| " ^^^^\n" + |
| "Syntax error, insert \"Identifier (\" to complete MethodHeaderName\n" + |
| "----------\n" + |
| "7. ERROR in snippet\\Bug366003.java (at line 11)\n" + |
| " org.eclipse.User.User(@NonNull String name, int uid, @Nullable String email)\n" + |
| " ^^^^\n" + |
| "Syntax error, insert \")\" to complete MethodDeclaration\n" + |
| "----------\n" + |
| "8. ERROR in snippet\\Bug366003.java (at line 11)\n" + |
| " org.eclipse.User.User(@NonNull String name, int uid, @Nullable String email)\n" + |
| " ^^^^\n" + |
| "Syntax error, insert \";\" to complete MethodDeclaration\n" + |
| "----------\n" + |
| "9. ERROR in snippet\\Bug366003.java (at line 11)\n" + |
| " org.eclipse.User.User(@NonNull String name, int uid, @Nullable String email)\n" + |
| " ^^^^\n" + |
| "Syntax error, insert \"}\" to complete ClassBody\n" + |
| "----------\n" + |
| "10. ERROR in snippet\\Bug366003.java (at line 11)\n" + |
| " org.eclipse.User.User(@NonNull String name, int uid, @Nullable String email)\n" + |
| " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + |
| "Return type for the method is missing\n" + |
| "----------\n" + |
| "11. ERROR in snippet\\Bug366003.java (at line 11)\n" + |
| " org.eclipse.User.User(@NonNull String name, int uid, @Nullable String email)\n" + |
| " ^^^^^^^\n" + |
| "NonNull cannot be resolved to a type\n" + |
| "----------\n" + |
| "12. ERROR in snippet\\Bug366003.java (at line 11)\n" + |
| " org.eclipse.User.User(@NonNull String name, int uid, @Nullable String email)\n" + |
| " ^^^^^^^^\n" + |
| "Nullable cannot be resolved to a type\n" + |
| "----------\n" + |
| "13. ERROR in snippet\\Bug366003.java (at line 11)\n" + |
| " org.eclipse.User.User(@NonNull String name, int uid, @Nullable String email)\n" + |
| " ^\n" + |
| "Syntax error, insert \";\" to complete ConstructorDeclaration\n" + |
| "----------\n"); |
| } |
| // Bug 366003 - CCE in ASTNode.resolveAnnotations(ASTNode.java:639) |
| // minimal syntax error to trigger CCE |
| public void testBug366003c() { |
| runNegativeTest( |
| new String[] { |
| "snippet/Bug366003.java", |
| "package snippet;\n" + |
| "public class Bug366003 {\n" + |
| " void foo(Object o1) {\n" + |
| " }\n" + |
| "org.User(@Bla String a)" |
| }, |
| "----------\n" + |
| "1. ERROR in snippet\\Bug366003.java (at line 5)\n" + |
| " org.User(@Bla String a)\n" + |
| " ^^^\n" + |
| "Syntax error, insert \"Identifier (\" to complete MethodHeaderName\n" + |
| "----------\n" + |
| "2. ERROR in snippet\\Bug366003.java (at line 5)\n" + |
| " org.User(@Bla String a)\n" + |
| " ^^^\n" + |
| "Syntax error, insert \")\" to complete MethodDeclaration\n" + |
| "----------\n" + |
| "3. ERROR in snippet\\Bug366003.java (at line 5)\n" + |
| " org.User(@Bla String a)\n" + |
| " ^^^\n" + |
| "Syntax error, insert \";\" to complete MethodDeclaration\n" + |
| "----------\n" + |
| "4. ERROR in snippet\\Bug366003.java (at line 5)\n" + |
| " org.User(@Bla String a)\n" + |
| " ^^^\n" + |
| "Syntax error, insert \"}\" to complete ClassBody\n" + |
| "----------\n" + |
| "5. ERROR in snippet\\Bug366003.java (at line 5)\n" + |
| " org.User(@Bla String a)\n" + |
| " ^^^^^^^^^^^^^^^^^^^\n" + |
| "Return type for the method is missing\n" + |
| "----------\n" + |
| "6. ERROR in snippet\\Bug366003.java (at line 5)\n" + |
| " org.User(@Bla String a)\n" + |
| " ^^^\n" + |
| "Bla cannot be resolved to a type\n" + |
| "----------\n" + |
| "7. ERROR in snippet\\Bug366003.java (at line 5)\n" + |
| " org.User(@Bla String a)\n" + |
| " ^\n" + |
| "Syntax error, insert \";\" to complete ConstructorDeclaration\n" + |
| "----------\n"); |
| } |
| // unfinished attempt to trigger the same CCE via catch formal parameters |
| public void testBug366003d() { |
| runNegativeTest( |
| new String[] { |
| "snippet/Bug366003.java", |
| "package snippet; \n" + |
| "public class Bug366003 {\n" + |
| " void foo() {\n" + |
| " try {\n" + |
| " System.out.println(\"\");\n" + |
| " } catch (Exeption eFirst) {\n" + |
| " e } catch (@Blah Exception eSecond) {\n" + |
| " e }\n" + |
| " }\n" + |
| "}\n" |
| }, |
| "----------\n" + |
| "1. ERROR in snippet\\Bug366003.java (at line 7)\n" + |
| " e } catch (@Blah Exception eSecond) {\n" + |
| " ^\n" + |
| "Syntax error, insert \"VariableDeclarators\" to complete LocalVariableDeclaration\n" + |
| "----------\n" + |
| "2. ERROR in snippet\\Bug366003.java (at line 7)\n" + |
| " e } catch (@Blah Exception eSecond) {\n" + |
| " ^\n" + |
| "Syntax error, insert \";\" to complete BlockStatements\n" + |
| "----------\n" + |
| "3. ERROR in snippet\\Bug366003.java (at line 8)\n" + |
| " e }\n" + |
| " ^\n" + |
| "Syntax error, insert \"VariableDeclarators\" to complete LocalVariableDeclaration\n" + |
| "----------\n" + |
| "4. ERROR in snippet\\Bug366003.java (at line 8)\n" + |
| " e }\n" + |
| " ^\n" + |
| "Syntax error, insert \";\" to complete BlockStatements\n" + |
| "----------\n"); |
| } |
| public void testBug366003e() { |
| runNegativeTest( |
| new String[] { |
| "snippet/Bug366003.java", |
| "package snippet;\n" + |
| "public class Bug366003 {\n" + |
| " void foo(Object o1){}\n" + |
| " @Blah org.User(@Bla String str){}\n" + |
| "}\n" |
| }, |
| "----------\n" + |
| "1. ERROR in snippet\\Bug366003.java (at line 4)\n" + |
| " @Blah org.User(@Bla String str){}\n" + |
| " ^^^^\n" + |
| "Blah cannot be resolved to a type\n" + |
| "----------\n" + |
| "2. ERROR in snippet\\Bug366003.java (at line 4)\n" + |
| " @Blah org.User(@Bla String str){}\n" + |
| " ^^^^\n" + |
| "Syntax error on token \"User\", Identifier expected after this token\n" + |
| "----------\n" + |
| "3. ERROR in snippet\\Bug366003.java (at line 4)\n" + |
| " @Blah org.User(@Bla String str){}\n" + |
| " ^^^^^^^^^^^^^^^^^^^^^\n" + |
| "Return type for the method is missing\n" + |
| "----------\n" + |
| "4. ERROR in snippet\\Bug366003.java (at line 4)\n" + |
| " @Blah org.User(@Bla String str){}\n" + |
| " ^^^\n" + |
| "Bla cannot be resolved to a type\n" + |
| "----------\n"); |
| } |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=365437 |
| public void testBug365437a() { |
| Map customOptions = getCompilerOptions(); |
| enableAllWarningsForIrritants(customOptions, IrritantSet.NULL); |
| customOptions.put(CompilerOptions.OPTION_ReportUnusedPrivateMember, CompilerOptions.ERROR); |
| String testFiles [] = new String[] { |
| "p/A.java", |
| "package p;\n" + |
| "import p1.*;\n" + |
| "public class A {\n" + |
| " @p1.PreDestroy\n" + |
| " private void foo1(){}\n" + |
| " @PreDestroy\n" + |
| " private void foo2(){}\n" + |
| " @SuppressWarnings(\"null\")\n" + |
| " @PostConstruct\n" + |
| " private void foo1a(){}\n" + |
| " @PostConstruct\n" + |
| " private void foo2a(){}\n" + |
| " @Deprecated" + |
| " private void foo3(){}" + |
| "}\n", |
| "p1/PreDestroy.java", |
| "package p1;\n" + |
| "public @interface PreDestroy{}", |
| "p1/PostConstruct.java", |
| "package p1;\n" + |
| "public @interface PostConstruct{}" |
| }; |
| String expectedErrorString = |
| "----------\n" + |
| "1. WARNING in p\\A.java (at line 8)\n" + |
| " @SuppressWarnings(\"null\")\n" + |
| " ^^^^^^\n" + |
| "Unnecessary @SuppressWarnings(\"null\")\n" + |
| "----------\n" + |
| "2. ERROR in p\\A.java (at line 13)\n" + |
| " @Deprecated private void foo3(){}}\n" + |
| " ^^^^^^\n" + |
| "The method foo3() from the type A is never used locally\n" + |
| "----------\n"; |
| runNegativeTest( |
| true, |
| testFiles, |
| null, |
| customOptions, |
| expectedErrorString, |
| JavacTestOptions.Excuse.EclipseWarningConfiguredAsError); |
| } |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=365437 |
| public void testBug365437b() { |
| if (isJRE11Plus) |
| return; |
| Map customOptions = getCompilerOptions(); |
| customOptions.put(CompilerOptions.OPTION_ReportUnusedPrivateMember, CompilerOptions.ERROR); |
| customOptions.put(CompilerOptions.OPTION_AnnotationBasedNullAnalysis, CompilerOptions.ENABLED); |
| customOptions.put(CompilerOptions.OPTION_NonNullAnnotationName, "p.NonNull"); |
| String testFiles [] = new String[] { |
| "A.java", |
| "import javax.annotation.*;\n" + |
| "public class A {\n" + |
| " @javax.annotation.PreDestroy\n" + |
| " private void foo1(){}\n" + |
| " @PreDestroy\n" + |
| " private void foo2(){}\n" + |
| " @javax.annotation.Resource\n" + |
| " private void foo1a(){}\n" + |
| " @Resource\n" + |
| " @p.NonNull\n" + |
| " private Object foo2a(){ return new Object();}\n" + |
| " @javax.annotation.PostConstruct\n" + |
| " @Deprecated\n" + |
| " private void foo3(){}\n" + |
| " @p.NonNull\n" + |
| " private Object foo3a(){ return new Object();}\n" + |
| "}\n", |
| "p/NonNull.java", |
| "package p;\n" + |
| "import static java.lang.annotation.ElementType.*;\n" + |
| "import java.lang.annotation.*;\n" + |
| "@Target({TYPE, METHOD,PARAMETER,LOCAL_VARIABLE})\n" + |
| "public @interface NonNull {\n" + |
| "}" |
| }; |
| String expectedErrorString = |
| "----------\n" + |
| "1. ERROR in A.java (at line 16)\n" + |
| " private Object foo3a(){ return new Object();}\n" + |
| " ^^^^^^^\n" + |
| "The method foo3a() from the type A is never used locally\n" + |
| "----------\n"; |
| INameEnvironment save = this.javaClassLib; |
| try { |
| if (isJRE9Plus) { |
| List<String> limitModules = Arrays.asList("java.se", "java.xml.ws.annotation"); |
| this.javaClassLib = new CustomFileSystem(limitModules); |
| } |
| runNegativeTest( |
| true, |
| testFiles, |
| null, |
| customOptions, |
| expectedErrorString, |
| isJRE9Plus ? JavacTestOptions.SKIP : JavacTestOptions.Excuse.EclipseWarningConfiguredAsError); // javac9+ cannot access javax.annotation |
| } finally { |
| this.javaClassLib = save; |
| } |
| } |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=365437 |
| // @SafeVarargs |
| public void testBug365437c() { |
| if (this.complianceLevel < ClassFileConstants.JDK1_7) return; |
| Map customOptions = getCompilerOptions(); |
| enableAllWarningsForIrritants(customOptions, IrritantSet.NULL); |
| customOptions.put(CompilerOptions.OPTION_ReportUnusedPrivateMember, CompilerOptions.ERROR); |
| String testFiles [] = new String[] { |
| "p/A.java", |
| "package p;\n" + |
| "import p1.*;\n" + |
| "public class A {\n" + |
| " @p1.PreDestroy\n" + |
| " private void foo1(){}\n" + |
| " @PreDestroy\n" + |
| " private void foo2(){}\n" + |
| " @SuppressWarnings(\"null\")\n" + |
| " @PostConstruct\n" + |
| " private void foo1a(){}\n" + |
| " @PostConstruct\n" + |
| " private void foo2a(){}\n" + |
| " @SafeVarargs" + |
| " private final void foo3(Object... o){}" + |
| "}\n", |
| "p1/PreDestroy.java", |
| "package p1;\n" + |
| "public @interface PreDestroy{}", |
| "p1/PostConstruct.java", |
| "package p1;\n" + |
| "public @interface PostConstruct{}" |
| }; |
| String expectedErrorString = |
| "----------\n" + |
| "1. WARNING in p\\A.java (at line 8)\n" + |
| " @SuppressWarnings(\"null\")\n" + |
| " ^^^^^^\n" + |
| "Unnecessary @SuppressWarnings(\"null\")\n" + |
| "----------\n" + |
| "2. ERROR in p\\A.java (at line 13)\n" + |
| " @SafeVarargs private final void foo3(Object... o){}}\n" + |
| " ^^^^^^^^^^^^^^^^^\n" + |
| "The method foo3(Object...) from the type A is never used locally\n" + |
| "----------\n"; |
| runNegativeTest( |
| true, |
| testFiles, |
| null, |
| customOptions, |
| expectedErrorString, |
| JavacTestOptions.Excuse.EclipseWarningConfiguredAsError); |
| } |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=365437 |
| // unused constructor |
| public void testBug365437d() { |
| Map customOptions = getCompilerOptions(); |
| enableAllWarningsForIrritants(customOptions, IrritantSet.NULL); |
| customOptions.put(CompilerOptions.OPTION_ReportUnusedPrivateMember, CompilerOptions.ERROR); |
| customOptions.put(CompilerOptions.OPTION_ReportUnusedPrivateMember, CompilerOptions.ERROR); |
| customOptions.put(CompilerOptions.OPTION_AnnotationBasedNullAnalysis, CompilerOptions.ENABLED); |
| customOptions.put(CompilerOptions.OPTION_NonNullByDefaultAnnotationName, "p.NonNullByDefault"); |
| this.runNegativeTest( |
| true, |
| new String[] { |
| "Example.java", |
| "class Example {\n" + |
| " @p.Annot\n" + |
| " private Example() {\n" + |
| " }\n" + |
| " public Example(int i) {\n" + |
| " }\n" + |
| "}\n" + |
| "class E1 {\n" + |
| " @Deprecated\n" + |
| " private E1() {}\n" + |
| " public E1(long l) {}\n" + |
| "}\n" + |
| "class E2 {\n" + |
| " @SuppressWarnings(\"null\")\n" + |
| " private E2() {}\n" + |
| " public E2(long l) {}\n" + |
| "}\n" + |
| "class E3 {\n" + |
| " @p.NonNullByDefault\n" + |
| " private E3() {}\n" + |
| " public E3(long l) {}\n" + |
| "}\n" + |
| "class E4 {\n" + |
| " @Deprecated\n" + |
| " @p.Annot\n" + |
| " private E4() {}\n" + |
| " public E4(long l) {}\n" + |
| "}\n", |
| "p/NonNullByDefault.java", |
| "package p;\n" + |
| "import static java.lang.annotation.ElementType.*;\n" + |
| "import java.lang.annotation.*;\n" + |
| "@Target({TYPE, METHOD,CONSTRUCTOR})\n" + |
| "public @interface NonNullByDefault {\n" + |
| "}", |
| "p/Annot.java", |
| "package p;\n" + |
| "import static java.lang.annotation.ElementType.*;\n" + |
| "import java.lang.annotation.*;\n" + |
| "@Target({TYPE, METHOD,PARAMETER,LOCAL_VARIABLE, CONSTRUCTOR})\n" + |
| "public @interface Annot {\n" + |
| "}" |
| }, |
| null, customOptions, |
| "----------\n" + |
| "1. ERROR in Example.java (at line 10)\n" + |
| " private E1() {}\n" + |
| " ^^^^\n" + |
| "The constructor E1() is never used locally\n" + |
| "----------\n" + |
| "2. WARNING in Example.java (at line 14)\n" + |
| " @SuppressWarnings(\"null\")\n" + |
| " ^^^^^^\n" + |
| "Unnecessary @SuppressWarnings(\"null\")\n" + |
| "----------\n" + |
| "3. ERROR in Example.java (at line 15)\n" + |
| " private E2() {}\n" + |
| " ^^^^\n" + |
| "The constructor E2() is never used locally\n" + |
| "----------\n" + |
| "4. ERROR in Example.java (at line 20)\n" + |
| " private E3() {}\n" + |
| " ^^^^\n" + |
| "The constructor E3() is never used locally\n" + |
| "----------\n", |
| JavacTestOptions.Excuse.EclipseWarningConfiguredAsError); |
| } |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=365437 |
| // unused field |
| public void testBug365437e() { |
| Map customOptions = getCompilerOptions(); |
| enableAllWarningsForIrritants(customOptions, IrritantSet.NULL); |
| customOptions.put(CompilerOptions.OPTION_ReportUnusedPrivateMember, CompilerOptions.ERROR); |
| customOptions.put(CompilerOptions.OPTION_ReportUnusedPrivateMember, CompilerOptions.ERROR); |
| customOptions.put(CompilerOptions.OPTION_AnnotationBasedNullAnalysis, CompilerOptions.ENABLED); |
| customOptions.put(CompilerOptions.OPTION_NonNullAnnotationName, "p.NonNull"); |
| this.runNegativeTest( |
| true, |
| new String[] { |
| "Example.java", |
| "class Example {\n" + |
| " @p.Annot\n" + |
| " private int Ex;\n" + |
| "}\n" + |
| "class E1 {\n" + |
| " @Deprecated\n" + |
| " private int E1;\n" + |
| "}\n" + |
| "class E2 {\n" + |
| " @SuppressWarnings(\"null\")\n" + |
| " private int E2;\n" + |
| "}\n" + |
| "class E3 {\n" + |
| " @p.NonNull\n" + |
| " private Object E3 = new Object();\n" + |
| "}\n" + |
| "class E4 {\n" + |
| " @Deprecated\n" + |
| " @p.Annot\n" + |
| " private int E4;\n" + |
| "}\n", |
| "p/NonNull.java", |
| "package p;\n" + |
| "import static java.lang.annotation.ElementType.*;\n" + |
| "import java.lang.annotation.*;\n" + |
| "@Target({TYPE, METHOD,PARAMETER,LOCAL_VARIABLE, FIELD})\n" + |
| "public @interface NonNull {\n" + |
| "}", |
| "p/Annot.java", |
| "package p;\n" + |
| "import static java.lang.annotation.ElementType.*;\n" + |
| "import java.lang.annotation.*;\n" + |
| "@Target({TYPE, METHOD,PARAMETER,LOCAL_VARIABLE, FIELD})\n" + |
| "public @interface Annot {\n" + |
| "}" |
| }, |
| null, customOptions, |
| "----------\n" + |
| "1. ERROR in Example.java (at line 7)\n" + |
| " private int E1;\n" + |
| " ^^\n" + |
| "The value of the field E1.E1 is not used\n" + |
| "----------\n" + |
| "2. WARNING in Example.java (at line 10)\n" + |
| " @SuppressWarnings(\"null\")\n" + |
| " ^^^^^^\n" + |
| "Unnecessary @SuppressWarnings(\"null\")\n" + |
| "----------\n" + |
| "3. ERROR in Example.java (at line 11)\n" + |
| " private int E2;\n" + |
| " ^^\n" + |
| "The value of the field E2.E2 is not used\n" + |
| "----------\n" + |
| "4. ERROR in Example.java (at line 15)\n" + |
| " private Object E3 = new Object();\n" + |
| " ^^\n" + |
| "The value of the field E3.E3 is not used\n" + |
| "----------\n", |
| JavacTestOptions.Excuse.EclipseWarningConfiguredAsError); |
| } |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=365437 |
| // unused type |
| public void testBug365437f() { |
| Map customOptions = getCompilerOptions(); |
| enableAllWarningsForIrritants(customOptions, IrritantSet.NULL); |
| customOptions.put(CompilerOptions.OPTION_ReportUnusedPrivateMember, CompilerOptions.ERROR); |
| customOptions.put(CompilerOptions.OPTION_ReportUnusedPrivateMember, CompilerOptions.ERROR); |
| customOptions.put(CompilerOptions.OPTION_AnnotationBasedNullAnalysis, CompilerOptions.ENABLED); |
| customOptions.put(CompilerOptions.OPTION_NonNullByDefaultAnnotationName, "p.NonNullByDefault"); |
| this.runNegativeTest( |
| true, |
| new String[] { |
| "Example.java", |
| "class Example {\n" + |
| " @p.Annot\n" + |
| " private class Ex{}\n" + |
| "}\n" + |
| "class E1 {\n" + |
| " @Deprecated\n" + |
| " private class E11{}\n" + |
| "}\n" + |
| "class E2 {\n" + |
| " @SuppressWarnings(\"null\")\n" + |
| " private class E22{}\n" + |
| "}\n" + |
| "class E3 {\n" + |
| " @p.NonNullByDefault\n" + |
| " private class E33{}\n" + |
| "}\n" + |
| "class E4 {\n" + |
| " @Deprecated\n" + |
| " @p.Annot\n" + |
| " private class E44{}\n" + |
| "}\n", |
| "p/NonNullByDefault.java", |
| "package p;\n" + |
| "import static java.lang.annotation.ElementType.*;\n" + |
| "import java.lang.annotation.*;\n" + |
| "@Target({TYPE, METHOD,PARAMETER})\n" + |
| "public @interface NonNullByDefault {\n" + |
| "}", |
| "p/Annot.java", |
| "package p;\n" + |
| "import static java.lang.annotation.ElementType.*;\n" + |
| "import java.lang.annotation.*;\n" + |
| "@Target({TYPE, METHOD,PARAMETER,LOCAL_VARIABLE, CONSTRUCTOR})\n" + |
| "public @interface Annot {\n" + |
| "}" |
| }, |
| null, customOptions, |
| "----------\n" + |
| "1. ERROR in Example.java (at line 7)\n" + |
| " private class E11{}\n" + |
| " ^^^\n" + |
| "The type E1.E11 is never used locally\n" + |
| "----------\n" + |
| "2. WARNING in Example.java (at line 10)\n" + |
| " @SuppressWarnings(\"null\")\n" + |
| " ^^^^^^\n" + |
| "Unnecessary @SuppressWarnings(\"null\")\n" + |
| "----------\n" + |
| "3. ERROR in Example.java (at line 11)\n" + |
| " private class E22{}\n" + |
| " ^^^\n" + |
| "The type E2.E22 is never used locally\n" + |
| "----------\n" + |
| "4. ERROR in Example.java (at line 15)\n" + |
| " private class E33{}\n" + |
| " ^^^\n" + |
| "The type E3.E33 is never used locally\n" + |
| "----------\n", |
| JavacTestOptions.Excuse.EclipseWarningConfiguredAsError); |
| } |
| |
| // https://bugs.eclipse.org/376590 - Private fields with @Inject are ignored by unused field validation |
| // using com.google.inject.Inject |
| public void testBug376590a() { |
| Map customOptions = getCompilerOptions(); |
| customOptions.put(CompilerOptions.OPTION_ReportUnusedPrivateMember, CompilerOptions.ERROR); |
| customOptions.put(CompilerOptions.OPTION_ReportUnusedPrivateMember, CompilerOptions.ERROR); |
| this.runNegativeTest( |
| true, |
| new String[] { |
| GOOGLE_INJECT_NAME, |
| GOOGLE_INJECT_CONTENT, |
| "Example.java", |
| "import com.google.inject.Inject;\n" + |
| "class Example {\n" + |
| " private @Inject Object o;\n" + |
| " private @Inject Example() {}\n" + // no warning on constructor |
| " public Example(Object o) { this.o = o; }\n" + |
| " private @Inject void setO(Object o) { this.o = o;}\n" + // no warning on method |
| "}\n" |
| }, |
| null, customOptions, |
| "----------\n" + |
| "1. ERROR in Example.java (at line 3)\n" + |
| " private @Inject Object o;\n" + |
| " ^\n" + |
| "The value of the field Example.o is not used\n" + |
| "----------\n", |
| JavacTestOptions.Excuse.EclipseWarningConfiguredAsError); |
| } |
| // https://bugs.eclipse.org/376590 - Private fields with @Inject are ignored by unused field validation |
| // using javax.inject.Inject - slight variation |
| public void testBug376590b() { |
| Map customOptions = getCompilerOptions(); |
| customOptions.put(CompilerOptions.OPTION_ReportUnusedPrivateMember, CompilerOptions.ERROR); |
| customOptions.put(CompilerOptions.OPTION_ReportUnusedPrivateMember, CompilerOptions.ERROR); |
| this.runNegativeTest( |
| true, |
| new String[] { |
| JAVAX_INJECT_NAME, |
| JAVAX_INJECT_CONTENT, |
| "Example.java", |
| "class Example {\n" + |
| " private @javax.inject.Inject Object o;\n" + |
| " private Example() {} // also warn here: no @Inject\n" + |
| " public Example(Object o) { this.o = o; }\n" + |
| " private @javax.inject.Inject void setO(Object o) { this.o = o;}\n" + |
| "}\n" |
| }, |
| null, customOptions, |
| "----------\n" + |
| "1. ERROR in Example.java (at line 2)\n" + |
| " private @javax.inject.Inject Object o;\n" + |
| " ^\n" + |
| "The value of the field Example.o is not used\n" + |
| "----------\n" + |
| "2. ERROR in Example.java (at line 3)\n" + |
| " private Example() {} // also warn here: no @Inject\n" + |
| " ^^^^^^^^^\n" + |
| "The constructor Example() is never used locally\n" + |
| "----------\n", |
| JavacTestOptions.Excuse.EclipseWarningConfiguredAsError); |
| } |
| // https://bugs.eclipse.org/376590 - Private fields with @Inject are ignored by unused field validation |
| // using javax.inject.Inject, combined with standard as well as custom annotations |
| public void testBug376590c() { |
| Map customOptions = getCompilerOptions(); |
| customOptions.put(CompilerOptions.OPTION_ReportUnusedPrivateMember, CompilerOptions.ERROR); |
| customOptions.put(CompilerOptions.OPTION_ReportUnusedPrivateMember, CompilerOptions.ERROR); |
| customOptions.put(CompilerOptions.OPTION_AnnotationBasedNullAnalysis, CompilerOptions.ENABLED); |
| customOptions.put(CompilerOptions.OPTION_NonNullAnnotationName, "p.NonNull"); |
| this.runNegativeTest( |
| true, |
| new String[] { |
| JAVAX_INJECT_NAME, |
| JAVAX_INJECT_CONTENT, |
| "Example.java", |
| "import javax.inject.Inject;\n" + |
| "class Example {\n" + |
| " private @Inject @p.NonNull Object o; // do warn, annotations don't signal a read\n" + |
| " private @Deprecated @Inject String old; // do warn, annotations don't signal a read\n" + |
| " private @Inject @p.Annot Object o2;\n" + // don't warn, custom annotation could imply a read access |
| "}\n", |
| "p/NonNull.java", |
| "package p;\n" + |
| "import static java.lang.annotation.ElementType.*;\n" + |
| "import java.lang.annotation.*;\n" + |
| "@Target({TYPE, METHOD,PARAMETER,LOCAL_VARIABLE,FIELD})\n" + |
| "public @interface NonNull {\n" + |
| "}", |
| "p/Annot.java", |
| "package p;\n" + |
| "import static java.lang.annotation.ElementType.*;\n" + |
| "import java.lang.annotation.*;\n" + |
| "@Target({TYPE, METHOD,PARAMETER,LOCAL_VARIABLE, CONSTRUCTOR, FIELD})\n" + |
| "public @interface Annot {\n" + |
| "}" |
| }, |
| null, customOptions, |
| "----------\n" + |
| "1. ERROR in Example.java (at line 3)\n" + |
| " private @Inject @p.NonNull Object o; // do warn, annotations don't signal a read\n" + |
| " ^\n" + |
| "The value of the field Example.o is not used\n" + |
| "----------\n" + |
| "2. ERROR in Example.java (at line 4)\n" + |
| " private @Deprecated @Inject String old; // do warn, annotations don't signal a read\n" + |
| " ^^^\n" + |
| "The value of the field Example.old is not used\n" + |
| "----------\n", |
| JavacTestOptions.Excuse.EclipseWarningConfiguredAsError); |
| } |
| |
| public void testBug376429a() { |
| this.runNegativeTest( |
| new String[] { |
| "Try.java", |
| "public @interface Try { \n" + |
| " byte[] value(); \n" + |
| " @Try t();\n"+ |
| " @Try u();\n"+ |
| "}" |
| }, |
| "----------\n" + |
| "1. ERROR in Try.java (at line 3)\n" + |
| " @Try t();\n" + |
| " ^^^^\n" + |
| "The annotation @Try must define the attribute value\n" + |
| "----------\n" + |
| "2. ERROR in Try.java (at line 3)\n" + |
| " @Try t();\n" + |
| " ^^^\n" + |
| "Return type for the method is missing\n" + |
| "----------\n" + |
| "3. ERROR in Try.java (at line 3)\n" + |
| " @Try t();\n" + |
| " ^^^\n" + |
| "Return type for the method is missing\n" + |
| "----------\n" + |
| "4. ERROR in Try.java (at line 4)\n" + |
| " @Try u();\n" + |
| " ^^^^\n" + |
| "The annotation @Try must define the attribute value\n" + |
| "----------\n" + |
| "5. ERROR in Try.java (at line 4)\n" + |
| " @Try u();\n" + |
| " ^^^\n" + |
| "Return type for the method is missing\n" + |
| "----------\n"); |
| } |
| public void testBug376429b() { |
| this.runNegativeTest( |
| new String[] { |
| "Try.java", |
| "public @interface Try { \n" + |
| " @Try t();\n"+ |
| " byte[] value(); \n" + |
| "}" |
| }, |
| "----------\n" + |
| "1. ERROR in Try.java (at line 2)\n" + |
| " @Try t();\n" + |
| " ^^^^\n" + |
| "The annotation @Try must define the attribute value\n" + |
| "----------\n" + |
| "2. ERROR in Try.java (at line 2)\n" + |
| " @Try t();\n" + |
| " ^^^\n" + |
| "Return type for the method is missing\n" + |
| "----------\n"); |
| } |
| |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=371832 |
| //Unused imports should be reported even if other errors are suppressed. |
| public void testBug371832() throws Exception { |
| Map customOptions = getCompilerOptions(); |
| customOptions.put(CompilerOptions.OPTION_ReportUnusedImport, CompilerOptions.ERROR); |
| customOptions.put(CompilerOptions.OPTION_ReportUnusedLocal, CompilerOptions.ERROR); |
| customOptions.put(CompilerOptions.OPTION_SuppressOptionalErrors, CompilerOptions.ENABLED); |
| customOptions.put(CompilerOptions.OPTION_ReportMissingSerialVersion, CompilerOptions.ERROR); |
| String testFiles [] = new String[] { |
| "A.java", |
| "import java.util.List;\n"+ |
| "@SuppressWarnings(\"serial\")\n" + |
| "public class A implements java.io.Serializable {\n" + |
| " void foo() { \n" + |
| " }\n"+ |
| "}\n" |
| }; |
| String expectedErrorString = |
| "----------\n" + |
| "1. ERROR in A.java (at line 1)\n" + |
| " import java.util.List;\n" + |
| " ^^^^^^^^^^^^^^\n" + |
| "The import java.util.List is never used\n" + |
| "----------\n"; |
| runNegativeTest( |
| true, |
| testFiles, |
| null, |
| customOptions, |
| expectedErrorString, |
| JavacTestOptions.Excuse.EclipseWarningConfiguredAsError); |
| } |
| // https://bugs.eclipse.org/384663 |
| // Package Based Annotation Compilation Error in JDT 3.8/4.2 (works in 3.7.2) |
| public void testBug384663() { |
| String[] testFiles = { |
| "annotations/test/IExtendsInterface.java", |
| "package annotations.test;\n" + |
| "public interface IExtendsInterface extends Interface {}\n", |
| |
| "annotations/test/Interface.java", |
| "package annotations.test;\n" + |
| "public interface Interface {}\n", |
| |
| "annotations/test/package-info.java", |
| "@AnnotationDefinition(\"Test1\") \n" + |
| "package annotations.test;\n" + |
| "import annotations.AnnotationDefinition;", |
| |
| "annotations/AnnotationDefinition.java", |
| "package annotations;\n" + |
| "import java.lang.annotation.*;\n" + |
| "@Retention(RetentionPolicy.RUNTIME)\n" + |
| "@Target(ElementType.PACKAGE)\n" + |
| "public @interface AnnotationDefinition {\n" + |
| " String value();\n" + |
| "}", |
| }; |
| runConformTest(testFiles); |
| } |
| |
| // Bug 386356 - Type mismatch error with annotations and generics |
| // test case from comment 9 |
| public void _testBug386356_1() { |
| runConformTest( |
| new String[] { |
| "p/X.java", |
| "package p;\n" + |
| "import javax.xml.bind.annotation.adapters.XmlAdapter;\n" + |
| "public abstract class X extends XmlAdapter<String,X> {\n" + |
| "}", |
| |
| "p/package-info.java", |
| "@XmlJavaTypeAdapters({ @XmlJavaTypeAdapter(value = X.class, type = X.class) })\n" + |
| "package p;\n" + |
| "import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; \n" + |
| "import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapters;" |
| |
| }); |
| } |
| |
| // Bug 386356 - Type mismatch error with annotations and generics |
| // test case from comment 6 |
| public void testBug386356_2() { |
| if (isJRE11Plus) |
| return; |
| INameEnvironment save = this.javaClassLib; |
| try { |
| if (isJRE9Plus) { |
| List<String> limitModules = Arrays.asList("java.se", "java.xml.bind"); |
| this.javaClassLib = new CustomFileSystem(limitModules); |
| } |
| runConformTest( |
| new String[] { |
| "com/ermahgerd/Ermahgerd.java", |
| "package com.ermahgerd;\n" + |
| "\n" + |
| "public class Ermahgerd {\n" + |
| "}", |
| |
| "com/ermahgerd/package-info.java", |
| "@XmlJavaTypeAdapters({ @XmlJavaTypeAdapter(value = ErmahgerdXmlAdapter.class, type = Ermahgerd.class) })\n" + |
| "package com.ermahgerd;\n" + |
| "import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;\n" + |
| "import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapters;", |
| |
| "com/ermahgerd/ErmahgerdXmlAdapter.java", |
| "package com.ermahgerd;\n" + |
| "\n" + |
| "import javax.xml.bind.annotation.adapters.XmlAdapter;\n" + |
| "\n" + |
| "public class ErmahgerdXmlAdapter extends XmlAdapter<String,Ermahgerd> {\n" + |
| "\n" + |
| " @Override\n" + |
| " public String marshal(Ermahgerd arg0) throws Exception {\n" + |
| " // TODO Auto-generated method stub\n" + |
| " return null;\n" + |
| " }\n" + |
| "\n" + |
| " @Override\n" + |
| " public Ermahgerd unmarshal(String arg0) throws Exception {\n" + |
| " // TODO Auto-generated method stub\n" + |
| " return null;\n" + |
| " }\n" + |
| "}" |
| }, |
| isJRE9Plus ? JavacTestOptions.SKIP : JavacTestOptions.DEFAULT); // javac9+ cannot access javax.xml.bind |
| } finally { |
| this.javaClassLib = save; |
| } |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=398657 |
| public void test398657() throws Exception { |
| if (this.complianceLevel != ClassFileConstants.JDK1_5) { |
| return; |
| } |
| Map options = getCompilerOptions(); |
| options.put(CompilerOptions.OPTION_Source, CompilerOptions.VERSION_1_5); |
| options.put(CompilerOptions.OPTION_TargetPlatform, CompilerOptions.VERSION_1_4); |
| options.put(CompilerOptions.OPTION_Compliance, CompilerOptions.VERSION_1_5); |
| this.runConformTest( |
| new String[] { |
| "p/Annot.java", |
| "package p;\n" + |
| "public @interface Annot {\n" + |
| " static public enum E { A }\n" + |
| " E getEnum();\n" + |
| "}", |
| "X.java", |
| "import static p.Annot.E.*;\n" + |
| "import p.Annot;" + |
| "@Annot(getEnum=A)\n" + |
| "public class X {}" |
| }, |
| "", |
| null, |
| true, |
| null, |
| options, |
| null, |
| true); |
| |
| String expectedOutput = |
| " Inner classes:\n" + |
| " [inner class info: #22 p/Annot$E, outer class info: #24 p/Annot\n" + |
| " inner name: #26 E, accessflags: 16409 public static final]\n"; |
| |
| checkDisassembledClassFile(OUTPUT_DIR + File.separator +"X.class", "X", expectedOutput, ClassFileBytesDisassembler.DETAILED); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=398657 |
| public void test398657_2() throws Exception { |
| if (this.complianceLevel != ClassFileConstants.JDK1_5) { |
| return; |
| } |
| Map options = getCompilerOptions(); |
| options.put(CompilerOptions.OPTION_Source, CompilerOptions.VERSION_1_5); |
| options.put(CompilerOptions.OPTION_TargetPlatform, CompilerOptions.VERSION_1_4); |
| options.put(CompilerOptions.OPTION_Compliance, CompilerOptions.VERSION_1_5); |
| this.runConformTest( |
| new String[] { |
| "p/Y.java", |
| "package p;\n" + |
| "public class Y {\n" + |
| " static public @interface Annot {\n" + |
| " int id();\n" + |
| " }\n" + |
| "}", |
| "X.java", |
| "import p.Y.Annot;\n" + |
| "@Annot(id=4)\n" + |
| "public class X {}" |
| }, |
| "", |
| null, |
| true, |
| null, |
| options, |
| null, |
| true); |
| |
| String expectedOutput = |
| " Inner classes:\n" + |
| " [inner class info: #21 p/Y$Annot, outer class info: #23 p/Y\n" + |
| " inner name: #25 Annot, accessflags: 9737 public abstract static]\n"; |
| |
| checkDisassembledClassFile(OUTPUT_DIR + File.separator +"X.class", "X", expectedOutput, ClassFileBytesDisassembler.DETAILED); |
| } |
| // check invalid and annotations on package |
| public void test384567() { |
| this.runNegativeTest( |
| new String[] { |
| "xy/X.java", |
| "public final synchronized @Foo private package xy;\n" + |
| "class X {\n" + |
| "}\n" + |
| "\n" + |
| "@interface Foo {\n" + |
| "}\n" |
| }, |
| "----------\n" + |
| "1. ERROR in xy\\X.java (at line 1)\n" + |
| " public final synchronized @Foo private package xy;\n" + |
| " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + |
| "Syntax error, modifiers are not allowed here\n" + |
| "----------\n" + |
| "2. ERROR in xy\\X.java (at line 1)\n" + |
| " public final synchronized @Foo private package xy;\n" + |
| " ^^^^\n" + |
| "Package annotations must be in file package-info.java\n" + |
| "----------\n"); |
| } |
| //check invalid modifiers on package |
| public void test384567_2() { |
| this.runNegativeTest( |
| new String[] { |
| "xy/X.java", |
| "public final synchronized private package xy;\n" + |
| "class X {\n" + |
| "}\n" + |
| "\n" |
| }, |
| "----------\n" + |
| "1. ERROR in xy\\X.java (at line 1)\n" + |
| " public final synchronized private package xy;\n" + |
| " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + |
| "Syntax error, modifiers are not allowed here\n" + |
| "----------\n"); |
| } |
| // Bug 416107 - Incomplete error message for member interface and annotation |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=416107 |
| public void test416107a() { |
| if (this.complianceLevel < ClassFileConstants.JDK16) { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "public class X {\n" + |
| " class Y {\n" + |
| " @interface Bar {\n" + |
| " public String bar = \"BUG\";\n" + |
| " }\n" + |
| " }\n" + |
| "}", |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 3)\n" + |
| " @interface Bar {\n" + |
| " ^^^\n" + |
| "The member annotation Bar can only be defined inside a top-level class or interface or in a static context\n" + |
| "----------\n"); |
| } else { |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "public class X {\n" + |
| " class Y {\n" + |
| " @interface Bar {\n" + |
| " public String bar = \"BUG\";\n" + |
| " }\n" + |
| " }\n" + |
| "}", |
| }, |
| ""); |
| |
| } |
| } |
| public void test416107b() { |
| if (this.complianceLevel < ClassFileConstants.JDK16) { |
| runNegativeTest( |
| new String[] { |
| "X.java", |
| "public class X {\n" + |
| " class Y {\n" + |
| " interface Bar {\n" + |
| " public String bar = \"BUG\";\n" + |
| " }\n" + |
| " }\n" + |
| "}", |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 3)\n" + |
| " interface Bar {\n" + |
| " ^^^\n" + |
| "The member interface Bar can only be defined inside a top-level class or interface or in a static context\n" + |
| "----------\n"); |
| } else { |
| runConformTest( |
| new String[] { |
| "X.java", |
| "public class X {\n" + |
| " class Y {\n" + |
| " interface Bar {\n" + |
| " public String bar = \"BUG\";\n" + |
| " }\n" + |
| " }\n" + |
| "}", |
| }, |
| ""); |
| |
| } |
| } |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=427367 |
| public void test427367() throws Exception { |
| if (this.complianceLevel < ClassFileConstants.JDK1_5) { |
| return; |
| } |
| Map options = getCompilerOptions(); |
| options.put(CompilerOptions.OPTION_Source, CompilerOptions.VERSION_1_5); |
| options.put(CompilerOptions.OPTION_TargetPlatform, CompilerOptions.VERSION_1_4); |
| options.put(CompilerOptions.OPTION_Compliance, CompilerOptions.VERSION_1_5); |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "@interface Annot1 {\n" + |
| " Thread.State value() default Thread.State.NEW;\n" + |
| " int value2() default 1;\n" + |
| "}\n" + |
| "@interface Annot2 {\n" + |
| " Thread.State value() default Thread.State.NEW;\n" + |
| "}\n" + |
| "@Annot1(value = XXThread.State.BLOCKED, value2 = 42)\n" + |
| "@Annot2(value = XYThread.State.BLOCKED)\n" + |
| "public class X {}" |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 8)\n" + |
| " @Annot1(value = XXThread.State.BLOCKED, value2 = 42)\n" + |
| " ^^^^^^^^\n" + |
| "XXThread cannot be resolved to a variable\n" + |
| "----------\n" + |
| "2. ERROR in X.java (at line 9)\n" + |
| " @Annot2(value = XYThread.State.BLOCKED)\n" + |
| " ^^^^^^^^\n" + |
| "XYThread cannot be resolved to a variable\n" + |
| "----------\n", |
| null, |
| true, |
| null, |
| true, // generate output |
| false, |
| false); |
| |
| String expectedOutput = "@Annot1@Annot2\n" + |
| "public class X {\n" + |
| " \n" + |
| " // Method descriptor #6 ()V\n" + |
| " // Stack: 3, Locals: 1\n" + |
| " public X();\n" + |
| " 0 new java.lang.Error [8]\n" + |
| " 3 dup\n" + |
| " 4 ldc <String \"Unresolved compilation problems: \\n\\tXXThread cannot be resolved to a variable\\n\\tXYThread cannot be resolved to a variable\\n\"> [10]\n" + |
| " 6 invokespecial java.lang.Error(java.lang.String) [12]\n" + |
| " 9 athrow\n" + |
| " Line numbers:\n" + |
| " [pc: 0, line: 8]\n" + |
| " Local variable table:\n" + |
| " [pc: 0, pc: 10] local: this index: 0 type: X\n" + |
| "\n" + |
| "}"; |
| try { |
| checkDisassembledClassFile(OUTPUT_DIR + File.separator +"X.class", "X", expectedOutput, ClassFileBytesDisassembler.DETAILED); |
| } catch(org.eclipse.jdt.core.util.ClassFormatException cfe) { |
| fail("Error reading classfile"); |
| } |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=376977 |
| public void test376977() throws Exception { |
| if (this.complianceLevel < ClassFileConstants.JDK1_5) { |
| return; |
| } |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "import p.Outer;\n" + |
| "@Outer(nest= {@Nested()})\n" + |
| "public class X {}", |
| "p/Outer.java", |
| "package p;\n" + |
| "public @interface Outer {\n" + |
| " Nested[] nest();" + |
| "}", |
| "p/Nested.java", |
| "package p;\n" + |
| "public @interface Nested {\n" + |
| "}" |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 2)\n" + |
| " @Outer(nest= {@Nested()})\n" + |
| " ^^^^^^\n" + |
| "Nested cannot be resolved to a type\n" + |
| "----------\n", |
| null, |
| true, |
| null, |
| false, |
| false, |
| false); |
| } |
| |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=438437 - [1.8][compiler] Annotations |
| // on enum constants interpreted only as type annotations if the annotation type |
| // specifies ElementType.TYPE_USE in @Target along with others. |
| public void test438437() { |
| if (this.complianceLevel < ClassFileConstants.JDK1_8) |
| return; |
| runNegativeTest( |
| new String[] { |
| "X.java", |
| "import java.lang.annotation.ElementType;\n" + |
| "import java.lang.annotation.Target;\n" + |
| "@Target({ElementType.TYPE_USE, ElementType.FIELD})\n" + |
| "@interface TUF {} \n" + |
| "@Target({ElementType.FIELD})\n" + |
| "@interface F {} \n" + |
| "@Target({ElementType.TYPE_USE})\n" + |
| "@interface TU1 {} \n" + |
| "@Target({ElementType.LOCAL_VARIABLE})\n" + |
| "@interface LV {} \n" + |
| "@Target({ElementType.TYPE_USE})\n" + |
| "@interface TU2 {} \n" + |
| "class Y {}\n" + |
| "public enum X {\n" + |
| " @TUF E1,\n" + // Error without the fix. |
| " @F E2,\n" + |
| " @TU1 E3,\n" + // Error is reported as no type exists for the Enum. |
| " @LV E4,\n" + |
| " @TUF @TU1 @F E5,\n" + |
| " @TUF @TU1 @F @TU2 E6;\n" + |
| " @TUF Y y11;\n" + |
| " @F Y y12;\n" + |
| " @TU1 Y y13;\n" + // No error reported as type exists. |
| " @LV Y y14;\n" + |
| "}\n" , |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 17)\n" + |
| " @TU1 E3,\n" + |
| " ^^^^\n" + |
| "Syntax error, type annotations are illegal here\n" + |
| "----------\n" + |
| "2. ERROR in X.java (at line 18)\n" + |
| " @LV E4,\n" + |
| " ^^^\n" + |
| "The annotation @LV is disallowed for this location\n" + |
| "----------\n" + |
| "3. ERROR in X.java (at line 19)\n" + |
| " @TUF @TU1 @F E5,\n" + |
| " ^^^^\n" + |
| "Syntax error, type annotations are illegal here\n" + |
| "----------\n" + |
| "4. ERROR in X.java (at line 20)\n" + |
| " @TUF @TU1 @F @TU2 E6;\n" + |
| " ^^^^\n" + |
| "Syntax error, type annotations are illegal here\n" + |
| "----------\n" + |
| "5. ERROR in X.java (at line 20)\n" + |
| " @TUF @TU1 @F @TU2 E6;\n" + |
| " ^^^^\n" + |
| "Syntax error, type annotations are illegal here\n" + |
| "----------\n" + |
| "6. ERROR in X.java (at line 24)\n" + |
| " @LV Y y14;\n" + |
| " ^^^\n" + |
| "The annotation @LV is disallowed for this location\n" + |
| "----------\n"); |
| } |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=434556, Broken class file generated for incorrect annotation usage |
| public void test434556() throws Exception { |
| if (this.complianceLevel < ClassFileConstants.JDK1_5) { |
| return; |
| } |
| this.runNegativeTest( |
| new String[] { |
| "A.java", |
| "import java.lang.annotation.Retention;\n" + |
| "import java.lang.annotation.RetentionPolicy;\n" + |
| "@Retention(RetentionPolicy.RUNTIME)\n" + |
| "@interface C {\n" + |
| " int i();\n" + |
| "}\n" + |
| "public class A {\n" + |
| " @C(b={},i=42)\n" + |
| " public void xxx() {}\n" + |
| " public static void main(String []argv) throws Exception {\n" + |
| " System.out.println(A.class.getDeclaredMethod(\"xxx\").getAnnotations()[0]); \n" + |
| " }\n" + |
| "}" |
| }, |
| "----------\n" + |
| "1. ERROR in A.java (at line 8)\n" + |
| " @C(b={},i=42)\n" + |
| " ^\n" + |
| "The attribute b is undefined for the annotation type C\n" + |
| "----------\n", |
| null, |
| true, |
| null, |
| true, // generate output |
| false, |
| false); |
| |
| String expectedOutput = "@C(i=(int) 42)\n" + |
| " public void xxx();\n" + |
| " 0 new java.lang.Error [20]\n" + |
| " 3 dup\n" + |
| " 4 ldc <String \"Unresolved compilation problem: \\n\\tThe attribute b is undefined for the annotation type C\\n\"> [22]\n" + |
| " 6 invokespecial java.lang.Error(java.lang.String) [24]\n" + |
| " 9 athrow\n" + |
| " Line numbers:\n" + |
| " [pc: 0, line: 8]\n" + |
| " Local variable table:\n" + |
| " [pc: 0, pc: 10] local: this index: 0 type: A\n" + |
| " \n"; |
| try { |
| checkDisassembledClassFile(OUTPUT_DIR + File.separator +"A.class", "A", expectedOutput, ClassFileBytesDisassembler.DETAILED); |
| } catch(org.eclipse.jdt.core.util.ClassFormatException cfe) { |
| fail("Error reading classfile"); |
| } |
| } |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=433747, [compiler] TYPE Annotation allowed in package-info instead of only PACKAGE |
| public void test433747() throws Exception { |
| if (this.complianceLevel < ClassFileConstants.JDK1_5) { |
| return; |
| } |
| String[] src = new String[] { |
| "p/package-info.java", |
| "@PackageAnnot(\"p123456\")\n" + |
| "package p;\n" + |
| "import java.lang.annotation.ElementType;\n" + |
| "import java.lang.annotation.Target;\n" + |
| "@Target(ElementType.TYPE)\n" + |
| "@interface PackageAnnot {\n" + |
| " String value();\n" + |
| "}\n" |
| }; |
| if (this.complianceLevel <= ClassFileConstants.JDK1_6) { |
| this.runConformTest(src, ""); |
| checkDisassembledClassFile(OUTPUT_DIR + File.separator + "p/package-info.class", "", "p123456"); |
| } else { |
| this.runNegativeTest( |
| src, |
| "----------\n" + |
| "1. ERROR in p\\package-info.java (at line 1)\n" + |
| " @PackageAnnot(\"p123456\")\n" + |
| " ^^^^^^^^^^^^^\n" + |
| "The annotation @PackageAnnot is disallowed for this location\n" + |
| "----------\n", |
| null, |
| true, |
| null, |
| true, // generate output |
| false, |
| false); |
| } |
| } |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=456960 - Broken classfile generated for incorrect annotation usage - case 2 |
| public void test456960() throws Exception { |
| if (this.complianceLevel < ClassFileConstants.JDK1_5) { |
| return; |
| } |
| Map options = getCompilerOptions(); |
| options.put(CompilerOptions.OPTION_Source, CompilerOptions.VERSION_1_5); |
| options.put(CompilerOptions.OPTION_TargetPlatform, CompilerOptions.VERSION_1_5); |
| options.put(CompilerOptions.OPTION_Compliance, CompilerOptions.VERSION_1_5); |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "@Bar(String)\n" + |
| "public class X {\n" + |
| "}", |
| "Bar.java", |
| "import java.lang.annotation.Retention;\n" + |
| "import java.lang.annotation.RetentionPolicy;\n" + |
| "@Retention(RetentionPolicy.RUNTIME)\n" + |
| "@interface Bar {\n" + |
| " Class<?>[] value();\n" + |
| "}" |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 1)\n" + |
| " @Bar(String)\n" + |
| " ^^^^^^\n" + |
| "String cannot be resolved to a variable\n" + |
| "----------\n", |
| null, |
| true, |
| null, |
| true, // generate output |
| false, |
| false); |
| |
| String expectedOutput = |
| "public class X {\n" + |
| " \n" + |
| " // Method descriptor #6 ()V\n" + |
| " // Stack: 3, Locals: 1\n" + |
| " public X();\n" + |
| " 0 new java.lang.Error [8]\n" + |
| " 3 dup\n" + |
| " 4 ldc <String \"Unresolved compilation problem: \\n\\tString cannot be resolved to a variable\\n\"> [10]\n" + |
| " 6 invokespecial java.lang.Error(java.lang.String) [12]\n" + |
| " 9 athrow\n" + |
| " Line numbers:\n" + |
| " [pc: 0, line: 1]\n" + |
| " Local variable table:\n" + |
| " [pc: 0, pc: 10] local: this index: 0 type: X\n" + |
| "}"; |
| try { |
| checkDisassembledClassFile(OUTPUT_DIR + File.separator +"X.class", "X", expectedOutput, ClassFileBytesDisassembler.DETAILED); |
| } catch(org.eclipse.jdt.core.util.ClassFormatException cfe) { |
| fail("Error reading classfile"); |
| } |
| |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=449330 - [1.6]Eclipse compiler doesn't compile annotations in class files |
| public void test449330() throws Exception { |
| String[] testFiles = new String[] { |
| "p/X.java", |
| "package p;\n" + |
| "@java.lang.annotation.Target(value={java.lang.annotation.ElementType.TYPE})\n" + |
| "@interface X { public java.lang.String name(); }\n", |
| "p/package-info.java", |
| "@X(name=\"HELLO\")\n" + |
| "package p;\n" |
| }; |
| if (this.complianceLevel <= ClassFileConstants.JDK1_6) { |
| this.runConformTest(testFiles); |
| checkDisassembledClassFile(OUTPUT_DIR + File.separator + "p/package-info.class", "", "HELLO"); |
| } else { |
| this.runNegativeTest(testFiles, |
| "----------\n" + |
| "1. ERROR in p\\package-info.java (at line 1)\n" + |
| " @X(name=\"HELLO\")\n" + |
| " ^^\n" + |
| "The annotation @X is disallowed for this location\n" + |
| "----------\n"); |
| } |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=449330 - [1.6]Eclipse compiler doesn't compile annotations in class files |
| //Retention Policy set to RUNTIME |
| public void test449330a() throws Exception { |
| String[] testFiles = new String[] { |
| "p/X.java", |
| "package p;\n" + |
| "@java.lang.annotation.Target(value={java.lang.annotation.ElementType.TYPE})\n" + |
| "@java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME)\n" + |
| "@interface X { public java.lang.String name(); }\n", |
| "p/package-info.java", |
| "@X(name=\"HELLO\")\n" + |
| "package p;\n" |
| }; |
| if (this.complianceLevel <= ClassFileConstants.JDK1_6) { |
| this.runConformTest(testFiles, ""); |
| checkDisassembledClassFile(OUTPUT_DIR + File.separator + "p/package-info.class", "", "HELLO"); |
| } else { |
| this.runNegativeTest(testFiles, |
| "----------\n" + |
| "1. ERROR in p\\package-info.java (at line 1)\n" + |
| " @X(name=\"HELLO\")\n" + |
| " ^^\n" + |
| "The annotation @X is disallowed for this location\n" + |
| "----------\n"); |
| } |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=449330 - [1.6]Eclipse compiler doesn't compile annotations in class files |
| //Annotation target not set |
| public void test449330b() throws Exception { |
| String[] testFiles = new String[] { |
| "p/X.java", |
| "package p;\n" + |
| "@interface X { public java.lang.String name(); }\n", |
| "p/package-info.java", |
| "@X(name=\"HELLO\")\n" + |
| "package p;\n" |
| }; |
| this.runConformTest(testFiles, ""); |
| checkDisassembledClassFile(OUTPUT_DIR + File.separator + "p/package-info.class", "", "HELLO"); |
| } |
| //https://bugs.eclipse.org/386692 |
| public void testBug386692() { |
| Map customOptions = getCompilerOptions(); |
| customOptions.put(CompilerOptions.OPTION_ReportUnusedPrivateMember, CompilerOptions.ERROR); |
| customOptions.put(CompilerOptions.OPTION_ReportUnusedPrivateMember, CompilerOptions.ERROR); |
| this.runNegativeTest( |
| true, |
| new String[] { |
| SPRINGFRAMEWORK_AUTOWIRED_NAME, |
| SPRINGFRAMEWORK_AUTOWIRED_CONTENT, |
| "Example.java", |
| "class Example {\n" + |
| " private @org.springframework.beans.factory.annotation.Autowired Object o;\n" + |
| " private Example() {}\n" + |
| " public Example(Object o) { this.o = o; }\n" + |
| " private @org.springframework.beans.factory.annotation.Autowired void setO(Object o) { this.o = o;}\n" + |
| "}\n" |
| }, |
| null, customOptions, |
| "----------\n" + |
| "1. ERROR in Example.java (at line 2)\n" + |
| " private @org.springframework.beans.factory.annotation.Autowired Object o;\n" + |
| " ^\n" + |
| "The value of the field Example.o is not used\n" + |
| "----------\n" + |
| "2. ERROR in Example.java (at line 3)\n" + |
| " private Example() {}\n" + |
| " ^^^^^^^^^\n" + |
| "The constructor Example() is never used locally\n" + |
| "----------\n", |
| JavacTestOptions.Excuse.EclipseWarningConfiguredAsError); |
| } |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=464977 |
| public void testBug464977() throws Exception { |
| if (this.complianceLevel < ClassFileConstants.JDK1_6 || this.complianceLevel > ClassFileConstants.JDK1_8) { |
| return; // Enough to run in 3 levels rather! |
| } |
| boolean apt = this.enableAPT; |
| String source = "@Deprecated\n" + |
| "public class DeprecatedClass {\n" + |
| "}"; |
| String version = ""; |
| if (this.complianceLevel == ClassFileConstants.JDK1_8) { |
| version = "1.8 : 52.0"; |
| } else if (this.complianceLevel == ClassFileConstants.JDK1_7) { |
| version = "1.7 : 51.0"; |
| } else if (this.complianceLevel == ClassFileConstants.JDK1_6) { |
| version = "1.6 : 50.0"; |
| } |
| String expectedOutput = "// Compiled from DeprecatedClass.java (version " + version + ", super bit, deprecated)\n" + |
| "@Deprecated\n" + |
| "public class DeprecatedClass {\n" + |
| " \n" + |
| " // Method descriptor #6 ()V\n" + |
| " // Stack: 1, Locals: 1\n" + |
| " public DeprecatedClass();\n" + |
| " 0 aload_0 [this]\n" + |
| " 1 invokespecial Object() [8]\n" + |
| " 4 return\n" + |
| " Line numbers:\n" + |
| " [pc: 0, line: 2]\n" + |
| " Local variable table:\n" + |
| " [pc: 0, pc: 5] local: this index: 0 type: DeprecatedClass\n" + |
| "\n" + |
| "}"; |
| try { |
| this.enableAPT = true; |
| checkClassFile("DeprecatedClass", source, expectedOutput, ClassFileBytesDisassembler.DETAILED | ClassFileBytesDisassembler.COMPACT); |
| } finally { |
| this.enableAPT = apt; |
| } |
| } |
| public void testBug469584() { |
| runNegativeTest( |
| new String[] { |
| "CCETest.java", |
| "import java.lang.annotation.*;\n" + |
| "\n" + |
| "@Retention({RetentionPolicy.CLASS, RetentionPolicy.RUNTIME})\n" + |
| "public @interface CCETest {\n" + |
| "\n" + |
| "}\n" |
| }, |
| "----------\n" + |
| "1. ERROR in CCETest.java (at line 3)\n" + |
| " @Retention({RetentionPolicy.CLASS, RetentionPolicy.RUNTIME})\n" + |
| " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + |
| "Type mismatch: cannot convert from RetentionPolicy[] to RetentionPolicy\n" + |
| "----------\n"); |
| } |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=472178 |
| public void test472178() throws Exception { |
| if (this.complianceLevel < ClassFileConstants.JDK1_8) { |
| return; // Enough to run in 3 levels rather! |
| } |
| String source = |
| "import java.lang.annotation.ElementType;\n" + |
| "import java.lang.annotation.Retention;\n" + |
| "import java.lang.annotation.RetentionPolicy;\n" + |
| "import java.lang.annotation.Target;\n" + |
| "import java.util.ArrayList;\n" + |
| "import java.util.Iterator;\n" + |
| " \n" + |
| "/**\n" + |
| " * @author gglab\n" + |
| " */\n" + |
| "public class Test<X> extends ArrayList<X> {\n" + |
| " public void iterateRemove()\n" + |
| " {\n" + |
| " for (Iterator<X> iter = this.iterator(); iter.hasNext();) {\n" + |
| " Object key = iter.next();\n" + |
| " @Flowannotation\n" + |
| " Foo<@Flowannotation String> f = new Foo<String>();\n" + |
| " @Flowannotation long l = (@Flowannotation long)f.getI(); // this line causes parse error\n" + |
| " iter.remove();\n" + |
| " }\n" + |
| " }\n" + |
| " \n" + |
| " @Flowannotation\n" + |
| " class Foo<@Flowannotation T>\n" + |
| " {\n" + |
| " @Flowannotation\n" + |
| " public int getI()\n" + |
| " {\n" + |
| " return 3;\n" + |
| " }\n" + |
| " }\n" + |
| " \n" + |
| " @Target({ ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.METHOD, ElementType.LOCAL_VARIABLE, ElementType.TYPE, ElementType.FIELD,\n" + |
| " ElementType.TYPE_PARAMETER, ElementType.TYPE_USE})\n" + |
| " @Retention(RetentionPolicy.RUNTIME)\n" + |
| " @interface Flowannotation {}\n" + |
| " public static void main(String[] args) {}\n" + |
| "}"; |
| String expectedOutput = |
| " // Method descriptor #6 ()V\n" + |
| " // Stack: 3, Locals: 6\n" + |
| " public void iterateRemove();\n" + |
| " 0 aload_0 [this]\n" + |
| " 1 invokevirtual Test.iterator() : Iterator [17]\n" + |
| " 4 astore_1 [iter]\n" + |
| " 5 goto 37\n" + |
| " 8 aload_1 [iter]\n" + |
| " 9 invokeinterface Iterator.next() : Object [21] [nargs: 1]\n" + |
| " 14 astore_2 [key]\n" + |
| " 15 new Test$Foo [27]\n" + |
| " 18 dup\n" + |
| " 19 aload_0 [this]\n" + |
| " 20 invokespecial Test$Foo(Test) [29]\n" + |
| " 23 astore_3 [f]\n" + |
| " 24 aload_3 [f]\n" + |
| " 25 invokevirtual Test$Foo.getI() : int [32]\n" + |
| " 28 i2l\n" + |
| " 29 lstore 4 [l]\n" + |
| " 31 aload_1 [iter]\n" + |
| " 32 invokeinterface Iterator.remove() : void [36] [nargs: 1]\n" + |
| " 37 aload_1 [iter]\n" + |
| " 38 invokeinterface Iterator.hasNext() : boolean [39] [nargs: 1]\n" + |
| " 43 ifne 8\n" + |
| " 46 return\n" + |
| " Line numbers:\n" + |
| " [pc: 0, line: 14]\n" + |
| " [pc: 8, line: 15]\n" + |
| " [pc: 15, line: 17]\n" + |
| " [pc: 24, line: 18]\n" + |
| " [pc: 31, line: 19]\n" + |
| " [pc: 37, line: 14]\n" + |
| " [pc: 46, line: 21]\n" + |
| " Local variable table:\n" + |
| " [pc: 0, pc: 47] local: this index: 0 type: Test\n" + |
| " [pc: 5, pc: 46] local: iter index: 1 type: Iterator\n" + |
| " [pc: 15, pc: 37] local: key index: 2 type: Object\n" + |
| " [pc: 24, pc: 37] local: f index: 3 type: Foo\n" + |
| " [pc: 31, pc: 37] local: l index: 4 type: long\n" + |
| " Local variable type table:\n" + |
| " [pc: 0, pc: 47] local: this index: 0 type: Test<X>\n" + |
| " [pc: 5, pc: 46] local: iter index: 1 type: Iterator<X>\n" + |
| " [pc: 24, pc: 37] local: f index: 3 type: String>\n" + |
| " Stack map table: number of frames 2\n" + |
| " [pc: 8, append: {Iterator}]\n" + |
| " [pc: 37, same]\n" + |
| " RuntimeVisibleTypeAnnotations: \n" + |
| " #55 @Flowannotation(\n" + |
| " target type = 0x47 CAST\n" + |
| " offset = 24\n" + |
| " type argument index = 0\n" + |
| " )\n" + |
| " #55 @Flowannotation(\n" + |
| " target type = 0x40 LOCAL_VARIABLE\n" + |
| " local variable entries:\n" + |
| " [pc: 24, pc: 37] index: 3\n" + |
| " location = [INNER_TYPE]\n" + |
| " )\n" + |
| " #55 @Flowannotation(\n" + |
| " target type = 0x40 LOCAL_VARIABLE\n" + |
| " local variable entries:\n" + |
| " [pc: 24, pc: 37] index: 3\n" + |
| " location = [INNER_TYPE, TYPE_ARGUMENT(0)]\n" + |
| " )\n" + |
| " #55 @Flowannotation(\n" + |
| " target type = 0x40 LOCAL_VARIABLE\n" + |
| " local variable entries:\n" + |
| " [pc: 31, pc: 37] index: 4\n" + |
| " )\n"; |
| checkClassFile("Test", source, expectedOutput, ClassFileBytesDisassembler.DETAILED | ClassFileBytesDisassembler.COMPACT); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=470665 |
| public void testBug470665() throws Exception { |
| if (this.complianceLevel <= ClassFileConstants.JDK1_7) { |
| return; // Enough to run in the last two levels! |
| } |
| boolean apt = this.enableAPT; |
| String errMessage = isMinimumCompliant(ClassFileConstants.JDK11) ? |
| "----------\n" + |
| "1. ERROR in A.java (at line 10)\n" + |
| " };\n" + |
| " ^\n" + |
| "Syntax error on token \"}\", delete this token\n" + |
| "----------\n" + |
| "----------\n" |
| : |
| "----------\n" + |
| "1. ERROR in A.java (at line 10)\n" + |
| " };\n" + |
| " ^\n" + |
| "Syntax error on token \"}\", delete this token\n" + |
| "----------\n" + |
| "----------\n" + |
| "1. WARNING in B.java (at line 12)\n" + |
| " X x = new X();\n" + |
| " ^^^^^^^\n" + |
| "Access to enclosing constructor B.X() is emulated by a synthetic accessor method\n" + |
| "----------\n"; |
| String[] sources = new String[] { |
| "A.java", |
| "public final class A {\n" + |
| " String myString;\n" + |
| " public interface B {\n" + |
| " void test();\n" + |
| " }\n" + |
| " private final B b = new B() {\n" + |
| " @Override\n" + |
| " public void test() {}\n" + |
| " }\n" + |
| "};\n" + |
| "}", |
| "B.java", |
| "public class B {\n" + |
| " private static class X {\n" + |
| " static final Object instance1;\n" + |
| " static {\n" + |
| " try {\n" + |
| " instance1 = new Object();\n" + |
| " } catch (Throwable e) {\n" + |
| " throw new AssertionError(e);\n" + |
| " }\n" + |
| " }\n" + |
| " }\n" + |
| " X x = new X();\n" + |
| " Object o = X.instance1;\n" + |
| "}" |
| }; |
| try { |
| this.enableAPT = true; |
| runNegativeTest(sources, errMessage); |
| } finally { |
| this.enableAPT = apt; |
| } |
| } |
| public void testBug506888a() throws Exception { |
| if (this.complianceLevel <= ClassFileConstants.JDK1_5) { |
| return; |
| } |
| Runner runner = new Runner(); |
| runner.customOptions = getCompilerOptions(); |
| runner.customOptions.put(CompilerOptions.OPTION_ReportUnusedWarningToken, CompilerOptions.ERROR); |
| runner.customOptions.put(CompilerOptions.OPTION_ReportIncompleteEnumSwitch, CompilerOptions.IGNORE); |
| runner.customOptions.put(CompilerOptions.OPTION_ReportMissingDefaultCase, CompilerOptions.WARNING); |
| runner.testFiles = |
| new String[] { |
| "X.java", |
| "public class X {\n" + |
| " \n" + |
| " @SuppressWarnings({\"incomplete-switch\"})\n" + |
| " void foo() {\n" + |
| " }\n" + |
| "} \n", |
| }; |
| runner.expectedCompilerLog = |
| "----------\n" + |
| "1. INFO in X.java (at line 3)\n" + |
| " @SuppressWarnings({\"incomplete-switch\"})\n" + |
| " ^^^^^^^^^^^^^^^^^^^\n" + |
| "At least one of the problems in category \'incomplete-switch\' is not analysed due to a compiler option being ignored\n" + |
| "----------\n"; |
| runner.javacTestOptions = JavacTestOptions.Excuse.EclipseHasSomeMoreWarnings; |
| runner.runWarningTest(); |
| } |
| public void testBug506888b() throws Exception { |
| if (this.complianceLevel <= ClassFileConstants.JDK1_5) { |
| return; |
| } |
| Map options = getCompilerOptions(); |
| options.put(CompilerOptions.OPTION_ReportUnusedWarningToken, CompilerOptions.ERROR); |
| options.put(CompilerOptions.OPTION_ReportIncompleteEnumSwitch, CompilerOptions.WARNING); |
| options.put(CompilerOptions.OPTION_ReportMissingDefaultCase, CompilerOptions.IGNORE); |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "public class X {\n" + |
| " \n" + |
| " @SuppressWarnings({\"incomplete-switch\"})\n" + |
| " void foo(Color c) {\n" + |
| " switch(c) {\n" + |
| " }\n" + |
| " }\n" + |
| " enum Color { BLUE, RED; } \n" + |
| "} \n", |
| }, |
| options); |
| } |
| public void testBug506888c() throws Exception { |
| if (this.complianceLevel <= ClassFileConstants.JDK1_5) { |
| return; |
| } |
| Runner runner = new Runner(); |
| runner.customOptions = getCompilerOptions(); |
| runner.customOptions.put(CompilerOptions.OPTION_ReportUnusedWarningToken, CompilerOptions.WARNING); |
| runner.customOptions.put(CompilerOptions.OPTION_ReportIncompleteEnumSwitch, CompilerOptions.WARNING); |
| runner.customOptions.put(CompilerOptions.OPTION_ReportMissingDefaultCase, CompilerOptions.WARNING); |
| runner.customOptions.put(CompilerOptions.OPTION_ReportUncheckedTypeOperation, CompilerOptions.WARNING); |
| runner.testFiles = |
| new String[] { |
| "X.java", |
| "public class X {\n" + |
| " \n" + |
| " @SuppressWarnings({\"incomplete-switch\", \"unchecked\"})\n" + |
| " void foo(Color c) {\n" + |
| " switch(c) {\n" + |
| " }\n" + |
| " }\n" + |
| " enum Color { BLUE, RED; } \n" + |
| "} \n", |
| }; |
| runner.expectedCompilerLog = |
| "----------\n" + |
| "1. WARNING in X.java (at line 3)\n" + |
| " @SuppressWarnings({\"incomplete-switch\", \"unchecked\"})\n" + |
| " ^^^^^^^^^^^\n" + |
| "Unnecessary @SuppressWarnings(\"unchecked\")\n" + |
| "----------\n"; |
| runner.javacTestOptions = JavacTestOptions.Excuse.EclipseHasSomeMoreWarnings; |
| runner.runWarningTest(); |
| } |
| public void testBug506888d() throws Exception { |
| if (this.complianceLevel <= ClassFileConstants.JDK1_5) { |
| return; |
| } |
| Map options = getCompilerOptions(); |
| options.put(CompilerOptions.OPTION_ReportUnusedWarningToken, CompilerOptions.IGNORE); |
| options.put(CompilerOptions.OPTION_ReportIncompleteEnumSwitch, CompilerOptions.IGNORE); |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "public class X {\n" + |
| " \n" + |
| " @SuppressWarnings({\"incomplete-switch\"})\n" + |
| " void foo() {\n" + |
| " }\n" + |
| "} \n", |
| }, |
| "", |
| null, true, options); |
| } |
| public void testBug506888e() throws Exception { |
| if (this.complianceLevel <= ClassFileConstants.JDK1_5) { |
| return; |
| } |
| Map options = getCompilerOptions(); |
| options.put(CompilerOptions.OPTION_ReportUnusedWarningToken, CompilerOptions.IGNORE); |
| options.put(CompilerOptions.OPTION_ReportUnusedLabel, CompilerOptions.WARNING); |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "public class X {\n" + |
| " \n" + |
| " @SuppressWarnings({\"unused\"})\n" + |
| " void foo() {}\n" + |
| "} \n", |
| }, |
| "", |
| null, true, options); |
| } |
| public void testBug506888f() throws Exception { |
| |
| class MyCompilerRequestor implements ICompilerRequestor { |
| String[] problemArguments = null; |
| |
| @Override |
| public void acceptResult(CompilationResult result) { |
| for (CategorizedProblem problem : result.getAllProblems()) { |
| String[] arguments = problem.getArguments(); |
| if (arguments != null && arguments.length > 0) { |
| this.problemArguments = arguments; |
| return; |
| } |
| } |
| } |
| } |
| |
| if (this.complianceLevel <= ClassFileConstants.JDK1_5) { |
| return; |
| } |
| Map options = getCompilerOptions(); |
| options.put(CompilerOptions.OPTION_ReportUnusedWarningToken, CompilerOptions.ERROR); |
| options.put(CompilerOptions.OPTION_ReportUnusedDeclaredThrownException, CompilerOptions.IGNORE); |
| options.put(CompilerOptions.OPTION_ReportUnusedLocal, CompilerOptions.WARNING); |
| MyCompilerRequestor requestor = new MyCompilerRequestor(); |
| runTest(new String[] { |
| "X.java", |
| "public class X {\n" + |
| " \n" + |
| " @SuppressWarnings({\"unused\"})\n" + |
| " void foo() {\n" + |
| " }\n" + |
| "} \n", |
| }, |
| false, |
| "----------\n" + |
| "1. INFO in X.java (at line 3)\n" + |
| " @SuppressWarnings({\"unused\"})\n" + |
| " ^^^^^^^^\n" + |
| "At least one of the problems in category \'unused\' is not analysed due to a compiler option being ignored\n" + |
| "----------\n", |
| "" /*expectedOutputString */, |
| "" /* expectedErrorString */, |
| false /* forceExecution */, |
| null /* classLib */, |
| true /* shouldFlushOutputDirectory */, |
| null /* vmArguments */, |
| options, |
| new Requestor(true, requestor, false, true), |
| JavacTestOptions.Excuse.EclipseHasSomeMoreWarnings); |
| assertNotNull(requestor.problemArguments); |
| assertEquals(1, requestor.problemArguments.length); |
| assertEquals(JavaCore.COMPILER_PB_UNUSED_PARAMETER, requestor.problemArguments[0]); |
| } |
| public void testBug537593_001() { |
| if (this.complianceLevel < ClassFileConstants.JDK1_8) |
| return; |
| class MyCompilerRequestor implements ICompilerRequestor { |
| String[] problemArguments = null; |
| |
| @Override |
| public void acceptResult(CompilationResult result) { |
| for (CategorizedProblem problem : result.getAllProblems()) { |
| String[] arguments = problem.getArguments(); |
| if (arguments != null && arguments.length > 0) { |
| this.problemArguments = arguments; |
| return; |
| } |
| } |
| } |
| } |
| |
| if (this.complianceLevel <= ClassFileConstants.JDK1_5) { |
| return; |
| } |
| String[] files = new String[] { |
| "X.java", |
| "\n" + |
| "public class X {\n" + |
| "\n" + |
| " protected void bar(Z z) {\n" + |
| " System.out.println(z.toString());\n" + |
| " }\n" + |
| "\n" + |
| " public void foo() {\n" + |
| " bar(() -> {\n" + |
| " foo2(new I() {\n" + |
| " @SuppressWarnings({\"unused\"})\n" + |
| " public void bar2() {}\n" + |
| " });\n" + |
| " });\n" + |
| " }\n" + |
| " public static void main(String[] args) {}\n" + |
| "\n" + |
| " public Z foo2(I i) {\n" + |
| " return i == null ? null : null;\n" + |
| " }\n" + |
| "}\n" + |
| "\n" + |
| "interface Z {\n" + |
| " void apply();\n" + |
| "}\n" + |
| "\n" + |
| "interface I {}\n" + |
| "\n", |
| }; |
| |
| Map options = getCompilerOptions(); |
| Object[] opts = { |
| CompilerOptions.OPTION_ReportUnusedDeclaredThrownException, |
| CompilerOptions.OPTION_ReportUnusedDeclaredThrownExceptionExemptExceptionAndThrowable, |
| CompilerOptions.OPTION_ReportUnusedDeclaredThrownExceptionIncludeDocCommentReference, |
| CompilerOptions.OPTION_ReportUnusedDeclaredThrownExceptionWhenOverriding, |
| CompilerOptions.OPTION_ReportUnusedExceptionParameter, |
| CompilerOptions.OPTION_ReportUnusedImport, |
| CompilerOptions.OPTION_ReportUnusedLabel, |
| CompilerOptions.OPTION_ReportUnusedLocal, |
| CompilerOptions.OPTION_ReportUnusedObjectAllocation, |
| CompilerOptions.OPTION_ReportUnusedParameter, |
| CompilerOptions.OPTION_ReportUnusedParameterWhenOverridingConcrete, |
| CompilerOptions.OPTION_ReportUnusedParameterIncludeDocCommentReference, |
| CompilerOptions.OPTION_ReportUnusedPrivateMember, |
| CompilerOptions.OPTION_ReportUnusedTypeArgumentsForMethodInvocation, |
| CompilerOptions.OPTION_ReportUnusedTypeParameter, |
| CompilerOptions.OPTION_ReportUnusedWarningToken, |
| CompilerOptions.OPTION_ReportRedundantSuperinterface, |
| CompilerOptions.OPTION_ReportRedundantSpecificationOfTypeArguments, |
| }; |
| for (Object option : opts) |
| options.put(option, CompilerOptions.WARNING); |
| MyCompilerRequestor requestor = new MyCompilerRequestor(); |
| runTest(files, |
| false, |
| "", |
| "" /*expectedOutputString */, |
| "" /* expectedErrorString */, |
| false /* forceExecution */, |
| null /* classLib */, |
| true /* shouldFlushOutputDirectory */, |
| null /* vmArguments */, |
| options, |
| new Requestor(true, requestor, false, true), |
| JavacTestOptions.DEFAULT); |
| assertNull(requestor.problemArguments); |
| } |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=542520 - [JUnit 5] Warning The method xxx from the type X |
| // is never used locally is shown when using MethodSource - common case |
| public void testBug542520a() throws Exception { |
| Runner runner = new Runner(); |
| runner.customOptions = getCompilerOptions(); |
| runner.customOptions.put(CompilerOptions.OPTION_ReportUnusedPrivateMember, CompilerOptions.ERROR); |
| runner.testFiles = |
| new String[] { |
| JUNIT_METHODSOURCE_NAME, |
| JUNIT_METHODSOURCE_CONTENT, |
| "ExampleTest.java", |
| "import java.util.Arrays;\n" + |
| "import java.util.List;\n" + |
| "import org.junit.jupiter.params.provider.MethodSource;\n" + |
| "public class ExampleTest {\n" + |
| "\n" + |
| " @MethodSource(\"getIntegers\")\n" + |
| " void testIntegers(Integer integer) {}\n" + |
| " \n" + |
| " private static List<Integer> getIntegers() {\n" + |
| " return Arrays.asList(0, 5, 1);\n" + |
| " }\n" + |
| "}\n", |
| }; |
| runner.runConformTest(); |
| } |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=542520 - [JUnit 5] Warning The method xxx from the type X |
| // is never used locally is shown when using MethodSource - variation with fully qualified annotation |
| public void testBug542520b() throws Exception { |
| Runner runner = new Runner(); |
| runner.customOptions = getCompilerOptions(); |
| runner.customOptions.put(CompilerOptions.OPTION_ReportUnusedPrivateMember, CompilerOptions.ERROR); |
| runner.testFiles = |
| new String[] { |
| JUNIT_METHODSOURCE_NAME, |
| JUNIT_METHODSOURCE_CONTENT, |
| "ExampleTest.java", |
| "import java.util.Arrays;\n" + |
| "import java.util.List;\n" + |
| "public class ExampleTest {\n" + |
| "\n" + |
| " @org.junit.jupiter.params.provider.MethodSource(\"getIntegers\")\n" + |
| " void testIntegers(Integer integer) {}\n" + |
| " \n" + |
| " private static List<Integer> getIntegers() {\n" + |
| " return Arrays.asList(0, 5, 1);\n" + |
| " }\n" + |
| "}\n", |
| }; |
| runner.runConformTest(); |
| } |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=542520 - [JUnit 5] Warning The method xxx from the type X |
| // is never used locally is shown when using MethodSource - marker annotation |
| public void testBug542520c() throws Exception { |
| Runner runner = new Runner(); |
| runner.customOptions = getCompilerOptions(); |
| runner.customOptions.put(CompilerOptions.OPTION_ReportUnusedPrivateMember, CompilerOptions.ERROR); |
| runner.testFiles = |
| new String[] { |
| JUNIT_METHODSOURCE_NAME, |
| JUNIT_METHODSOURCE_CONTENT, |
| "ExampleTest.java", |
| "import java.util.Arrays;\n" + |
| "import java.util.List;\n" + |
| "import org.junit.jupiter.params.provider.MethodSource;\n" + |
| "public class ExampleTest {\n" + |
| "\n" + |
| " @MethodSource\n" + |
| " void testIntegers(Integer integer) {}\n" + |
| " \n" + |
| " private static List<Integer> testIntegers() {\n" + |
| " return Arrays.asList(0, 5, 1);\n" + |
| " }\n" + |
| "}\n", |
| }; |
| runner.runConformTest(); |
| } |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=542520 - [JUnit 5] Warning The method xxx from the type X |
| // is never used locally is shown when using MethodSource - missing no-args method source |
| public void testBug542520d() throws Exception { |
| Map customOptions = getCompilerOptions(); |
| customOptions.put(CompilerOptions.OPTION_ReportUnusedPrivateMember, CompilerOptions.ERROR); |
| this.runNegativeTest( |
| true, |
| new String[] { |
| JUNIT_METHODSOURCE_NAME, |
| JUNIT_METHODSOURCE_CONTENT, |
| "ExampleTest.java", |
| "import java.util.Arrays;\n" + |
| "import java.util.List;\n" + |
| "import org.junit.jupiter.params.provider.MethodSource;\n" + |
| "public class ExampleTest {\n" + |
| "\n" + |
| " @MethodSource(\"getIntegers\")\n" + |
| " void testIntegers(Integer integer) {}\n" + |
| " \n" + |
| " private static List<Integer> getIntegers(int i) {\n" + |
| " return Arrays.asList(0, 5, 1);\n" + |
| " }\n" + |
| "}\n", |
| }, |
| null, customOptions, |
| "----------\n" + |
| "1. ERROR in ExampleTest.java (at line 9)\n" + |
| " private static List<Integer> getIntegers(int i) {\n" + |
| " ^^^^^^^^^^^^^^^^^^\n" + |
| "The method getIntegers(int) from the type ExampleTest is never used locally\n" + |
| "----------\n", |
| JavacTestOptions.Excuse.EclipseWarningConfiguredAsError); |
| } |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=546084 - Using Junit 5s MethodSource leads to |
| // ClassCastException - string concatenation, i.e. BinaryExpression in @MethodSource annotation |
| public void testBug546084a() throws Exception { |
| Runner runner = new Runner(); |
| runner.customOptions = getCompilerOptions(); |
| runner.customOptions.put(CompilerOptions.OPTION_ReportUnusedPrivateMember, CompilerOptions.ERROR); |
| runner.testFiles = |
| new String[] { |
| JUNIT_METHODSOURCE_NAME, |
| JUNIT_METHODSOURCE_CONTENT, |
| "ExampleTest.java", |
| "import java.util.Arrays;\n" + |
| "import java.util.List;\n" + |
| "import org.junit.jupiter.params.provider.MethodSource;\n" + |
| "public class ExampleTest {\n" + |
| "\n" + |
| " private final String TEST_METHOD_PREFIX = \"get\";\n" + |
| " @MethodSource(TEST_METHOD_PREFIX + \"Integers\")\n" + |
| " void testIntegers(Integer integer) {}\n" + |
| " \n" + |
| " private static List<Integer> getIntegers() {\n" + |
| " return Arrays.asList(0, 5, 1);\n" + |
| " }\n" + |
| "}\n", |
| }; |
| runner.runConformTest(); |
| } |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=546084 - Using Junit 5s MethodSource leads to |
| // ClassCastException - non string value, e.g. ClassLiteralAccess in @MethodSource annotation |
| public void testBug546084b() throws Exception { |
| this.runNegativeTest( |
| new String[] { |
| JUNIT_METHODSOURCE_NAME, |
| JUNIT_METHODSOURCE_CONTENT, |
| "ExampleTest.java", |
| "import java.util.Arrays;\n" + |
| "import java.util.List;\n" + |
| "import org.junit.jupiter.params.provider.MethodSource;\n" + |
| "public class ExampleTest {\n" + |
| "\n" + |
| " @MethodSource(Object.class)\n" + |
| " void testIntegers(Integer integer) {}\n" + |
| " \n" + |
| " private static List<Integer> getIntegers(int i) {\n" + |
| " return Arrays.asList(0, 5, 1);\n" + |
| " }\n" + |
| "}\n", |
| }, |
| "----------\n" + |
| "1. ERROR in ExampleTest.java (at line 6)\n" + |
| " @MethodSource(Object.class)\n" + |
| " ^^^^^^^^^^^^\n" + |
| "Type mismatch: cannot convert from Class<Object> to String[]\n" + |
| "----------\n" + |
| "2. WARNING in ExampleTest.java (at line 9)\n" + |
| " private static List<Integer> getIntegers(int i) {\n" + |
| " ^^^^^^^^^^^^^^^^^^\n" + |
| "The method getIntegers(int) from the type ExampleTest is never used locally\n" + |
| "----------\n"); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=546084 - Using Junit 5s MethodSource leads to |
| //ClassCastException - array of string values, e.g. ArrayInitializer in @MethodSource annotation |
| public void testBug546084c() throws Exception { |
| Runner runner = new Runner(); |
| runner.customOptions = getCompilerOptions(); |
| runner.customOptions.put(CompilerOptions.OPTION_ReportUnusedPrivateMember, CompilerOptions.ERROR); |
| runner.testFiles = |
| new String[] { |
| JUNIT_METHODSOURCE_NAME, |
| JUNIT_METHODSOURCE_CONTENT, |
| "ExampleTest.java", |
| "import java.util.Arrays;\n" + |
| "import java.util.List;\n" + |
| "import org.junit.jupiter.params.provider.MethodSource;\n" + |
| "public class ExampleTest {\n" + |
| "\n" + |
| " @MethodSource({ \"getIntegers\" })\n" + |
| " void testIntegers(Integer integer) {}\n" + |
| " \n" + |
| " private static List<Integer> getIntegers() {\n" + |
| " return Arrays.asList(0, 5, 1);\n" + |
| " }\n" + |
| "}\n", |
| }; |
| runner.runConformTest(); |
| } |
| public void testBug490698_comment16() { |
| runConformTest( |
| new String[] { |
| "foo/bar/AnnotationError.java", |
| "package foo.bar;\n" + |
| "\n" + |
| "import static java.lang.annotation.ElementType.FIELD;\n" + |
| "import static java.lang.annotation.RetentionPolicy.RUNTIME;\n" + |
| "\n" + |
| "import java.lang.annotation.Retention;\n" + |
| "import java.lang.annotation.Target;\n" + |
| "import java.util.function.Predicate;\n" + |
| "\n" + |
| "public class AnnotationError<T> {\n" + |
| "\n" + |
| " public enum P {\n" + |
| " AAA\n" + |
| " }\n" + |
| "\n" + |
| " @Target(FIELD)\n" + |
| " @Retention(RUNTIME)\n" + |
| " public @interface A {\n" + |
| " P value();\n" + |
| " }\n" + |
| "\n" + |
| " @Target(FIELD)\n" + |
| " @Retention(RUNTIME)\n" + |
| " public @interface FF {\n" + |
| " }\n" + |
| "\n" + |
| " public static class Bool extends AnnotationError<Boolean> {\n" + |
| " }\n" + |
| "\n" + |
| " @A(P.AAA)\n" + |
| " @FF\n" + |
| " public static final AnnotationError.Bool FOO = new AnnotationError.Bool();\n" + |
| "}\n" |
| }); |
| } |
| } |