• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

pmd / pmd / #3722

pending completion
#3722

push

github actions

adangel
Suppress MissingOverride for Chars::isEmpty (#4291)

67270 of 127658 relevant lines covered (52.7%)

0.53 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

47.83
/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/symbols/AnnotWrapper.java
1
/*
2
 * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
3
 */
4

5
package net.sourceforge.pmd.lang.java.symbols;
6

7
import java.lang.annotation.Annotation;
8
import java.util.Arrays;
9
import java.util.Objects;
10

11
import org.checkerframework.checker.nullness.qual.NonNull;
12
import org.checkerframework.checker.nullness.qual.Nullable;
13

14
import net.sourceforge.pmd.lang.java.symbols.SymbolicValue.SymAnnot;
15
import net.sourceforge.pmd.lang.java.symbols.internal.SymbolEquality;
16
import net.sourceforge.pmd.lang.java.symbols.internal.SymbolToStrings;
17
import net.sourceforge.pmd.lang.java.types.TypeSystem;
18

19
/**
20
 * Wraps an instance of a JVM {@link Annotation} and provide the same API as {@link SymAnnot}.
21
 */
22
final class AnnotWrapper implements SymAnnot {
23

24
    private final Annotation annotation;
25
    private final Class<? extends Annotation> annotationClass;
26
    private final JClassSymbol annotationClassSymbol;
27

28

29
    private AnnotWrapper(JClassSymbol annotationClassSymbol, @NonNull Annotation annotation) {
1✔
30
        this.annotationClassSymbol = annotationClassSymbol;
1✔
31
        this.annotation = annotation;
1✔
32
        this.annotationClass = annotation.annotationType();
1✔
33
    }
1✔
34

35
    static SymAnnot wrap(TypeSystem ts, @NonNull Annotation annotation) {
36
        JClassSymbol sym = ts.getClassSymbol(annotation.annotationType());
1✔
37
        if (sym == null) {
1✔
38
            return null;
×
39
        }
40
        return new AnnotWrapper(sym, annotation);
1✔
41
    }
42

43
    @Override
44
    public @NonNull JClassSymbol getAnnotationSymbol() {
45
        return annotationClassSymbol;
1✔
46
    }
47

48
    @Override
49
    public @Nullable SymbolicValue getAttribute(String attrName) {
50
        return Arrays.stream(annotationClass.getDeclaredMethods())
×
51
                     .filter(it -> it.getName().equals(attrName) && it.getParameterCount() == 0)
×
52
                     .map(it -> {
×
53
                         try {
54
                             Object result = it.invoke(annotation);
×
55
                             return SymbolicValue.of(annotationClassSymbol.getTypeSystem(), result);
×
56
                         } catch (Exception ignored) {
×
57
                             return null;
×
58
                         }
59
                     })
60
                     .filter(Objects::nonNull)
×
61
                     .findAny().orElse(null);
×
62
    }
63

64
    @Override
65
    public boolean valueEquals(Object o) {
66
        return annotation.equals(o);
×
67
    }
68

69
    @Override
70
    public boolean equals(Object o) {
71
        return SymbolEquality.ANNOTATION.equals(this, o);
1✔
72
    }
73

74
    @Override
75
    public int hashCode() {
76
        return SymbolEquality.ANNOTATION.hash(this);
1✔
77
    }
78

79
    @Override
80
    public String toString() {
81
        return SymbolToStrings.FAKE.toString(this);
×
82
    }
83
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc