Skip to content

Commit 8b4d382

Browse files
Test uniqueness of problem IDs (eclipse-jdt#1754)
- exclude deprecated constants (from pre Java 5 time / 2004) - mark deprecation using annotation (was not possible in 2004) Fixes https://bugs.eclipse.org/bugs/show_bug.cgi?id=509643.
1 parent e101538 commit 8b4d382

File tree

2 files changed

+65
-0
lines changed

2 files changed

+65
-0
lines changed

org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/core/compiler/IProblem.java

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -835,25 +835,35 @@ public interface IProblem {
835835
int IllegalModifierCombinationForType = TypeRelated + 334;
836836

837837
/** @deprecated - problem is no longer generated, use {@link #UndefinedType} instead */
838+
@Deprecated
838839
int SuperclassNotFound = TypeRelated + 329 + ProblemReasons.NotFound; // TypeRelated + 330
839840
/** @deprecated - problem is no longer generated, use {@link #NotVisibleType} instead */
841+
@Deprecated
840842
int SuperclassNotVisible = TypeRelated + 329 + ProblemReasons.NotVisible; // TypeRelated + 331
841843
/** @deprecated - problem is no longer generated, use {@link #AmbiguousType} instead */
844+
@Deprecated
842845
int SuperclassAmbiguous = TypeRelated + 329 + ProblemReasons.Ambiguous; // TypeRelated + 332
843846
/** @deprecated - problem is no longer generated, use {@link #InternalTypeNameProvided} instead */
847+
@Deprecated
844848
int SuperclassInternalNameProvided = TypeRelated + 329 + ProblemReasons.InternalNameProvided; // TypeRelated + 333
845849
/** @deprecated - problem is no longer generated, use {@link #InheritedTypeHidesEnclosingName} instead */
850+
@Deprecated
846851
int SuperclassInheritedNameHidesEnclosingName = TypeRelated + 329 + ProblemReasons.InheritedNameHidesEnclosingName; // TypeRelated + 334
847852

848853
/** @deprecated - problem is no longer generated, use {@link #UndefinedType} instead */
854+
@Deprecated
849855
int InterfaceNotFound = TypeRelated + 334 + ProblemReasons.NotFound; // TypeRelated + 335
850856
/** @deprecated - problem is no longer generated, use {@link #NotVisibleType} instead */
857+
@Deprecated
851858
int InterfaceNotVisible = TypeRelated + 334 + ProblemReasons.NotVisible; // TypeRelated + 336
852859
/** @deprecated - problem is no longer generated, use {@link #AmbiguousType} instead */
860+
@Deprecated
853861
int InterfaceAmbiguous = TypeRelated + 334 + ProblemReasons.Ambiguous; // TypeRelated + 337
854862
/** @deprecated - problem is no longer generated, use {@link #InternalTypeNameProvided} instead */
863+
@Deprecated
855864
int InterfaceInternalNameProvided = TypeRelated + 334 + ProblemReasons.InternalNameProvided; // TypeRelated + 338
856865
/** @deprecated - problem is no longer generated, use {@link #InheritedTypeHidesEnclosingName} instead */
866+
@Deprecated
857867
int InterfaceInheritedNameHidesEnclosingName = TypeRelated + 334 + ProblemReasons.InheritedNameHidesEnclosingName; // TypeRelated + 339
858868

859869
// field related problems
@@ -890,45 +900,62 @@ public interface IProblem {
890900
int AbstractMethodInAbstractClass = MethodRelated + 363;
891901
int ArgumentTypeCannotBeVoid = MethodRelated + 364;
892902
/** @deprecated - problem is no longer generated, use {@link #CannotAllocateVoidArray} instead */
903+
@Deprecated
893904
int ArgumentTypeCannotBeVoidArray = MethodRelated + 365;
894905
/** @deprecated - problem is no longer generated, use {@link #CannotAllocateVoidArray} instead */
906+
@Deprecated
895907
int ReturnTypeCannotBeVoidArray = MethodRelated + 366;
896908
int NativeMethodsCannotBeStrictfp = MethodRelated + 367;
897909
int DuplicateModifierForArgument = MethodRelated + 368;
898910
/** @since 3.5 */
899911
int IllegalModifierForConstructor = MethodRelated + 369;
900912

901913
/** @deprecated - problem is no longer generated, use {@link #UndefinedType} instead */
914+
@Deprecated
902915
int ArgumentTypeNotFound = MethodRelated + 369 + ProblemReasons.NotFound; // MethodRelated + 370
903916
/** @deprecated - problem is no longer generated, use {@link #NotVisibleType} instead */
917+
@Deprecated
904918
int ArgumentTypeNotVisible = MethodRelated + 369 + ProblemReasons.NotVisible; // MethodRelated + 371
905919
/** @deprecated - problem is no longer generated, use {@link #AmbiguousType} instead */
920+
@Deprecated
906921
int ArgumentTypeAmbiguous = MethodRelated + 369 + ProblemReasons.Ambiguous; // MethodRelated + 372
907922
/** @deprecated - problem is no longer generated, use {@link #InternalTypeNameProvided} instead */
923+
@Deprecated
908924
int ArgumentTypeInternalNameProvided = MethodRelated + 369 + ProblemReasons.InternalNameProvided; // MethodRelated + 373
909925
/** @deprecated - problem is no longer generated, use {@link #InheritedTypeHidesEnclosingName} instead */
926+
@Deprecated
910927
int ArgumentTypeInheritedNameHidesEnclosingName = MethodRelated + 369 + ProblemReasons.InheritedNameHidesEnclosingName; // MethodRelated + 374
911928

912929
/** @deprecated - problem is no longer generated, use {@link #UndefinedType} instead */
930+
@Deprecated
913931
int ExceptionTypeNotFound = MethodRelated + 374 + ProblemReasons.NotFound; // MethodRelated + 375
914932
/** @deprecated - problem is no longer generated, use {@link #NotVisibleType} instead */
933+
@Deprecated
915934
int ExceptionTypeNotVisible = MethodRelated + 374 + ProblemReasons.NotVisible; // MethodRelated + 376
916935
/** @deprecated - problem is no longer generated, use {@link #AmbiguousType} instead */
936+
@Deprecated
917937
int ExceptionTypeAmbiguous = MethodRelated + 374 + ProblemReasons.Ambiguous; // MethodRelated + 377
918938
/** @deprecated - problem is no longer generated, use {@link #InternalTypeNameProvided} instead */
939+
@Deprecated
919940
int ExceptionTypeInternalNameProvided = MethodRelated + 374 + ProblemReasons.InternalNameProvided; // MethodRelated + 378
920941
/** @deprecated - problem is no longer generated, use {@link #InheritedTypeHidesEnclosingName} instead */
942+
@Deprecated
921943
int ExceptionTypeInheritedNameHidesEnclosingName = MethodRelated + 374 + ProblemReasons.InheritedNameHidesEnclosingName; // MethodRelated + 379
922944

923945
/** @deprecated - problem is no longer generated, use {@link #UndefinedType} instead */
946+
@Deprecated
924947
int ReturnTypeNotFound = MethodRelated + 379 + ProblemReasons.NotFound; // MethodRelated + 380
925948
/** @deprecated - problem is no longer generated, use {@link #NotVisibleType} instead */
949+
@Deprecated
926950
int ReturnTypeNotVisible = MethodRelated + 379 + ProblemReasons.NotVisible; // MethodRelated + 381
927951
/** @deprecated - problem is no longer generated, use {@link #AmbiguousType} instead */
952+
@Deprecated
928953
int ReturnTypeAmbiguous = MethodRelated + 379 + ProblemReasons.Ambiguous; // MethodRelated + 382
929954
/** @deprecated - problem is no longer generated, use {@link #InternalTypeNameProvided} instead */
955+
@Deprecated
930956
int ReturnTypeInternalNameProvided = MethodRelated + 379 + ProblemReasons.InternalNameProvided; // MethodRelated + 383
931957
/** @deprecated - problem is no longer generated, use {@link #InheritedTypeHidesEnclosingName} instead */
958+
@Deprecated
932959
int ReturnTypeInheritedNameHidesEnclosingName = MethodRelated + 379 + ProblemReasons.InheritedNameHidesEnclosingName; // MethodRelated + 384
933960

934961
// import related problems
@@ -939,12 +966,16 @@ public interface IProblem {
939966

940967
int ImportNotFound = ImportRelated + 389 + ProblemReasons.NotFound; // ImportRelated + 390
941968
/** @deprecated - problem is no longer generated, use {@link #NotVisibleType} instead */
969+
@Deprecated
942970
int ImportNotVisible = ImportRelated + 389 + ProblemReasons.NotVisible; // ImportRelated + 391
943971
/** @deprecated - problem is no longer generated, use {@link #AmbiguousType} instead */
972+
@Deprecated
944973
int ImportAmbiguous = ImportRelated + 389 + ProblemReasons.Ambiguous; // ImportRelated + 392
945974
/** @deprecated - problem is no longer generated, use {@link #InternalTypeNameProvided} instead */
975+
@Deprecated
946976
int ImportInternalNameProvided = ImportRelated + 389 + ProblemReasons.InternalNameProvided; // ImportRelated + 393
947977
/** @deprecated - problem is no longer generated, use {@link #InheritedTypeHidesEnclosingName} instead */
978+
@Deprecated
948979
int ImportInheritedNameHidesEnclosingName = ImportRelated + 389 + ProblemReasons.InheritedNameHidesEnclosingName; // ImportRelated + 394
949980

950981
/** @since 3.1 */
@@ -954,10 +985,13 @@ public interface IProblem {
954985
int DuplicateModifierForVariable = MethodRelated + 395;
955986
int IllegalModifierForVariable = MethodRelated + 396;
956987
/** @deprecated - problem is no longer generated, use {@link #RedundantNullCheckOnNonNullLocalVariable} instead */
988+
@Deprecated
957989
int LocalVariableCannotBeNull = Internal + 397; // since 3.3: semantics are LocalVariableRedundantCheckOnNonNull
958990
/** @deprecated - problem is no longer generated, use {@link #NullLocalVariableReference}, {@link #RedundantNullCheckOnNullLocalVariable} or {@link #RedundantLocalVariableNullAssignment} instead */
991+
@Deprecated
959992
int LocalVariableCanOnlyBeNull = Internal + 398; // since 3.3: split with LocalVariableRedundantCheckOnNull depending on context
960993
/** @deprecated - problem is no longer generated, use {@link #PotentialNullLocalVariableReference} instead */
994+
@Deprecated
961995
int LocalVariableMayBeNull = Internal + 399;
962996

963997
// method verifier problems
@@ -1755,6 +1789,7 @@ public interface IProblem {
17551789
int DuplicateBoundInIntersectionCast = TypeRelated + 894;
17561790
/** @deprecated This problem is no longer reported; number Of functional interface is not an issue, number of abstract methods is.
17571791
* @since 3.10 */
1792+
@Deprecated
17581793
int MultipleFunctionalInterfaces = TypeRelated + 895;
17591794
/** @since 3.10 */
17601795
int StaticInterfaceMethodNotBelow18 = Internal + Syntax + 896;

org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/CompilerInvocationTests.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,11 +50,15 @@
5050
*******************************************************************************/
5151
package org.eclipse.jdt.core.tests.compiler.regression;
5252

53+
import java.lang.annotation.Annotation;
5354
import java.lang.reflect.Field;
55+
import java.util.ArrayList;
5456
import java.util.Arrays;
5557
import java.util.Comparator;
5658
import java.util.HashMap;
59+
import java.util.List;
5760
import java.util.Map;
61+
import java.util.stream.Collectors;
5862

5963
import junit.framework.Test;
6064

@@ -2552,4 +2556,30 @@ public int compare(Object o1, Object o2) {
25522556
fail("could not access members");
25532557
}
25542558
}
2559+
public void testuniqueIDs() throws IllegalArgumentException, IllegalAccessException {
2560+
Field[] fields = IProblem.class.getFields();
2561+
Map<Integer,List<String>> id2names = new HashMap<>();
2562+
for (int i = 0, length = fields.length; i < length; i++) {
2563+
Field field = fields[i];
2564+
if (field.getType() == Integer.TYPE && !isDeprecated(field)) {
2565+
int problemId = field.getInt(null);
2566+
List<String> names = id2names.computeIfAbsent(problemId, k -> new ArrayList<>());
2567+
names.add(field.getName());
2568+
}
2569+
}
2570+
String duplicates = id2names.entrySet().stream()
2571+
.filter(e -> e.getValue().size() > 1)
2572+
.map(e -> e.getKey().toString()+": "+e.getValue().toString())
2573+
.collect(Collectors.joining(", "));
2574+
if (!duplicates.isEmpty())
2575+
fail("The following problem IDs are used more than once: "+duplicates);
2576+
}
2577+
2578+
private boolean isDeprecated(Field field) {
2579+
for (Annotation annotation : field.getAnnotations()) {
2580+
if (annotation.annotationType() == Deprecated.class)
2581+
return true;
2582+
}
2583+
return false;
2584+
}
25552585
}

0 commit comments

Comments
 (0)