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

pmd / pmd / 821

24 Sep 2026 09:12AM UTC coverage: 79.728% (+0.05%) from 79.676%
821

push

github

web-flow
[java] New rule: InternalApiUsage (#6994)


Co-authored-by: Andreas Dangel <andreas.dangel@pmd-code.org>

20235 of 26420 branches covered (76.59%)

Branch coverage included in aggregate %.

119 of 119 new or added lines in 2 files covered. (100.0%)

8 existing lines in 2 files now uncovered.

43541 of 53572 relevant lines covered (81.28%)

0.82 hits per line

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

91.53
/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/internal/JavaLanguageProcessor.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.internal;
6

7
import java.nio.file.Path;
8
import java.util.ArrayList;
9
import java.util.List;
10
import java.util.Objects;
11

12
import org.checkerframework.checker.nullness.qual.NonNull;
13
import org.slf4j.Logger;
14
import org.slf4j.LoggerFactory;
15

16
import net.sourceforge.pmd.lang.JvmLanguagePropertyBundle;
17
import net.sourceforge.pmd.lang.LanguageVersionHandler;
18
import net.sourceforge.pmd.lang.ast.Parser;
19
import net.sourceforge.pmd.lang.impl.BatchLanguageProcessor;
20
import net.sourceforge.pmd.lang.java.ast.JavaParser;
21
import net.sourceforge.pmd.lang.java.internal.JavaLanguageProperties.InferenceLoggingVerbosity;
22
import net.sourceforge.pmd.lang.java.rule.xpath.internal.BaseContextNodeTestFun;
23
import net.sourceforge.pmd.lang.java.rule.xpath.internal.GetCommentOnFunction;
24
import net.sourceforge.pmd.lang.java.rule.xpath.internal.GetModifiersFun;
25
import net.sourceforge.pmd.lang.java.rule.xpath.internal.MatchesSignatureFunction;
26
import net.sourceforge.pmd.lang.java.rule.xpath.internal.MetricFunction;
27
import net.sourceforge.pmd.lang.java.rule.xpath.internal.NodeIsFunction;
28
import net.sourceforge.pmd.lang.java.types.TypeSystem;
29
import net.sourceforge.pmd.lang.java.types.internal.infer.TypeInferenceLogger;
30
import net.sourceforge.pmd.lang.java.types.internal.infer.TypeInferenceLogger.SimpleLogger;
31
import net.sourceforge.pmd.lang.java.types.internal.infer.TypeInferenceLogger.VerboseLogger;
32
import net.sourceforge.pmd.lang.metrics.LanguageMetricsProvider;
33
import net.sourceforge.pmd.lang.rule.xpath.impl.XPathHandler;
34
import net.sourceforge.pmd.reporting.ViolationDecorator;
35
import net.sourceforge.pmd.reporting.ViolationSuppressor;
36
import net.sourceforge.pmd.util.AuxClasspathLoader;
37
import net.sourceforge.pmd.util.designerbindings.DesignerBindings;
38
import net.sourceforge.pmd.util.internal.AuxClasspathUtil;
39

40
/**
41
 * @author Clément Fournier
42
 */
43
public class JavaLanguageProcessor extends BatchLanguageProcessor<JavaLanguageProperties>
44
    implements LanguageVersionHandler {
45

46
    private static final Logger LOG = LoggerFactory.getLogger(JavaLanguageProcessor.class);
1✔
47

48
    private final LanguageMetricsProvider myMetricsProvider = new JavaMetricsProvider();
1✔
49
    private final JavaParser parser;
50
    private final JavaParser parserWithoutProcessing;
51
    private final boolean firstClassLombok;
52
    private TypeSystem typeSystem;
53
    private AuxClasspathLoader auxClasspathLoader;
54

55
    public JavaLanguageProcessor(JavaLanguageProperties properties) {
56
        super(properties);
1✔
57

58
        initTypeSystem(properties);
1✔
59

60
        String suppressMarker = properties.getSuppressMarker();
1✔
61
        this.parser = new JavaParser(suppressMarker, this, true);
1✔
62
        this.parserWithoutProcessing = new JavaParser(suppressMarker, this, false);
1✔
63
        this.firstClassLombok = properties.getProperty(JavaLanguageProperties.FIRST_CLASS_LOMBOK);
1✔
64
    }
1✔
65

66
    private void initTypeSystem(JavaLanguageProperties properties) {
67
        ClassLoader externallyConfiguredClassLoader = properties.getExternalClassLoader();
1✔
68
        if (externallyConfiguredClassLoader != null) {
1✔
69
            LOG.debug("Using externally configured classloader as analysis classloader: {}", externallyConfiguredClassLoader);
1✔
70
            this.typeSystem = TypeSystem.usingClassLoaderClasspath(externallyConfiguredClassLoader);
1✔
71
        } else {
72
            String rawAuxClasspath = properties.getProperty(JvmLanguagePropertyBundle.AUX_CLASSPATH);
1✔
73
            List<Path> auxClasspath = new ArrayList<>(AuxClasspathUtil.expandClasspath(rawAuxClasspath));
1✔
74

75
            if (!AuxClasspathUtil.containsPlatformClasspath(auxClasspath)) {
1✔
76
                Path platformClasspath = AuxClasspathUtil.getPlatformClasspath();
1✔
77
                LOG.warn("Adding current platform {} to auxClasspath, which could be the wrong java version. "
1✔
78
                        + "Please add the correct jrt-fs.jar explicitly to the auxClasspath.", platformClasspath);
79
                auxClasspath.add(platformClasspath);
1✔
80
            }
81
            String expandedAuxClasspath = AuxClasspathUtil.toRawClasspath(auxClasspath);
1✔
82
            LOG.debug("Using auxClasspath as analysis classloader: {}", expandedAuxClasspath);
1✔
83
            this.auxClasspathLoader = AuxClasspathLoader.create(expandedAuxClasspath);
1✔
84
            this.typeSystem = TypeSystem.usingClasspath(name -> auxClasspathLoader.findResource(name));
1✔
85
        }
86
    }
1✔
87

88
    @Override
89
    public @NonNull LanguageVersionHandler services() {
90
        return this;
1✔
91
    }
92

93
    @Override
94
    public Parser getParser() {
95
        return parser;
1✔
96
    }
97

98
    public JavaParser getParserWithoutProcessing() {
99
        return parserWithoutProcessing;
1✔
100
    }
101

102
    public TypeSystem getTypeSystem() {
103
        return typeSystem;
1✔
104
    }
105

106
    public boolean hasFirstClassLombokSupport() {
107
        return firstClassLombok;
1✔
108
    }
109

110
    TypeInferenceLogger newTypeInfLogger() {
111
        InferenceLoggingVerbosity verbosity = getProperties().getProperty(JavaLanguageProperties.INTERNAL_INFERENCE_LOGGING_VERBOSITY);
1✔
112
        if (verbosity == InferenceLoggingVerbosity.VERBOSE) {
1!
UNCOV
113
            return new VerboseLogger(System.err);
×
114
        } else if (verbosity == InferenceLoggingVerbosity.SIMPLE) {
1!
115
            return new SimpleLogger(System.err);
×
116
        } else {
117
            return TypeInferenceLogger.noop();
1✔
118
        }
119
    }
120

121
    @Override
122
    public DesignerBindings getDesignerBindings() {
UNCOV
123
        return JavaDesignerBindings.INSTANCE;
×
124
    }
125

126
    @Override
127
    public XPathHandler getXPathHandler() {
128
        return XPATH_HANDLER;
1✔
129
    }
130

131
    @Override
132
    public List<ViolationSuppressor> getExtraViolationSuppressors() {
133
        return JavaAnnotationSuppressor.ALL_JAVA_SUPPRESSORS;
1✔
134
    }
135

136
    @Override
137
    public ViolationDecorator getViolationDecorator() {
138
        return JavaViolationDecorator.INSTANCE;
1✔
139
    }
140

141
    @Override
142
    public LanguageMetricsProvider getLanguageMetricsProvider() {
143
        return myMetricsProvider;
1✔
144
    }
145

146
    private static final XPathHandler XPATH_HANDLER =
1✔
147
        XPathHandler.getHandlerForFunctionDefs(
1✔
148
            BaseContextNodeTestFun.TYPE_IS_EXACTLY,
149
            BaseContextNodeTestFun.TYPE_IS,
150
            BaseContextNodeTestFun.HAS_ANNOTATION,
151
            MatchesSignatureFunction.INSTANCE,
152
            NodeIsFunction.INSTANCE,
153
            GetModifiersFun.GET_EFFECTIVE,
154
            GetModifiersFun.GET_EXPLICIT,
155
            MetricFunction.INSTANCE,
156
            GetCommentOnFunction.INSTANCE
157
        );
158

159
    public void setTypeSystem(TypeSystem ts) {
160
        this.typeSystem = Objects.requireNonNull(ts);
1✔
161
    }
1✔
162

163
    @Override
164
    public void close() throws Exception {
165
        this.typeSystem.logStats();
1✔
166
        if (this.auxClasspathLoader != null) {
1✔
167
            this.auxClasspathLoader.close();
1✔
168
        }
169
        super.close();
1✔
170
    }
1✔
171
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE TRIAL · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc