Merge branch 'pmd/7.0.x' into pmd7-896-slf4j

This commit is contained in:
Andreas Dangel
2022-02-18 14:22:10 +01:00
6 changed files with 59 additions and 14 deletions

View File

@ -29,12 +29,21 @@ This is a {{ site.pmd.release_type }} release.
#### Deprecated API
Some API deprecations were performed in core PMD classes, to improve compatibility with PMD 7.
- {% jdoc core::Report %}: construction methods like addViolation or createReport
- {% jdoc core::Report %}: the constructor and other construction methods like addViolation or createReport
- {% jdoc core::RuleContext %}: all constructors, getters and setters. A new set
of stable methods, matching those in PMD 7, was added to replace the `addViolation`
overloads of {% jdoc core::lang.rule.AbstractRule %}. In PMD 7, `RuleContext` will
be the API to report violations, and it can already be used as such in PMD 6.
- The field {% jdoc core::PMD#configuration %} is unused and will be removed.
#### Internal API
Those APIs are not intended to be used by clients, and will be hidden or removed with PMD 7.0.0.
You can identify them with the `@InternalApi` annotation. You'll also get a deprecation warning.
- {% jdoc core::RuleSet %}: methods that serve to apply rules, including `apply`, `start`, `end`, `removeDysfunctionalRules`
- {% jdoc !!core::renderers.AbstractAccumulatingRenderer#renderFileReport(Report) %} is internal API
and should not be overridden in own renderers.
#### Changed API

View File

@ -60,6 +60,17 @@ import net.sourceforge.pmd.util.datasource.ReaderDataSource;
* process is controlled via interactions with this class. A command line
* interface is supported, as well as a programmatic API for integrating PMD
* with other software such as IDEs and Ant.
*
* <p>Main entrypoints are:
* <ul>
* <li>{@link #main(String[])} which exits the java process</li>
* <li>{@link #runPmd(String...)} which returns a {@link StatusCode}</li>
* <li>{@link #runPmd(PMDConfiguration)}</li>
* <li>{@link #processFiles(PMDConfiguration, List, Collection, List)}</li>
* </ul>
*
* <p><strong>Warning:</strong> This class is not intended to be instantiated or subclassed. It will
* be made final in PMD7.
*/
public final class PMD {

View File

@ -14,6 +14,8 @@ import java.util.Collections;
import java.util.List;
import java.util.function.Consumer;
import net.sourceforge.pmd.annotation.DeprecatedUntil700;
import net.sourceforge.pmd.annotation.InternalApi;
import net.sourceforge.pmd.renderers.AbstractAccumulatingRenderer;
import net.sourceforge.pmd.reporting.FileAnalysisListener;
import net.sourceforge.pmd.reporting.GlobalAnalysisListener;
@ -37,8 +39,10 @@ public final class Report {
private final List<ProcessingError> errors = synchronizedList(new ArrayList<>());
private final List<ConfigurationError> configErrors = synchronizedList(new ArrayList<>());
Report() {
// package-private, you have to use a listener to build a report.
@DeprecatedUntil700
@InternalApi
public Report() { // NOPMD - UnnecessaryConstructor
// TODO: should be package-private, you have to use a listener to build a report.
}
/**
@ -168,7 +172,10 @@ public final class Report {
*
* @deprecated PMD's way of creating a report is internal and may be changed in pmd 7.
*/
private void addRuleViolation(RuleViolation violation) {
@DeprecatedUntil700
@Deprecated
@InternalApi
public void addRuleViolation(RuleViolation violation) {
synchronized (violations) {
int index = Collections.binarySearch(violations, violation, RuleViolation.DEFAULT_COMPARATOR);
violations.add(index < 0 ? -index - 1 : index, violation);
@ -189,7 +196,10 @@ public final class Report {
*
* @deprecated PMD's way of creating a report is internal and may be changed in pmd 7.
*/
private void addConfigError(ConfigurationError error) {
@DeprecatedUntil700
@Deprecated
@InternalApi
public void addConfigError(ConfigurationError error) {
configErrors.add(error);
}
@ -200,7 +210,10 @@ public final class Report {
* the error to add
* @deprecated PMD's way of creating a report is internal and may be changed in pmd 7.
*/
private void addError(ProcessingError error) {
@DeprecatedUntil700
@Deprecated
@InternalApi
public void addError(ProcessingError error) {
errors.add(error);
}

View File

@ -10,6 +10,7 @@ import java.util.Objects;
import net.sourceforge.pmd.Report;
import net.sourceforge.pmd.Report.ConfigurationError;
import net.sourceforge.pmd.Report.GlobalReportBuilderListener;
import net.sourceforge.pmd.annotation.InternalApi;
import net.sourceforge.pmd.benchmark.TimeTracker;
import net.sourceforge.pmd.benchmark.TimedOperation;
import net.sourceforge.pmd.benchmark.TimedOperationCategory;
@ -24,6 +25,9 @@ import net.sourceforge.pmd.util.datasource.DataSource;
* quite large in some scenarios. Consider using
* {@link AbstractIncrementingRenderer} which can use significantly less memory.
*
* <p>Subclasses should only implement the {@link #end()} method to output the
* complete {@link #report}.
*
* @see AbstractIncrementingRenderer
*/
public abstract class AbstractAccumulatingRenderer extends AbstractRenderer {
@ -48,7 +52,15 @@ public abstract class AbstractAccumulatingRenderer extends AbstractRenderer {
Objects.requireNonNull(dataSource);
}
/**
* {@inheritDoc}
*
* @deprecated This is internal API. Do not override when extending {@link AbstractAccumulatingRenderer}.
* In PMD7 this method will be made final.
*/
@Override
@InternalApi
@Deprecated
public final void renderFileReport(Report report) throws IOException {
// do nothing, final because it will never be called by the listener
Objects.requireNonNull(report);

View File

@ -256,20 +256,20 @@ public abstract class RuleTst {
public Report runTestFromString(String code, Rule rule, LanguageVersion languageVersion, boolean isUseAuxClasspath) {
try {
PMDConfiguration config = new PMDConfiguration();
config.setIgnoreIncrementalAnalysis(true);
config.setDefaultLanguageVersion(languageVersion);
config.setThreads(1);
PMDConfiguration configuration = new PMDConfiguration();
configuration.setIgnoreIncrementalAnalysis(true);
configuration.setDefaultLanguageVersion(languageVersion);
configuration.setThreads(1);
if (isUseAuxClasspath) {
// configure the "auxclasspath" option for unit testing
config.prependClasspath(".");
configuration.prependClasspath(".");
} else {
// simple class loader, that doesn't delegate to parent.
// this allows us in the tests to simulate PMD run without
// auxclasspath, not even the classes from the test dependencies
// will be found.
config.setClassLoader(new ClassLoader() {
configuration.setClassLoader(new ClassLoader() {
@Override
protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
if (name.startsWith("java.") || name.startsWith("javax.")) {
@ -289,7 +289,7 @@ public abstract class RuleTst {
listOf(RuleSet.forSingleRule(rule)),
DataSource.forString(code, "test." + languageVersion.getLanguage().getExtensions().get(0)),
listener,
config
configuration
);
listener.close();

View File

@ -94,7 +94,7 @@
<surefire.version>3.0.0-M5</surefire.version>
<checkstyle.version>9.3</checkstyle.version>
<checkstyle.plugin.version>3.1.2</checkstyle.plugin.version>
<pmd.plugin.version>3.15.0</pmd.plugin.version>
<pmd.plugin.version>3.16.0</pmd.plugin.version>
<ant.version>1.10.12</ant.version>
<javadoc.plugin.version>3.2.0</javadoc.plugin.version>
<antlr.version>4.8</antlr.version>