Skip to content

Commit b9765d2

Browse files
SONARJAVA-5763 Cleanup SymbolMetadata API
1 parent 8e5ee9e commit b9765d2

File tree

6 files changed

+23
-111
lines changed

6 files changed

+23
-111
lines changed

java-checks-test-sources/default/src/main/java/annotations/nullability/no_default/NullabilityOfParametrizedTypes_Old.java

Lines changed: 0 additions & 33 deletions
This file was deleted.

java-frontend/src/main/java/org/sonar/java/model/JSymbolMetadata.java

Lines changed: 8 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,6 @@ final class JSymbolMetadata implements SymbolMetadata {
6262
private List<AnnotationInstance> symbolAnnotations;
6363

6464
private final Map<NullabilityTarget, NullabilityData> nullabilityCache = new EnumMap<>(NullabilityTarget.class);
65-
private final Map<NullabilityTarget, NullabilityData> oldNullabilityCache = new EnumMap<>(NullabilityTarget.class);
6665

6766
JSymbolMetadata(JSema sema, Symbol symbol, IAnnotationBinding[] annotationBindings) {
6867
this.sema = Objects.requireNonNull(sema);
@@ -156,7 +155,7 @@ public final boolean isAnnotatedWith(String fullyQualifiedName) {
156155

157156
@Nullable
158157
@Override
159-
public final List<AnnotationValue> valuesForAnnotation(String fullyQualifiedNameOfAnnotation) {
158+
public List<AnnotationValue> valuesForAnnotation(String fullyQualifiedNameOfAnnotation) {
160159
for (AnnotationInstance a : annotations()) {
161160
if (a.symbol().type().is(fullyQualifiedNameOfAnnotation)) {
162161
// TODO what about repeating annotations?
@@ -175,23 +174,9 @@ public NullabilityData nullabilityData() {
175174
return nullabilityData(target);
176175
}
177176

178-
@Override
179-
public NullabilityData oldNullabilityData() {
180-
NullabilityTarget target = getTarget(symbol);
181-
if (target == null) {
182-
return unknownNullabilityAt(NullabilityLevel.UNKNOWN);
183-
}
184-
return oldNullabilityData(target);
185-
}
186-
187177
@Override
188178
public NullabilityData nullabilityData(NullabilityTarget target) {
189-
return nullabilityCache.computeIfAbsent(target, t -> resolveNullability(t, false));
190-
}
191-
192-
@Override
193-
public NullabilityData oldNullabilityData(NullabilityTarget target) {
194-
return oldNullabilityCache.computeIfAbsent(target, t -> resolveNullability(t, true));
179+
return nullabilityCache.computeIfAbsent(target, this::resolveNullability);
195180
}
196181

197182
@Nullable
@@ -220,16 +205,16 @@ private static AnnotationTree findAnnotationTree(List<AnnotationTree> annotation
220205
return null;
221206
}
222207

223-
private NullabilityData resolveNullability(NullabilityTarget target, boolean useOldMethod) {
208+
private NullabilityData resolveNullability(NullabilityTarget target) {
224209
NullabilityLevel currentLevel = getLevel(symbol);
225-
NullabilityData nullabilityDataAtLevel = getNullabilityDataAtLevel(this, target, currentLevel, useOldMethod);
210+
NullabilityData nullabilityDataAtLevel = getNullabilityDataAtLevel(this, target, currentLevel);
226211
if (nullabilityDataAtLevel.type() != NullabilityType.NO_ANNOTATION) {
227212
return nullabilityDataAtLevel;
228213
}
229214

230215
// Check nullability from the inheritance hierarchy
231216
if (symbol.isMethodSymbol()) {
232-
NullabilityData nullabilityDataFromInheritance = getNullabilityDataFromInheritance((Symbol.MethodSymbol) symbol, target, useOldMethod);
217+
NullabilityData nullabilityDataFromInheritance = getNullabilityDataFromInheritance((Symbol.MethodSymbol) symbol, target);
233218
if (nullabilityDataFromInheritance.type() != NullabilityType.NO_ANNOTATION) {
234219
return nullabilityDataFromInheritance;
235220
}
@@ -242,15 +227,15 @@ private NullabilityData resolveNullability(NullabilityTarget target, boolean use
242227
Symbol owner = getEffectiveOwner(symbol, currentLevel);
243228
if (owner == null) return unknownNullabilityAt(currentLevel);
244229
var metadata = owner.metadata();
245-
return useOldMethod ? metadata.oldNullabilityData(target) : metadata.nullabilityData(target);
230+
return metadata.nullabilityData(target);
246231
}
247232

248-
private static NullabilityData getNullabilityDataFromInheritance(Symbol.MethodSymbol methodSymbol, NullabilityTarget target, boolean useOldMethod) {
233+
private static NullabilityData getNullabilityDataFromInheritance(Symbol.MethodSymbol methodSymbol, NullabilityTarget target) {
249234
List<Symbol.MethodSymbol> overriddenSymbols = methodSymbol.overriddenSymbols();
250235
NullabilityLevel level = NullabilityLevel.METHOD;
251236
for (Symbol.MethodSymbol overriddenSymbol : overriddenSymbols) {
252237
SymbolMetadata metadata = overriddenSymbol.metadata();
253-
NullabilityData nullabilityData = getNullabilityDataAtLevel(metadata, target, level, useOldMethod);
238+
NullabilityData nullabilityData = getNullabilityDataAtLevel(metadata, target, level);
254239
if (nullabilityData.type() != NullabilityType.NO_ANNOTATION && !nullabilityData.equals(unknownNullabilityAt(level))) {
255240
return nullabilityData;
256241
}

java-frontend/src/main/java/org/sonar/java/model/JSymbolMetadataNullabilityHelper.java

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -280,29 +280,28 @@ private static void configureAnnotation(Function<AnnotationInstance, Nullability
280280
/**
281281
* Return the Nullability data given the metadata of the current symbol, a level and a target.
282282
*/
283-
public static NullabilityData getNullabilityDataAtLevel(SymbolMetadata metadata, NullabilityTarget target, NullabilityLevel level, boolean useOldMethod) {
283+
public static NullabilityData getNullabilityDataAtLevel(SymbolMetadata metadata, NullabilityTarget target, NullabilityLevel level) {
284284
TypesForAnnotations typeForAnnotations = configuration.get(new ConfigurationKey(target, level));
285285
if (typeForAnnotations != null) {
286-
return getNullabilityDataAtLevel(new HashSet<>(), metadata, level, false, typeForAnnotations, useOldMethod);
286+
return getNullabilityDataAtLevel(new HashSet<>(), metadata, level, false, typeForAnnotations);
287287
}
288288
return noNullabilityAnnotationAt(level);
289289
}
290290

291291
private static NullabilityData getNullabilityDataAtLevel(Set<Type> knownTypes, SymbolMetadata metadata,
292-
NullabilityLevel level, boolean isMetaAnnotated, TypesForAnnotations typeForAnnotations, boolean useOldMethod) {
292+
NullabilityLevel level, boolean isMetaAnnotated, TypesForAnnotations typeForAnnotations) {
293293
// Check if the symbol is directly annotated
294-
NullabilityData directlyAnnotated = getNullabilityData(metadata, level, isMetaAnnotated, typeForAnnotations, useOldMethod);
294+
NullabilityData directlyAnnotated = getNullabilityData(metadata, level, isMetaAnnotated, typeForAnnotations);
295295
if (directlyAnnotated.type() != NO_ANNOTATION) {
296296
return directlyAnnotated;
297297
}
298-
for (AnnotationInstance annotationInstance : metadata.annotations()) {
298+
for (AnnotationInstance annotationInstance : metadata.symbolAnnotations()) {
299299
Symbol annotationSymbol = annotationInstance.symbol();
300300
Type annotationType = annotationSymbol.type();
301301
if (knownTypes.add(annotationType) && !KNOWN_ANNOTATIONS.contains(annotationType(annotationInstance).fullyQualifiedName())) {
302302
// Only do recursion when we face unknown annotations, as we already know the nullability impact and might contain contradicting
303303
// annotations.
304-
NullabilityData nullabilityData = getNullabilityDataAtLevel(knownTypes, annotationSymbol.metadata(), level,
305-
true, typeForAnnotations, useOldMethod);
304+
NullabilityData nullabilityData = getNullabilityDataAtLevel(knownTypes, annotationSymbol.metadata(), level, true, typeForAnnotations);
306305
if (nullabilityData.type() != NO_ANNOTATION) {
307306
return nullabilityData;
308307
}
@@ -314,12 +313,11 @@ private static NullabilityData getNullabilityDataAtLevel(Set<Type> knownTypes, S
314313
private static NullabilityData getNullabilityData(SymbolMetadata metadata,
315314
NullabilityLevel level,
316315
boolean isMetaAnnotated,
317-
TypesForAnnotations typeForAnnotations,
318-
boolean useOldMethod) {
316+
TypesForAnnotations typeForAnnotations) {
319317

320318
NullabilityType nullabilityType = NullabilityType.NO_ANNOTATION;
321319
AnnotationInstance annotationInstance = null;
322-
for (AnnotationInstance annotation : getAnnotations(metadata, useOldMethod)) {
320+
for (AnnotationInstance annotation : metadata.symbolAnnotations()) {
323321
NullabilityType typeFromAnnotation = typeForAnnotations.getTypeFromAnnotation(annotation);
324322
if (typeFromAnnotation.ordinal() > nullabilityType.ordinal()) {
325323
nullabilityType = typeFromAnnotation;
@@ -335,10 +333,6 @@ private static NullabilityData getNullabilityData(SymbolMetadata metadata,
335333
annotationInstance, metadata.findAnnotationTree(annotationInstance), isMetaAnnotated);
336334
}
337335

338-
private static List<AnnotationInstance> getAnnotations(SymbolMetadata metadata, boolean useOldMethod) {
339-
return useOldMethod ? metadata.annotations() : metadata.symbolAnnotations();
340-
}
341-
342336
private static NullabilityType getIfStrongNullable(AnnotationInstance annotation) {
343337
if (isStrongNullableAnnotation(annotationType(annotation))) {
344338
return STRONG_NULLABLE;

java-frontend/src/main/java/org/sonar/java/model/Symbols.java

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -69,21 +69,11 @@ public NullabilityData nullabilityData() {
6969
return JSymbolMetadata.unknownNullabilityAt(NullabilityLevel.UNKNOWN);
7070
}
7171

72-
@Override
73-
public NullabilityData oldNullabilityData() {
74-
return JSymbolMetadata.unknownNullabilityAt(NullabilityLevel.UNKNOWN);
75-
}
76-
7772
@Override
7873
public NullabilityData nullabilityData(NullabilityTarget level) {
7974
return JSymbolMetadata.unknownNullabilityAt(NullabilityLevel.UNKNOWN);
8075
}
8176

82-
@Override
83-
public NullabilityData oldNullabilityData(NullabilityTarget level) {
84-
return JSymbolMetadata.unknownNullabilityAt(NullabilityLevel.UNKNOWN);
85-
}
86-
8777
@Nullable
8878
@Override
8979
public AnnotationTree findAnnotationTree(AnnotationInstance annotationInstance) {

java-frontend/src/main/java/org/sonar/plugins/java/api/semantic/SymbolMetadata.java

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -66,28 +66,16 @@ public interface SymbolMetadata {
6666
*/
6767
NullabilityData nullabilityData();
6868

69-
/**
70-
* @deprecated use {@link #nullabilityData())} instead,
71-
* this method uses the annotation of type parameter to compute nullability which is not correct
72-
*/
73-
@Deprecated(since = "8.19.0")
74-
NullabilityData oldNullabilityData();
75-
7669
NullabilityData nullabilityData(NullabilityTarget level);
7770

78-
/**
79-
* @deprecated use {@link #nullabilityData(NullabilityTarget)} instead,
80-
* this method uses the annotation of type parameter to compute nullability which is not correct
81-
*/
82-
@Deprecated(since = "8.19.0")
83-
NullabilityData oldNullabilityData(NullabilityTarget level);
84-
8571
@Nullable
8672
AnnotationTree findAnnotationTree(AnnotationInstance annotationInstance);
8773

8874
/**
89-
*
90-
* @return
75+
* @return the metadata of the parameterized types of the current metadata
76+
* <p>
77+
* If the current metadata is attached to {@code @NonNull List<@Nullable String>},
78+
* it will return an array containing one metadata describing {@code @Nullable String}.
9179
*/
9280
SymbolMetadata[] parameterMetadata();
9381

java-frontend/src/test/java/org/sonar/java/model/JSymbolMetadataTest.java

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -192,14 +192,6 @@ void parametrized_type_level_nullability() throws IOException {
192192
);
193193
}
194194

195-
@Test
196-
void parametrized_type_level_nullability_old() throws IOException {
197-
assertNullability(
198-
NULLABILITY_SOURCE_DIR.resolve(Paths.get("no_default", "NullabilityOfParametrizedTypes_Old.java")),
199-
true
200-
);
201-
}
202-
203195
@Test
204196
void unsupported_nullability() throws IOException {
205197
assertNullability(
@@ -360,10 +352,6 @@ void nullability_unknown_type() {
360352
}
361353

362354
void assertNullability(Path sourceFile) throws IOException {
363-
assertNullability(sourceFile, false);
364-
}
365-
366-
void assertNullability(Path sourceFile, boolean useOldMethod) throws IOException {
367355
CompilationUnitTree cut = JParserTestUtils.parse(sourceFile.toRealPath().toFile(), JParserTestUtils.checksTestClassPath());
368356
List<Symbol> idSymbols = collectIdentifiers(cut).stream()
369357
.filter(identifier -> identifier.name().startsWith("id"))
@@ -382,16 +370,16 @@ void assertNullability(Path sourceFile, boolean useOldMethod) throws IOException
382370
String expectedLine = matcher.group("line");
383371
boolean metaAnnotation = matcher.group("meta") != null;
384372

385-
assertNullability(symbol, expectedType, expectedLevel, expectedLine, metaAnnotation, useOldMethod, "\nFile: " + sourceFile.toRealPath() + "\n");
373+
assertNullability(symbol, expectedType, expectedLevel, expectedLine, metaAnnotation, "\nFile: " + sourceFile.toRealPath() + "\n");
386374
}
387375
}
388376

389377
private static void assertNullability(Symbol symbol, NullabilityType expectedType,
390378
@Nullable NullabilityLevel expectedLevel, @Nullable String expectedLine,
391-
boolean metaAnnotation, boolean useOldMethod, String context) {
379+
boolean metaAnnotation, String context) {
392380

393381
String symbolContext = "for symbol: " + symbol.name() + " in " + context;
394-
SymbolMetadata.NullabilityData nullabilityData = (useOldMethod ? symbol.metadata().oldNullabilityData() : symbol.metadata().nullabilityData());
382+
SymbolMetadata.NullabilityData nullabilityData = symbol.metadata().nullabilityData();
395383
assertThat(nullabilityData.type()).describedAs(symbolContext).isEqualTo(expectedType);
396384
if (expectedLevel != null) {
397385
assertThat(nullabilityData.level()).describedAs(symbolContext).isEqualTo(expectedLevel);

0 commit comments

Comments
 (0)