forked from phoedos/pmd
Merge pull request #4803 from adangel:issue-3903-reporting-package
[core] Consolidate n.s.pmd.reporting package #4803
This commit is contained in:
@ -172,6 +172,7 @@ The rules have been moved into categories with PMD 6.
|
||||
* [#4723](https://github.com/pmd/pmd/issues/4723): \[cli] Launch fails for "bash pmd"
|
||||
* core
|
||||
* [#1027](https://github.com/pmd/pmd/issues/1027): \[core] Apply the new PropertyDescriptor<Pattern> type where applicable
|
||||
* [#3903](https://github.com/pmd/pmd/issues/3903): \[core] Consolidate `n.s.pmd.reporting` package
|
||||
* [#3917](https://github.com/pmd/pmd/issues/3917): \[core] Consolidate `n.s.pmd.lang.rule` package
|
||||
* [#4065](https://github.com/pmd/pmd/issues/4065): \[core] Rename TokenMgrError to LexException, Tokenizer to CpdLexer
|
||||
* [#4312](https://github.com/pmd/pmd/issues/4312): \[core] Remove unnecessary property `color` and system property `pmd.color` in `TextColorRenderer`
|
||||
@ -245,6 +246,12 @@ in the migration guide for details.
|
||||
* {%jdoc core::lang.rule.RuleSetLoader %}
|
||||
* {%jdoc core::lang.rule.RuleSetLoadException %}
|
||||
* {%jdoc core::lang.rule.RuleSetWriter %}
|
||||
* Many types have been moved from the base package `net.sourceforge.pmd` into subpackage {% jdoc_package core::reporting %}
|
||||
* {%jdoc core::reporting.Report %}
|
||||
* {%jdoc core::reporting.RuleContext %}
|
||||
* {%jdoc core::reporting.RuleViolation %}
|
||||
* {%jdoc core::reporting.ViolationSuppressor %}
|
||||
* {%jdoc core::reporting.ParametricRuleViolation %} (moved from `net.sourcceforge.pmd.lang.rule`)
|
||||
|
||||
**Internalized classes**
|
||||
|
||||
@ -728,6 +735,7 @@ See also [Detailed Release Notes for PMD 7]({{ baseurl }}pmd_release_notes_pmd7.
|
||||
* [#3815](https://github.com/pmd/pmd/issues/3815): \[core] Update Saxon HE to 10.7
|
||||
* [#3893](https://github.com/pmd/pmd/pull/3893): \[core] Text documents
|
||||
* [#3902](https://github.com/pmd/pmd/issues/3902): \[core] Violation decorators
|
||||
* [#3903](https://github.com/pmd/pmd/issues/3903): \[core] Consolidate `n.s.pmd.reporting` package
|
||||
* [#3917](https://github.com/pmd/pmd/issues/3917): \[core] Consolidate `n.s.pmd.lang.rule` package
|
||||
* [#3918](https://github.com/pmd/pmd/issues/3918): \[core] Make LanguageRegistry non static
|
||||
* [#3919](https://github.com/pmd/pmd/issues/3919): \[core] Merge CPD and PMD language
|
||||
|
@ -1201,7 +1201,7 @@ You can identify them with the `@InternalApi` annotation. You'll also get a depr
|
||||
should be used.
|
||||
- Several members of {% jdoc test::cli.BaseCPDCLITest %} have been deprecated with replacements.
|
||||
- The methods {% jdoc !!core::ant.Formatter#start(java.lang.String) %},
|
||||
{% jdoc !!core::ant.Formatter#end(net.sourceforge.pmd.Report) %}, {% jdoc !!core::ant.Formatter#getRenderer() %},
|
||||
{% jdoc !!core::ant.Formatter#end(net.sourceforge.pmd.reporting.Report) %}, {% jdoc !!core::ant.Formatter#getRenderer() %},
|
||||
and {% jdoc !!core::ant.Formatter#isNoOutputSupplied() %} have been internalized.
|
||||
|
||||
#### 6.45.0
|
||||
@ -1211,7 +1211,7 @@ You can identify them with the `@InternalApi` annotation. You'll also get a depr
|
||||
* Report has two new methods which allow limited mutations of a given report:
|
||||
* {% jdoc !!core::Report#filterViolations(net.sourceforge.pmd.util.Predicate) %} creates a new report with
|
||||
some violations removed with a given predicate based filter.
|
||||
* {% jdoc !!core::Report#union(net.sourceforge.pmd.Report) %} can combine two reports into a single new Report.
|
||||
* {% jdoc !!core::Report#union(net.sourceforge.pmd.reporting.Report) %} can combine two reports into a single new Report.
|
||||
* {% jdoc !!core::util.Predicate %} will be replaced in PMD7 with the standard Predicate interface from java8.
|
||||
* The module `pmd-html` is entirely experimental right now. Anything in the package
|
||||
`net.sourceforge.pmd.lang.html` should be used cautiously.
|
||||
|
@ -26,7 +26,6 @@ import org.apache.tools.ant.BuildException;
|
||||
import org.apache.tools.ant.Project;
|
||||
import org.apache.tools.ant.types.Parameter;
|
||||
|
||||
import net.sourceforge.pmd.Report;
|
||||
import net.sourceforge.pmd.annotation.InternalApi;
|
||||
import net.sourceforge.pmd.internal.util.IOUtil;
|
||||
import net.sourceforge.pmd.lang.document.TextFile;
|
||||
@ -36,6 +35,7 @@ import net.sourceforge.pmd.reporting.FileAnalysisListener;
|
||||
import net.sourceforge.pmd.reporting.FileNameRenderer;
|
||||
import net.sourceforge.pmd.reporting.GlobalAnalysisListener;
|
||||
import net.sourceforge.pmd.reporting.ListenerInitializer;
|
||||
import net.sourceforge.pmd.reporting.Report;
|
||||
|
||||
@InternalApi
|
||||
public class Formatter {
|
||||
|
@ -9,7 +9,6 @@ import static net.sourceforge.pmd.util.CollectionUtil.setOf;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import net.sourceforge.pmd.ViolationSuppressor;
|
||||
import net.sourceforge.pmd.lang.LanguageVersionHandler;
|
||||
import net.sourceforge.pmd.lang.apex.ast.ApexParser;
|
||||
import net.sourceforge.pmd.lang.apex.internal.ApexDesignerBindings;
|
||||
@ -17,6 +16,7 @@ import net.sourceforge.pmd.lang.apex.metrics.ApexMetrics;
|
||||
import net.sourceforge.pmd.lang.ast.Parser;
|
||||
import net.sourceforge.pmd.lang.metrics.LanguageMetricsProvider;
|
||||
import net.sourceforge.pmd.lang.metrics.Metric;
|
||||
import net.sourceforge.pmd.reporting.ViolationSuppressor;
|
||||
import net.sourceforge.pmd.util.designerbindings.DesignerBindings;
|
||||
|
||||
class ApexLanguageHandler implements LanguageVersionHandler {
|
||||
|
@ -13,10 +13,6 @@ import java.util.TreeSet;
|
||||
|
||||
import org.checkerframework.checker.nullness.qual.NonNull;
|
||||
|
||||
import net.sourceforge.pmd.Report;
|
||||
import net.sourceforge.pmd.Report.SuppressedViolation;
|
||||
import net.sourceforge.pmd.RuleViolation;
|
||||
import net.sourceforge.pmd.ViolationSuppressor;
|
||||
import net.sourceforge.pmd.lang.apex.ast.ASTAnnotation;
|
||||
import net.sourceforge.pmd.lang.apex.ast.ASTAnnotationParameter;
|
||||
import net.sourceforge.pmd.lang.apex.ast.ASTField;
|
||||
@ -30,6 +26,10 @@ import net.sourceforge.pmd.lang.apex.ast.ASTVariableDeclarationStatements;
|
||||
import net.sourceforge.pmd.lang.apex.ast.ApexNode;
|
||||
import net.sourceforge.pmd.lang.ast.Node;
|
||||
import net.sourceforge.pmd.lang.rule.Rule;
|
||||
import net.sourceforge.pmd.reporting.Report;
|
||||
import net.sourceforge.pmd.reporting.Report.SuppressedViolation;
|
||||
import net.sourceforge.pmd.reporting.RuleViolation;
|
||||
import net.sourceforge.pmd.reporting.ViolationSuppressor;
|
||||
|
||||
final class ApexViolationSuppressors {
|
||||
|
||||
|
@ -4,10 +4,10 @@
|
||||
|
||||
package net.sourceforge.pmd.lang.apex.rule;
|
||||
|
||||
import net.sourceforge.pmd.RuleContext;
|
||||
import net.sourceforge.pmd.lang.apex.ast.ApexParserVisitor;
|
||||
import net.sourceforge.pmd.lang.ast.Node;
|
||||
import net.sourceforge.pmd.lang.rule.AbstractRule;
|
||||
import net.sourceforge.pmd.reporting.RuleContext;
|
||||
|
||||
public abstract class AbstractApexRule extends AbstractRule
|
||||
implements ApexParserVisitor {
|
||||
|
@ -10,7 +10,6 @@ import static net.sourceforge.pmd.properties.PropertyFactory.booleanProperty;
|
||||
import java.util.ArrayDeque;
|
||||
import java.util.Deque;
|
||||
|
||||
import net.sourceforge.pmd.RuleContext;
|
||||
import net.sourceforge.pmd.lang.apex.ast.ASTBooleanExpression;
|
||||
import net.sourceforge.pmd.lang.apex.ast.ASTDoLoopStatement;
|
||||
import net.sourceforge.pmd.lang.apex.ast.ASTForEachStatement;
|
||||
@ -27,6 +26,7 @@ import net.sourceforge.pmd.lang.apex.ast.ASTWhileLoopStatement;
|
||||
import net.sourceforge.pmd.lang.apex.rule.AbstractApexRule;
|
||||
import net.sourceforge.pmd.properties.PropertyDescriptor;
|
||||
import net.sourceforge.pmd.properties.PropertyFactory;
|
||||
import net.sourceforge.pmd.reporting.RuleContext;
|
||||
|
||||
|
||||
/**
|
||||
|
@ -23,7 +23,6 @@ import java.util.stream.Collectors;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
import net.sourceforge.pmd.RuleContext;
|
||||
import net.sourceforge.pmd.lang.apex.ast.ASTAssignmentExpression;
|
||||
import net.sourceforge.pmd.lang.apex.ast.ASTBlockStatement;
|
||||
import net.sourceforge.pmd.lang.apex.ast.ASTDmlDeleteStatement;
|
||||
@ -57,6 +56,7 @@ import net.sourceforge.pmd.lang.apex.rule.AbstractApexRule;
|
||||
import net.sourceforge.pmd.lang.apex.rule.internal.Helper;
|
||||
import net.sourceforge.pmd.lang.ast.Node;
|
||||
import net.sourceforge.pmd.properties.PropertyDescriptor;
|
||||
import net.sourceforge.pmd.reporting.RuleContext;
|
||||
|
||||
import com.google.common.base.Objects;
|
||||
import com.google.common.collect.HashMultimap;
|
||||
|
@ -10,7 +10,6 @@ import java.util.WeakHashMap;
|
||||
|
||||
import org.checkerframework.checker.nullness.qual.NonNull;
|
||||
|
||||
import net.sourceforge.pmd.RuleContext;
|
||||
import net.sourceforge.pmd.lang.apex.ast.ASTDmlDeleteStatement;
|
||||
import net.sourceforge.pmd.lang.apex.ast.ASTDmlInsertStatement;
|
||||
import net.sourceforge.pmd.lang.apex.ast.ASTDmlMergeStatement;
|
||||
@ -26,6 +25,7 @@ import net.sourceforge.pmd.lang.apex.ast.ApexNode;
|
||||
import net.sourceforge.pmd.lang.apex.rule.AbstractApexRule;
|
||||
import net.sourceforge.pmd.lang.apex.rule.internal.Helper;
|
||||
import net.sourceforge.pmd.lang.rule.RuleTargetSelector;
|
||||
import net.sourceforge.pmd.reporting.RuleContext;
|
||||
|
||||
/**
|
||||
* Finds Apex class that do not define sharing
|
||||
|
@ -12,11 +12,11 @@ import java.util.List;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import net.sourceforge.pmd.Report;
|
||||
import net.sourceforge.pmd.ViolationSuppressor;
|
||||
import net.sourceforge.pmd.lang.apex.ast.ASTUserClass;
|
||||
import net.sourceforge.pmd.lang.apex.ast.ApexParserTestBase;
|
||||
import net.sourceforge.pmd.lang.apex.rule.AbstractApexRule;
|
||||
import net.sourceforge.pmd.reporting.Report;
|
||||
import net.sourceforge.pmd.reporting.ViolationSuppressor;
|
||||
|
||||
class SuppressWarningsTest extends ApexParserTestBase {
|
||||
|
||||
|
@ -6,7 +6,6 @@ package net.sourceforge.pmd.lang.apex.rule;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import net.sourceforge.pmd.Report;
|
||||
import net.sourceforge.pmd.lang.apex.ast.ASTAnonymousClass;
|
||||
import net.sourceforge.pmd.lang.apex.ast.ASTUserClass;
|
||||
import net.sourceforge.pmd.lang.apex.ast.ASTUserEnum;
|
||||
@ -14,6 +13,7 @@ import net.sourceforge.pmd.lang.apex.ast.ASTUserInterface;
|
||||
import net.sourceforge.pmd.lang.apex.ast.ASTUserTrigger;
|
||||
import net.sourceforge.pmd.lang.apex.ast.ApexParserTestBase;
|
||||
import net.sourceforge.pmd.lang.ast.test.TestUtilsKt;
|
||||
import net.sourceforge.pmd.reporting.Report;
|
||||
|
||||
class AbstractApexRuleTest extends ApexParserTestBase {
|
||||
|
||||
|
@ -8,10 +8,10 @@ import static net.sourceforge.pmd.lang.ast.test.TestUtilsKt.assertSize;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import net.sourceforge.pmd.Report;
|
||||
import net.sourceforge.pmd.lang.apex.ast.ApexParserTestBase;
|
||||
import net.sourceforge.pmd.lang.document.FileId;
|
||||
import net.sourceforge.pmd.lang.rule.XPathRule;
|
||||
import net.sourceforge.pmd.reporting.Report;
|
||||
|
||||
/**
|
||||
* @author daniels
|
||||
|
@ -15,8 +15,6 @@ import org.junit.jupiter.api.io.TempDir;
|
||||
|
||||
import net.sourceforge.pmd.PMDConfiguration;
|
||||
import net.sourceforge.pmd.PmdAnalysis;
|
||||
import net.sourceforge.pmd.Report;
|
||||
import net.sourceforge.pmd.RuleViolation;
|
||||
import net.sourceforge.pmd.lang.Language;
|
||||
import net.sourceforge.pmd.lang.LanguageVersion;
|
||||
import net.sourceforge.pmd.lang.apex.ApexLanguageModule;
|
||||
@ -25,6 +23,8 @@ import net.sourceforge.pmd.lang.rule.Rule;
|
||||
import net.sourceforge.pmd.lang.rule.RuleSet;
|
||||
import net.sourceforge.pmd.lang.rule.RuleSetLoader;
|
||||
import net.sourceforge.pmd.reporting.GlobalAnalysisListener;
|
||||
import net.sourceforge.pmd.reporting.Report;
|
||||
import net.sourceforge.pmd.reporting.RuleViolation;
|
||||
|
||||
import com.nawforce.pkgforce.path.PathFactory;
|
||||
import com.nawforce.pkgforce.path.PathLike;
|
||||
|
@ -14,9 +14,9 @@ import java.util.stream.Collectors;
|
||||
import org.junit.jupiter.params.ParameterizedTest;
|
||||
import org.junit.jupiter.params.provider.MethodSource;
|
||||
|
||||
import net.sourceforge.pmd.Report;
|
||||
import net.sourceforge.pmd.RuleViolation;
|
||||
import net.sourceforge.pmd.lang.apex.ast.ApexParserTestBase;
|
||||
import net.sourceforge.pmd.reporting.Report;
|
||||
import net.sourceforge.pmd.reporting.RuleViolation;
|
||||
|
||||
/**
|
||||
* <p>Sharing settings are not inherited by inner classes. Sharing settings need to be declared on the class that
|
||||
|
@ -6,12 +6,12 @@ package net.sourceforge.pmd.cli.internal;
|
||||
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
import net.sourceforge.pmd.Report;
|
||||
import net.sourceforge.pmd.RuleViolation;
|
||||
import net.sourceforge.pmd.lang.document.TextFile;
|
||||
import net.sourceforge.pmd.reporting.FileAnalysisListener;
|
||||
import net.sourceforge.pmd.reporting.GlobalAnalysisListener;
|
||||
import net.sourceforge.pmd.reporting.ListenerInitializer;
|
||||
import net.sourceforge.pmd.reporting.Report;
|
||||
import net.sourceforge.pmd.reporting.RuleViolation;
|
||||
|
||||
import me.tongfei.progressbar.PmdProgressBarFriend;
|
||||
import me.tongfei.progressbar.ProgressBar;
|
||||
|
@ -40,11 +40,11 @@ import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.jupiter.api.io.TempDir;
|
||||
|
||||
import net.sourceforge.pmd.RuleContext;
|
||||
import net.sourceforge.pmd.internal.Slf4jSimpleConfiguration;
|
||||
import net.sourceforge.pmd.internal.util.IOUtil;
|
||||
import net.sourceforge.pmd.lang.ast.Node;
|
||||
import net.sourceforge.pmd.lang.rule.MockRule;
|
||||
import net.sourceforge.pmd.reporting.RuleContext;
|
||||
|
||||
import com.github.stefanbirkner.systemlambda.SystemLambda;
|
||||
|
||||
|
@ -4,5 +4,7 @@ public class Main {
|
||||
public static void main(String[] args) {
|
||||
String thisIsAUnusedLocalVar = "a";
|
||||
System.out.println("Hello world!");
|
||||
|
||||
String thisIsASuppressedUnusedLocalVar = "b"; // NOPMD suppressed
|
||||
}
|
||||
}
|
||||
|
622
pmd-compat6/src/main/java/net/sourceforge/pmd/PmdAnalysis.java
Normal file
622
pmd-compat6/src/main/java/net/sourceforge/pmd/PmdAnalysis.java
Normal file
File diff suppressed because it is too large
Load Diff
@ -26,10 +26,11 @@ import net.sourceforge.pmd.lang.document.TextFile;
|
||||
import net.sourceforge.pmd.renderers.AbstractAccumulatingRenderer;
|
||||
import net.sourceforge.pmd.reporting.FileAnalysisListener;
|
||||
import net.sourceforge.pmd.reporting.GlobalAnalysisListener;
|
||||
import net.sourceforge.pmd.reporting.ViolationSuppressor;
|
||||
import net.sourceforge.pmd.util.BaseResultProducingCloseable;
|
||||
|
||||
/**
|
||||
* A {@link Report} collects all informations during a PMD execution. This
|
||||
* A {@link Report} collects all information during a PMD execution. This
|
||||
* includes violations, suppressed violations, metrics, error during processing
|
||||
* and configuration errors.
|
||||
*
|
||||
@ -46,7 +47,7 @@ import net.sourceforge.pmd.util.BaseResultProducingCloseable;
|
||||
* These methods create a new {@link Report} rather than modifying their receiver.
|
||||
* </p>
|
||||
*/
|
||||
public final class Report {
|
||||
public class Report {
|
||||
// todo move to package reporting
|
||||
|
||||
private final List<RuleViolation> violations = synchronizedList(new ArrayList<>());
|
||||
@ -312,7 +313,7 @@ public final class Report {
|
||||
* A {@link FileAnalysisListener} that accumulates events into a
|
||||
* {@link Report}.
|
||||
*/
|
||||
public static final class ReportBuilderListener extends BaseResultProducingCloseable<Report> implements FileAnalysisListener {
|
||||
public static /*final*/ class ReportBuilderListener extends BaseResultProducingCloseable<Report> implements FileAnalysisListener {
|
||||
|
||||
private final Report report;
|
||||
|
||||
@ -330,17 +331,17 @@ public final class Report {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onRuleViolation(RuleViolation violation) {
|
||||
public void onRuleViolation(net.sourceforge.pmd.reporting.RuleViolation violation) {
|
||||
report.addRuleViolation(violation);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSuppressedRuleViolation(SuppressedViolation violation) {
|
||||
public void onSuppressedRuleViolation(net.sourceforge.pmd.reporting.Report.SuppressedViolation violation) {
|
||||
report.addSuppressedViolation(violation);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(ProcessingError error) {
|
||||
public void onError(net.sourceforge.pmd.reporting.Report.ProcessingError error) {
|
||||
report.addError(error);
|
||||
}
|
||||
|
||||
@ -354,9 +355,9 @@ public final class Report {
|
||||
* A {@link GlobalAnalysisListener} that accumulates the events of
|
||||
* all files into a {@link Report}.
|
||||
*/
|
||||
public static final class GlobalReportBuilderListener extends BaseResultProducingCloseable<Report> implements GlobalAnalysisListener {
|
||||
public static /*final*/ class GlobalReportBuilderListener extends BaseResultProducingCloseable<net.sourceforge.pmd.reporting.Report> implements GlobalAnalysisListener {
|
||||
|
||||
private final Report report = new Report();
|
||||
private final net.sourceforge.pmd.reporting.Report report = new net.sourceforge.pmd.reporting.Report();
|
||||
|
||||
@Override
|
||||
public FileAnalysisListener startFileAnalysis(TextFile file) {
|
||||
@ -365,12 +366,12 @@ public final class Report {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onConfigError(ConfigurationError error) {
|
||||
public void onConfigError(net.sourceforge.pmd.reporting.Report.ConfigurationError error) {
|
||||
report.addConfigError(error);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Report getResultImpl() {
|
||||
protected net.sourceforge.pmd.reporting.Report getResultImpl() {
|
||||
return report;
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,288 @@
|
||||
/**
|
||||
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html
|
||||
*/
|
||||
|
||||
// This class has been taken from 7.0.0-SNAPSHOT
|
||||
// Changes: renderFileReport
|
||||
|
||||
package net.sourceforge.pmd.renderers;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.Writer;
|
||||
|
||||
import net.sourceforge.pmd.annotation.Experimental;
|
||||
import net.sourceforge.pmd.benchmark.TimeTracker;
|
||||
import net.sourceforge.pmd.benchmark.TimedOperation;
|
||||
import net.sourceforge.pmd.benchmark.TimedOperationCategory;
|
||||
import net.sourceforge.pmd.lang.document.TextFile;
|
||||
import net.sourceforge.pmd.properties.PropertyDescriptor;
|
||||
import net.sourceforge.pmd.properties.PropertySource;
|
||||
import net.sourceforge.pmd.reporting.FileAnalysisListener;
|
||||
import net.sourceforge.pmd.reporting.FileNameRenderer;
|
||||
import net.sourceforge.pmd.reporting.GlobalAnalysisListener;
|
||||
import net.sourceforge.pmd.reporting.ListenerInitializer;
|
||||
import net.sourceforge.pmd.reporting.Report;
|
||||
import net.sourceforge.pmd.reporting.Report.ConfigurationError;
|
||||
import net.sourceforge.pmd.reporting.Report.GlobalReportBuilderListener;
|
||||
import net.sourceforge.pmd.reporting.Report.ProcessingError;
|
||||
import net.sourceforge.pmd.reporting.Report.ReportBuilderListener;
|
||||
import net.sourceforge.pmd.reporting.Report.SuppressedViolation;
|
||||
import net.sourceforge.pmd.reporting.RuleViolation;
|
||||
|
||||
/**
|
||||
* This is an interface for rendering a Report. When a Renderer is being
|
||||
* invoked, the sequence of method calls is something like the following:
|
||||
* <ol>
|
||||
* <li>Renderer construction/initialization</li>
|
||||
* <li>{@link Renderer#setShowSuppressedViolations(boolean)}</li>
|
||||
* <li>{@link Renderer#setWriter(Writer)}</li>
|
||||
* <li>{@link Renderer#start()}</li>
|
||||
* <li>{@link Renderer#startFileAnalysis(TextFile)} for each source file
|
||||
* processed</li>
|
||||
* <li>{@link Renderer#renderFileReport(Report)} for each Report instance</li>
|
||||
* <li>{@link Renderer#end()}</li>
|
||||
* </ol>
|
||||
* <p>
|
||||
* An implementation of the Renderer interface is expected to have a default
|
||||
* constructor. Properties should be defined using the
|
||||
* {@link #definePropertyDescriptor(PropertyDescriptor)}
|
||||
* method. After the instance is created, the property values are set. This
|
||||
* means, you won't have access to property values in your constructor.
|
||||
*/
|
||||
// TODO Are implementations expected to be thread-safe?
|
||||
public interface Renderer extends PropertySource {
|
||||
|
||||
/**
|
||||
* Get the name of the Renderer.
|
||||
*
|
||||
* @return The name of the Renderer.
|
||||
*/
|
||||
@Override
|
||||
String getName();
|
||||
|
||||
/**
|
||||
* Set the name of the Renderer.
|
||||
*
|
||||
* @param name
|
||||
* The name of the Renderer.
|
||||
*/
|
||||
void setName(String name);
|
||||
|
||||
/**
|
||||
* Get the description of the Renderer.
|
||||
*
|
||||
* @return The description of the Renderer.
|
||||
*/
|
||||
String getDescription();
|
||||
|
||||
/**
|
||||
* Return the default filename extension to use.
|
||||
*
|
||||
* @return String
|
||||
*/
|
||||
String defaultFileExtension();
|
||||
|
||||
/**
|
||||
* Set the description of the Renderer.
|
||||
*
|
||||
* @param description
|
||||
* The description of the Renderer.
|
||||
*/
|
||||
void setDescription(String description);
|
||||
|
||||
/**
|
||||
* Get the indicator for whether to show suppressed violations.
|
||||
*
|
||||
* @return <code>true</code> if suppressed violations should show,
|
||||
* <code>false</code> otherwise.
|
||||
*/
|
||||
boolean isShowSuppressedViolations();
|
||||
|
||||
/**
|
||||
* Set the indicator for whether to show suppressed violations.
|
||||
*
|
||||
* @param showSuppressedViolations
|
||||
* Whether to show suppressed violations.
|
||||
*/
|
||||
void setShowSuppressedViolations(boolean showSuppressedViolations);
|
||||
|
||||
/**
|
||||
* Get the Writer for the Renderer.
|
||||
*
|
||||
* @return The Writer.
|
||||
*/
|
||||
Writer getWriter();
|
||||
|
||||
/**
|
||||
* Set the {@link FileNameRenderer} used to render file paths to the report.
|
||||
* Note that this renderer does not have to use the parameter to output paths.
|
||||
* Some report formats require a specific format for paths (eg a URI), and are
|
||||
* allowed to circumvent the provided strategy.
|
||||
*
|
||||
* @param fileNameRenderer a non-null file name renderer
|
||||
*/
|
||||
void setFileNameRenderer(FileNameRenderer fileNameRenderer);
|
||||
|
||||
/**
|
||||
* Set the Writer for the Renderer.
|
||||
*
|
||||
* @param writer The Writer.
|
||||
*/
|
||||
void setWriter(Writer writer);
|
||||
|
||||
/**
|
||||
* This method is called before any source files are processed. The Renderer
|
||||
* will have been fully initialized by the time this method is called, so
|
||||
* the Writer and other state will be available.
|
||||
*
|
||||
* @throws IOException
|
||||
*/
|
||||
void start() throws IOException;
|
||||
|
||||
/**
|
||||
* This method is called each time a source file is processed. It is called
|
||||
* after {@link Renderer#start()}, but before
|
||||
* {@link Renderer#renderFileReport(Report)} and {@link Renderer#end()}.
|
||||
*
|
||||
* This method may be invoked by different threads which are processing
|
||||
* files independently. Therefore, any non-trivial implementation of this
|
||||
* method needs to be thread-safe.
|
||||
*
|
||||
* @param dataSource
|
||||
* The source file.
|
||||
*/
|
||||
void startFileAnalysis(TextFile dataSource);
|
||||
|
||||
/**
|
||||
* Render the given file Report. There may be multiple Report instances
|
||||
* which need to be rendered if produced by different threads. It is called
|
||||
* after {@link Renderer#start()} and
|
||||
* {@link Renderer#startFileAnalysis(TextFile)}, but before
|
||||
* {@link Renderer#end()}.
|
||||
*
|
||||
* @param report
|
||||
* A file Report.
|
||||
* @throws IOException
|
||||
*
|
||||
* @see Report
|
||||
*/
|
||||
void renderFileReport(Report report) throws IOException;
|
||||
|
||||
/**
|
||||
* This method is at the very end of the Rendering process, after
|
||||
* {@link Renderer#renderFileReport(Report)}.
|
||||
*/
|
||||
void end() throws IOException;
|
||||
|
||||
void flush() throws IOException;
|
||||
|
||||
/**
|
||||
* Sets the filename where the report should be written to. If no filename is provided,
|
||||
* the renderer should write to stdout.
|
||||
*
|
||||
* <p>Implementations must initialize the writer of the renderer.
|
||||
*
|
||||
* <p>See {@link AbstractRenderer#setReportFile(String)} for the default impl.
|
||||
*
|
||||
* @param reportFilename the filename (optional).
|
||||
*/
|
||||
@Experimental
|
||||
void setReportFile(String reportFilename);
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Returns a new analysis listener, that handles violations by rendering
|
||||
* them in an implementation-defined way.
|
||||
*/
|
||||
// TODO the default implementation matches the current behavior,
|
||||
// ie violations are batched by file and forwarded to the renderer
|
||||
// when the file is done. Many renderers could directly handle
|
||||
// violations as they come though.
|
||||
default GlobalAnalysisListener newListener() throws IOException {
|
||||
try (TimedOperation ignored = TimeTracker.startOperation(TimedOperationCategory.REPORTING)) {
|
||||
this.start();
|
||||
}
|
||||
|
||||
return new GlobalAnalysisListener() {
|
||||
|
||||
// guard for the close routine
|
||||
final Object reportMergeLock = new Object();
|
||||
|
||||
final GlobalReportBuilderListener configErrorReport = new GlobalReportBuilderListener();
|
||||
|
||||
@Override
|
||||
public void onConfigError(ConfigurationError error) {
|
||||
configErrorReport.onConfigError(error);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ListenerInitializer initializer() {
|
||||
return new ListenerInitializer() {
|
||||
@Override
|
||||
public void setFileNameRenderer(FileNameRenderer fileNameRenderer) {
|
||||
Renderer.this.setFileNameRenderer(fileNameRenderer);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@Override
|
||||
public FileAnalysisListener startFileAnalysis(TextFile file) {
|
||||
Renderer renderer = Renderer.this;
|
||||
|
||||
renderer.startFileAnalysis(file); // this routine is thread-safe by contract
|
||||
return new FileAnalysisListener() {
|
||||
final ReportBuilderListener reportBuilder = new ReportBuilderListener();
|
||||
|
||||
@Override
|
||||
public void onRuleViolation(RuleViolation violation) {
|
||||
reportBuilder.onRuleViolation(violation);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSuppressedRuleViolation(SuppressedViolation violation) {
|
||||
reportBuilder.onSuppressedRuleViolation(violation);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(ProcessingError error) {
|
||||
reportBuilder.onError(error);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void close() throws Exception {
|
||||
reportBuilder.close();
|
||||
synchronized (reportMergeLock) {
|
||||
// TODO renderFileReport should be thread-safe instead
|
||||
try (TimedOperation ignored = TimeTracker.startOperation(TimedOperationCategory.REPORTING)) {
|
||||
renderer.renderFileReport(reportBuilder.getResult());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "FileRendererListener[" + Renderer.this + "]";
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@Override
|
||||
public void close() throws Exception {
|
||||
configErrorReport.close();
|
||||
Renderer.this.renderFileReport(configErrorReport.getResult());
|
||||
try (TimedOperation ignored = TimeTracker.startOperation(TimedOperationCategory.REPORTING)) {
|
||||
end();
|
||||
flush();
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
// --- compat
|
||||
default void renderFileReport(net.sourceforge.pmd.Report report) throws IOException {
|
||||
Report newReport = new Report();
|
||||
newReport.merge(report);
|
||||
renderFileReport(newReport);
|
||||
}
|
||||
}
|
@ -0,0 +1,43 @@
|
||||
/*
|
||||
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html
|
||||
*/
|
||||
|
||||
package net.sourceforge.pmd.reporting;
|
||||
|
||||
import net.sourceforge.pmd.Rule;
|
||||
import net.sourceforge.pmd.lang.document.FileId;
|
||||
|
||||
public class Report extends net.sourceforge.pmd.Report {
|
||||
|
||||
public static class ConfigurationError extends net.sourceforge.pmd.Report.ConfigurationError {
|
||||
public ConfigurationError(Rule theRule, String theIssue) {
|
||||
super(theRule, theIssue);
|
||||
}
|
||||
}
|
||||
|
||||
public static class ProcessingError extends net.sourceforge.pmd.Report.ProcessingError {
|
||||
public ProcessingError(Throwable error, FileId file) {
|
||||
super(error, file);
|
||||
}
|
||||
}
|
||||
|
||||
public static class SuppressedViolation extends net.sourceforge.pmd.Report.SuppressedViolation {
|
||||
private final RuleViolation rv;
|
||||
|
||||
public SuppressedViolation(RuleViolation rv, ViolationSuppressor suppressor, String userMessage) {
|
||||
super(rv, suppressor, userMessage);
|
||||
this.rv = rv;
|
||||
}
|
||||
|
||||
@Override
|
||||
public net.sourceforge.pmd.reporting.RuleViolation getRuleViolation() {
|
||||
return rv;
|
||||
}
|
||||
}
|
||||
|
||||
public static final class GlobalReportBuilderListener extends net.sourceforge.pmd.Report.GlobalReportBuilderListener {
|
||||
}
|
||||
|
||||
public static final class ReportBuilderListener extends net.sourceforge.pmd.Report.ReportBuilderListener {
|
||||
}
|
||||
}
|
@ -0,0 +1,8 @@
|
||||
/*
|
||||
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html
|
||||
*/
|
||||
|
||||
package net.sourceforge.pmd.reporting;
|
||||
|
||||
public interface RuleViolation extends net.sourceforge.pmd.RuleViolation {
|
||||
}
|
@ -21,7 +21,6 @@ import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.slf4j.event.Level;
|
||||
|
||||
import net.sourceforge.pmd.Report.GlobalReportBuilderListener;
|
||||
import net.sourceforge.pmd.benchmark.TimeTracker;
|
||||
import net.sourceforge.pmd.benchmark.TimedOperation;
|
||||
import net.sourceforge.pmd.benchmark.TimedOperationCategory;
|
||||
@ -51,6 +50,8 @@ import net.sourceforge.pmd.reporting.ConfigurableFileNameRenderer;
|
||||
import net.sourceforge.pmd.reporting.FileAnalysisListener;
|
||||
import net.sourceforge.pmd.reporting.GlobalAnalysisListener;
|
||||
import net.sourceforge.pmd.reporting.ListenerInitializer;
|
||||
import net.sourceforge.pmd.reporting.Report;
|
||||
import net.sourceforge.pmd.reporting.Report.GlobalReportBuilderListener;
|
||||
import net.sourceforge.pmd.reporting.ReportStats;
|
||||
import net.sourceforge.pmd.reporting.ReportStatsListener;
|
||||
import net.sourceforge.pmd.util.AssertionUtil;
|
||||
|
@ -26,8 +26,6 @@ import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import net.sourceforge.pmd.PMDVersion;
|
||||
import net.sourceforge.pmd.Report.ProcessingError;
|
||||
import net.sourceforge.pmd.RuleViolation;
|
||||
import net.sourceforge.pmd.annotation.InternalApi;
|
||||
import net.sourceforge.pmd.benchmark.TimeTracker;
|
||||
import net.sourceforge.pmd.benchmark.TimedOperation;
|
||||
@ -39,6 +37,8 @@ import net.sourceforge.pmd.lang.document.TextDocument;
|
||||
import net.sourceforge.pmd.lang.document.TextFile;
|
||||
import net.sourceforge.pmd.lang.rule.internal.RuleSets;
|
||||
import net.sourceforge.pmd.reporting.FileAnalysisListener;
|
||||
import net.sourceforge.pmd.reporting.Report.ProcessingError;
|
||||
import net.sourceforge.pmd.reporting.RuleViolation;
|
||||
|
||||
/**
|
||||
* Abstract implementation of the analysis cache. Handles all operations, except for persistence.
|
||||
|
@ -8,13 +8,13 @@ import java.io.IOException;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
import net.sourceforge.pmd.RuleViolation;
|
||||
import net.sourceforge.pmd.annotation.InternalApi;
|
||||
import net.sourceforge.pmd.lang.document.TextDocument;
|
||||
import net.sourceforge.pmd.lang.document.TextFile;
|
||||
import net.sourceforge.pmd.lang.rule.internal.RuleSets;
|
||||
import net.sourceforge.pmd.reporting.FileAnalysisListener;
|
||||
import net.sourceforge.pmd.reporting.GlobalAnalysisListener;
|
||||
import net.sourceforge.pmd.reporting.RuleViolation;
|
||||
|
||||
/**
|
||||
* An analysis cache for incremental analysis.
|
||||
|
@ -7,8 +7,8 @@ package net.sourceforge.pmd.cache;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import net.sourceforge.pmd.RuleViolation;
|
||||
import net.sourceforge.pmd.annotation.InternalApi;
|
||||
import net.sourceforge.pmd.reporting.RuleViolation;
|
||||
|
||||
/**
|
||||
* The result of a single file analysis.
|
||||
|
@ -14,12 +14,12 @@ import java.util.Map.Entry;
|
||||
|
||||
import org.checkerframework.checker.nullness.qual.NonNull;
|
||||
|
||||
import net.sourceforge.pmd.RuleViolation;
|
||||
import net.sourceforge.pmd.annotation.InternalApi;
|
||||
import net.sourceforge.pmd.lang.document.FileId;
|
||||
import net.sourceforge.pmd.lang.document.FileLocation;
|
||||
import net.sourceforge.pmd.lang.document.TextRange2d;
|
||||
import net.sourceforge.pmd.lang.rule.Rule;
|
||||
import net.sourceforge.pmd.reporting.RuleViolation;
|
||||
import net.sourceforge.pmd.util.StringUtil;
|
||||
|
||||
/**
|
||||
|
@ -19,7 +19,6 @@ import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import net.sourceforge.pmd.PMDVersion;
|
||||
import net.sourceforge.pmd.RuleViolation;
|
||||
import net.sourceforge.pmd.annotation.InternalApi;
|
||||
import net.sourceforge.pmd.benchmark.TimeTracker;
|
||||
import net.sourceforge.pmd.benchmark.TimedOperation;
|
||||
@ -27,6 +26,7 @@ import net.sourceforge.pmd.benchmark.TimedOperationCategory;
|
||||
import net.sourceforge.pmd.lang.document.FileId;
|
||||
import net.sourceforge.pmd.lang.document.TextFile;
|
||||
import net.sourceforge.pmd.lang.rule.internal.RuleSets;
|
||||
import net.sourceforge.pmd.reporting.RuleViolation;
|
||||
|
||||
/**
|
||||
* An analysis cache backed by a regular file.
|
||||
|
@ -8,12 +8,12 @@ import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import net.sourceforge.pmd.RuleViolation;
|
||||
import net.sourceforge.pmd.annotation.InternalApi;
|
||||
import net.sourceforge.pmd.lang.document.TextDocument;
|
||||
import net.sourceforge.pmd.lang.document.TextFile;
|
||||
import net.sourceforge.pmd.lang.rule.internal.RuleSets;
|
||||
import net.sourceforge.pmd.reporting.FileAnalysisListener;
|
||||
import net.sourceforge.pmd.reporting.RuleViolation;
|
||||
|
||||
/**
|
||||
* A NOOP analysis cache. Easier / safer than null-checking.
|
||||
|
@ -7,12 +7,12 @@ package net.sourceforge.pmd.lang;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import net.sourceforge.pmd.ViolationSuppressor;
|
||||
import net.sourceforge.pmd.annotation.Experimental;
|
||||
import net.sourceforge.pmd.lang.ast.Parser;
|
||||
import net.sourceforge.pmd.lang.metrics.LanguageMetricsProvider;
|
||||
import net.sourceforge.pmd.lang.rule.xpath.impl.XPathHandler;
|
||||
import net.sourceforge.pmd.reporting.ViolationDecorator;
|
||||
import net.sourceforge.pmd.reporting.ViolationSuppressor;
|
||||
import net.sourceforge.pmd.util.designerbindings.DesignerBindings;
|
||||
import net.sourceforge.pmd.util.designerbindings.DesignerBindings.DefaultDesignerBindings;
|
||||
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user