/******************************************************************************* * Copyright (c) 2000, 2014 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.jdt.core.tests.compiler.regression; import java.util.Map; import junit.framework.Test; import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; @SuppressWarnings({ "unchecked", "rawtypes" }) public class JavadocTest_1_5 extends JavadocTest { String docCommentSupport = CompilerOptions.ENABLED; String reportInvalidJavadoc = CompilerOptions.ERROR; String reportInvalidJavadocVisibility = CompilerOptions.PRIVATE; String reportMissingJavadocTags = CompilerOptions.ERROR; String reportMissingJavadocTagsOverriding = CompilerOptions.ENABLED; String reportMissingJavadocComments = null; String reportMissingJavadocCommentsVisibility = null; public JavadocTest_1_5(String name) { super(name); } public static Class testClass() { return JavadocTest_1_5.class; } // Use this static initializer to specify subset for tests // All specified tests which does not belong to the class are skipped... static { // TESTS_PREFIX = "testBug95521"; // TESTS_NAMES = new String[] { "testBug331872d" }; // TESTS_NUMBERS = new int[] { 101283 }; // TESTS_RANGE = new int[] { 23, -1 }; } public static Test suite() { return buildMinimalComplianceTestSuite(testClass(), F_1_5); } protected Map getCompilerOptions() { Map options = super.getCompilerOptions(); options.put(CompilerOptions.OPTION_DocCommentSupport, this.docCommentSupport); options.put(CompilerOptions.OPTION_ReportInvalidJavadoc, this.reportInvalidJavadoc); if (!CompilerOptions.IGNORE.equals(this.reportInvalidJavadoc)) { options.put(CompilerOptions.OPTION_ReportInvalidJavadocTagsVisibility, this.reportInvalidJavadocVisibility); } if (this.reportMissingJavadocComments != null) options.put(CompilerOptions.OPTION_ReportMissingJavadocComments, this.reportMissingJavadocComments); else options.put(CompilerOptions.OPTION_ReportMissingJavadocComments, this.reportInvalidJavadoc); if (this.reportMissingJavadocCommentsVisibility != null) options.put(CompilerOptions.OPTION_ReportMissingJavadocCommentsVisibility, this.reportMissingJavadocCommentsVisibility); if (this.reportMissingJavadocTags != null) { options.put(CompilerOptions.OPTION_ReportMissingJavadocTags, this.reportMissingJavadocTags); if (this.reportMissingJavadocTagsOverriding != null) { options.put(CompilerOptions.OPTION_ReportMissingJavadocTagsOverriding, this.reportMissingJavadocTagsOverriding); } } else { options.put(CompilerOptions.OPTION_ReportMissingJavadocTags, this.reportInvalidJavadoc); } options.put(CompilerOptions.OPTION_ReportFieldHiding, CompilerOptions.IGNORE); options.put(CompilerOptions.OPTION_ReportSyntheticAccessEmulation, CompilerOptions.IGNORE); options.put(CompilerOptions.OPTION_ReportDeprecation, CompilerOptions.ERROR); options.put(CompilerOptions.OPTION_ReportUnusedImport, CompilerOptions.ERROR); options.put(CompilerOptions.OPTION_ReportUnusedPrivateMember, CompilerOptions.IGNORE); options.put(CompilerOptions.OPTION_ReportMissingJavadocTagsMethodTypeParameters, CompilerOptions.ENABLED); return options; } /* (non-Javadoc) * @see junit.framework.TestCase#setUp() */ protected void setUp() throws Exception { super.setUp(); this.docCommentSupport = CompilerOptions.ENABLED; this.reportInvalidJavadoc = CompilerOptions.ERROR; this.reportInvalidJavadocVisibility = CompilerOptions.PRIVATE; this.reportMissingJavadocTags = CompilerOptions.ERROR; this.reportMissingJavadocTagsOverriding = CompilerOptions.ENABLED; this.reportMissingJavadocComments = CompilerOptions.IGNORE; } /** * Test fix for bug 70891: [1.5][javadoc] Compiler should accept new 1.5 syntax for @param * @see <a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=70891">70891</a> * These two tests fail for 1.5 source level but should pass for 1.3 or 1.4 * @see JavadocTest_1_4 */ /* (non-Javadoc) * Test @param for generic class type parameter */ public void test003() { this.runConformTest( new String[] { "X.java", " /**\n" + " * Valid type parameter reference\n" + " * @param <E> Type\n" + " */\n" + " public class X<E> {}" } ); } public void test004() { this.runConformTest( new String[] { "X.java", " /**\n" + " * Valid type parameter reference\n" + " * @param <E> Type extends RuntimeException\n" + " */\n" + " public class X<E extends RuntimeException> {}" } ); } public void test005() { this.runConformTest( new String[] { "X.java", " /**\n" + " * Valid type parameter reference\n" + " * @param <T> Type parameter 1\n" + " * @param <U> Type parameter 2\n" + " * @param <V> Type parameter 3\n" + " */\n" + " public class X<T, U, V> {}" } ); } public void test006() { this.runNegativeTest( new String[] { "X.java", " /**\n" + " * Invalid type parameter reference\n" + " * @param <E> Type parameter\n" + " */\n" + " public class X {}", }, "----------\n" + "1. ERROR in X.java (at line 3)\n" + " * @param <E> Type parameter\n" + " ^^^^^\n" + "Javadoc: Unexpected tag\n" + "----------\n", JavacTestOptions.Excuse.EclipseWarningConfiguredAsError ); } public void test007() { this.runNegativeTest( new String[] { "X.java", " /**\n" + " * Invalid type parameter reference\n" + " * @param <E> Type parameter\n" + " */\n" + " public class X<E, F> {}", }, "----------\n" + "1. ERROR in X.java (at line 5)\n" + " public class X<E, F> {}\n" + " ^\n" + "Javadoc: Missing tag for parameter F\n" + "----------\n", JavacTestOptions.Excuse.EclipseWarningConfiguredAsError ); } public void test008() { this.runNegativeTest( new String[] { "X.java", " /**\n" + " * Invalid type parameter reference\n" + " * @param <T> Type parameter 1\n" + " * @param <U> Type parameter 2\n" + " * @param <V> Type parameter 3\n" + " */\n" + " public class X<T> {}" }, "----------\n" + "1. ERROR in X.java (at line 4)\n" + " * @param <U> Type parameter 2\n" + " ^\n" + "Javadoc: U cannot be resolved to a type\n" + "----------\n" + "2. ERROR in X.java (at line 5)\n" + " * @param <V> Type parameter 3\n" + " ^\n" + "Javadoc: V cannot be resolved to a type\n" + "----------\n", JavacTestOptions.Excuse.EclipseWarningConfiguredAsError ); } public void test009() { this.runNegativeTest( new String[] { "X.java", " /**\n" + " * Invalid type parameter reference\n" + " * @param <T> Type parameter 1\n" + " * @param <X> Type parameter 2\n" + " * @param <U> Type parameter 2\n" + " * @param <E> Type parameter 2\n" + " * @param <V> Type parameter 3\n" + " */\n" + " public class X<T, U, V> {}" }, "----------\n" + "1. ERROR in X.java (at line 4)\n" + " * @param <X> Type parameter 2\n" + " ^\n" + "Javadoc: Parameter X is not declared\n" + "----------\n" + "2. ERROR in X.java (at line 6)\n" + " * @param <E> Type parameter 2\n" + " ^\n" + "Javadoc: E cannot be resolved to a type\n" + "----------\n", JavacTestOptions.Excuse.EclipseWarningConfiguredAsError ); } public void test010() { this.runConformTest( new String[] { "X.java", " /**\n" + " * Valid type parameter reference\n" + " * @param <V> Type parameter 3\n" + " * @param <U> Type parameter 2\n" + " * @param <T> Type parameter 1\n" + " */\n" + " public class X<T, U, V> {}" } ); } public void test011() { this.runNegativeTest( new String[] { "X.java", " /**\n" + " * Invalid type parameter reference\n" + " * @param <U> Type parameter 1\n" + " * @param <E> Type parameter 2\n" + " * @param <V> Type parameter 2\n" + " * @param <U> Type parameter 2\n" + " * @param <T> Type parameter 3\n" + " */\n" + " public class X<T, U, V> {}" }, "----------\n" + "1. ERROR in X.java (at line 4)\n" + " * @param <E> Type parameter 2\n" + " ^\n" + "Javadoc: E cannot be resolved to a type\n" + "----------\n" + "2. ERROR in X.java (at line 6)\n" + " * @param <U> Type parameter 2\n" + " ^\n" + "Javadoc: Duplicate tag for parameter\n" + "----------\n", JavacTestOptions.Excuse.EclipseWarningConfiguredAsError ); } public void test012() { this.runNegativeTest( new String[] { "X.java", " /**\n" + " * Invalid type parameter reference\n" + " */\n" + " public class X<T, U, V> {}" }, "----------\n" + "1. ERROR in X.java (at line 4)\n" + " public class X<T, U, V> {}\n" + " ^\n" + "Javadoc: Missing tag for parameter T\n" + "----------\n" + "2. ERROR in X.java (at line 4)\n" + " public class X<T, U, V> {}\n" + " ^\n" + "Javadoc: Missing tag for parameter U\n" + "----------\n" + "3. ERROR in X.java (at line 4)\n" + " public class X<T, U, V> {}\n" + " ^\n" + "Javadoc: Missing tag for parameter V\n" + "----------\n", JavacTestOptions.Excuse.EclipseWarningConfiguredAsError ); } public void test013() { this.runNegativeTest( new String[] { "X.java", " /**\n" + " * Invalid type parameter reference\n" + " * @param <T> Type parameter 3\n" + " */\n" + " public class X<T, U, V> {}" }, "----------\n" + "1. ERROR in X.java (at line 5)\n" + " public class X<T, U, V> {}\n" + " ^\n" + "Javadoc: Missing tag for parameter U\n" + "----------\n" + "2. ERROR in X.java (at line 5)\n" + " public class X<T, U, V> {}\n" + " ^\n" + "Javadoc: Missing tag for parameter V\n" + "----------\n", JavacTestOptions.Excuse.EclipseWarningConfiguredAsError ); } public void test014() { this.runNegativeTest( new String[] { "X.java", " /**\n" + " * Invalid type parameter reference\n" + " * @param <U> Type parameter 3\n" + " */\n" + " public class X<T, U, V> {}" }, "----------\n" + "1. ERROR in X.java (at line 5)\n" + " public class X<T, U, V> {}\n" + " ^\n" + "Javadoc: Missing tag for parameter T\n" + "----------\n" + "2. ERROR in X.java (at line 5)\n" + " public class X<T, U, V> {}\n" + " ^\n" + "Javadoc: Missing tag for parameter V\n" + "----------\n", JavacTestOptions.Excuse.EclipseWarningConfiguredAsError ); } public void test015() { this.runNegativeTest( new String[] { "X.java", " /**\n" + " * Invalid type parameter reference\n" + " * @param <U> Type parameter 3\n" + " * @param <V> Type parameter 3\n" + " */\n" + " public class X<T, U, V> {}" }, "----------\n" + "1. ERROR in X.java (at line 6)\n" + " public class X<T, U, V> {}\n" + " ^\n" + "Javadoc: Missing tag for parameter T\n" + "----------\n", JavacTestOptions.Excuse.EclipseWarningConfiguredAsError ); } public void test016() { this.runNegativeTest( new String[] { "X.java", " /**\n" + " * Invalid type parameter reference\n" + " * @param <T> Type parameter 3\n" + " * @param <V> Type parameter 3\n" + " */\n" + " public class X<T, U, V> {}" }, "----------\n" + "1. ERROR in X.java (at line 6)\n" + " public class X<T, U, V> {}\n" + " ^\n" + "Javadoc: Missing tag for parameter U\n" + "----------\n", JavacTestOptions.Excuse.EclipseWarningConfiguredAsError ); } public void test017() { this.runNegativeTest( new String[] { "X.java", " /**\n" + " * Invalid type parameter reference\n" + " * @param <T> Type parameter 3\n" + " * @param <U> Type parameter 3\n" + " */\n" + " public class X<T, U, V> {}" }, "----------\n" + "1. ERROR in X.java (at line 6)\n" + " public class X<T, U, V> {}\n" + " ^\n" + "Javadoc: Missing tag for parameter V\n" + "----------\n", JavacTestOptions.Excuse.EclipseWarningConfiguredAsError ); } public void test018() { this.runNegativeTest( new String[] { "X.java", " /**\n" + " * Invalid type parameter reference\n" + " * @param <V> Type parameter 3\n" + " */\n" + " public class X<T, U, V> {}" }, "----------\n" + "1. ERROR in X.java (at line 5)\n" + " public class X<T, U, V> {}\n" + " ^\n" + "Javadoc: Missing tag for parameter T\n" + "----------\n" + "2. ERROR in X.java (at line 5)\n" + " public class X<T, U, V> {}\n" + " ^\n" + "Javadoc: Missing tag for parameter U\n" + "----------\n", JavacTestOptions.Excuse.EclipseWarningConfiguredAsError ); } public void test019() { this.runNegativeTest( new String[] { "X.java", " /**\n" + " * Invalid type parameter reference\n" + " * @param <V> Type parameter 2\n" + " * @param <X> Type parameter 2\n" + " * @param <U> Type parameter 1\n" + " * @param <E> Type parameter 2\n" + " * @param <U> Type parameter 2\n" + " */\n" + " public class X<T, U, V> {}" }, "----------\n" + "1. ERROR in X.java (at line 4)\n" + " * @param <X> Type parameter 2\n" + " ^\n" + "Javadoc: Parameter X is not declared\n" + "----------\n" + "2. ERROR in X.java (at line 6)\n" + " * @param <E> Type parameter 2\n" + " ^\n" + "Javadoc: E cannot be resolved to a type\n" + "----------\n" + "3. ERROR in X.java (at line 7)\n" + " * @param <U> Type parameter 2\n" + " ^\n" + "Javadoc: Duplicate tag for parameter\n" + "----------\n" + "4. ERROR in X.java (at line 9)\n" + " public class X<T, U, V> {}\n" + " ^\n" + "Javadoc: Missing tag for parameter T\n" + "----------\n", JavacTestOptions.Excuse.EclipseWarningConfiguredAsError ); } public void test020() { this.runNegativeTest( new String[] { "X.java", " /**\n" + " * Invalid type parameter reference\n" + " * @param <V> Type parameter 2\n" + " * @param\n" + " * @param <U> Type parameter 1\n" + " */\n" + " public class X<T, U, V> {}" }, "----------\n" + "1. ERROR in X.java (at line 4)\n" + " * @param\n" + " ^^^^^\n" + "Javadoc: Missing parameter name\n" + "----------\n" + "2. ERROR in X.java (at line 7)\n" + " public class X<T, U, V> {}\n" + " ^\n" + "Javadoc: Missing tag for parameter T\n" + "----------\n", JavacTestOptions.Excuse.EclipseWarningConfiguredAsError ); } public void test021() { this.runNegativeTest( new String[] { "X.java", " /**\n" + " * Invalid type parameter reference: compile error\n" + " * @param <T> Type parameter 2\n" + " * @param <V> Type parameter 2\n" + " * @param <U> Type parameter 1\n" + " */\n" + " public class X<T, , V> {}" }, "----------\n" + "1. ERROR in X.java (at line 4)\n" + " * @param <V> Type parameter 2\n" + " ^\n" + "Javadoc: V cannot be resolved to a type\n" + "----------\n" + "2. ERROR in X.java (at line 5)\n" + " * @param <U> Type parameter 1\n" + " ^\n" + "Javadoc: U cannot be resolved to a type\n" + "----------\n" + "3. ERROR in X.java (at line 7)\n" + " public class X<T, , V> {}\n" + " ^\n" + "Syntax error on token \",\", delete this token\n" + "----------\n" ); } public void test022() { this.runNegativeTest( new String[] { "X.java", " /**\n" + " * Invalid type parameter reference: compile error\n" + " * @param <T> Type parameter 2\n" + " * @param <V> Type parameter 2\n" + " * @param <U> Type parameter 1\n" + " */\n" + " public class X<T, U, V extend Exception> {}" }, "----------\n" + "1. ERROR in X.java (at line 7)\n" + " public class X<T, U, V extend Exception> {}\n" + " ^^^^^^\n" + "Syntax error on token \"extend\", extends expected\n" + "----------\n" + "2. ERROR in X.java (at line 7)\n" + " public class X<T, U, V extend Exception> {}\n" + " ^^^^^^\n" + "extend cannot be resolved to a type\n" + "----------\n" ); } /* (non-Javadoc) * Test @param for generic method type parameter */ public void test023() { this.runConformTest( new String[] { "X.java", " public class X {\n" + " /**\n" + " * Valid type parameter reference\n" + " * @param <E> Type\n" + " */\n" + " public <E> void foo() {}\n" + "}" } ); } public void test024() { this.runConformTest( new String[] { "X.java", " public class X {\n" + " /**\n" + " * Valid type parameter reference\n" + " * @param <E> Type extends RuntimeException\n" + " * @param val int\n" + " * @param obj Object\n" + " */\n" + " public <E extends RuntimeException> void foo(int val, Object obj) {}\n" + "}" } ); } public void test025() { this.runConformTest( new String[] { "X.java", " public class X {\n" + " /**\n" + " * Valid type parameter reference\n" + " * @param val int\n" + " * @param obj Object\n" + " * @param <T> Type parameter 1\n" + " * @param <U> Type parameter 2\n" + " * @param <V> Type parameter 3\n" + " */\n" + " public <T, U, V> void foo(int val, Object obj) {}\n" + "}" } ); } public void test026() { this.runNegativeTest( new String[] { "X.java", " public class X {\n" + " /**\n" + " * Invalid type parameter reference\n" + " * @param val int\n" + " * @param <E> Type parameter\n" + " * @param obj Object\n" + " */\n" + " public void foo(int val, Object obj) {}\n" + "}" }, "----------\n" + "1. ERROR in X.java (at line 5)\n" + " * @param <E> Type parameter\n" + " ^^^^^\n" + "Javadoc: Unexpected tag\n" + "----------\n", JavacTestOptions.Excuse.EclipseWarningConfiguredAsError ); } public void test027() { this.runNegativeTest( new String[] { "X.java", " public class X {\n" + " /**\n" + " * Invalid type parameter reference\n" + " * @param <E> Type parameter\n" + " */\n" + " public <E, F> void foo(int val, Object obj) {}\n" + "}" }, "----------\n" + "1. ERROR in X.java (at line 6)\n" + " public <E, F> void foo(int val, Object obj) {}\n" + " ^\n" + "Javadoc: Missing tag for parameter F\n" + "----------\n" + "2. ERROR in X.java (at line 6)\n" + " public <E, F> void foo(int val, Object obj) {}\n" + " ^^^\n" + "Javadoc: Missing tag for parameter val\n" + "----------\n" + "3. ERROR in X.java (at line 6)\n" + " public <E, F> void foo(int val, Object obj) {}\n" + " ^^^\n" + "Javadoc: Missing tag for parameter obj\n" + "----------\n", JavacTestOptions.Excuse.EclipseWarningConfiguredAsError ); } public void test028() { this.runNegativeTest( new String[] { "X.java", " public class X {\n" + " /**\n" + " * Invalid type parameter reference\n" + " * @param <T> Type parameter 1\n" + " * @param <U> Type parameter 2\n" + " * @param <V> Type parameter 3\n" + " * @param xxx int\n" + " * @param Obj Object\n" + " */\n" + " public <T> void foo(int val, Object obj) {}\n" + "}" }, "----------\n" + "1. ERROR in X.java (at line 5)\n" + " * @param <U> Type parameter 2\n" + " ^\n" + "Javadoc: U cannot be resolved to a type\n" + "----------\n" + "2. ERROR in X.java (at line 6)\n" + " * @param <V> Type parameter 3\n" + " ^\n" + "Javadoc: V cannot be resolved to a type\n" + "----------\n" + "3. ERROR in X.java (at line 7)\n" + " * @param xxx int\n" + " ^^^\n" + "Javadoc: Parameter xxx is not declared\n" + "----------\n" + "4. ERROR in X.java (at line 8)\n" + " * @param Obj Object\n" + " ^^^\n" + "Javadoc: Parameter Obj is not declared\n" + "----------\n" + "5. ERROR in X.java (at line 10)\n" + " public <T> void foo(int val, Object obj) {}\n" + " ^^^\n" + "Javadoc: Missing tag for parameter val\n" + "----------\n" + "6. ERROR in X.java (at line 10)\n" + " public <T> void foo(int val, Object obj) {}\n" + " ^^^\n" + "Javadoc: Missing tag for parameter obj\n" + "----------\n", JavacTestOptions.Excuse.EclipseWarningConfiguredAsError ); } public void test029() { this.runNegativeTest( new String[] { "X.java", " public class X {\n" + " /**\n" + " * Invalid type parameter reference\n" + " * @param <T> Type parameter 1\n" + " * @param <X> Type parameter 2\n" + " * @param val int\n" + " * @param <U> Type parameter 2\n" + " * @param <E> Type parameter 2\n" + " * @param obj Object\n" + " * @param <V> Type parameter 3\n" + " */\n" + " public <T, U, V> void foo(int val, Object obj) {}\n" + "}" }, "----------\n" + "1. ERROR in X.java (at line 5)\n" + " * @param <X> Type parameter 2\n" + " ^\n" + "Javadoc: Parameter X is not declared\n" + "----------\n" + "2. ERROR in X.java (at line 8)\n" + " * @param <E> Type parameter 2\n" + " ^\n" + "Javadoc: E cannot be resolved to a type\n" + "----------\n", JavacTestOptions.Excuse.EclipseWarningConfiguredAsError ); } public void test030() { this.runConformTest( new String[] { "X.java", " public class X {\n" + " /**\n" + " * Valid type parameter reference\n" + " * @param <V> Type parameter 3\n" + " * @param obj Object\n" + " * @param <U> Type parameter 2\n" + " * @param val int\n" + " * @param <T> Type parameter 1\n" + " */\n" + " public <T, U, V> void foo(int val, Object obj) {}\n" + "}" } ); } public void test031() { this.runNegativeTest( new String[] { "X.java", " public class X {\n" + " /**\n" + " * Invalid type parameter reference\n" + " */\n" + " public <T, U, V> void foo(int val, Object obj) {}\n" + "}" }, "----------\n" + "1. ERROR in X.java (at line 5)\n" + " public <T, U, V> void foo(int val, Object obj) {}\n" + " ^\n" + "Javadoc: Missing tag for parameter T\n" + "----------\n" + "2. ERROR in X.java (at line 5)\n" + " public <T, U, V> void foo(int val, Object obj) {}\n" + " ^\n" + "Javadoc: Missing tag for parameter U\n" + "----------\n" + "3. ERROR in X.java (at line 5)\n" + " public <T, U, V> void foo(int val, Object obj) {}\n" + " ^\n" + "Javadoc: Missing tag for parameter V\n" + "----------\n" + "4. ERROR in X.java (at line 5)\n" + " public <T, U, V> void foo(int val, Object obj) {}\n" + " ^^^\n" + "Javadoc: Missing tag for parameter val\n" + "----------\n" + "5. ERROR in X.java (at line 5)\n" + " public <T, U, V> void foo(int val, Object obj) {}\n" + " ^^^\n" + "Javadoc: Missing tag for parameter obj\n" + "----------\n", JavacTestOptions.Excuse.EclipseWarningConfiguredAsError ); } public void test032() { this.runNegativeTest( new String[] { "X.java", " public class X {\n" + " /**\n" + " * Invalid type parameter reference\n" + " * @param <T> Type parameter 3\n" + " * @param val int\n" + " */\n" + " public <T, U, V> void foo(int val, Object obj) {}\n" + "}" }, "----------\n" + "1. ERROR in X.java (at line 7)\n" + " public <T, U, V> void foo(int val, Object obj) {}\n" + " ^\n" + "Javadoc: Missing tag for parameter U\n" + "----------\n" + "2. ERROR in X.java (at line 7)\n" + " public <T, U, V> void foo(int val, Object obj) {}\n" + " ^\n" + "Javadoc: Missing tag for parameter V\n" + "----------\n" + "3. ERROR in X.java (at line 7)\n" + " public <T, U, V> void foo(int val, Object obj) {}\n" + " ^^^\n" + "Javadoc: Missing tag for parameter obj\n" + "----------\n", JavacTestOptions.Excuse.EclipseWarningConfiguredAsError ); } public void test033() { this.runNegativeTest( new String[] { "X.java", " public class X {\n" + " /**\n" + " * Invalid type parameter reference\n" + " * @param obj Object\n" + " * @param <U> Type parameter 3\n" + " * @param <V> Type parameter 3\n" + " */\n" + " public <T, U, V> void foo(int val, Object obj) {}\n" + "}" }, "----------\n" + "1. ERROR in X.java (at line 8)\n" + " public <T, U, V> void foo(int val, Object obj) {}\n" + " ^\n" + "Javadoc: Missing tag for parameter T\n" + "----------\n" + "2. ERROR in X.java (at line 8)\n" + " public <T, U, V> void foo(int val, Object obj) {}\n" + " ^^^\n" + "Javadoc: Missing tag for parameter val\n" + "----------\n", JavacTestOptions.Excuse.EclipseWarningConfiguredAsError ); } public void test034() { this.runNegativeTest( new String[] { "X.java", " public class X {\n" + " /**\n" + " * Invalid type parameter reference\n" + " * @param val int\n" + " * @param <V> Type parameter 2\n" + " * @param <X> Type parameter 2\n" + " * @param <U> Type parameter 1\n" + " * @param Object obj\n" + " * @param <E> Type parameter 2\n" + " * @param <U> Type parameter 2\n" + " * @param val int\n" + " */\n" + " public <T, U, V> void foo(int val, Object obj) {}\n" + "}" }, "----------\n" + "1. ERROR in X.java (at line 6)\n" + " * @param <X> Type parameter 2\n" + " ^\n" + "Javadoc: Parameter X is not declared\n" + "----------\n" + "2. ERROR in X.java (at line 8)\n" + " * @param Object obj\n" + " ^^^^^^\n" + "Javadoc: Parameter Object is not declared\n" + "----------\n" + "3. ERROR in X.java (at line 9)\n" + " * @param <E> Type parameter 2\n" + " ^\n" + "Javadoc: E cannot be resolved to a type\n" + "----------\n" + "4. ERROR in X.java (at line 10)\n" + " * @param <U> Type parameter 2\n" + " ^\n" + "Javadoc: Duplicate tag for parameter\n" + "----------\n" + "5. ERROR in X.java (at line 11)\n" + " * @param val int\n" + " ^^^\n" + "Javadoc: Duplicate tag for parameter\n" + "----------\n" + "6. ERROR in X.java (at line 13)\n" + " public <T, U, V> void foo(int val, Object obj) {}\n" + " ^\n" + "Javadoc: Missing tag for parameter T\n" + "----------\n" + "7. ERROR in X.java (at line 13)\n" + " public <T, U, V> void foo(int val, Object obj) {}\n" + " ^^^\n" + "Javadoc: Missing tag for parameter obj\n" + "----------\n", JavacTestOptions.Excuse.EclipseWarningConfiguredAsError ); } public void test035() { this.runNegativeTest( new String[] { "X.java", " public class X {\n" + " /**\n" + " * Invalid type parameter reference\n" + " * @param <V> Type parameter 2\n" + " * @param\n" + " * @param <U> Type parameter 1\n" + " */\n" + " public <T, U, V> void foo(int val, Object obj) {}\n" + "}" }, "----------\n" + "1. ERROR in X.java (at line 5)\n" + " * @param\n" + " ^^^^^\n" + "Javadoc: Missing parameter name\n" + "----------\n" + "2. ERROR in X.java (at line 8)\n" + " public <T, U, V> void foo(int val, Object obj) {}\n" + " ^\n" + "Javadoc: Missing tag for parameter T\n" + "----------\n" + "3. ERROR in X.java (at line 8)\n" + " public <T, U, V> void foo(int val, Object obj) {}\n" + " ^^^\n" + "Javadoc: Missing tag for parameter val\n" + "----------\n" + "4. ERROR in X.java (at line 8)\n" + " public <T, U, V> void foo(int val, Object obj) {}\n" + " ^^^\n" + "Javadoc: Missing tag for parameter obj\n" + "----------\n", JavacTestOptions.Excuse.EclipseWarningConfiguredAsError ); } // TODO (david) recovery seems not to work properly here: // we should have type parameters in method declaration. public void test036() { this.runNegativeTest( new String[] { "X.java", " public class X {\n" + " /**\n" + " * Invalid type parameter reference: compile error\n" + " * @param <T> Type parameter 2\n" + " * @param <V> Type parameter 2\n" + " * @param <U> Type parameter 1\n" + " * @param val int\n" + " * @param obj Object\n" + " */\n" + " public <T, , V> void foo(int val, Object obj) {}\n" + "}" }, "----------\n" + "1. ERROR in X.java (at line 4)\n" + " * @param <T> Type parameter 2\n" + " ^^^^^\n" + "Javadoc: Unexpected tag\n" + "----------\n" + "2. ERROR in X.java (at line 5)\n" + " * @param <V> Type parameter 2\n" + " ^^^^^\n" + "Javadoc: Unexpected tag\n" + "----------\n" + "3. ERROR in X.java (at line 6)\n" + " * @param <U> Type parameter 1\n" + " ^^^^^\n" + "Javadoc: Unexpected tag\n" + "----------\n" + "4. ERROR in X.java (at line 10)\n" + " public <T, , V> void foo(int val, Object obj) {}\n" + " ^\n" + "Syntax error on token \",\", delete this token\n" + "----------\n" ); } public void test037() { this.runNegativeTest( new String[] { "X.java", " public class X {\n" + " /**\n" + " * Invalid type parameter reference: compile error\n" + " * @param <T> Type parameter 2\n" + " * @param <V> Type parameter 2\n" + " * @param <U> Type parameter 1\n" + " * @param val int\n" + " * @param obj Object\n" + " */\n" + " public <T, U, V extends Exceptions> void foo(int val, Object obj) {}\n" + "}" }, "----------\n" + "1. ERROR in X.java (at line 10)\n" + " public <T, U, V extends Exceptions> void foo(int val, Object obj) {}\n" + " ^^^^^^^^^^\n" + "Exceptions cannot be resolved to a type\n" + "----------\n" ); } public void test038() { this.runNegativeTest( new String[] { "X.java", " /**\n" + " * Invalid type parameter reference\n" + " * @param < Type\n" + " * @param < Type for parameterization\n" + " * @param <> Type\n" + " * @param <?> Type\n" + " * @param <*> Type\n" + " */\n" + " public class X<E> {}" }, "----------\n" + "1. ERROR in X.java (at line 3)\n" + " * @param < Type\n" + " ^^^^^^\n" + "Javadoc: Invalid param tag type parameter name\n" + "----------\n" + "2. ERROR in X.java (at line 4)\n" + " * @param < Type for parameterization\n" + " ^^^^^^\n" + "Javadoc: Invalid param tag type parameter name\n" + "----------\n" + "3. ERROR in X.java (at line 5)\n" + " * @param <> Type\n" + " ^^\n" + "Javadoc: Invalid param tag type parameter name\n" + "----------\n" + "4. ERROR in X.java (at line 6)\n" + " * @param <?> Type\n" + " ^^^\n" + "Javadoc: Invalid param tag type parameter name\n" + "----------\n" + "5. ERROR in X.java (at line 7)\n" + " * @param <*> Type\n" + " ^^^\n" + "Javadoc: Invalid param tag type parameter name\n" + "----------\n" + "6. ERROR in X.java (at line 9)\n" + " public class X<E> {}\n" + " ^\n" + "Javadoc: Missing tag for parameter E\n" + "----------\n", JavacTestOptions.Excuse.EclipseWarningConfiguredAsError ); } public void test039() { this.runNegativeTest( new String[] { "X.java", " /**\n" + " * Invalid type parameter reference\n" + " * @param <E Type\n" + " * @param E> Type\n" + " * @param <<E> Type\n" + " * @param <<<E> Type\n" + " * @param <E>> Type\n" + " */\n" + " public class X<E> {}" }, "----------\n" + "1. ERROR in X.java (at line 3)\n" + " * @param <E Type\n" + " ^^\n" + "Javadoc: Invalid param tag type parameter name\n" + "----------\n" + "2. ERROR in X.java (at line 4)\n" + " * @param E> Type\n" + " ^^\n" + "Javadoc: Invalid param tag name\n" + "----------\n" + "3. ERROR in X.java (at line 5)\n" + " * @param <<E> Type\n" + " ^^^^\n" + "Javadoc: Invalid param tag type parameter name\n" + "----------\n" + "4. ERROR in X.java (at line 6)\n" + " * @param <<<E> Type\n" + " ^^^^^\n" + "Javadoc: Invalid param tag type parameter name\n" + "----------\n" + "5. ERROR in X.java (at line 7)\n" + " * @param <E>> Type\n" + " ^^^^\n" + "Javadoc: Invalid param tag type parameter name\n" + "----------\n" + "6. ERROR in X.java (at line 9)\n" + " public class X<E> {}\n" + " ^\n" + "Javadoc: Missing tag for parameter E\n" + "----------\n", JavacTestOptions.Excuse.EclipseWarningConfiguredAsError ); } public void test040() { runConformReferenceTest( new String[] { "X.java", "/**\n" + " * @category\n" + " */\n" + "public class X {\n" + "}\n" } ); } /** * Test fix for bug 80257: [javadoc] Invalid missing reference warning on @see or @link tags * @see "http://bugs.eclipse.org/bugs/show_bug.cgi?id=80257" */ public void testBug80257() { runNegativeTest( new String[] { "X.java", "/**\n" + " * @see G#G(Object)\n" + " * @see G#G(Exception)\n" + " */\n" + "public class X extends G<Exception> {\n" + " X(Exception exc) { super(exc);}\n" + "}\n" + "class G<E extends Exception> {\n" + " G(E e) {}\n" + "}\n" }, "----------\n" + "1. ERROR in X.java (at line 2)\n" + " * @see G#G(Object)\n" + " ^^^^^^^^^\n" + "Javadoc: The constructor G(Object) is undefined\n" + "----------\n", JavacTestOptions.Excuse.EclipseWarningConfiguredAsError ); } /** * Test fix for bug 82514: [1.5][javadoc] Problem with generics in javadoc * @see "http://bugs.eclipse.org/bugs/show_bug.cgi?id=82514" */ // FAIL ERRMSG public void _testBug82514() { this.runNegativeTest( new String[] { "X.java", "class ComparableUtils {\n" + " public static <T extends Comparable< ? super T>> int compareTo(final Object first, final Object firstPrime, final Class<T> type) throws ClassCastException\n" + " {\n" + " return 0;\n" + " }\n" + " public static <X extends Comparable< ? super X>> int compareTo(final X first, final X firstPrime)\n" + " throws ClassCastException\n" + " {\n" + " return 0;\n" + " }\n" + "}\n" + "public final class X { \n" + " /** Tests the method{@link ComparableUtils#compareTo(Object, Object, Class)} and\n" + " * {@link ComparableUtils#compareTo(Object, Object)}.\n" + " */\n" + " public void testCompareTo() {}\n" + "}" }, "----------\n" + "1. WARNING in X.java (at line 6)\n" + " public static <X extends Comparable< ? super X>> int compareTo(final X first, final X firstPrime)\n" + " ^\n" + "The type parameter X is hiding the type X\n" + "----------\n" + "2. ERROR in X.java (at line 14)\n" + " * {@link ComparableUtils#compareTo(Object, Object)}.\n" + " ^^^^^^^^^\n" + "Javadoc: Bound mismatch: The generic method compareTo(X, X) of type ComparableUtils is not applicable for the arguments (Object, Object). The inferred type Object is not a valid substitute for the bounded parameter <X extends Comparable<? super X>>\n" + "----------\n", JavacTestOptions.Excuse.EclipseWarningConfiguredAsError); } /** * Test fix for bug 83127: [1.5][javadoc][dom] Wrong / strange bindings for references in javadoc to methods with type variables as parameter types * @see "http://bugs.eclipse.org/bugs/show_bug.cgi?id=83127" */ public void testBug83127a() { this.reportMissingJavadocTags = CompilerOptions.IGNORE; runNegativeTest( new String[] { "Test.java", "/** \n" + " * @see Test#add(T) \n" + " * @see #add(T)\n" + " * @see Test#Test(T)\n" + " * @see #Test(T)\n" + " * - warning = \"The method add(Object) in the type Test is not applicable for\n" + " * the arguments (T)\"\n" + " * - method binding = Test.add(Object)\n" + " * - parameter binding = T of A\n" + " */\n" + "public class Test<T> {\n" + " Test(T t) {}\n" + " public boolean add(T t) {\n" + " return true;\n" + " }\n" + "}\n" + "\n" + "class Sub<E extends Number> extends Test<E> {\n" + " Sub (E e) {super(null);}\n" + " public boolean add(E e) {\n" + " if (e.doubleValue() > 0)\n" + " return false;\n" + " return super.add(e);\n" + " }\n" + "}\n" }, "----------\n" + "1. ERROR in Test.java (at line 2)\n" + " * @see Test#add(T) \n" + " ^^^\n" + "Javadoc: The method add(Object) in the type Test is not applicable for the arguments (T)\n" + "----------\n" + "2. ERROR in Test.java (at line 3)\n" + " * @see #add(T)\n" + " ^^^\n" + "Javadoc: The method add(Object) in the type Test is not applicable for the arguments (T)\n" + "----------\n" + "3. ERROR in Test.java (at line 4)\n" + " * @see Test#Test(T)\n" + " ^^^^^^^\n" + "Javadoc: The constructor Test(T) is undefined\n" + "----------\n" + "4. ERROR in Test.java (at line 5)\n" + " * @see #Test(T)\n" + " ^^^^^^^\n" + "Javadoc: The constructor Test(T) is undefined\n" + "----------\n", JavacTestOptions.Excuse.EclipseWarningConfiguredAsError ); } public void testBug83127b() { this.reportMissingJavadocTags = CompilerOptions.IGNORE; runNegativeTest( new String[] { "Test.java", "/** \n" + " * @see Sub#add(T)\n" + " * @see Sub#Sub(T)\n" + " * - warning = \"The method add(Number) in the type Sub is not applicable for\n" + " * the arguments (T)\"\n" + " * - method binding = Sub.add(Number)\n" + " * - parameter binding = T of A\n" + " * -> Do we need to change this as T natually resolved to TypeVariable?\n" + " * As compiler raises a warning, it\'s perhaps not a problem now...\n" + " */\n" + "public class Test<T>{\n" + " Test(T t) {}\n" + " public boolean add(T t) {\n" + " return true;\n" + " }\n" + "}\n" + "\n" + "class Sub<E extends Number> extends Test<E> {\n" + " Sub (E e) {super(null);}\n" + " public boolean add(E e) {\n" + " if (e.doubleValue() > 0)\n" + " return false;\n" + " return super.add(e);\n" + " }\n" + "}\n" }, "----------\n" + "1. ERROR in Test.java (at line 2)\n" + " * @see Sub#add(T)\n" + " ^^^\n" + "Javadoc: The method add(Number) in the type Sub is not applicable for the arguments (T)\n" + "----------\n" + "2. ERROR in Test.java (at line 3)\n" + " * @see Sub#Sub(T)\n" + " ^^^^^^\n" + "Javadoc: The constructor Sub(T) is undefined\n" + "----------\n", JavacTestOptions.Excuse.EclipseWarningConfiguredAsError ); } public void testBug83127c() { this.reportMissingJavadocTags = CompilerOptions.IGNORE; runNegativeTest( new String[] { "Test.java", "/** \n" + " * @see Sub#add(E) \n" + " * @see Sub#Sub(E)\n" + " * - warning = \"E cannot be resolved to a type\"\n" + " * - method binding = null\n" + " * - parameter binding = null\n" + " */\n" + "public class Test<T>{\n" + " Test(T t) {}\n" + " public boolean add(T t) {\n" + " return true;\n" + " }\n" + "}\n" + "\n" + "class Sub<E extends Number> extends Test<E> {\n" + " Sub (E e) {super(null);}\n" + " public boolean add(E e) {\n" + " if (e.doubleValue() > 0)\n" + " return false;\n" + " return super.add(e);\n" + " }\n" + "}\n" }, "----------\n" + "1. ERROR in Test.java (at line 2)\n" + " * @see Sub#add(E) \n" + " ^\n" + "Javadoc: E cannot be resolved to a type\n" + "----------\n" + "2. ERROR in Test.java (at line 3)\n" + " * @see Sub#Sub(E)\n" + " ^\n" + "Javadoc: E cannot be resolved to a type\n" + "----------\n", JavacTestOptions.Excuse.EclipseWarningConfiguredAsError ); } public void testBug83127d() { this.reportMissingJavadocTags = CompilerOptions.IGNORE; runNegativeTest( new String[] { "Unrelated1.java", "public class Unrelated1<E extends Number> {\n" + " public Unrelated1(E e) {}\n" + " public boolean add(E e) { return false; }\n" + "}\n", "Test.java", "/** \n" + " * @see Unrelated1#add(E)\n" + " * @see Unrelated1#Unrelated1(E)\n" + " * - warning = \"E cannot be resolved to a type\"\n" + " * - method binding = null\n" + " * - parameter binding = null\n" + " */\n" + "public class Test<T>{\n" + " Test(T t) {}\n" + " public boolean add(T t) {\n" + " return true;\n" + " }\n" + "}\n" + "\n" + "class Sub<E extends Number> extends Test<E> {\n" + " Sub (E e) {super(null);}\n" + " public boolean add(E e) {\n" + " if (e.doubleValue() > 0)\n" + " return false;\n" + " return super.add(e);\n" + " }\n" + "}\n" }, "----------\n" + "1. ERROR in Test.java (at line 2)\n" + " * @see Unrelated1#add(E)\n" + " ^\n" + "Javadoc: E cannot be resolved to a type\n" + "----------\n" + "2. ERROR in Test.java (at line 3)\n" + " * @see Unrelated1#Unrelated1(E)\n" + " ^\n" + "Javadoc: E cannot be resolved to a type\n" + "----------\n", JavacTestOptions.Excuse.EclipseWarningConfiguredAsError ); } public void testBug83127e() { this.reportMissingJavadocTags = CompilerOptions.IGNORE; runNegativeTest( new String[] { "Unrelated1.java", "public class Unrelated1<E extends Number> {\n" + " public Unrelated1(E e) {}\n" + " public boolean add(E e) { return false; }\n" + "}\n", "Test.java", "/** \n" + " * @see Unrelated1#add(Object)\n" + " * @see Unrelated1#Unrelated1(Object)\n" + " * - warning = \"The method add(Object) in the type Test is not applicable for\n" + " * the arguments (Object)\"\n" + " * - method binding = Unrelated1.add(Number)\n" + " * - parameter binding = java.lang.Object\n" + " */\n" + "public class Test<T>{\n" + " Test(T t) {}\n" + " public boolean add(T t) {\n" + " return true;\n" + " }\n" + "}\n" + "class Sub<E extends Number> extends Test<E> {\n" + " Sub (E e) {super(null);}\n" + " public boolean add(E e) {\n" + " if (e.doubleValue() > 0)\n" + " return false;\n" + " return super.add(e);\n" + " }\n" + "}\n" }, "----------\n" + "1. ERROR in Test.java (at line 2)\n" + " * @see Unrelated1#add(Object)\n" + " ^^^\n" + "Javadoc: The method add(Number) in the type Unrelated1 is not applicable for the arguments (Object)\n" + "----------\n" + "2. ERROR in Test.java (at line 3)\n" + " * @see Unrelated1#Unrelated1(Object)\n" + " ^^^^^^^^^^^^^^^^^^\n" + "Javadoc: The constructor Unrelated1(Object) is undefined\n" + "----------\n", JavacTestOptions.Excuse.EclipseWarningConfiguredAsError ); } public void testBug83127f() { this.reportMissingJavadocTags = CompilerOptions.IGNORE; runConformTest( new String[] { "Unrelated1.java", "public class Unrelated1<E extends Number> {\n" + " public Unrelated1(E e) {}\n" + " public boolean add(E e) { return false; }\n" + "}\n", "Test.java", "/** \n" + " * @see Unrelated1#add(Number)\n" + " * @see Unrelated1#Unrelated1(Number)\n" + " * - no warning\n" + " * - method binding = Unrelated1.add(Number)\n" + " * - parameter binding = java.lang.Number\n" + " */\n" + "public class Test<T>{\n" + " Test(T t) {}\n" + " public boolean add(T t) {\n" + " return true;\n" + " }\n" + "}\n" + "class Sub<E extends Number> extends Test<E> {\n" + " Sub (E e) {super(null);}\n" + " public boolean add(E e) {\n" + " if (e.doubleValue() > 0)\n" + " return false;\n" + " return super.add(e);\n" + " }\n" + "}\n" } ); } public void testBug83127g() { this.reportMissingJavadocTags = CompilerOptions.IGNORE; runNegativeTest( new String[] { "Unrelated1.java", "public class Unrelated1<E extends Number> {\n" + " public Unrelated1(E e) {}\n" + " public boolean add(E e) { return false; }\n" + "}\n", "Test.java", "/** \n" + " * @see Unrelated1#add(Integer)\n" + " * @see Unrelated1#Unrelated1(Integer)\n" + " * - warning = \"The method add(Object) in the type Test is not applicable for\n" + " * the arguments (Integer)\"\n" + " * - method binding = Unrelated1.add(Number)\n" + " * - parameter binding = java.lang.Integer\n" + " */\n" + "public class Test<T>{\n" + " Test(T t) {}\n" + " public boolean add(T t) {\n" + " return true;\n" + " }\n" + "}\n" + "\n" + "class Sub<E extends Number> extends Test<E> {\n" + " Sub (E e) {super(null);}\n" + " public boolean add(E e) {\n" + " if (e.doubleValue() > 0)\n" + " return false;\n" + " return super.add(e);\n" + " }\n" + "}\n" }, "----------\n" + "1. ERROR in Test.java (at line 2)\n" + " * @see Unrelated1#add(Integer)\n" + " ^^^\n" + "Javadoc: The method add(Number) in the type Unrelated1 is not applicable for the arguments (Integer)\n" + "----------\n" + "2. ERROR in Test.java (at line 3)\n" + " * @see Unrelated1#Unrelated1(Integer)\n" + " ^^^^^^^^^^^^^^^^^^^\n" + "Javadoc: The constructor Unrelated1(Integer) is undefined\n" + "----------\n", JavacTestOptions.Excuse.EclipseWarningConfiguredAsError ); } public void testBug83127h() { this.reportMissingJavadocTags = CompilerOptions.IGNORE; runNegativeTest( new String[] { "Unrelated2.java", "public interface Unrelated2<E> {\n" + " boolean add(E e);\n" + "}\n", "Test.java", "/** \n" + " * @see Unrelated2#add(T)\n" + " * - warning = \"The method add(Object) in the type Test is not applicable for\n" + " * the arguments (T)\"\n" + " * - method binding = Unrelated2.add(Object)\n" + " * - parameter binding = T of A\n" + " * -> Do we need to change this as T natually resolved to TypeVariable?\n" + " * As compiler raises a warning, it\'s perhaps not a problem now...\n" + " */\n" + "public class Test<T>{\n" + " Test(T t) {}\n" + " public boolean add(T t) {\n" + " return true;\n" + " }\n" + "}\n" + "\n" + "class Sub<E extends Number> extends Test<E> {\n" + " Sub (E e) {super(null);}\n" + " public boolean add(E e) {\n" + " if (e.doubleValue() > 0)\n" + " return false;\n" + " return super.add(e);\n" + " }\n" + "}\n" }, "----------\n" + "1. ERROR in Test.java (at line 2)\n" + " * @see Unrelated2#add(T)\n" + " ^^^\n" + "Javadoc: The method add(Object) in the type Unrelated2 is not applicable for the arguments (T)\n" + "----------\n", JavacTestOptions.Excuse.EclipseWarningConfiguredAsError ); } /** * Bug 83393: [1.5][javadoc] reference to vararg method also considers non-array type as correct * @see "http://bugs.eclipse.org/bugs/show_bug.cgi?id=83393" */ public void testBug83393a() { runConformTest( new String[] { "Test.java", "public class Test {\n" + " public void foo(int a, int b) {} \n" + " public void foo(int a, int... args) {}\n" + " public void foo(String... args) {}\n" + " public void foo(Exception str, boolean... args) {}\n" + "}\n", "Valid.java", "/**\n" + " * @see Test#foo(int, int)\n" + " * @see Test#foo(int, int[])\n" + " * @see Test#foo(int, int...)\n" + " * @see Test#foo(String[])\n" + " * @see Test#foo(String...)\n" + " * @see Test#foo(Exception, boolean[])\n" + " * @see Test#foo(Exception, boolean...)\n" + " */\n" + "public class Valid {}\n" } ); } public void testBug83393b() { runNegativeTest( new String[] { "Test.java", "public class Test {\n" + " public void foo(int a, int b) {} \n" + " public void foo(int a, int... args) {}\n" + " public void foo(String... args) {}\n" + " public void foo(Exception str, boolean... args) {}\n" + "}\n", "Invalid.java", "/**\n" + " * @see Test#foo(int)\n" + " * @see Test#foo(int, int, int)\n" + " * @see Test#foo()\n" + " * @see Test#foo(String)\n" + " * @see Test#foo(String, String)\n" + " * @see Test#foo(Exception)\n" + " * @see Test#foo(Exception, boolean)\n" + " * @see Test#foo(Exception, boolean, boolean)\n" + " */\n" + "public class Invalid {}\n" }, "----------\n" + "1. ERROR in Invalid.java (at line 2)\n" + " * @see Test#foo(int)\n" + " ^^^\n" + "Javadoc: The method foo(int, int...) in the type Test is not applicable for the arguments (int)\n" + "----------\n" + "2. ERROR in Invalid.java (at line 3)\n" + " * @see Test#foo(int, int, int)\n" + " ^^^\n" + "Javadoc: The method foo(int, int...) in the type Test is not applicable for the arguments (int, int, int)\n" + "----------\n" + "3. ERROR in Invalid.java (at line 4)\n" + " * @see Test#foo()\n" + " ^^^\n" + "Javadoc: The method foo(String...) in the type Test is not applicable for the arguments ()\n" + "----------\n" + "4. ERROR in Invalid.java (at line 5)\n" + " * @see Test#foo(String)\n" + " ^^^\n" + "Javadoc: The method foo(String...) in the type Test is not applicable for the arguments (String)\n" + "----------\n" + "5. ERROR in Invalid.java (at line 6)\n" + " * @see Test#foo(String, String)\n" + " ^^^\n" + "Javadoc: The method foo(String...) in the type Test is not applicable for the arguments (String, String)\n" + "----------\n" + "6. ERROR in Invalid.java (at line 7)\n" + " * @see Test#foo(Exception)\n" + " ^^^\n" + "Javadoc: The method foo(Exception, boolean...) in the type Test is not applicable for the arguments (Exception)\n" + "----------\n" + "7. ERROR in Invalid.java (at line 8)\n" + " * @see Test#foo(Exception, boolean)\n" + " ^^^\n" + "Javadoc: The method foo(Exception, boolean...) in the type Test is not applicable for the arguments (Exception, boolean)\n" + "----------\n" + "8. ERROR in Invalid.java (at line 9)\n" + " * @see Test#foo(Exception, boolean, boolean)\n" + " ^^^\n" + "Javadoc: The method foo(Exception, boolean...) in the type Test is not applicable for the arguments (Exception, boolean, boolean)\n" + "----------\n", JavacTestOptions.Excuse.EclipseWarningConfiguredAsError ); } /** * Bug 83804: [1.5][javadoc] Missing Javadoc node for package declaration * @see "http://bugs.eclipse.org/bugs/show_bug.cgi?id=83804" */ public void testBug83804() { runNegativeTest( new String[] { "pack/package-info.java", "/**\n" + " * Valid javadoc.\n" + " * @see pack.Test\n" + " * @see Unknown\n" + " * @see pack.Test#foo()\n" + " * @see pack.Test#unknown()\n" + " * @see pack.Test#field\n" + " * @see pack.Test#unknown\n" + " * @param unexpected\n" + " * @throws unexpected\n" + " * @return unexpected \n" + " * @deprecated accepted by javadoc.exe although javadoc 1.5 spec does not say that's a valid tag\n" + " * @other-tags are valid\n" + " */\n" + "package pack;\n", "pack/Test.java", "/**\n" + " * Invalid javadoc\n" + " */\n" + "package pack;\n" + "public class Test {\n" + " public int field;\n" + " public void foo() {}\n" + "}\n" }, "----------\n" + "1. ERROR in pack\\package-info.java (at line 4)\n" + " * @see Unknown\n" + " ^^^^^^^\n" + "Javadoc: Unknown cannot be resolved to a type\n" + "----------\n" + "2. ERROR in pack\\package-info.java (at line 6)\n" + " * @see pack.Test#unknown()\n" + " ^^^^^^^\n" + "Javadoc: The method unknown() is undefined for the type Test\n" + "----------\n" + "3. ERROR in pack\\package-info.java (at line 8)\n" + " * @see pack.Test#unknown\n" + " ^^^^^^^\n" + "Javadoc: unknown cannot be resolved or is not a field\n" + "----------\n" + "4. ERROR in pack\\package-info.java (at line 9)\n" + " * @param unexpected\n" + " ^^^^^\n" + "Javadoc: Unexpected tag\n" + "----------\n" + "5. ERROR in pack\\package-info.java (at line 10)\n" + " * @throws unexpected\n" + " ^^^^^^\n" + "Javadoc: Unexpected tag\n" + "----------\n" + "6. ERROR in pack\\package-info.java (at line 11)\n" + " * @return unexpected \n" + " ^^^^^^\n" + "Javadoc: Unexpected tag\n" + "----------\n", JavacTestOptions.Excuse.EclipseWarningConfiguredAsError ); } /** * Bug 86769: [javadoc] Warn/Error for 'Missing javadoc comments' doesn't recognize private inner classes * @see "http://bugs.eclipse.org/bugs/show_bug.cgi?id=86769" */ public void testBug86769() { this.reportMissingJavadocComments = CompilerOptions.ERROR; runNegativeTest( new String[] { "E.java", "public enum E {\n" + " A,\n" + " DC{\n" + " public void foo() {}\n" + " };\n" + " E() {}\n" + " public void foo() {}\n" + " private enum Epriv {\n" + " Apriv,\n" + " Cpriv {\n" + " public void foo() {}\n" + " };\n" + " Epriv() {}\n" + " public void foo() {}\n" + " }\n" + " enum Edef {\n" + " Adef,\n" + " Cdef {\n" + " public void foo() {}\n" + " };\n" + " Edef() {}\n" + " public void foo() {}\n" + " }\n" + " protected enum Epro {\n" + " Apro,\n" + " Cpro {\n" + " public void foo() {}\n" + " };\n" + " Epro() {}\n" + " public void foo() {}\n" + " }\n" + " public enum Epub {\n" + " Apub,\n" + " Cpub {\n" + " public void foo() {}\n" + " };\n" + " Epub() {}\n" + " public void foo() {}\n" + " }\n" + "}\n" }, "----------\n" + "1. ERROR in E.java (at line 1)\n" + " public enum E {\n" + " ^\n" + "Javadoc: Missing comment for public declaration\n" + "----------\n" + "2. ERROR in E.java (at line 2)\n" + " A,\n" + " ^\n" + "Javadoc: Missing comment for public declaration\n" + "----------\n" + "3. ERROR in E.java (at line 3)\n" + " DC{\n" + " ^^\n" + "Javadoc: Missing comment for public declaration\n" + "----------\n" + "4. ERROR in E.java (at line 7)\n" + " public void foo() {}\n" + " ^^^^^\n" + "Javadoc: Missing comment for public declaration\n" + "----------\n" + "5. ERROR in E.java (at line 32)\n" + " public enum Epub {\n" + " ^^^^\n" + "Javadoc: Missing comment for public declaration\n" + "----------\n" + "6. ERROR in E.java (at line 33)\n" + " Apub,\n" + " ^^^^\n" + "Javadoc: Missing comment for public declaration\n" + "----------\n" + "7. ERROR in E.java (at line 34)\n" + " Cpub {\n" + " ^^^^\n" + "Javadoc: Missing comment for public declaration\n" + "----------\n" + "8. ERROR in E.java (at line 38)\n" + " public void foo() {}\n" + " ^^^^^\n" + "Javadoc: Missing comment for public declaration\n" + "----------\n", JavacTestOptions.Excuse.EclipseWarningConfiguredAsError ); } /** * Bug 95286: [1.5][javadoc] package-info.java incorrectly flags "Missing comment for public declaration" * @see "http://bugs.eclipse.org/bugs/show_bug.cgi?id=95286" */ public void testBug95286_Default() { this.reportMissingJavadocComments = CompilerOptions.ERROR; this.reportMissingJavadocCommentsVisibility = CompilerOptions.DEFAULT; runConformTest( new String[] { "test/package-info.java", "/**\n" + " * Javadoc for all package \n" + " */\n" + "package test;\n" } ); } public void testBug95286_Private() { this.reportMissingJavadocComments = CompilerOptions.ERROR; this.reportMissingJavadocCommentsVisibility = CompilerOptions.PRIVATE; runConformTest( new String[] { "test/package-info.java", "/**\n" + " * Javadoc for all package \n" + " */\n" + "package test;\n" } ); } /** * Bug 95521: [1.5][javadoc] validation with @see tag not working for generic method * @see "http://bugs.eclipse.org/bugs/show_bug.cgi?id=95521" */ public void testBug95521() { runConformTest( new String[] { "test/X.java", "package test;\n" + "\n" + "/** Test */\n" + "public class X implements I {\n" + " /**\n" + " * @see test.I#foo(java.lang.Class)\n" + " */\n" + " public <T> G<T> foo(Class<T> stuffClass) {\n" + " return null;\n" + " }\n" + "}\n" + "/** Interface */\n" + "interface I {\n" + " /**\n" + " * @param <T>\n" + " * @param stuffClass \n" + " * @return stuff\n" + " */\n" + " public <T extends Object> G<T> foo(Class<T> stuffClass);\n" + "}\n" + "/** \n" + " * @param <T>\n" + " */\n" + "class G<T> {}\n" } ); } public void testBug95521b() { runConformTest( new String[] { "test/X.java", "package test;\n" + "\n" + "/** Test */\n" + "public class X {\n" + " /**\n" + " * @param <T>\n" + " * @param classT \n" + " */\n" + " public <T> X(Class<T> classT) {\n" + " }\n" + " /**\n" + " * @param <T>\n" + " * @param classT\n" + " * @return classT\n" + " */\n" + " public <T> Class<T> foo(Class<T> classT) {\n" + " return classT;\n" + " }\n" + "}\n" + "/** Super class */\n" + "class Y extends X {\n" + " /**\n" + " * @see X#X(java.lang.Class)\n" + " */\n" + " public <T> Y(Class<T> classT) {\n" + " super(classT);\n" + " }\n" + "\n" + " /**\n" + " * @see X#foo(java.lang.Class)\n" + " */\n" + " public <T extends Object> Class<T> foo(Class<T> stuffClass) {\n" + " return null;\n" + " }\n" + "}\n" } ); } /** * Bug 96237: [javadoc] Inner types must be qualified * @see "http://bugs.eclipse.org/bugs/show_bug.cgi?id=96237" */ public void testBug96237_Public01() { this.reportInvalidJavadocVisibility = CompilerOptions.PUBLIC; runConformTest( new String[] { "comment6/Valid.java", "package comment6;\n" + "public class Valid {\n" + " /**\n" + " * @see Valid.Inner\n" + " */\n" + " public class Inner { }\n" + "}\n" + "/**\n" + " * See also {@link Valid.Inner}\n" + " */\n" + "class Sub2 extends Valid { }" } ); } public void testBug96237_Public02() { this.reportInvalidJavadocVisibility = CompilerOptions.PUBLIC; runConformTest( new String[] { "comment6/Invalid.java", "package comment6;\n" + "public class Invalid {\n" + " /**\n" + " * @see Inner\n" + " */\n" + " public class Inner { }\n" + "}\n" + "/**\n" + " * See also {@link Inner} \n" + " */\n" + "class Sub1 extends Invalid { }\n" } ); } public void testBug96237_Public03() { this.reportInvalidJavadocVisibility = CompilerOptions.PUBLIC; runNegativeTest( new String[] { "comment6a/def/Test.java", "package comment6a.def;\n" + "public class Test {\n" + " /**\n" + " * @see Inner\n" + " */\n" + " public class Inner { }\n" + "}\n", "comment6a/test/Invalid.java", "package comment6a.test;\n" + "import comment6a.def.Test;\n" + "/**\n" + " * See also {@link Inner}\n" + " */\n" + "public class Invalid extends Test { \n" + "}", "comment6a/test/Invalid2.java", "package comment6a.test;\n" + "import comment6a.def.Test;\n" + "/**\n" + " * @see Test.Inner\n" + " */\n" + "public class Invalid2 extends Test { \n" + "}", "comment6a/test/Valid.java", "package comment6a.test;\n" + "import comment6a.def.Test;\n" + "/**\n" + " * @see comment6a.def.Test.Inner\n" + " */\n" + "public class Valid extends Test { \n" + "}" }, //comment6a\test\Invalid.java:8: warning - Tag @link: reference not found: Inner //comment6a\test\Invalid2.java:8: warning - Tag @see: reference not found: Test.Inner => bug ID: 4464323 "----------\n" + "1. ERROR in comment6a\\test\\Invalid.java (at line 4)\n" + " * See also {@link Inner}\n" + " ^^^^^\n" + "Javadoc: Invalid member type qualification\n" + "----------\n" + "----------\n" + "1. ERROR in comment6a\\test\\Invalid2.java (at line 4)\n" + " * @see Test.Inner\n" + " ^^^^^^^^^^\n" + "Javadoc: Invalid member type qualification\n" + "----------\n", JavacTestOptions.Excuse.EclipseWarningConfiguredAsError ); } public void testBug96237_Public04() { this.reportInvalidJavadocVisibility = CompilerOptions.PUBLIC; runNegativeTest( new String[] { "comment6b/Invalid.java", "package comment6b;\n" + "\n" + "/**\n" + " * @see Inner\n" + " */\n" + "public class Invalid implements Test { \n" + "}", "comment6b/Test.java", "package comment6b;\n" + "public interface Test {\n" + " /**\n" + " * @see Inner\n" + " */\n" + " public class Inner { }\n" + "}\n", "comment6b/Valid.java", "package comment6b;\n" + "\n" + "/**\n" + " * @see Test.Inner\n" + " */\n" + "public class Valid implements Test { \n" + "}" }, //comment6b\Invalid.java:6: warning - Tag @see: reference not found: Inner "----------\n" + "1. ERROR in comment6b\\Invalid.java (at line 4)\n" + " * @see Inner\n" + " ^^^^^\n" + "Javadoc: Invalid member type qualification\n" + "----------\n", JavacTestOptions.Excuse.EclipseWarningConfiguredAsError ); } public void testBug96237_Public05() { this.reportInvalidJavadocVisibility = CompilerOptions.PUBLIC; runNegativeTest( new String[] { "test/a/Test.java", "package test.a;\n" + "/**\n" + " * @see Inner\n" + " * @see Test.Inner\n" + " */\n" + "public class Test {\n" + " class Inner {}\n" + "}\n" }, //test\a\Test.java:6: warning - Tag @see: reference not found: Inner //test\a\Test.java:6: warning - Tag @see: reference not found: Test.Inner "----------\n" + "1. ERROR in test\\a\\Test.java (at line 3)\n" + " * @see Inner\n" + " ^^^^^\n" + "Javadoc: 'public' visibility for malformed doc comments hides this 'default' reference\n" + "----------\n" + "2. ERROR in test\\a\\Test.java (at line 4)\n" + " * @see Test.Inner\n" + " ^^^^^^^^^^\n" + "Javadoc: 'public' visibility for malformed doc comments hides this 'default' reference\n" + "----------\n", JavacTestOptions.Excuse.EclipseWarningConfiguredAsError ); } public void testBug96237_Public06() { this.reportInvalidJavadocVisibility = CompilerOptions.PUBLIC; runNegativeTest( new String[] { "test/b/Test.java", "package test.b;\n" + "/** \n" + " * @see Inner.Level2\n" + " * @see Test.Inner.Level2\n" + " */\n" + "public class Test {\n" + " /** \n" + " * @see Level2\n" + " * @see Test.Inner.Level2\n" + " */\n" + " public class Inner {\n" + " class Level2 {}\n" + " }\n" + "}\n" }, //test\b\Test.java:6: warning - Tag @see: reference not found: Inner.Level2 //test\b\Test.java:6: warning - Tag @see: reference not found: Test.Inner.Level2 //test\b\Test.java:11: warning - Tag @see: reference not found: Level2 //test\b\Test.java:11: warning - Tag @see: reference not found: Test.Inner.Level2 "----------\n" + "1. ERROR in test\\b\\Test.java (at line 3)\n" + " * @see Inner.Level2\n" + " ^^^^^^^^^^^^\n" + "Javadoc: 'public' visibility for malformed doc comments hides this 'default' reference\n" + "----------\n" + "2. ERROR in test\\b\\Test.java (at line 4)\n" + " * @see Test.Inner.Level2\n" + " ^^^^^^^^^^^^^^^^^\n" + "Javadoc: 'public' visibility for malformed doc comments hides this 'default' reference\n" + "----------\n" + "3. ERROR in test\\b\\Test.java (at line 8)\n" + " * @see Level2\n" + " ^^^^^^\n" + "Javadoc: 'public' visibility for malformed doc comments hides this 'default' reference\n" + "----------\n" + "4. ERROR in test\\b\\Test.java (at line 9)\n" + " * @see Test.Inner.Level2\n" + " ^^^^^^^^^^^^^^^^^\n" + "Javadoc: 'public' visibility for malformed doc comments hides this 'default' reference\n" + "----------\n", JavacTestOptions.Excuse.EclipseWarningConfiguredAsError ); } public void testBug96237_Public07() { this.reportInvalidJavadocVisibility = CompilerOptions.PUBLIC; runNegativeTest( new String[] { "test/c/Test.java", "package test.c;\n" + "/**\n" + " * @see Inner.Level2.Level3\n" + " * @see Test.Inner.Level2.Level3\n" + " */\n" + "public class Test {\n" + " public class Inner {\n" + " /**\n" + " * @see Level3\n" + " * @see Level2.Level3\n" + " * @see Inner.Level2.Level3\n" + " * @see Test.Inner.Level2.Level3\n" + " */\n" + " public class Level2 {\n" + " class Level3 {\n" + " }\n" + " }\n" + " }\n" + "}\n" }, //test\c\Test.java:6: warning - Tag @see: reference not found: Inner.Level2.Level3 //test\c\Test.java:6: warning - Tag @see: reference not found: Test.Inner.Level2.Level3 //test\c\Test.java:14: warning - Tag @see: reference not found: Level3 //test\c\Test.java:14: warning - Tag @see: reference not found: Level2.Level3 //test\c\Test.java:14: warning - Tag @see: reference not found: Inner.Level2.Level3 //test\c\Test.java:14: warning - Tag @see: reference not found: Test.Inner.Level2.Level3 "----------\n" + "1. ERROR in test\\c\\Test.java (at line 3)\n" + " * @see Inner.Level2.Level3\n" + " ^^^^^^^^^^^^^^^^^^^\n" + "Javadoc: 'public' visibility for malformed doc comments hides this 'default' reference\n" + "----------\n" + "2. ERROR in test\\c\\Test.java (at line 4)\n" + " * @see Test.Inner.Level2.Level3\n" + " ^^^^^^^^^^^^^^^^^^^^^^^^\n" + "Javadoc: 'public' visibility for malformed doc comments hides this 'default' reference\n" + "----------\n" + "3. ERROR in test\\c\\Test.java (at line 9)\n" + " * @see Level3\n" + " ^^^^^^\n" + "Javadoc: 'public' visibility for malformed doc comments hides this 'default' reference\n" + "----------\n" + "4. ERROR in test\\c\\Test.java (at line 10)\n" + " * @see Level2.Level3\n" + " ^^^^^^^^^^^^^\n" + "Javadoc: 'public' visibility for malformed doc comments hides this 'default' reference\n" + "----------\n" + "5. ERROR in test\\c\\Test.java (at line 11)\n" + " * @see Inner.Level2.Level3\n" + " ^^^^^^^^^^^^^^^^^^^\n" + "Javadoc: 'public' visibility for malformed doc comments hides this 'default' reference\n" + "----------\n" + "6. ERROR in test\\c\\Test.java (at line 12)\n" + " * @see Test.Inner.Level2.Level3\n" + " ^^^^^^^^^^^^^^^^^^^^^^^^\n" + "Javadoc: 'public' visibility for malformed doc comments hides this 'default' reference\n" + "----------\n", JavacTestOptions.Excuse.EclipseWarningConfiguredAsError ); } public void testBug96237_Public08() { this.reportInvalidJavadocVisibility = CompilerOptions.PUBLIC; runNegativeTest( new String[] { "test/d/Reference.java", "package test.d;\n" + "class Reference {\n" + "}\n", "test/d/Test.java", "package test.d;\n" + "/**\n" + " * @see Secondary\n" + " * @see Reference\n" + " */\n" + "public class Test {\n" + "}\n" + "class Secondary {}" }, "----------\n" + "1. ERROR in test\\d\\Test.java (at line 3)\n" + " * @see Secondary\n" + " ^^^^^^^^^\n" + "Javadoc: 'public' visibility for malformed doc comments hides this 'default' reference\n" + "----------\n" + "2. ERROR in test\\d\\Test.java (at line 4)\n" + " * @see Reference\n" + " ^^^^^^^^^\n" + "Javadoc: 'public' visibility for malformed doc comments hides this 'default' reference\n" + "----------\n", JavacTestOptions.Excuse.EclipseWarningConfiguredAsError ); } public void testBug96237_Private01() { this.reportInvalidJavadocVisibility = CompilerOptions.PRIVATE; runConformTest( new String[] { "comment6/Valid.java", "package comment6;\n" + "public class Valid {\n" + " /**\n" + " * @see Valid.Inner\n" + " */\n" + " public class Inner { }\n" + "}\n" + "/**\n" + " * See also {@link Valid.Inner}\n" + " */\n" + "class Sub2 extends Valid { }" } ); } public void testBug96237_Private02() { this.reportInvalidJavadocVisibility = CompilerOptions.PRIVATE; runNegativeTest( new String[] { "comment6/Invalid.java", "package comment6;\n" + "public class Invalid {\n" + " /**\n" + " * @see Inner\n" + " */\n" + " public class Inner { }\n" + "}\n" + "/**\n" + " * See also {@link Inner} \n" + " */\n" + "class Sub1 extends Invalid { }\n" }, //comment6\Invalid.java:11: warning - Tag @link: reference not found: Inner "----------\n" + "1. ERROR in comment6\\Invalid.java (at line 9)\n" + " * See also {@link Inner} \n" + " ^^^^^\n" + "Javadoc: Invalid member type qualification\n" + "----------\n", JavacTestOptions.Excuse.EclipseWarningConfiguredAsError ); } public void testBug96237_Private03() { this.reportInvalidJavadocVisibility = CompilerOptions.PRIVATE; runNegativeTest( new String[] { "comment6a/def/Test.java", "package comment6a.def;\n" + "public class Test {\n" + " /**\n" + " * @see Inner\n" + " */\n" + " public class Inner { }\n" + "}\n", "comment6a/test/Invalid.java", "package comment6a.test;\n" + "import comment6a.def.Test;\n" + "/**\n" + " * See also {@link Inner}\n" + " */\n" + "public class Invalid extends Test { \n" + "}", "comment6a/test/Invalid2.java", "package comment6a.test;\n" + "import comment6a.def.Test;\n" + "/**\n" + " * @see Test.Inner\n" + " */\n" + "public class Invalid2 extends Test { \n" + "}", "comment6a/test/Valid.java", "package comment6a.test;\n" + "import comment6a.def.Test;\n" + "/**\n" + " * @see comment6a.def.Test.Inner\n" + " */\n" + "public class Valid extends Test { \n" + "}" }, //comment6a\test\Invalid.java:8: warning - Tag @link: reference not found: Inner //comment6a\test\Invalid2.java:8: warning - Tag @see: reference not found: Test.Inner => bug ID: 4464323 "----------\n" + "1. ERROR in comment6a\\test\\Invalid.java (at line 4)\n" + " * See also {@link Inner}\n" + " ^^^^^\n" + "Javadoc: Invalid member type qualification\n" + "----------\n" + "----------\n" + "1. ERROR in comment6a\\test\\Invalid2.java (at line 4)\n" + " * @see Test.Inner\n" + " ^^^^^^^^^^\n" + "Javadoc: Invalid member type qualification\n" + "----------\n", JavacTestOptions.Excuse.EclipseWarningConfiguredAsError ); } public void testBug96237_Private04() { this.reportInvalidJavadocVisibility = CompilerOptions.PRIVATE; runNegativeTest( new String[] { "comment6b/Invalid.java", "package comment6b;\n" + "\n" + "/**\n" + " * @see Inner\n" + " */\n" + "public class Invalid implements Test { \n" + "}", "comment6b/Test.java", "package comment6b;\n" + "public interface Test {\n" + " /**\n" + " * @see Inner\n" + " */\n" + " public class Inner { }\n" + "}\n", "comment6b/Valid.java", "package comment6b;\n" + "\n" + "/**\n" + " * @see Test.Inner\n" + " */\n" + "public class Valid implements Test { \n" + "}" }, //comment6b\Invalid.java:6: warning - Tag @see: reference not found: Inner "----------\n" + "1. ERROR in comment6b\\Invalid.java (at line 4)\n" + " * @see Inner\n" + " ^^^^^\n" + "Javadoc: Invalid member type qualification\n" + "----------\n", JavacTestOptions.Excuse.EclipseWarningConfiguredAsError ); } public void testBug96237_Private05() { this.reportInvalidJavadocVisibility = CompilerOptions.PRIVATE; runConformTest( new String[] { "test/a/Test.java", "package test.a;\n" + "/**\n" + " * @see Inner\n" + " * @see Test.Inner\n" + " */\n" + "public class Test {\n" + " class Inner {}\n" + "}\n" } ); } public void testBug96237_Private06() { this.reportInvalidJavadocVisibility = CompilerOptions.PRIVATE; runConformTest( new String[] { "test/b/Test.java", "package test.b;\n" + "/** \n" + " * @see Inner.Level2\n" + " * @see Test.Inner.Level2\n" + " */\n" + "public class Test {\n" + " /** \n" + " * @see Level2\n" + " * @see Test.Inner.Level2\n" + " */\n" + " public class Inner {\n" + " class Level2 {}\n" + " }\n" + "}\n" } ); } public void testBug96237_Private07() { this.reportInvalidJavadocVisibility = CompilerOptions.PRIVATE; runConformTest( new String[] { "test/c/Test.java", "package test.c;\n" + "/**\n" + " * @see Inner.Level2.Level3\n" + " * @see Test.Inner.Level2.Level3\n" + " */\n" + "public class Test {\n" + " public class Inner {\n" + " /**\n" + " * @see Level3\n" + " * @see Level2.Level3\n" + " * @see Inner.Level2.Level3\n" + " * @see Test.Inner.Level2.Level3\n" + " */\n" + " public class Level2 {\n" + " class Level3 {\n" + " }\n" + " }\n" + " }\n" + "}\n" } ); } public void testBug96237_Private08() { this.reportInvalidJavadocVisibility = CompilerOptions.PRIVATE; runConformTest( new String[] { "test/d/Reference.java", "package test.d;\n" + "class Reference {\n" + "}\n", "test/d/Test.java", "package test.d;\n" + "/**\n" + " * @see Secondary\n" + " * @see Reference\n" + " */\n" + "public class Test {\n" + "}\n" + "class Secondary {}" } ); } /** * Bug 101283: [1.5][javadoc] Javadoc validation raises missing implementation in compiler * @see "http://bugs.eclipse.org/bugs/show_bug.cgi?id=101283" */ public void testBug101283a() { runNegativeTest( new String[] { "X.java", "public class X<T, F> {\n" + "\n" + " /**\n" + " * @param <T> \n" + " * @param <F>\n" + " */\n" + " static class Entry<L, R> {\n" + " // empty\n" + " }\n" + "}\n" }, "----------\n" + "1. ERROR in X.java (at line 4)\n" + " * @param <T> \n" + " ^\n" + "Javadoc: Parameter T is not declared\n" + "----------\n" + "2. ERROR in X.java (at line 5)\n" + " * @param <F>\n" + " ^\n" + "Javadoc: Parameter F is not declared\n" + "----------\n" + "3. ERROR in X.java (at line 7)\n" + " static class Entry<L, R> {\n" + " ^\n" + "Javadoc: Missing tag for parameter L\n" + "----------\n" + "4. ERROR in X.java (at line 7)\n" + " static class Entry<L, R> {\n" + " ^\n" + "Javadoc: Missing tag for parameter R\n" + "----------\n", JavacTestOptions.Excuse.EclipseWarningConfiguredAsError ); } public void testBug101283b() { runNegativeTest( new String[] { "X.java", "public class X<T, F> {\n" + "\n" + " /**\n" + " * @see T Variable \n" + " * @see F Variable\n" + " */\n" + " static class Entry<L, R> {\n" + " // empty\n" + " }\n" + "}\n" }, "----------\n" + "1. ERROR in X.java (at line 4)\n" + " * @see T Variable \n" + " ^\n" + "Javadoc: Invalid reference\n" + "----------\n" + "2. ERROR in X.java (at line 5)\n" + " * @see F Variable\n" + " ^\n" + "Javadoc: Invalid reference\n" + "----------\n" + "3. ERROR in X.java (at line 7)\n" + " static class Entry<L, R> {\n" + " ^\n" + "Javadoc: Missing tag for parameter L\n" + "----------\n" + "4. ERROR in X.java (at line 7)\n" + " static class Entry<L, R> {\n" + " ^\n" + "Javadoc: Missing tag for parameter R\n" + "----------\n", JavacTestOptions.Excuse.EclipseWarningConfiguredAsError ); } public void testBug101283c() { runNegativeTest( new String[] { "X.java", "public class X<T, F> {\n" + "\n" + " /**\n" + " * @param <T> \n" + " * @param <F>\n" + " */\n" + " class Entry<L, R> {\n" + " // empty\n" + " }\n" + "}\n" }, "----------\n" + "1. ERROR in X.java (at line 4)\n" + " * @param <T> \n" + " ^\n" + "Javadoc: Parameter T is not declared\n" + "----------\n" + "2. ERROR in X.java (at line 5)\n" + " * @param <F>\n" + " ^\n" + "Javadoc: Parameter F is not declared\n" + "----------\n" + "3. ERROR in X.java (at line 7)\n" + " class Entry<L, R> {\n" + " ^\n" + "Javadoc: Missing tag for parameter L\n" + "----------\n" + "4. ERROR in X.java (at line 7)\n" + " class Entry<L, R> {\n" + " ^\n" + "Javadoc: Missing tag for parameter R\n" + "----------\n", JavacTestOptions.Excuse.EclipseWarningConfiguredAsError ); } public void testBug101283d() { runNegativeTest( new String[] { "X.java", "public class X<T, F> {\n" + "\n" + " /**\n" + " * @see T Variable \n" + " * @see F Variable\n" + " */\n" + " class Entry<L, R> {\n" + " // empty\n" + " }\n" + "}\n" }, "----------\n" + "1. ERROR in X.java (at line 4)\n" + " * @see T Variable \n" + " ^\n" + "Javadoc: Invalid reference\n" + "----------\n" + "2. ERROR in X.java (at line 5)\n" + " * @see F Variable\n" + " ^\n" + "Javadoc: Invalid reference\n" + "----------\n" + "3. ERROR in X.java (at line 7)\n" + " class Entry<L, R> {\n" + " ^\n" + "Javadoc: Missing tag for parameter L\n" + "----------\n" + "4. ERROR in X.java (at line 7)\n" + " class Entry<L, R> {\n" + " ^\n" + "Javadoc: Missing tag for parameter R\n" + "----------\n", JavacTestOptions.Excuse.EclipseWarningConfiguredAsError ); } // Verify duplicate test case: bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=102735 public void testBug101283e() { this.reportMissingJavadocTags = CompilerOptions.DISABLED; runNegativeTest( new String[] { "Test.java", "public interface Test<V, R extends Component<?>, C extends\n" + "Test<V, R, C>> extends Control<SelectModel<V>, C>\n" + "{\n" + " public interface ValueRepresentationStrategy<VV, RR extends Component<?>> extends ComponentFactory<VV, RR>\n" + " {\n" + " /**This value must be equal to the ID of the component returned by the {@link\n" + " ComponentFactory#createComponent(V)} method.*/\n" + " public String getID(final VV value);\n" + " }\n" + "}\n" + "class Component<T> {}\n" + "interface Control<U, V> {}\n" + "class SelectModel<V> {}\n" + "interface ComponentFactory <U, V> {\n" + " public void createComponent(V v);\n" + "}\n" }, "----------\n" + "1. ERROR in Test.java (at line 7)\n" + " ComponentFactory#createComponent(V)} method.*/\n" + " ^\n" + "Javadoc: Cannot make a static reference to the non-static type variable V\n" + "----------\n", JavacTestOptions.Excuse.EclipseWarningConfiguredAsError ); } public void testBug101283f() { this.reportMissingJavadocTags = CompilerOptions.DISABLED; runConformTest( new String[] { "Test.java", "public interface Test<V, R extends Component<?>, C extends\n" + "Test<V, R, C>> extends Control<SelectModel<V>, C>\n" + "{\n" + " public interface ValueRepresentationStrategy<VV, RR extends Component<?>> extends ComponentFactory<VV, RR>\n" + " {\n" + " /**This value must be equal to the ID of the component returned by the {@link\n" + " ComponentFactory#createComponent(Object)} method.*/\n" + " public String getID(final VV value);\n" + " }\n" + "}\n" + "class Component<T> {}\n" + "interface Control<U, V> {}\n" + "class SelectModel<V> {}\n" + "interface ComponentFactory <U, V> {\n" + " public void createComponent(V v);\n" + "}\n" } ); } // Verify that ProblemReasons.InheritedNameHidesEnclosingName is not reported as Javadoc error public void testBug101283g() { this.reportMissingJavadocTags = CompilerOptions.DISABLED; runConformTest( new String[] { "test/X.java", "package test;\n" + "public class X {\n" + " int foo() { return 0; }\n" + " class XX extends X2 {\n" + " int bar() {\n" + " return foo();\n" + " }\n" + " }\n" + "}\n" + "class X2 {\n" + " int foo() {\n" + " return 0;\n" + " }\n" + "}\n", "test/Y.java", "package test;\n" + "public class Y {\n" + " int foo;\n" + " class YY extends Y2 {\n" + " /**\n" + " * @see #foo\n" + " */\n" + " int bar() {\n" + " return foo;\n" + " }\n" + " }\n" + "}\n" + "class Y2 {\n" + " int foo;\n" + "}\n" } ); } /** * Bug 112346: [javadoc] {@inheritedDoc} should be inactive for non-overridden method * @see "http://bugs.eclipse.org/bugs/show_bug.cgi?id=112346" */ public void testBug112346() { this.reportMissingJavadocTags = CompilerOptions.IGNORE; runConformTest( new String[] { "Test.java", "/**\n" + " * Test references\n" + " * @see Test#field\n" + " * @see Test#foo()\n" + " */\n" + "public class Test<T> {\n" + " T field;\n" + " T foo() { return null; }\n" + "}\n" } ); } /** * Bug 119857: [javadoc] Some inner class references should be flagged as unresolved * @see "http://bugs.eclipse.org/bugs/show_bug.cgi?id=119857" */ public void testBug119857() { runConformTest( new String[] { "DefaultInformationControl.java", "public class DefaultInformationControl {\n" + " public interface IInformationPresenter {\n" + " /**\n" + " * Updates the given presentation of the given information and\n" + " * thereby may manipulate the information to be displayed. The manipulation\n" + " * could be the extraction of textual encoded style information etc. Returns the\n" + " * manipulated information.\n" + " *\n" + " * @param hoverInfo the information to be presented\n" + " * @param maxWidth the maximal width in pixels\n" + " * @param maxHeight the maximal height in pixels\n" + " *\n" + " * @return the manipulated information\n" + " * @deprecated As of 3.2, replaced by {@link IInformationPresenterExtension#updatePresentation(String, int, int)}\n" + " * see bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=38528 for details.\n" + " */\n" + " String updatePresentation(String hoverInfo, int maxWidth, int maxHeight);\n" + " }\n" + " /**\n" + " * An information presenter determines the style presentation\n" + " * of information displayed in the default information control.\n" + " * The interface can be implemented by clients.\n" + " * \n" + " * @since 3.2\n" + " */\n" + " public interface IInformationPresenterExtension {\n" + " \n" + " /**\n" + " * Updates the given presentation of the given information and\n" + " * thereby may manipulate the information to be displayed. The manipulation\n" + " * could be the extraction of textual encoded style information etc. Returns the\n" + " * manipulated information.\n" + " * <p>\n" + " * Replaces {@link IInformationPresenter#updatePresentation(String, int, int)}\n" + " * <em>Make sure that you do not pass in a <code>Display</code></em> until\n" + " * https://bugs.eclipse.org/bugs/show_bug.cgi?id=38528 is fixed.\n" + " * </p>\n" + " *\n" + " * @param hoverInfo the information to be presented\n" + " * @param maxWidth the maximal width in pixels\n" + " * @param maxHeight the maximal height in pixels\n" + " *\n" + " * @return the manipulated information\n" + " */\n" + " String updatePresentation(String hoverInfo, int maxWidth, int maxHeight);\n" + " }\n" + "}\n" } ); } public void testBug119857_Fields() { runConformTest( new String[] { "TestFields.java", "/**\n" + " * @see MyInnerClass#foo\n" + " */\n" + "public class TestFields {\n" + " /**\n" + " * @see MyInnerClass#foo\n" + " */\n" + " public class MyInnerClass {\n" + " Object foo;\n" + " }\n" + "}" } ); } public void testBug119857_Methods() { runConformTest( new String[] { "TestMethods.java", "/**\n" + " * @see MyInnerClass#foo()\n" + " * @see MyInnerInterface#foo()\n" + " */\n" + "public class TestMethods {\n" + " /**\n" + " * @see MyInnerInterface#foo()\n" + " */\n" + " public class MyInnerClass {\n" + " public void foo() {}\n" + " }\n" + " /**\n" + " * @see MyInnerClass#foo()\n" + " */\n" + " public interface MyInnerInterface {\n" + " public void foo();\n" + " }\n" + "}" } ); } public void testBug119857_Types() { runConformTest( new String[] { "TestTypes.java", "/**\n" + " * @see MyInnerClass\n" + " * @see MyInnerInterface\n" + " */\n" + "public class TestTypes {\n" + " /**\n" + " * @see MyInnerInterface\n" + " */\n" + " public class MyInnerClass {\n" + " public void foo() {}\n" + " }\n" + " /**\n" + " * @see MyInnerClass\n" + " */\n" + " public interface MyInnerInterface {\n" + " public void foo();\n" + " }\n" + "}" } ); } public void testBug119857_Private01() { this.reportMissingJavadocTags = CompilerOptions.IGNORE; runConformTest( new String[] { "pack/Test.java", "package pack;\n" + "public class Test {\n" + " static class Inner {\n" + " public Object foo() { return null; }\n" + " }\n" + " public Inner field;\n" + " /** \n" + " * @see Inner#foo()\n" + " */\n" + " public Object foo() {\n" + " return field.foo();\n" + " }\n" + "}\n" } ); } public void testBug119857_Public01() { this.reportMissingJavadocTags = CompilerOptions.DISABLED; this.reportInvalidJavadocVisibility = CompilerOptions.PUBLIC; runNegativeTest( new String[] { "pack/Test.java", "package pack;\n" + "public class Test {\n" + " static class Inner {\n" + " public Object foo() { return null; }\n" + " }\n" + " public Inner field;\n" + " /** \n" + " * @see Inner#foo()\n" + " */\n" + " public Object foo() {\n" + " return field.foo();\n" + " }\n" + "}\n" }, //pack/Test.java:13: warning - Tag @see: reference not found: Inner1#foo() "----------\n" + "1. ERROR in pack\\Test.java (at line 8)\r\n" + " * @see Inner#foo()\r\n" + " ^^^^^\n" + "Javadoc: \'public\' visibility for malformed doc comments hides this \'default\' reference\n" + "----------\n", JavacTestOptions.Excuse.EclipseWarningConfiguredAsError ); } public void testBug119857_Private02() { this.reportMissingJavadocTags = CompilerOptions.IGNORE; runConformTest( new String[] { "test/Test.java", "package test;\n" + "public class Test {\n" + " static class Inner1 {\n" + " public Object foo() { return null; }\n" + " }\n" + " static class Inner2 {\n" + " public Inner1 field;\n" + " /** \n" + " * @see Inner1#foo()\n" + " */\n" + " public Object foo() {\n" + " return field.foo();\n" + " }\n" + " }\n" + "}\n" } ); } public void testBug119857_Public02() { this.reportMissingJavadocTags = CompilerOptions.IGNORE; this.reportInvalidJavadocVisibility = CompilerOptions.PUBLIC; runConformTest( new String[] { "test/Test.java", "package test;\n" + "public class Test {\n" + " static class Inner1 {\n" + " public Object foo() { return null; }\n" + " }\n" + " static class Inner2 {\n" + " public Inner1 field;\n" + " /** \n" + " * @see Inner1#foo()\n" + " */\n" + " public Object foo() {\n" + " return field.foo();\n" + " }\n" + " }\n" + "}\n" } ); } public void testBug119857_Public03() { this.reportMissingJavadocTags = CompilerOptions.IGNORE; this.reportInvalidJavadocVisibility = CompilerOptions.PUBLIC; runNegativeTest( new String[] { "pack/Test.java", "package pack;\n" + "public class Test {\n" + " static class Inner1 {\n" + " public Object foo() { return null; }\n" + " }\n" + " public static class Inner2 {\n" + " public Inner1 field;\n" + " /** \n" + " * @see Inner1#foo()\n" + " */\n" + " public Object foo() {\n" + " return field.foo();\n" + " }\n" + " }\n" + "}\n" }, //pack/Test.java:13: warning - Tag @see: reference not found: Inner1#foo() "----------\n" + "1. ERROR in pack\\Test.java (at line 9)\n" + " * @see Inner1#foo()\n" + " ^^^^^^\n" + "Javadoc: \'public\' visibility for malformed doc comments hides this \'default\' reference\n" + "----------\n", JavacTestOptions.Excuse.EclipseWarningConfiguredAsError ); } /** * Bug 132430: [1.5][javadoc] Unwanted missing tag warning for overridden method with parameter containing type variable * @see "http://bugs.eclipse.org/bugs/show_bug.cgi?id=132430" */ public void testBug132430() { runConformTest( new String[] { "A.java", "public class A<E> {\n" + " /**\n" + " * @param object\n" + " */\n" + " public void aMethod(E object) {}\n" + "}", "B.java", "public class B<E> extends A<E> {\n" + " /**\n" + " * @see A#aMethod(java.lang.Object)\n" + " */\n" + " @Override\n" + " public void aMethod(E object) {\n" + " super.aMethod(object);\n" + " }\n" + "}\n" } ); } public void testBug132430b() { runConformTest( new String[] { "A.java", "public class A<E> {\n" + " /**\n" + " * @param object\n" + " */\n" + " public void aMethod(E object) {}\n" + "}", "B.java", "public class B<E> extends A<E> {\n" + " /**\n" + " * @see A#aMethod(java.lang.Object)\n" + " */\n" + " public void aMethod(E object) {\n" + " super.aMethod(object);\n" + " }\n" + "}\n" } ); } public void testBug132430c() { runConformTest( new String[] { "A.java", "public class A<E> {\n" + " /**\n" + " * @param object\n" + " */\n" + " public void aMethod(E object) {}\n" + "}", "B.java", "public class B<E> extends A<E> {\n" + " /**\n" + " * Empty comment\n" + " */\n" + " @Override\n" + " public void aMethod(E object) {\n" + " super.aMethod(object);\n" + " }\n" + "}\n" } ); } /** * Bug 145007: [1.5][javadoc] Generics + Inner Class -> Javadoc "missing @throws" warning * @see "http://bugs.eclipse.org/bugs/show_bug.cgi?id=145007" */ public void testBug145007() { runConformTest( new String[] { "TestClass.java", "class TestClass<T> {\n" + " static class Test1 {\n" + " /**\n" + " * A simple method that demonstrates tag problems\n" + " * \n" + " * @return a string\n" + " * @throws MyException\n" + " * if something goes wrong\n" + " */\n" + " public String getString() throws MyException {\n" + " throw new MyException();\n" + " }\n" + " }\n" + " static class MyException extends Exception {\n" + " private static final long serialVersionUID = 1L;\n" + " }\n" + "}" } ); } /** * Bug 87500: [1.5][javadoc][options] Add a 'Consider enum values' option to warn/error on 'Missing javadoc comments'. * @see "https://bugs.eclipse.org/bugs/show_bug.cgi?id=87500" */ public void testBug87500a() { this.reportMissingJavadocComments = CompilerOptions.ERROR; this.reportMissingJavadocCommentsVisibility = CompilerOptions.DEFAULT; runNegativeTest( new String[] { "A.java", "enum A {\n" + " clubs,\n" + " diamonds,\n" + " hearts,\n" + " spades\n" + "}\n" }, "----------\n" + "1. ERROR in A.java (at line 1)\n" + " enum A {\n" + " ^\n" + "Javadoc: Missing comment for default declaration\n" + "----------\n" + "2. ERROR in A.java (at line 2)\n" + " clubs,\n" + " ^^^^^\n" + "Javadoc: Missing comment for default declaration\n" + "----------\n" + "3. ERROR in A.java (at line 3)\n" + " diamonds,\n" + " ^^^^^^^^\n" + "Javadoc: Missing comment for default declaration\n" + "----------\n" + "4. ERROR in A.java (at line 4)\n" + " hearts,\n" + " ^^^^^^\n" + "Javadoc: Missing comment for default declaration\n" + "----------\n" + "5. ERROR in A.java (at line 5)\n" + " spades\n" + " ^^^^^^\n" + "Javadoc: Missing comment for default declaration\n" + "----------\n", JavacTestOptions.Excuse.EclipseWarningConfiguredAsError ); } public void testBug87500b() { this.reportMissingJavadocComments = CompilerOptions.IGNORE; runConformTest( new String[] { "A.java", "enum A {\n" + " clubs,\n" + " diamonds,\n" + " hearts,\n" + " spades\n" + "}\n" }); } /** * Bug 204749 [1.5][javadoc] NPE in JavadocQualifiedTypeReference * @see "https://bugs.eclipse.org/bugs/show_bug.cgi?id=204749" */ public void testBug204749a() { this.reportMissingJavadocTags = CompilerOptions.IGNORE; this.reportMissingJavadocComments = CompilerOptions.IGNORE; this.reportMissingJavadocCommentsVisibility = CompilerOptions.WARNING; runNegativeTest( new String[] { "X.java", "public class X<T> {\n" + " /** @see T.R */\n" + " void foo() {}\n" + "}" }, "----------\n" + "1. ERROR in X.java (at line 2)\n" + " /** @see T.R */\n" + " ^^^\n" + "Javadoc: Invalid reference\n" + "----------\n", JavacTestOptions.Excuse.EclipseWarningConfiguredAsError ); } public void testBug204749b() { this.reportMissingJavadocTags = CompilerOptions.IGNORE; this.reportMissingJavadocComments = CompilerOptions.IGNORE; this.reportInvalidJavadoc = CompilerOptions.IGNORE; runConformTest( new String[] { "X.java", "public class X<T> {\n" + " /** @see T.R */\n" + " void foo() {}\n" + "}" } ); } /** * Bug 209936 Missing code implementation in the compiler on inner classes * @see "https://bugs.eclipse.org/bugs/show_bug.cgi?id=209936" */ public void testBug209936a() { this.reportMissingJavadocCommentsVisibility = CompilerOptions.WARNING; runNegativeTest( new String[] { "p/X.java", "package p;\n" + "public abstract class X extends Y {\n" + " protected class A extends Member {\n" + " /**\n" + " * @see Member#foo(Object, Object)\n" + " */\n" + " public void foo(Object source, Object data) {}\n" + " }\n" + "}", "p/Y.java", "package p;\n" + "import p1.Z;\n" + "public abstract class Y extends Z<Object> {\n" + "}", "p1/Z.java", "package p1;\n" + "public abstract class Z<T> {\n" + " protected class Member {\n" + " protected void foo(Object source, Object data) {\n" + " }\n" + " }\n" + "}" }, "----------\n" + "1. ERROR in p\\X.java (at line 5)\n" + " * @see Member#foo(Object, Object)\n" + " ^^^^^^\n" + "Javadoc: Invalid member type qualification\n" + "----------\n", JavacTestOptions.Excuse.EclipseWarningConfiguredAsError ); } public void testBug209936b() { this.reportMissingJavadocCommentsVisibility = CompilerOptions.WARNING; runNegativeTest( new String[] { "p/X.java", "package p;\n" + "public abstract class X extends Y {\n" + " protected class A extends Member {\n" + " /**\n" + " * @see Member#foo(Object, Object)\n" + " */\n" + " public void foo(Object source, Object data) {}\n" + " }\n" + "}", "p/Y.java", "package p;\n" + "\n" + "import p1.Z;\n" + "public abstract class Y extends Z<Object> {}", "p1/Z.java", "package p1;\n" + "public abstract class Z<T> {\n" + " protected class Member {\n" + " protected void foo(Object source, Object data) {}\n" + " }\n" + "}" }, "----------\n" + "1. ERROR in p\\X.java (at line 5)\n" + " * @see Member#foo(Object, Object)\n" + " ^^^^^^\n" + "Javadoc: Invalid member type qualification\n" + "----------\n", JavacTestOptions.Excuse.EclipseWarningConfiguredAsError ); } public void testBug209936_GenericMemberImplicitReference() { this.reportMissingJavadocTags = CompilerOptions.IGNORE; this.reportMissingJavadocCommentsVisibility = CompilerOptions.WARNING; runNegativeTest( new String[] { "p1/A.java", "package p1;\n" + "public class A<R> {\n" + " public class A1<S> {\n" + " public class A2<T> {\n" + " public class A3<U> {\n" + " public class A4<V> {\n" + " public void foo(V v) {}\n" + " }\n" + " }\n" + " }\n" + " }\n" + "}", "p2/X.java", "package p2;\n" + "import p1.A;\n" + "public class X<R> extends A<R> {\n" + " public class X1<S> extends A1<S> {\n" + " public class X2<T> extends A2<T> {\n" + " public class X3<U> extends A3<U> {\n" + " public class X4<V> extends A4<V> {\n" + " /**\n" + // implicit type reference " * @see #foo(Object)\n" + " * @see #foo(V)\n" + " */\n" + " public void foo(V v) {}\n" + " }\n" + " }\n" + " }\n" + " }\n" + "}" }, "----------\n" + "1. ERROR in p2\\X.java (at line 10)\n" + " * @see #foo(V)\n" + " ^^^\n" + "Javadoc: The method foo(Object) in the type X.X1.X2.X3.X4 is not applicable for the arguments (V)\n" + "----------\n", JavacTestOptions.Excuse.EclipseWarningConfiguredAsError ); } public void testBug209936_GenericMemberSingleReference() { this.reportMissingJavadocTags = CompilerOptions.IGNORE; this.reportMissingJavadocCommentsVisibility = CompilerOptions.WARNING; runNegativeTest( new String[] { "p1/A.java", "package p1;\n" + "public class A<R> {\n" + " public class A1<S> {\n" + " public class A2<T> {\n" + " public class A3<U> {\n" + " public class A4<V> {\n" + " public void foo(V v) {}\n" + " }\n" + " }\n" + " }\n" + " }\n" + "}", "p2/X.java", "package p2;\n" + "import p1.A;\n" + "public class X<R> extends A<R> {\n" + " public class X1<S> extends A1<S> {\n" + " public class X2<T> extends A2<T> {\n" + " public class X3<U> extends A3<U> {\n" + " public class X4<V> extends A4<V> {\n" + " /**\n" + // single type reference " * @see A4#foo(V)\n" + " * @see A4#foo(Object)\n" + " */\n" + " public void myFoo(V v) {}\n" + " }\n" + " }\n" + " }\n" + " }\n" + "}" }, "----------\n" + "1. ERROR in p2\\X.java (at line 9)\n" + " * @see A4#foo(V)\n" + " ^^^\n" + "Javadoc: The method foo(Object) in the type A.A1.A2.A3.A4 is not applicable for the arguments (V)\n" + "----------\n" + "2. ERROR in p2\\X.java (at line 10)\n" + " * @see A4#foo(Object)\n" + " ^^\n" + "Javadoc: Invalid member type qualification\n" + "----------\n", JavacTestOptions.Excuse.EclipseWarningConfiguredAsError ); } public void testBug209936_GenericMemberQualifiedSingleReference() { this.reportMissingJavadocCommentsVisibility = CompilerOptions.WARNING; runNegativeTest( new String[] { "p1/A.java", "package p1;\n" + "public class A<R> {\n" + " public class A1<S> {\n" + " public class A2<T> {\n" + " public class A3<U> {\n" + " public class A4<V> {\n" + " public void foo(V v) {}\n" + " }\n" + " }\n" + " }\n" + " }\n" + "}", "p2/X.java", "package p2;\n" + "import p1.A;\n" + "public class X<R> extends A<R> {\n" + " public class X1<S> extends A1<S> {\n" + " public class X2<T> extends A2<T> {\n" + " public class X3<U> extends A3<U> {\n" + " public class X4<V> extends A4<V> {\n" + " /**\n" + // qualified single type reference " * @see A3.A4#foo(V)\n" + " * @see p1.A.A1.A2.A3.A4#foo(Object)\n" + " */\n" + " public void foo(V v) {}\n" + " }\n" + " }\n" + " }\n" + " }\n" + "}" }, "----------\n" + "1. ERROR in p2\\X.java (at line 9)\n" + " * @see A3.A4#foo(V)\n" + " ^^^\n" + "Javadoc: The method foo(Object) in the type A.A1.A2.A3.A4 is not applicable for the arguments (V)\n" + "----------\n", JavacTestOptions.Excuse.EclipseWarningConfiguredAsError ); } public void testBug209936_GenericMemberFullyQualifiedSingleReference() { this.reportMissingJavadocCommentsVisibility = CompilerOptions.WARNING; runNegativeTest( new String[] { "p1/A.java", "package p1;\n" + "public class A<R> {\n" + " public class A1<S> {\n" + " public class A2<T> {\n" + " public class A3<U> {\n" + " public class A4<V> {\n" + " public void foo(V v) {}\n" + " }\n" + " }\n" + " }\n" + " }\n" + "}", "p2/X.java", "package p2;\n" + "import p1.A;\n" + "public class X<R> extends A<R> {\n" + " public class X1<S> extends A1<S> {\n" + " public class X2<T> extends A2<T> {\n" + " public class X3<U> extends A3<U> {\n" + " public class X4<V> extends A4<V> {\n" + " /**\n" + // fully qualified type reference " * @see p1.A.A1.A2.A3.A4#foo(V)\n" + " * @see p1.A.A1.A2.A3.A4#foo(Object)\n" + " */\n" + " public void foo(V v) {}\n" + " }\n" + " }\n" + " }\n" + " }\n" + "}" }, "----------\n" + "1. ERROR in p2\\X.java (at line 9)\n" + " * @see p1.A.A1.A2.A3.A4#foo(V)\n" + " ^^^\n" + "Javadoc: The method foo(Object) in the type A.A1.A2.A3.A4 is not applicable for the arguments (V)\n" + "----------\n", JavacTestOptions.Excuse.EclipseWarningConfiguredAsError ); } public void testBug209936_MemberImplicitReference() { this.reportMissingJavadocTags = CompilerOptions.IGNORE; this.reportMissingJavadocCommentsVisibility = CompilerOptions.WARNING; runNegativeTest( new String[] { "p1/A.java", "package p1;\n" + "public class A<R> {\n" + " public class A1<S> {\n" + " public class A2<T> {\n" + " public class A3<U> {\n" + " public class A4 {\n" + " public void foo(U u) {}\n" + " }\n" + " }\n" + " }\n" + " }\n" + "}", "p2/X.java", "package p2;\n" + "import p1.A;\n" + "public class X<R> extends A<R> {\n" + " public class X1<S> extends A1<S> {\n" + " public class X2<T> extends A2<T> {\n" + " public class X3<U> extends A3<U> {\n" + " public class X4 extends A4 {\n" + " /**\n" + // implicit reference " * @see #foo(Object)\n" + " * @see #foo(U u)\n" + " */\n" + " public void foo(U u) {}\n" + " }\n" + " }\n" + " }\n" + " }\n" + "}" }, "----------\n" + "1. ERROR in p2\\X.java (at line 10)\r\n" + " * @see #foo(U u)\r\n" + " ^^^\n" + "Javadoc: The method foo(Object) in the type X.X1.X2.X3.X4 is not applicable for the arguments (U)\n" + "----------\n", JavacTestOptions.Excuse.EclipseWarningConfiguredAsError ); } public void testBug209936_MemberSingleReference1(){ this.reportMissingJavadocTags = CompilerOptions.IGNORE; this.reportMissingJavadocCommentsVisibility = CompilerOptions.WARNING; runNegativeTest( new String[] { "p1/A.java", "package p1;\n" + "public class A<R> {\n" + " public class A1<S> {\n" + " public class A2<T> {\n" + " public class A3 {\n" + " public class A4 {\n" + " public void foo(T t) {}\n" + " }\n" + " }\n" + " }\n" + " }\n" + "}", "p2/X.java", "package p2;\n" + "import p1.A;\n" + "public class X<R> extends A<R> {\n" + " public class X1<S> extends A1<S> {\n" + " public class X2<T> extends A2<T> {\n" + " public class X3 extends A3 {\n" + " public class X4 extends A4 {\n" + " /**\n" + // single type reference " * @see A4#foo(Object)\n" + " * @see A4#foo(T)\n" + " */\n" + " public void foo(T t) {}\n" + " }\n" + " }\n" + " }\n" + " }\n" + "}" }, "----------\n" + "1. ERROR in p2\\X.java (at line 9)\n" + " * @see A4#foo(Object)\n" + " ^^\n" + "Javadoc: Invalid member type qualification\n" + "----------\n" + "2. ERROR in p2\\X.java (at line 10)\n" + " * @see A4#foo(T)\n" + " ^^^\n" + "Javadoc: The method foo(Object) in the type A.A1.A2.A3.A4 is not applicable for the arguments (T)\n" + "----------\n", JavacTestOptions.Excuse.EclipseWarningConfiguredAsError ); } public void testBug209936_MemberSingleReference2(){ this.reportMissingJavadocTags = CompilerOptions.IGNORE; this.reportMissingJavadocCommentsVisibility = CompilerOptions.WARNING; runNegativeTest( new String[] { "p1/A.java", "package p1;\n" + "public class A<R> {\n" + " public class A1<S> {\n" + " public class A2 {\n" + " public class A3 {\n" + " public class A4 {\n" + " public void foo(S s) {}\n" + " }\n" + " }\n" + " }\n" + " }\n" + "}", "p2/X.java", "package p2;\n" + "import p1.A;\n" + "public class X<R> extends A<R> {\n" + " public class X1<S> extends A1<S> {\n" + " public class X2 extends A2 {\n" + " public class X3 extends A3 {\n" + " public class X4 extends A4 {\n" + " /**\n" + // single type reference " * @see A4#foo(Object)\n" + " * @see A4#foo(S)\n" + " */\n" + " public void foo(S s) {}\n" + " }\n" + " }\n" + " }\n" + " }\n" + "}" }, "----------\n" + "1. ERROR in p2\\X.java (at line 9)\n" + " * @see A4#foo(Object)\n" + " ^^\n" + "Javadoc: Invalid member type qualification\n" + "----------\n" + "2. ERROR in p2\\X.java (at line 10)\n" + " * @see A4#foo(S)\n" + " ^^^\n" + "Javadoc: The method foo(Object) in the type A.A1.A2.A3.A4 is not applicable for the arguments (S)\n" + "----------\n", JavacTestOptions.Excuse.EclipseWarningConfiguredAsError ); } public void testBug209936_MemberSingleReference3(){ this.reportMissingJavadocTags = CompilerOptions.IGNORE; this.reportMissingJavadocCommentsVisibility = CompilerOptions.WARNING; runNegativeTest( new String[] { "p1/A.java", "package p1;\n" + "public class A {\n" + " public class A1 {\n" + " public class A2<T> {\n" + " public class A3 {\n" + " public class A4 {\n" + " public void foo(T t) {}\n" + " }\n" + " }\n" + " }\n" + " }\n" + "}", "p2/X.java", "package p2;\n" + "import p1.A;\n" + "public class X extends A {\n" + " public class X1 extends A1 {\n" + " public class X2<T> extends A2<T> {\n" + " public class X3 extends A3 {\n" + " public class X4 extends A4 {\n" + " /**\n" + // single type reference " * @see A4#foo(Object)\n" + " * @see A4#foo(T)\n" + " */\n" + " public void foo(T t) {}\n" + " }\n" + " }\n" + " }\n" + " }\n" + "}" }, "----------\n" + "1. ERROR in p2\\X.java (at line 9)\n" + " * @see A4#foo(Object)\n" + " ^^\n" + "Javadoc: Invalid member type qualification\n" + "----------\n" + "2. ERROR in p2\\X.java (at line 10)\n" + " * @see A4#foo(T)\n" + " ^^^\n" + "Javadoc: The method foo(Object) in the type A.A1.A2.A3.A4 is not applicable for the arguments (T)\n" + "----------\n", JavacTestOptions.Excuse.EclipseWarningConfiguredAsError ); } public void testBug209936_MemberSingleReference4(){ this.reportMissingJavadocTags = CompilerOptions.IGNORE; this.reportMissingJavadocCommentsVisibility = CompilerOptions.WARNING; runNegativeTest( new String[] { "p1/A.java", "package p1;\n" + "public class A {\n" + " public class A1 {\n" + " public class A2<T> {\n" + " public class A3 {\n" + " public class A4 {\n" + " public void foo(T t) {}\n" + " }\n" + " }\n" + " }\n" + " }\n" + "}", "p2/X.java", "package p2;\n" + "import p1.A;\n" + "public class X extends A {\n" + " public class X1 extends A1 {\n" + " public class X2<T> extends A2<T> {\n" + " public class X3 extends A3 {\n" + " public class X4 extends A4 {\n" + " /**\n" + // single type reference " * @see A4#foo(Object)\n" + " * @see A4#foo(T)\n" + " */\n" + " public void foo(T t) {}\n" + " }\n" + " }\n" + " }\n" + " }\n" + "}" }, "----------\n" + "1. ERROR in p2\\X.java (at line 9)\n" + " * @see A4#foo(Object)\n" + " ^^\n" + "Javadoc: Invalid member type qualification\n" + "----------\n" + "2. ERROR in p2\\X.java (at line 10)\n" + " * @see A4#foo(T)\n" + " ^^^\n" + "Javadoc: The method foo(Object) in the type A.A1.A2.A3.A4 is not applicable for the arguments (T)\n" + "----------\n", JavacTestOptions.Excuse.EclipseWarningConfiguredAsError ); } public void testBug209936_MemberQualifiedSingleReference1() { this.reportMissingJavadocTags = CompilerOptions.IGNORE; this.reportMissingJavadocCommentsVisibility = CompilerOptions.WARNING; runConformTest( new String[] { "p1/A.java", "package p1;\n" + "\n" + "public class A<R> {\n" + " public class A1<S> {\n" + " public class A2 {\n" + " public class A3 {\n" + " public class A4 {\n" + " public void foo(S s) {}\n" + " }\n" + " }\n" + " }\n" + " }\n" + "}", "p2/X.java", "package p2;\n" + "import p1.A;\n" + "public class X<R> extends A<R> {\n" + " public class X1<S> extends A1<S> {\n" + " public class X2 extends A2 {\n" + " public class X3 extends A3 {\n" + " public class X4 extends A4 {\n" + " /**\n" + // qualified single type reference " * @see p1.A.A1.A2.A3.A4#foo(Object)\n" + " */\n" + " public void foo(S s) {}\n" + " }\n" + " }\n" + " }\n" + " }\n" + "}" } ); } public void testBug209936_MemberQualifiedSingleReference2() { this.reportMissingJavadocTags = CompilerOptions.IGNORE; this.reportMissingJavadocCommentsVisibility = CompilerOptions.WARNING; runConformTest( new String[] { "p1/A.java", "package p1;\n" + "\n" + "public class A<R> {\n" + " public class A1<S> {\n" + " public class A2 {\n" + " public class A3 {\n" + " public class A4 {\n" + " public class A5 {\n" + " public class A6 {\n" + " public void foo(S s) {}\n" + " }\n" + " }\n" + " }\n" + " }\n" + " }\n" + " }\n" + "}", "p2/X.java", "package p2;\n" + "import p1.A;\n" + "public class X<R> extends A<R> {\n" + " public class X1<S> extends A1<S> {\n" + " public class X2 extends A2 {\n" + " public class X3 extends A3 {\n" + " public class X4 extends A4 {\n" + " public class X5 extends A5 {\n" + " public class X6 extends A6 {\n" + " /**\n" + // qualified single type reference " * @see p1.A.A1.A2.A3.A4.A5.A6#foo(Object)\n" + " */\n" + " public void foo(S s) {}\n" + " }\n" + " }\n" + " }\n" + " }\n" + " }\n" + " }\n" + "}" } ); } public void testBug209936_MemberFullyQualifiedSingleReference() { this.reportMissingJavadocCommentsVisibility = CompilerOptions.WARNING; runNegativeTest( new String[] { "p1/A.java", "package p1;\n" + "\n" + "public class A<R> {\n" + " public class A1 {\n" + " public class A2 {\n" + " public class A3 {\n" + " public class A4 {\n" + " public void foo(R r) {}\n" + " }\n" + " }\n" + " }\n" + " }\n" + "}", "p2/X.java", "package p2;\n" + "import p1.A;\n" + "public class X<R> extends A<R> {\n" + " public class X1 extends A1 {\n" + " public class X2 extends A2 {\n" + " public class X3 extends A3 {\n" + " public class X4 extends A4 {\n" + " /**\n" + // fully qualified type reference " * @see p1.A.A1.A2.A3.A4#foo(Object)\n" + " * @see p1.A.A1.A2.A3.A4#foo(R)\n" + " */\n" + " public void foo(R r) {}\n" + " }\n" + " }\n" + " }\n" + " }\n" + "}" }, "----------\n" + "1. ERROR in p2\\X.java (at line 10)\r\n" + " * @see p1.A.A1.A2.A3.A4#foo(R)\r\n" + " ^^^\n" + "Javadoc: The method foo(Object) in the type A.A1.A2.A3.A4 is not applicable for the arguments (R)\n" + "----------\n", JavacTestOptions.Excuse.EclipseWarningConfiguredAsError ); } // https://bugs.eclipse.org/bugs/show_bug.cgi?id=247037, verify that we complain about @inheritDoc // being used in package level javadoc. public void testBug247037a() { runNegativeTest( new String[] { "pack/package-info.java", "/**\n" + " * {@inheritDoc}\n" + " * @since {@inheritDoc}\n" + " * @blah {@inheritDoc}\n" + " */\n" + "package pack;\n" }, "----------\n" + "1. ERROR in pack\\package-info.java (at line 2)\n" + " * {@inheritDoc}\n" + " ^^^^^^^^^^\n" + "Javadoc: Unexpected tag\n" + "----------\n" + "2. ERROR in pack\\package-info.java (at line 3)\n" + " * @since {@inheritDoc}\n" + " ^^^^^^^^^^\n" + "Javadoc: Unexpected tag\n" + "----------\n" + "3. ERROR in pack\\package-info.java (at line 4)\n" + " * @blah {@inheritDoc}\n" + " ^^^^^^^^^^\n" + "Javadoc: Unexpected tag\n" + "----------\n" ); } // https://bugs.eclipse.org/bugs/show_bug.cgi?id=247037, verify that we complain about @inheritDoc // being used in package level javadoc (variation) public void testBug247037b() { runNegativeTest( new String[] { "pack/package-info.java", "/**\n" + " * @return {@inheritDoc}\n" + " * @param blah {@inheritDoc}\n" + " */\n" + "package pack;\n" }, "----------\n" + "1. ERROR in pack\\package-info.java (at line 2)\n" + " * @return {@inheritDoc}\n" + " ^^^^^^\n" + "Javadoc: Unexpected tag\n" + "----------\n" + "2. ERROR in pack\\package-info.java (at line 2)\n" + " * @return {@inheritDoc}\n" + " ^^^^^^^^^^\n" + "Javadoc: Unexpected tag\n" + "----------\n" + "3. ERROR in pack\\package-info.java (at line 3)\n" + " * @param blah {@inheritDoc}\n" + " ^^^^^\n" + "Javadoc: Unexpected tag\n" + "----------\n" + "4. ERROR in pack\\package-info.java (at line 3)\n" + " * @param blah {@inheritDoc}\n" + " ^^^^^^^^^^\n" + "Javadoc: Unexpected tag\n" + "----------\n" ); } /** * @bug 286918:[javadoc] Compiler should warn when @see and @link tag references in package-info.java don't have fully qualified names * @test that in a package-info.java file * 1. References to valid packages are ACCEPTED without any warnings or errors * 2. References to valid Java elements (including the ones in the same package) without qualified names are REPORTED as errors * 3. References to valid Java elements with qualified names are ACCEPTED * @see "https://bugs.eclipse.org/bugs/show_bug.cgi?id=286918" */ public void testBug284333() { runNegativeTest(new String[]{ "goo/bar/package-info.java", "/**\n" + "*/\n" + "package goo.bar;\n", "foo/bar/ClassInSamePackage.java", "package foo.bar;\n" + "public class ClassInSamePackage {\n" + " public static int SOME_FIELD; \n" + "}\n", "foo/bar/goo/ClassInSubPackage.java", "package foo.bar.goo;\n" + "public class ClassInSubPackage {\n" + " public static void foo() { \n" + " }\n" + "}\n", "foo/ClassInEnclosingPackage.java", "package foo;\n" + "public class ClassInEnclosingPackage {\n" + " public static int SOME_FIELD; \n" + "}\n", "foo/bar/package-info.java", "/**\n" + " * @see ClassInSamePackage#SOME_FIELD\n" + " * @see foo.bar.ClassInSamePackage#SOME_FIELD\n" + " * @see ClassInSamePackage#SOME_FIELD\n" + " * @see ClassInSubPackage#foo\n" + " * @see foo.bar.goo.ClassInSubPackage#foo\n" + " * @see ClassInSubPackage#foo\n" + " * @see ClassInEnclosingPackage\n" + " * @see foo.ClassInEnclosingPackage\n" + " * @see ClassInEnclosingPackage\n" + " * @see foo.bar\n" + " * @see goo.bar\n" + " * @see foo.bar.goo\n" + " */\n" + "package foo.bar;\n" }, "----------\n" + "1. ERROR in foo\\bar\\package-info.java (at line 2)\n" + " * @see ClassInSamePackage#SOME_FIELD\n" + " ^^^^^^^^^^^^^^^^^^\n" + "Javadoc: Invalid reference\n" + "----------\n" + "2. ERROR in foo\\bar\\package-info.java (at line 4)\n" + " * @see ClassInSamePackage#SOME_FIELD\n" + " ^^^^^^^^^^^^^^^^^^\n" + "Javadoc: Invalid reference\n" + "----------\n" + "3. ERROR in foo\\bar\\package-info.java (at line 5)\n" + " * @see ClassInSubPackage#foo\n" + " ^^^^^^^^^^^^^^^^^\n" + "Javadoc: ClassInSubPackage cannot be resolved to a type\n" + "----------\n" + "4. ERROR in foo\\bar\\package-info.java (at line 7)\n" + " * @see ClassInSubPackage#foo\n" + " ^^^^^^^^^^^^^^^^^\n" + "Javadoc: ClassInSubPackage cannot be resolved to a type\n" + "----------\n" + "5. ERROR in foo\\bar\\package-info.java (at line 8)\n" + " * @see ClassInEnclosingPackage\n" + " ^^^^^^^^^^^^^^^^^^^^^^^\n" + "Javadoc: ClassInEnclosingPackage cannot be resolved to a type\n" + "----------\n" + "6. ERROR in foo\\bar\\package-info.java (at line 10)\n" + " * @see ClassInEnclosingPackage\n" + " ^^^^^^^^^^^^^^^^^^^^^^^\n" + "Javadoc: ClassInEnclosingPackage cannot be resolved to a type\n" + "----------\n"); } /** * Additional tests for "https://bugs.eclipse.org/bugs/show_bug.cgi?id=286918" * @test that in a non package-info.java file * 2. References without qualified names to valid Java elements in the same package are ACCEPTED * 2. References without qualified names to valid Java elements in other packages are REPORTED * 3. References with qualified names to valid Java elements are accepted */ public void testBug284333a() { runNegativeTest(new String[]{ "goo/bar/package-info.java", "/**\n" + "*/\n" + "package goo.bar;\n", "foo/bar/ClassInSamePackage.java", "package foo.bar;\n" + "public class ClassInSamePackage {\n" + " public static int SOME_FIELD; \n" + "}\n", "foo/bar/goo/ClassInSubPackage.java", "package foo.bar.goo;\n" + "public class ClassInSubPackage {\n" + " public static void foo() { \n" + " }\n" + "}\n", "foo/ClassInEnclosingPackage.java", "package foo;\n" + "public class ClassInEnclosingPackage {\n" + " public static int SOME_FIELD; \n" + "}\n", "foo/bar/NotAPackageInfo.java", "package foo.bar;\n" + "/**\n" + " * @see ClassInSamePackage#SOME_FIELD\n" + " * @see foo.bar.ClassInSamePackage#SOME_FIELD\n" + " * @see ClassInSamePackage#SOME_FIELD\n" + " */\n" + " public class NotAPackageInfo {\n" + "/**\n" + " * @see ClassInSubPackage#foo\n" + " * @see foo.bar.goo.ClassInSubPackage#foo\n" + " * @see ClassInSubPackage#foo\n" + " */\n" + " public static int SOME_FIELD = 0;\n" + "/**\n" + " * @see ClassInEnclosingPackage\n" + " * @see foo.ClassInEnclosingPackage\n" + " * @see ClassInEnclosingPackage\n" + " */\n" + " public static void foo() {\n" + " }\n" + " " + " }\n" }, "----------\n" + "1. ERROR in foo\\bar\\NotAPackageInfo.java (at line 9)\n" + " * @see ClassInSubPackage#foo\n" + " ^^^^^^^^^^^^^^^^^\n" + "Javadoc: ClassInSubPackage cannot be resolved to a type\n" + "----------\n" + "2. ERROR in foo\\bar\\NotAPackageInfo.java (at line 11)\n" + " * @see ClassInSubPackage#foo\n" + " ^^^^^^^^^^^^^^^^^\n" + "Javadoc: ClassInSubPackage cannot be resolved to a type\n" + "----------\n" + "3. ERROR in foo\\bar\\NotAPackageInfo.java (at line 15)\n" + " * @see ClassInEnclosingPackage\n" + " ^^^^^^^^^^^^^^^^^^^^^^^\n" + "Javadoc: ClassInEnclosingPackage cannot be resolved to a type\n" + "----------\n" + "4. ERROR in foo\\bar\\NotAPackageInfo.java (at line 17)\n" + " * @see ClassInEnclosingPackage\n" + " ^^^^^^^^^^^^^^^^^^^^^^^\n" + "Javadoc: ClassInEnclosingPackage cannot be resolved to a type\n" + "----------\n"); } /** * Additional tests for "https://bugs.eclipse.org/bugs/show_bug.cgi?id=284333" * @test that in a non package-info.java file * 2. References without qualified names to imported Java elements in other packages are ACCEPTED * 3. References with qualified names to valid Java elements are ACCEPTED */ public void testBug284333b() { runConformTest(new String[] { "goo/bar/package-info.java", "/**\n" + "*/\n" + "package goo.bar;\n", "foo/bar/ClassInSamePackage.java", "package foo.bar;\n" + "public class ClassInSamePackage {\n" + " public static int SOME_FIELD; \n" + "}\n", "foo/bar/goo/ClassInSubPackage.java", "package foo.bar.goo;\n" + "public class ClassInSubPackage {\n" + " public static void foo() { \n" + " }\n" + "}\n", "foo/ClassInEnclosingPackage.java", "package foo;\n" + "public class ClassInEnclosingPackage {\n" + " public static int SOME_FIELD; \n" + "}\n", "foo/bar/NotAPackageInfo.java", "package foo.bar;\n" + "import foo.*;\n" + "import foo.bar.goo.*;\n" + "/**\n" + " * @see ClassInSamePackage#SOME_FIELD\n" + " * @see foo.bar.ClassInSamePackage#SOME_FIELD\n" + " * @see ClassInSamePackage#SOME_FIELD\n" + " * @see goo.bar\n" + " */\n" + " public class NotAPackageInfo {\n" + "/**\n" + " * @see ClassInSubPackage#foo\n" + " * @see foo.bar.goo.ClassInSubPackage#foo\n" + " * @see ClassInSubPackage#foo\n" + " * @see goo.bar\n" + " */\n" + " public static int SOME_FIELD = 0;\n" + "/**\n" + " * @see ClassInEnclosingPackage\n" + " * @see foo.ClassInEnclosingPackage\n" + " * @see ClassInEnclosingPackage\n" + " * @see goo.bar\n" + " */\n" + " public static void foo() {\n" + " }\n" + " " + " }\n" }); } // https://bugs.eclipse.org/bugs/show_bug.cgi?id=322581 // To test the javadoc option CompilerOptions.OPTION_ReportMissingJavadocTagsMethodTypeParameters public void testBug322581a() { Map options = getCompilerOptions(); options.put(CompilerOptions.OPTION_ReportMissingJavadocTagsMethodTypeParameters, CompilerOptions.DISABLED); this.runNegativeTest( true, new String[] { "X.java", " public class X {\n" + " /**\n" + " * javadoc\n" + " */\n" + " public <T, U, V> void foo(int val, Object obj) {}\n" + "}" }, null, options, "----------\n" + "1. ERROR in X.java (at line 5)\n" + " public <T, U, V> void foo(int val, Object obj) {}\n" + " ^^^\n" + "Javadoc: Missing tag for parameter val\n" + "----------\n" + "2. ERROR in X.java (at line 5)\n" + " public <T, U, V> void foo(int val, Object obj) {}\n" + " ^^^\n" + "Javadoc: Missing tag for parameter obj\n" + "----------\n", JavacTestOptions.Excuse.EclipseWarningConfiguredAsError ); } // https://bugs.eclipse.org/bugs/show_bug.cgi?id=322581 // To test the javadoc option CompilerOptions.OPTION_ReportMissingJavadocTagsMethodTypeParameters public void testBug322581b() { Map options = getCompilerOptions(); options.put(CompilerOptions.OPTION_ReportMissingJavadocTagsMethodTypeParameters, CompilerOptions.DISABLED); this.runNegativeTest( true, new String[] { "ListCallable.java", " import java.util.Collections;\n" + " import java.util.List;\n" + " import java.util.concurrent.Callable;\n" + "/**\n" + " * Callable that returns a list.\n" + " */\n" + "public abstract class ListCallable<V> implements Callable<List<V>> { // good warning\n" + " public abstract List<V> call() throws Exception;\n" + " /**\n" + " * Returns a {@link ListCallable} that wraps the result from calling <code>callable</code>.\n" + " * @param callable the {@link Callable} to wrap\n" + " * @return the wrapper\n" + " */\n" + " public static <T> ListCallable<T> from(final Callable<T> callable) { // don't warn\n" + " return new ListCallable<T>() {\n" + " @Override\n" + " public List<T> call() throws Exception {\n" + " return Collections.singletonList(callable.call());\n" + " }\n" + " };\n" + " }\n" + "}" }, null, options, "----------\n" + "1. ERROR in ListCallable.java (at line 7)\n" + " public abstract class ListCallable<V> implements Callable<List<V>> { // good warning\n" + " ^\n" + "Javadoc: Missing tag for parameter V\n" + "----------\n", JavacTestOptions.Excuse.EclipseWarningConfiguredAsError ); } // https://bugs.eclipse.org/bugs/show_bug.cgi?id=331872 public void testBug331872() { Map options = getCompilerOptions(); options.put(CompilerOptions.OPTION_ReportMissingJavadocTagsMethodTypeParameters, CompilerOptions.DISABLED); this.runNegativeTest( true, new String[] { "X.java", "/**\n" + " * @param <p> the given type parameter\n" + " */\n" + "public class X<p> {\n" + " /**\n" + " * @param o the given object\n" + " * @see #foo(p.O[])\n" + " */\n" + " public void foo(Object o) {\n" + " }\n" + "}" }, null, options, "----------\n" + "1. ERROR in X.java (at line 7)\n" + " * @see #foo(p.O[])\n" + " ^^^\n" + "Illegal qualified access from the type parameter p\n" + "----------\n", JavacTestOptions.Excuse.EclipseWarningConfiguredAsError ); } // https://bugs.eclipse.org/bugs/show_bug.cgi?id=331872 public void testBug331872b() { Map options = getCompilerOptions(); options.put(CompilerOptions.OPTION_ReportMissingJavadocTagsMethodTypeParameters, CompilerOptions.DISABLED); this.runNegativeTest( true, new String[] { "X.java", "/**\n" + " * @param <p> the given type parameter\n" + " */\n" + "public class X<p> {\n" + " /**\n" + " * @param o the given object\n" + " * @see #foo(O[])\n" + " */\n" + " public void foo(Object o) {\n" + " }\n" + "}" }, null, options, "----------\n" + "1. ERROR in X.java (at line 7)\n" + " * @see #foo(O[])\n" + " ^\n" + "Javadoc: O[] cannot be resolved to a type\n" + "----------\n", JavacTestOptions.Excuse.EclipseWarningConfiguredAsError ); } // https://bugs.eclipse.org/bugs/show_bug.cgi?id=331872 public void testBug331872c() { Map options = getCompilerOptions(); options.put(CompilerOptions.OPTION_ReportMissingJavadocTagsMethodTypeParameters, CompilerOptions.DISABLED); this.runNegativeTest( true, new String[] { "X.java", "/**\n" + " * @param <p> the given type parameter\n" + " */\n" + "public class X<p> {\n" + " /**\n" + " * @param o the given object\n" + " * @see #foo(test.O[])\n" + " */\n" + " public void foo(Object o) {\n" + " }\n" + "}" }, null, options, "----------\n" + "1. ERROR in X.java (at line 7)\n" + " * @see #foo(test.O[])\n" + " ^^^^^^\n" + "Javadoc: test[] cannot be resolved to a type\n" + "----------\n", JavacTestOptions.Excuse.EclipseWarningConfiguredAsError ); } // https://bugs.eclipse.org/bugs/show_bug.cgi?id=331872 public void testBug331872d() { Map options = getCompilerOptions(); options.put(CompilerOptions.OPTION_ReportMissingJavadocTagsMethodTypeParameters, CompilerOptions.DISABLED); this.runNegativeTest( true, new String[] { "X.java", "/**\n" + " * @param <p> the given type parameter\n" + " */\n" + "public class X<p> {\n" + " /**\n" + " * @param o the given object\n" + " * @see #foo(test.O)\n" + " */\n" + " public void foo(Object o) {\n" + " }\n" + "}" }, null, options, "----------\n" + "1. ERROR in X.java (at line 7)\n" + " * @see #foo(test.O)\n" + " ^^^^^^\n" + "Javadoc: test cannot be resolved to a type\n" + "----------\n", JavacTestOptions.Excuse.EclipseWarningConfiguredAsError ); } }