Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMajoj Palat2012-10-12 05:50:53 +0000
committerJayaprakash Arthanareeswaran2012-10-19 04:49:08 +0000
commitf7ea870ffaddfcb451c55807a166c8c5500cf565 (patch)
tree2d5ab4bdc710e3b30f80c91ecab23cdf0ad3ebfb
parenta09311fc616e4147742893af072d96170b7d4b0c (diff)
downloadeclipse.jdt.core-f7ea870ffaddfcb451c55807a166c8c5500cf565.tar.gz
eclipse.jdt.core-f7ea870ffaddfcb451c55807a166c8c5500cf565.tar.xz
eclipse.jdt.core-f7ea870ffaddfcb451c55807a166c8c5500cf565.zip
Fixed bug 385780: No warning for unused generic parameters
-rw-r--r--org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/BatchCompilerTest.java109
-rw-r--r--org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/CompilerInvocationTests.java2
-rw-r--r--org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/GenericTypeTest.java3
-rw-r--r--org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/GenericsRegressionTest.java51
-rw-r--r--org.eclipse.jdt.core/batch/org/eclipse/jdt/internal/compiler/batch/Main.java4
-rw-r--r--org.eclipse.jdt.core/compiler/org/eclipse/jdt/core/compiler/IProblem.java2
-rw-r--r--org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ASTNode.java4
-rw-r--r--org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ConstructorDeclaration.java11
-rw-r--r--org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/MethodDeclaration.java12
-rw-r--r--org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/TypeDeclaration.java12
-rw-r--r--org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/impl/CompilerOptions.java11
-rw-r--r--org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/impl/IrritantSet.java1
-rw-r--r--org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/ProblemReporter.java15
-rw-r--r--org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/messages.properties1
-rw-r--r--org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/DefaultCodeFormatter.java1
-rw-r--r--org.eclipse.jdt.core/model/org/eclipse/jdt/core/JavaCore.java15
16 files changed, 241 insertions, 13 deletions
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/BatchCompilerTest.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/BatchCompilerTest.java
index 1b6c2ec27e..c6dd206604 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/BatchCompilerTest.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/BatchCompilerTest.java
@@ -1996,7 +1996,8 @@ public void test012b(){
" <option key=\"org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract\" value=\"disabled\"/>\n" +
" <option key=\"org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete\" value=\"disabled\"/>\n" +
" <option key=\"org.eclipse.jdt.core.compiler.problem.unusedPrivateMember\" value=\"warning\"/>\n" +
- " <option key=\"org.eclipse.jdt.core.compiler.problem.unusedTypeArgumentsForMethodInvocation\" value=\"warning\"/>\n" +
+ " <option key=\"org.eclipse.jdt.core.compiler.problem.unusedTypeArgumentsForMethodInvocation\" value=\"warning\"/>\n" +
+ " <option key=\"org.eclipse.jdt.core.compiler.problem.unusedTypeParameter\" value=\"ignore\"/>\n" +
" <option key=\"org.eclipse.jdt.core.compiler.problem.unusedWarningToken\" value=\"warning\"/>\n" +
" <option key=\"org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast\" value=\"warning\"/>\n" +
" <option key=\"org.eclipse.jdt.core.compiler.processAnnotations\" value=\"disabled\"/>\n" +
@@ -7763,7 +7764,12 @@ public void test191_warn_options() {
" ^^^^\n" +
"The label next is never explicitly referenced\n" +
"----------\n" +
- "7 problems (7 warnings)",
+ "8. WARNING in ---OUTPUT_DIR_PLACEHOLDER---/X.java (at line 14)\n" +
+ " <T> void bar() {\n" +
+ " ^\n" +
+ "Unused type parameter T\n" +
+ "----------\n" +
+ "8 problems (8 warnings)",
true);
}
// -warn option - regression tests
@@ -8068,7 +8074,12 @@ public void test199_warn_options() {
" ^^^^\n" +
"The label next is never explicitly referenced\n" +
"----------\n" +
- "6 problems (6 warnings)",
+ "7. WARNING in ---OUTPUT_DIR_PLACEHOLDER---/X.java (at line 14)\n" +
+ " <T> void bar() {\n" +
+ " ^\n" +
+ "Unused type parameter T\n" +
+ "----------\n" +
+ "7 problems (7 warnings)",
true);
}
// -warn option - regression tests
@@ -8128,7 +8139,12 @@ public void test200_warn_options() {
" ^^^^\n" +
"The label next is never explicitly referenced\n" +
"----------\n" +
- "6 problems (6 warnings)",
+ "7. WARNING in ---OUTPUT_DIR_PLACEHOLDER---/X.java (at line 14)\n" +
+ " <T> void bar() {\n" +
+ " ^\n" +
+ "Unused type parameter T\n" +
+ "----------\n" +
+ "7 problems (7 warnings)",
true);
}
// -warn option - regression tests
@@ -8188,7 +8204,12 @@ public void test201_warn_options() {
" ^^^^^^\n" +
"Unused type arguments for the non generic method bar() of type X; it should not be parameterized with arguments <String>\n" +
"----------\n" +
- "6 problems (6 warnings)",
+ "7. WARNING in ---OUTPUT_DIR_PLACEHOLDER---/X.java (at line 14)\n" +
+ " <T> void bar() {\n" +
+ " ^\n" +
+ "Unused type parameter T\n" +
+ "----------\n" +
+ "7 problems (7 warnings)",
true);
}
// -warn option - regression tests
@@ -8248,7 +8269,12 @@ public void test202_warn_options() {
" ^^^^\n" +
"The label next is never explicitly referenced\n" +
"----------\n" +
- "6 problems (6 warnings)",
+ "7. WARNING in ---OUTPUT_DIR_PLACEHOLDER---/X.java (at line 14)\n" +
+ " <T> void bar() {\n" +
+ " ^\n" +
+ "Unused type parameter T\n" +
+ "----------\n" +
+ "7 problems (7 warnings)",
true);
}
// -warn option - regression tests
@@ -8308,7 +8334,12 @@ public void test203_warn_options() {
" ^^^^\n" +
"The label next is never explicitly referenced\n" +
"----------\n" +
- "6 problems (6 warnings)",
+ "7. WARNING in ---OUTPUT_DIR_PLACEHOLDER---/X.java (at line 14)\n" +
+ " <T> void bar() {\n" +
+ " ^\n" +
+ "Unused type parameter T\n" +
+ "----------\n" +
+ "7 problems (7 warnings)",
true);
}
// -warn option - regression tests
@@ -8368,7 +8399,12 @@ public void test204_warn_options() {
" ^^^^\n" +
"The label next is never explicitly referenced\n" +
"----------\n" +
- "6 problems (6 warnings)",
+ "7. WARNING in ---OUTPUT_DIR_PLACEHOLDER---/X.java (at line 14)\n" +
+ " <T> void bar() {\n" +
+ " ^\n" +
+ "Unused type parameter T\n" +
+ "----------\n" +
+ "7 problems (7 warnings)",
true);
}
// -warn option - regression tests
@@ -8428,7 +8464,12 @@ public void test205_warn_options() {
" ^^^^\n" +
"The label next is never explicitly referenced\n" +
"----------\n" +
- "6 problems (6 warnings)",
+ "7. WARNING in ---OUTPUT_DIR_PLACEHOLDER---/X.java (at line 14)\n" +
+ " <T> void bar() {\n" +
+ " ^\n" +
+ "Unused type parameter T\n" +
+ "----------\n" +
+ "7 problems (7 warnings)",
true);
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=211588
@@ -13596,4 +13637,54 @@ public void testBug375366c() throws IOException {
"3 problems (3 errors)",
false/*don't flush*/);
}
+
+// https://bugs.eclipse.org/bugs/show_bug.cgi?id=385780
+public void test385780_warn_option() {
+ this.runConformTest(
+ new String[] {
+ "X.java",
+ "public class X<T> {\n"+
+ "public <S> X() {\n"+
+ "}\n"+
+ "public void ph(int t) {\n"+
+ "}\n"+
+ "}\n"+
+ "interface doNothingInterface<T> {\n"+
+ "}\n"+
+ "class doNothing {\n"+
+ "public <T> void doNothingMethod() {"+
+ "}\n"+
+ "}\n"+
+ "class noerror {\n"+
+ "public <T> void doNothing(T t) {"+
+ "}"+
+ "}\n"
+ },
+ "\"" + OUTPUT_DIR + File.separator + "X.java\""
+ + " -warn:unusedTypeParameter -proc:none -1.7 -d \"" + OUTPUT_DIR + "\"",
+ "",
+ "----------\n" +
+ "1. WARNING in ---OUTPUT_DIR_PLACEHOLDER---/X.java (at line 1)\n" +
+ " public class X<T> {\n" +
+ " ^\n" +
+ "Unused type parameter T\n" +
+ "----------\n" +
+ "2. WARNING in ---OUTPUT_DIR_PLACEHOLDER---/X.java (at line 2)\n" +
+ " public <S> X() {\n" +
+ " ^\n" +
+ "Unused type parameter S\n" +
+ "----------\n" +
+ "3. WARNING in ---OUTPUT_DIR_PLACEHOLDER---/X.java (at line 7)\n" +
+ " interface doNothingInterface<T> {\n" +
+ " ^\n" +
+ "Unused type parameter T\n" +
+ "----------\n" +
+ "4. WARNING in ---OUTPUT_DIR_PLACEHOLDER---/X.java (at line 10)\n" +
+ " public <T> void doNothingMethod() {}\n" +
+ " ^\n" +
+ "Unused type parameter T\n" +
+ "----------\n" +
+ "4 problems (4 warnings)",
+ true);
+}
}
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/CompilerInvocationTests.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/CompilerInvocationTests.java
index e0f9bb9422..1553b5e17a 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/CompilerInvocationTests.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/CompilerInvocationTests.java
@@ -947,6 +947,7 @@ public void test011_problem_categories() {
expectedProblemAttributes.put("UnusedPrivateMethod", new ProblemAttributes(CategorizedProblem.CAT_UNNECESSARY_CODE));
expectedProblemAttributes.put("UnusedPrivateType", new ProblemAttributes(CategorizedProblem.CAT_UNNECESSARY_CODE));
expectedProblemAttributes.put("UnusedTypeArgumentsForConstructorInvocation", new ProblemAttributes(CategorizedProblem.CAT_MEMBER));
+ expectedProblemAttributes.put("UnusedTypeParameter", new ProblemAttributes(CategorizedProblem.CAT_UNNECESSARY_CODE));
expectedProblemAttributes.put("UnusedTypeArgumentsForMethodInvocation", new ProblemAttributes(CategorizedProblem.CAT_MEMBER));
expectedProblemAttributes.put("UnusedWarningToken", new ProblemAttributes(CategorizedProblem.CAT_UNNECESSARY_CODE));
expectedProblemAttributes.put("UseAssertAsAnIdentifier", new ProblemAttributes(CategorizedProblem.CAT_CODE_STYLE));
@@ -1672,6 +1673,7 @@ public void test012_compiler_problems_tuning() {
expectedProblemAttributes.put("UnusedPrivateMethod", new ProblemAttributes(JavaCore.COMPILER_PB_UNUSED_PRIVATE_MEMBER));
expectedProblemAttributes.put("UnusedPrivateType", new ProblemAttributes(JavaCore.COMPILER_PB_UNUSED_PRIVATE_MEMBER));
expectedProblemAttributes.put("UnusedTypeArgumentsForConstructorInvocation", new ProblemAttributes(JavaCore.COMPILER_PB_UNUSED_TYPE_ARGUMENTS_FOR_METHOD_INVOCATION));
+ expectedProblemAttributes.put("UnusedTypeParameter", new ProblemAttributes(JavaCore.COMPILER_PB_UNUSED_TYPE_PARAMETER));
expectedProblemAttributes.put("UnusedTypeArgumentsForMethodInvocation", new ProblemAttributes(JavaCore.COMPILER_PB_UNUSED_TYPE_ARGUMENTS_FOR_METHOD_INVOCATION));
expectedProblemAttributes.put("UnusedWarningToken", new ProblemAttributes(JavaCore.COMPILER_PB_UNUSED_WARNING_TOKEN));
expectedProblemAttributes.put("UseAssertAsAnIdentifier", new ProblemAttributes(JavaCore.COMPILER_PB_ASSERT_IDENTIFIER));
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/GenericTypeTest.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/GenericTypeTest.java
index c241843898..5f73f37aed 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/GenericTypeTest.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/GenericTypeTest.java
@@ -57,6 +57,7 @@ public class GenericTypeTest extends AbstractComparableTest {
options.put(CompilerOptions.OPTION_ReportUnusedLocal, CompilerOptions.IGNORE);
options.put(CompilerOptions.OPTION_ReportUnusedParameter, CompilerOptions.IGNORE);
options.put(CompilerOptions.OPTION_ReportUnusedPrivateMember, CompilerOptions.IGNORE);
+ options.put(CompilerOptions.OPTION_ReportUnusedTypeParameter, CompilerOptions.IGNORE);
return options;
}
@@ -51053,4 +51054,4 @@ public void test1467() {
"The constructor X.Base<X<T>.Arr>(Class<X.Arr>) is undefined\n" +
"----------\n");
}
-} \ No newline at end of file
+}
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/GenericsRegressionTest.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/GenericsRegressionTest.java
index 00813bfce7..ffc6b67656 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/GenericsRegressionTest.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/GenericsRegressionTest.java
@@ -44,6 +44,7 @@ public class GenericsRegressionTest extends AbstractComparableTest {
protected Map getCompilerOptions() {
Map compilerOptions = super.getCompilerOptions();
compilerOptions.put(CompilerOptions.OPTION_ReportMissingOverrideAnnotationForInterfaceMethodImplementation, CompilerOptions.DISABLED);
+ compilerOptions.put(CompilerOptions.OPTION_ReportUnusedTypeParameter,CompilerOptions.IGNORE);
return compilerOptions;
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=322531
@@ -2598,4 +2599,54 @@ public void test375394a() {
"C is a raw type. References to generic type C<T> should be parameterized\n" +
"----------\n");
}
+
+// https://bugs.eclipse.org/bugs/show_bug.cgi?id=385780
+public void test385780() {
+ Map customOptions = getCompilerOptions();
+ customOptions.put(
+ CompilerOptions.OPTION_ReportUnusedTypeParameter,
+ CompilerOptions.ERROR);
+ this.runNegativeTest(
+ new String[] {
+ "X.java",
+ "public class X<T> {\n"+
+ "public <S> X() {\n"+
+ "}\n"+
+ "public void ph(int t) {\n"+
+ "}\n"+
+ "}\n"+
+ "interface doNothingInterface<T> {\n"+
+ "}\n"+
+ "class doNothing {\n"+
+ "public <T> void doNothingMethod() {"+
+ "}\n"+
+ "}\n"+
+ "class noerror {\n"+
+ "public <T> void doNothing(T t) {"+
+ "}"+
+ "}\n"
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 1)\n" +
+ " public class X<T> {\n" +
+ " ^\n" +
+ "Unused type parameter T\n" +
+ "----------\n" +
+ "2. ERROR in X.java (at line 2)\n" +
+ " public <S> X() {\n" +
+ " ^\n" +
+ "Unused type parameter S\n" +
+ "----------\n" +
+ "3. ERROR in X.java (at line 7)\n" +
+ " interface doNothingInterface<T> {\n" +
+ " ^\n" +
+ "Unused type parameter T\n" +
+ "----------\n" +
+ "4. ERROR in X.java (at line 10)\n" +
+ " public <T> void doNothingMethod() {}\n" +
+ " ^\n" +
+ "Unused type parameter T\n" +
+ "----------\n",
+ null, true, customOptions);
+}
} \ No newline at end of file
diff --git a/org.eclipse.jdt.core/batch/org/eclipse/jdt/internal/compiler/batch/Main.java b/org.eclipse.jdt.core/batch/org/eclipse/jdt/internal/compiler/batch/Main.java
index e053b674bc..85541ea707 100644
--- a/org.eclipse.jdt.core/batch/org/eclipse/jdt/internal/compiler/batch/Main.java
+++ b/org.eclipse.jdt.core/batch/org/eclipse/jdt/internal/compiler/batch/Main.java
@@ -3873,10 +3873,14 @@ private void handleErrorOrWarningToken(String token, boolean isEnabling, int sev
setSeverity(CompilerOptions.OPTION_ReportUnusedLabel, severity, isEnabling);
setSeverity(CompilerOptions.OPTION_ReportUnusedTypeArgumentsForMethodInvocation, severity, isEnabling);
setSeverity(CompilerOptions.OPTION_ReportRedundantSpecificationOfTypeArguments, severity, isEnabling);
+ setSeverity(CompilerOptions.OPTION_ReportUnusedTypeParameter, severity,isEnabling); //TODO - Enable this when tests are modified at ui addition.
return;
} else if (token.equals("unusedParam")) { //$NON-NLS-1$
setSeverity(CompilerOptions.OPTION_ReportUnusedParameter, severity, isEnabling);
return;
+ } else if (token.equals("unusedTypeParameter")) { //$NON-NLS-1$
+ setSeverity(CompilerOptions.OPTION_ReportUnusedTypeParameter, severity, isEnabling);
+ return;
} else if (token.equals("unusedParamIncludeDoc")) { //$NON-NLS-1$
this.options.put(
CompilerOptions.OPTION_ReportUnusedParameterIncludeDocCommentReference,
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/core/compiler/IProblem.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/core/compiler/IProblem.java
index 345e4dabc9..95aab42d22 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/core/compiler/IProblem.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/core/compiler/IProblem.java
@@ -1329,6 +1329,8 @@ void setSourceStart(int sourceStart);
*/
/** @since 3.4 */
int UnusedTypeArgumentsForConstructorInvocation = MethodRelated + 660;
+ /** @since 3.9 */
+ int UnusedTypeParameter = TypeRelated + 661;
/**
* Corrupted binaries
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ASTNode.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ASTNode.java
index 90eedb9416..4a1d4e47a9 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ASTNode.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ASTNode.java
@@ -500,6 +500,10 @@ public abstract class ASTNode implements TypeConstants, TypeIds {
return false;
ReferenceBinding refType = (ReferenceBinding) type;
+ // https://bugs.eclipse.org/bugs/show_bug.cgi?id=385780
+ if (refType instanceof TypeVariableBinding) {
+ refType.modifiers |= ExtraCompilerModifiers.AccLocallyUsed;
+ }
// ignore references insing Javadoc comments
if ((this.bits & ASTNode.InsideJavadoc) == 0 && refType.isOrEnclosedByPrivateType() && !scope.isDefinedInType(refType)) {
// ignore cases where type is used from inside itself
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ConstructorDeclaration.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ConstructorDeclaration.java
index 89ac33a572..63a19489a3 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ConstructorDeclaration.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ConstructorDeclaration.java
@@ -89,7 +89,16 @@ public void analyseCode(ClassScope classScope, InitializationFlowContext initial
if (isRecursive(null /*lazy initialized visited list*/)) {
this.scope.problemReporter().recursiveConstructorInvocation(this.constructorCall);
}
-
+ // https://bugs.eclipse.org/bugs/show_bug.cgi?id=385780
+ if (this.typeParameters != null &&
+ !this.scope.referenceCompilationUnit().compilationResult.hasSyntaxError) {
+ for (int i = 0, length = this.typeParameters.length; i < length; ++i) {
+ TypeParameter typeParameter = this.typeParameters[i];
+ if ((typeParameter.binding.modifiers & ExtraCompilerModifiers.AccLocallyUsed) == 0) {
+ this.scope.problemReporter().unusedTypeParameter(typeParameter);
+ }
+ }
+ }
try {
ExceptionHandlingFlowContext constructorContext =
new ExceptionHandlingFlowContext(
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/MethodDeclaration.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/MethodDeclaration.java
index 3acfa70c30..d36ab9871b 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/MethodDeclaration.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/MethodDeclaration.java
@@ -82,7 +82,17 @@ public class MethodDeclaration extends AbstractMethodDeclaration {
// may be in a non necessary <clinit> for innerclass with static final constant fields
if (this.binding.isAbstract() || this.binding.isNative())
return;
-
+
+ // https://bugs.eclipse.org/bugs/show_bug.cgi?id=385780
+ if (this.typeParameters != null &&
+ !this.scope.referenceCompilationUnit().compilationResult.hasSyntaxError) {
+ for (int i = 0, length = this.typeParameters.length; i < length; ++i) {
+ TypeParameter typeParameter = this.typeParameters[i];
+ if ((typeParameter.binding.modifiers & ExtraCompilerModifiers.AccLocallyUsed) == 0) {
+ this.scope.problemReporter().unusedTypeParameter(typeParameter);
+ }
+ }
+ }
ExceptionHandlingFlowContext methodContext =
new ExceptionHandlingFlowContext(
flowContext,
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/TypeDeclaration.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/TypeDeclaration.java
index 405a84d1cf..4241f76b50 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/TypeDeclaration.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/TypeDeclaration.java
@@ -645,6 +645,18 @@ private void internalAnalyseCode(FlowContext flowContext, FlowInfo flowInfo) {
this.scope.problemReporter().unusedPrivateType(this);
}
}
+
+ // https://bugs.eclipse.org/bugs/show_bug.cgi?id=385780
+ if (this.typeParameters != null &&
+ !this.scope.referenceCompilationUnit().compilationResult.hasSyntaxError) {
+ for (int i = 0, length = this.typeParameters.length; i < length; ++i) {
+ TypeParameter typeParameter = this.typeParameters[i];
+ if ((typeParameter.binding.modifiers & ExtraCompilerModifiers.AccLocallyUsed) == 0) {
+ this.scope.problemReporter().unusedTypeParameter(typeParameter);
+ }
+ }
+ }
+
// for local classes we use the flowContext as our parent, but never use an initialization context for this purpose
// see Bug 360328 - [compiler][null] detect null problems in nested code (local class inside a loop)
FlowContext parentContext = (flowContext instanceof InitializationFlowContext) ? null : flowContext;
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/impl/CompilerOptions.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/impl/CompilerOptions.java
index 101b6ab3b5..3c5a3f61e1 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/impl/CompilerOptions.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/impl/CompilerOptions.java
@@ -129,6 +129,7 @@ public class CompilerOptions {
public static final String OPTION_SuppressWarnings = "org.eclipse.jdt.core.compiler.problem.suppressWarnings"; //$NON-NLS-1$
public static final String OPTION_SuppressOptionalErrors = "org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors"; //$NON-NLS-1$
public static final String OPTION_ReportUnhandledWarningToken = "org.eclipse.jdt.core.compiler.problem.unhandledWarningToken"; //$NON-NLS-1$
+ public static final String OPTION_ReportUnusedTypeParameter = "org.eclipse.jdt.core.compiler.problem.unusedTypeParameter"; //$NON-NLS-1$
public static final String OPTION_ReportUnusedWarningToken = "org.eclipse.jdt.core.compiler.problem.unusedWarningToken"; //$NON-NLS-1$
public static final String OPTION_ReportUnusedLabel = "org.eclipse.jdt.core.compiler.problem.unusedLabel"; //$NON-NLS-1$
public static final String OPTION_FatalOptionalError = "org.eclipse.jdt.core.compiler.problem.fatalOptionalError"; //$NON-NLS-1$
@@ -278,6 +279,7 @@ public class CompilerOptions {
public static final int RedundantNullAnnotation = IrritantSet.GROUP2 | ASTNode.Bit14;
public static final int MissingNonNullByDefaultAnnotation = IrritantSet.GROUP2 | ASTNode.Bit15;
public static final int MissingDefaultCase = IrritantSet.GROUP2 | ASTNode.Bit16;
+ public static final int UnusedTypeParameter = IrritantSet.GROUP2 | ASTNode.Bit17;
// Severity level for handlers
/**
@@ -602,6 +604,8 @@ public class CompilerOptions {
return OPTION_ReportMissingJavadocTagDescription;
case UnusedTypeArguments :
return OPTION_ReportUnusedTypeArgumentsForMethodInvocation;
+ case UnusedTypeParameter:
+ return OPTION_ReportUnusedTypeParameter;
case UnusedWarningToken :
return OPTION_ReportUnusedWarningToken;
case RedundantSuperinterface :
@@ -820,7 +824,8 @@ public class CompilerOptions {
OPTION_ReportNullSpecViolation,
OPTION_ReportNullAnnotationInferenceConflict,
OPTION_ReportNullUncheckedConversion,
- OPTION_ReportRedundantNullAnnotation
+ OPTION_ReportRedundantNullAnnotation,
+ OPTION_ReportUnusedTypeParameter,
};
return result;
}
@@ -877,6 +882,7 @@ public class CompilerOptions {
case DeadCode :
case UnusedObjectAllocation :
case RedundantSpecificationOfTypeArguments :
+ case UnusedTypeParameter:
return "unused"; //$NON-NLS-1$
case DiscouragedReference :
case ForbiddenReference :
@@ -1116,6 +1122,7 @@ public class CompilerOptions {
optionsMap.put(OPTION_NonNullAnnotationName, String.valueOf(CharOperation.concatWith(this.nonNullAnnotationName, '.')));
optionsMap.put(OPTION_NonNullByDefaultAnnotationName, String.valueOf(CharOperation.concatWith(this.nonNullByDefaultAnnotationName, '.')));
optionsMap.put(OPTION_ReportMissingNonNullByDefaultAnnotation, getSeverityString(MissingNonNullByDefaultAnnotation));
+ optionsMap.put(OPTION_ReportUnusedTypeParameter, getSeverityString(UnusedTypeParameter));
return optionsMap;
}
@@ -1569,6 +1576,7 @@ public class CompilerOptions {
if ((optionValue = optionsMap.get(OPTION_ReportUnclosedCloseable)) != null) updateSeverity(UnclosedCloseable, optionValue);
if ((optionValue = optionsMap.get(OPTION_ReportPotentiallyUnclosedCloseable)) != null) updateSeverity(PotentiallyUnclosedCloseable, optionValue);
if ((optionValue = optionsMap.get(OPTION_ReportExplicitlyClosedAutoCloseable)) != null) updateSeverity(ExplicitlyClosedAutoCloseable, optionValue);
+ if ((optionValue = optionsMap.get(OPTION_ReportUnusedTypeParameter)) != null) updateSeverity(UnusedTypeParameter, optionValue);
if (getSeverity(UnclosedCloseable) == ProblemSeverities.Ignore
&& getSeverity(PotentiallyUnclosedCloseable) == ProblemSeverities.Ignore
&& getSeverity(ExplicitlyClosedAutoCloseable) == ProblemSeverities.Ignore) {
@@ -1822,6 +1830,7 @@ public class CompilerOptions {
buf.append("\n\t- resource is not closed: ").append(getSeverityString(UnclosedCloseable)); //$NON-NLS-1$
buf.append("\n\t- resource may not be closed: ").append(getSeverityString(PotentiallyUnclosedCloseable)); //$NON-NLS-1$
buf.append("\n\t- resource should be handled by try-with-resources: ").append(getSeverityString(ExplicitlyClosedAutoCloseable)); //$NON-NLS-1$
+ buf.append("\n\t- Unused Type Parameter: ").append(getSeverityString(UnusedTypeParameter)); //$NON-NLS-1$
return buf.toString();
}
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/impl/IrritantSet.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/impl/IrritantSet.java
index 38f3cc0ef0..9d04d4d3bc 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/impl/IrritantSet.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/impl/IrritantSet.java
@@ -142,6 +142,7 @@ public class IrritantSet {
.set(CompilerOptions.RedundantSuperinterface)
.set(CompilerOptions.DeadCode)
.set(CompilerOptions.UnusedObjectAllocation)
+ .set(CompilerOptions.UnusedTypeParameter)
.set(CompilerOptions.RedundantSpecificationOfTypeArguments);
STATIC_METHOD
.set(CompilerOptions.MethodCanBePotentiallyStatic);
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/ProblemReporter.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/ProblemReporter.java
index 808f156574..61b111088b 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/ProblemReporter.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/ProblemReporter.java
@@ -492,6 +492,9 @@ public static int getIrritant(int problemID) {
case IProblem.MissingNonNullByDefaultAnnotationOnPackage:
case IProblem.MissingNonNullByDefaultAnnotationOnType:
return CompilerOptions.MissingNonNullByDefaultAnnotation;
+
+ case IProblem.UnusedTypeParameter:
+ return CompilerOptions.UnusedTypeParameter;
}
return 0;
}
@@ -570,6 +573,7 @@ public static int getProblemCategory(int severity, int problemID) {
case CompilerOptions.UnusedLabel :
case CompilerOptions.RedundantSuperinterface :
case CompilerOptions.RedundantSpecificationOfTypeArguments :
+ case CompilerOptions.UnusedTypeParameter:
return CategorizedProblem.CAT_UNNECESSARY_CODE;
case CompilerOptions.UsingDeprecatedAPI :
@@ -8019,6 +8023,17 @@ public void unusedPrivateType(TypeDeclaration typeDecl) {
typeDecl.sourceStart,
typeDecl.sourceEnd);
}
+public void unusedTypeParameter(TypeParameter typeParameter) {
+ int severity = computeSeverity(IProblem.UnusedTypeParameter);
+ if (severity == ProblemSeverities.Ignore) return;
+ String [] arguments = new String[] {new String(typeParameter.name)};
+ this.handle(
+ IProblem.UnusedTypeParameter,
+ arguments,
+ arguments,
+ typeParameter.sourceStart,
+ typeParameter.sourceEnd);
+}
public void unusedWarningToken(Expression token) {
String[] arguments = new String[] { token.constant.stringValue() };
this.handle(
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/messages.properties b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/messages.properties
index b179b8b2f6..d69a6dc991 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/messages.properties
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/messages.properties
@@ -605,6 +605,7 @@
651 = The explicit ''this'' parameter is expected to be qualified with {0}
### MORE GENERICS
660 = Unused type arguments for the non generic constructor {0}({1}) of type {2}; it should not be parameterized with arguments <{3}>
+661 = Unused type parameter {0}
### CORRUPTED BINARIES
700 = The class file {0} contains a signature ''{1}'' ill-formed at position {2}
diff --git a/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/DefaultCodeFormatter.java b/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/DefaultCodeFormatter.java
index f987d0f758..62afdf5f0c 100644
--- a/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/DefaultCodeFormatter.java
+++ b/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/DefaultCodeFormatter.java
@@ -341,6 +341,7 @@ public class DefaultCodeFormatter extends CodeFormatter {
optionsMap.put(CompilerOptions.OPTION_InlineJsr, CompilerOptions.DISABLED);
optionsMap.put(CompilerOptions.OPTION_ReportMethodCanBeStatic, CompilerOptions.IGNORE);
optionsMap.put(CompilerOptions.OPTION_ReportMethodCanBePotentiallyStatic, CompilerOptions.IGNORE);
+ optionsMap.put(CompilerOptions.OPTION_ReportUnusedTypeParameter, CompilerOptions.IGNORE);
this.defaultCompilerOptions = optionsMap;
}
Object sourceOption = this.options.get(CompilerOptions.OPTION_Source);
diff --git a/org.eclipse.jdt.core/model/org/eclipse/jdt/core/JavaCore.java b/org.eclipse.jdt.core/model/org/eclipse/jdt/core/JavaCore.java
index 813069944f..2125b64d2a 100644
--- a/org.eclipse.jdt.core/model/org/eclipse/jdt/core/JavaCore.java
+++ b/org.eclipse.jdt.core/model/org/eclipse/jdt/core/JavaCore.java
@@ -513,6 +513,21 @@ public final class JavaCore extends Plugin {
* @category CompilerOptionID
*/
public static final String COMPILER_PB_SYNTHETIC_ACCESS_EMULATION = PLUGIN_ID + ".compiler.problem.syntheticAccessEmulation"; //$NON-NLS-1$
+
+ /**
+ * Compiler option ID: Reporting Unused Type Parameter.
+ * <p>When enabled, the compiler will issue an error or a warning whenever it encounters an
+ * unused type parameter. </p>
+ * <dl>
+ * <dt>Option id:</dt><dd><code>"org.eclipse.jdt.core.compiler.problem.unusedTypeParameter"</code></dd>
+ * <dt>Possible values:</dt><dd><code>{ "error", "warning", "ignore" }</code></dd>
+ * <dt>Default:</dt><dd><code>"ignore"</code></dd>
+ * </dl>
+ * @since 3.9
+ * @category CompilerOptionID
+ */
+ public static final String COMPILER_PB_UNUSED_TYPE_PARAMETER = PLUGIN_ID + ".compiler.problem.unusedTypeParameter"; //$NON-NLS-1$
+
/**
* Compiler option ID: Reporting Non-Externalized String Literal.
* <p>When enabled, the compiler will issue an error or a warning for non externalized

Back to the top