Skip to content

Commit c5e8aee

Browse files
committed
Merge pull request #182 from adangel:update-pmd-7.0.0-SNAPSHOT
Update to PMD 7.0.0-rc4 #182
2 parents 04cdbee + 95ab0f9 commit c5e8aee

39 files changed

+418
-509
lines changed

ReleaseNotes.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,27 @@ This is a minor release.
1313

1414
### New and noteworthy
1515

16+
* Updated to PMD 7.0.0-rc4
1617
* Support for Eclipse 2023-06 added
1718
* Support for Eclipse 2022-06 removed
1819

1920
### Fixed Issues
2021

2122
* [#181](https://github.com/pmd/pmd-eclipse-plugin/pull/181): Support eclipse 2023-06
23+
* [#182](https://github.com/pmd/pmd-eclipse-plugin/pull/182): Update to PMD 7.0.0-rc4
2224

2325
### API Changes
2426

27+
* The deprecated field net.sourceforge.pmd.eclipse.runtime.PMDRuntimeConstants.MAX_VIOLATIONS_DESCRIPTOR has been
28+
removed.
29+
* The following deprecated classes have been removed
30+
* net.sourceforge.pmd.eclipse.ui.preferences.br.FilterManager
31+
* net.sourceforge.pmd.eclipse.ui.preferences.editors.FileEditorFactory
32+
* net.sourceforge.pmd.eclipse.ui.preferences.editors.FloatEditorFactory
33+
* The following packages are not exported anymore, as they don't exist anymore:
34+
* net.sourceforge.pmd.cpd.renderer
35+
* net.sourceforge.pmd.properties.constraints
36+
2537
### External Contributions
2638

2739
## 30-May-2023: 7.0.0.v20230530-1924-rc3

net.sourceforge.pmd.eclipse.plugin/META-INF/MANIFEST.MF

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,15 +24,13 @@ Bundle-ClassPath: .,
2424
target/lib/checker-qual.jar,
2525
target/lib/common_2.13.jar,
2626
target/lib/commons-lang3.jar,
27-
target/lib/fastparse-v2_2.13.jar,
2827
target/lib/geny_2.13.jar,
2928
target/lib/groovy.jar,
3029
target/lib/gson.jar,
3130
target/lib/javax.activation-api.jar,
3231
target/lib/jaxb-api.jar,
3332
target/lib/jaxb-core.jar,
3433
target/lib/jaxb-impl.jar,
35-
target/lib/jcommander.jar,
3634
target/lib/jsoup.jar,
3735
target/lib/jul-to-slf4j.jar,
3836
target/lib/lenses_2.13.jar,
@@ -96,7 +94,6 @@ Export-Package: ch.qos.logback.classic;x-friends:="net.sourceforge.pmd.eclipse.p
9694
net.sourceforge.pmd.lang.rule.properties,
9795
net.sourceforge.pmd.lang.dfa.report",
9896
net.sourceforge.pmd.cpd,
99-
net.sourceforge.pmd.cpd.renderer,
10097
net.sourceforge.pmd.eclipse.core;uses:="net.sourceforge.pmd",
10198
net.sourceforge.pmd.eclipse.core.impl;x-friends:="net.sourceforge.pmd.eclipse.plugin.test",
10299
net.sourceforge.pmd.eclipse.plugin;
@@ -138,7 +135,6 @@ Export-Package: ch.qos.logback.classic;x-friends:="net.sourceforge.pmd.eclipse.p
138135
net.sourceforge.pmd.lang.rule,
139136
net.sourceforge.pmd.lang.rule.xpath,
140137
net.sourceforge.pmd.properties,
141-
net.sourceforge.pmd.properties.constraints,
142138
net.sourceforge.pmd.renderers,
143139
net.sourceforge.pmd.reporting,
144140
net.sourceforge.pmd.util;uses:="net.sourceforge.pmd.lang.java.ast",

net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/plugin/PMDPlugin.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,6 @@
8484
import net.sourceforge.pmd.eclipse.ui.priority.PriorityDescriptorCache;
8585
import net.sourceforge.pmd.eclipse.ui.views.PriorityFilter;
8686
import net.sourceforge.pmd.eclipse.util.ResourceManager;
87-
import net.sourceforge.pmd.lang.LanguageRegistry;
8887
import net.sourceforge.pmd.lang.LanguageVersion;
8988
import net.sourceforge.pmd.lang.java.JavaLanguageModule;
9089
import net.sourceforge.pmd.lang.rule.RuleReference;
@@ -172,7 +171,7 @@ public static LanguageVersion javaVersionFor(IProject project) {
172171

173172
if (jProject.exists()) {
174173
String compilerCompliance = jProject.getOption(JavaCore.COMPILER_COMPLIANCE, true);
175-
return LanguageRegistry.getLanguage(JavaLanguageModule.NAME).getVersion(compilerCompliance);
174+
return JavaLanguageModule.getInstance().getVersion(compilerCompliance);
176175
}
177176
return null;
178177
}

net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/runtime/PMDRuntimeConstants.java

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -30,15 +30,6 @@ public final class PMDRuntimeConstants {
3030
public static final String[] ALL_MARKER_TYPES = new String[] { PMD_MARKER, PMD_DFA_MARKER, PMD_TASKMARKER,
3131
PMD_MARKER_1, PMD_MARKER_2, PMD_MARKER_3, PMD_MARKER_4, PMD_MARKER_5 };
3232

33-
/**
34-
* @deprecated not useful, as the property cannot occur on rules anyway. The default was used always,
35-
* which was 1000 violations.
36-
*/
37-
@Deprecated
38-
public static final net.sourceforge.pmd.properties.IntegerProperty MAX_VIOLATIONS_DESCRIPTOR =
39-
new net.sourceforge.pmd.properties.IntegerProperty("maxviolations",
40-
"Max allowable violations", 1, Integer.MAX_VALUE - 1, 1000, 0f);
41-
4233
public static final String ID_PERSPECTIVE = "net.sourceforge.pmd.eclipse.ui.views.pmdPerspective";
4334

4435
public static final String KEY_MARKERATT_RULENAME = "rulename";

net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/runtime/cmd/BaseVisitor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -275,7 +275,7 @@ protected final void reviewResource(IResource resource) {
275275
LanguageVersion languageVersion = languageDiscoverer.getDefaultLanguageVersionForFile(file.getName());
276276
// in case it is java, select the correct java version
277277
if (languageVersion != null
278-
&& LanguageRegistry.getLanguage(JavaLanguageModule.NAME).equals(languageVersion.getLanguage())) {
278+
&& JavaLanguageModule.getInstance().equals(languageVersion.getLanguage())) {
279279
languageVersion = PMDPlugin.javaVersionFor(file.getProject());
280280
}
281281
if (languageVersion != null) {

net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/runtime/cmd/CPDVisitor.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
import org.slf4j.Logger;
1818
import org.slf4j.LoggerFactory;
1919

20-
import net.sourceforge.pmd.cpd.Language;
20+
import net.sourceforge.pmd.cpd.CpdCapableLanguage;
2121
import net.sourceforge.pmd.eclipse.runtime.properties.PropertiesException;
2222

2323
/**
@@ -32,7 +32,7 @@ public class CPDVisitor implements IResourceVisitor {
3232
private static final Logger LOG = LoggerFactory.getLogger(CPDVisitor.class);
3333
private boolean includeDerivedFiles;
3434
private ResourceWorkingSetFilter workingSetFilter;
35-
private Language language;
35+
private CpdCapableLanguage language;
3636
private List<File> files;
3737

3838
/**
@@ -56,7 +56,7 @@ public void setWorkingSet(IWorkingSet workingSet) {
5656
* @param language
5757
* Only add files with that language
5858
*/
59-
public void setLanguage(Language language) {
59+
public void setLanguage(CpdCapableLanguage language) {
6060
this.language = language;
6161
}
6262

@@ -88,7 +88,8 @@ public boolean visit(IResource resource) throws CoreException {
8888
File ioFile = file.getLocation().toFile();
8989
try {
9090
if (StringUtils.isNotBlank(file.getFileExtension())
91-
&& language.getFileFilter().accept(ioFile, file.getName()) && isFileInWorkingSet(file)
91+
&& language.hasExtension(file.getFileExtension())
92+
&& isFileInWorkingSet(file)
9293
&& (includeDerivedFiles || !file.isDerived())) {
9394
LOG.debug("Add file " + resource.getName());
9495
files.add(ioFile);

net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/runtime/cmd/DetectCutAndPasteCmd.java

Lines changed: 45 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,12 @@
1111
import java.io.InputStream;
1212
import java.io.OutputStreamWriter;
1313
import java.io.Writer;
14+
import java.nio.charset.Charset;
1415
import java.util.ArrayList;
1516
import java.util.Iterator;
1617
import java.util.List;
18+
import java.util.concurrent.atomic.AtomicReference;
19+
import java.util.function.Consumer;
1720

1821
import org.apache.commons.lang3.StringUtils;
1922
import org.eclipse.core.resources.IFile;
@@ -25,16 +28,17 @@
2528
import org.slf4j.Logger;
2629
import org.slf4j.LoggerFactory;
2730

28-
import net.sourceforge.pmd.cpd.CPD;
2931
import net.sourceforge.pmd.cpd.CPDConfiguration;
3032
import net.sourceforge.pmd.cpd.CPDReport;
31-
import net.sourceforge.pmd.cpd.Language;
32-
import net.sourceforge.pmd.cpd.LanguageFactory;
33-
import net.sourceforge.pmd.cpd.renderer.CPDReportRenderer;
33+
import net.sourceforge.pmd.cpd.CPDReportRenderer;
34+
import net.sourceforge.pmd.cpd.CpdAnalysis;
35+
import net.sourceforge.pmd.cpd.CpdCapableLanguage;
3436
import net.sourceforge.pmd.eclipse.plugin.PMDPlugin;
3537
import net.sourceforge.pmd.eclipse.runtime.PMDRuntimeConstants;
38+
import net.sourceforge.pmd.eclipse.runtime.cmd.internal.CpdResult;
3639
import net.sourceforge.pmd.eclipse.runtime.properties.IProjectProperties;
3740
import net.sourceforge.pmd.eclipse.runtime.properties.PropertiesException;
41+
import net.sourceforge.pmd.lang.LanguageRegistry;
3842

3943
/**
4044
* This command produces a report of the Cut And Paste detector.
@@ -44,7 +48,7 @@
4448
*/
4549
public class DetectCutAndPasteCmd extends AbstractProjectCommand {
4650

47-
private Language language;
51+
private CpdCapableLanguage language;
4852
private int minTileSize;
4953
private CPDReportRenderer renderer;
5054
private String reportName;
@@ -65,13 +69,13 @@ public DetectCutAndPasteCmd() {
6569
listeners = new ArrayList<>();
6670
}
6771

68-
private void notifyListeners(final CPDReport cpdResult) {
72+
private void notifyListeners(final CpdResult cpdResult) {
6973
// trigger event propertyChanged for all listeners
7074
Display.getDefault().asyncExec(new Runnable() {
7175
@Override
7276
public void run() {
7377
for (IPropertyListener listener : listeners) {
74-
listener.propertyChanged(cpdResult.getMatches(), PMDRuntimeConstants.PROPERTY_CPD);
78+
listener.propertyChanged(cpdResult, PMDRuntimeConstants.PROPERTY_CPD);
7579
}
7680
}
7781
});
@@ -90,13 +94,15 @@ public void execute() {
9094
setStepCount(files.size());
9195
beginTask("Finding suspect Cut And Paste", getStepCount() * 2);
9296

97+
Consumer<CPDReport> renderer = null;
98+
if (createReport) {
99+
renderer = this::renderReport;
100+
}
101+
93102
if (!isCanceled()) {
94-
final CPDReport cpdResult = detectCutAndPaste(files);
103+
final CpdResult cpdResult = detectCutAndPaste(files, renderer);
95104

96105
if (!isCanceled()) {
97-
if (createReport) {
98-
renderReport(cpdResult);
99-
}
100106
notifyListeners(cpdResult);
101107
}
102108
}
@@ -130,7 +136,7 @@ public void reset() {
130136
* The language to set.
131137
*/
132138
public void setLanguage(String theLanguage) {
133-
language = LanguageFactory.createLanguage(theLanguage);
139+
language = (CpdCapableLanguage) LanguageRegistry.CPD.getLanguageById(theLanguage);
134140
}
135141

136142
/**
@@ -206,39 +212,41 @@ private List<File> findCandidateFiles() throws PropertiesException, CoreExceptio
206212
* @return the CPD itself for retrieving the matches.
207213
* @throws CoreException
208214
*/
209-
private CPDReport detectCutAndPaste(final List<File> files) {
215+
private CpdResult detectCutAndPaste(final List<File> files, final Consumer<CPDReport> renderer) {
210216
LOG.debug("Searching for project files");
211217

212-
final CPD cpd = newCPD();
218+
final AtomicReference<CpdResult> reportResult = new AtomicReference<>();
213219

214-
subTask("Collecting files for CPD");
215-
final Iterator<File> fileIterator = files.iterator();
216-
while (fileIterator.hasNext() && !isCanceled()) {
217-
final File file = fileIterator.next();
218-
try {
219-
cpd.add(file);
220+
CPDConfiguration config = new CPDConfiguration();
221+
config.setMinimumTileSize(minTileSize);
222+
config.setOnlyRecognizeLanguage(language);
223+
config.setSourceEncoding(Charset.defaultCharset());
224+
225+
try (CpdAnalysis cpd = CpdAnalysis.create(config)) {
226+
subTask("Collecting files for CPD");
227+
final Iterator<File> fileIterator = files.iterator();
228+
while (fileIterator.hasNext() && !isCanceled()) {
229+
final File file = fileIterator.next();
230+
cpd.files().addFile(file.toPath());
220231
worked(1);
221-
} catch (IOException e) {
222-
LOG.warn("IOException when adding file " + file.getName() + " to CPD. Continuing.", e);
223232
}
224-
}
225233

226-
if (!isCanceled()) {
227-
subTask("Performing CPD");
228-
LOG.debug("Performing CPD");
229-
cpd.go();
230-
worked(getStepCount());
234+
if (!isCanceled()) {
235+
subTask("Performing CPD");
236+
LOG.debug("Performing CPD");
237+
cpd.performAnalysis(r -> {
238+
if (renderer != null) {
239+
renderer.accept(r);
240+
}
241+
reportResult.set(new CpdResult(r));
242+
});
243+
worked(getStepCount());
244+
}
245+
} catch (IOException e) {
246+
LOG.error("IOException while executing CPD", e);
231247
}
232248

233-
return cpd.toReport();
234-
}
235-
236-
private CPD newCPD() {
237-
CPDConfiguration config = new CPDConfiguration();
238-
config.setMinimumTileSize(minTileSize);
239-
config.setLanguage(language);
240-
config.setSourceEncoding(System.getProperty("file.encoding"));
241-
return new CPD(config);
249+
return reportResult.get();
242250
}
243251

244252
/**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
/*
2+
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html
3+
*/
4+
5+
6+
package net.sourceforge.pmd.eclipse.runtime.cmd.internal;
7+
8+
import net.sourceforge.pmd.cpd.Mark;
9+
10+
public class CpdMarkWithSourceCode {
11+
private final Mark mark;
12+
private final CharSequence sourceCode;
13+
14+
public CpdMarkWithSourceCode(CpdResult result, Mark mark) {
15+
this.mark = mark;
16+
sourceCode = result.getSourceCodeSlices().get(this.mark);
17+
}
18+
19+
public Mark getMark() {
20+
return mark;
21+
}
22+
23+
public CharSequence getSourceCode() {
24+
return sourceCode;
25+
}
26+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
/*
2+
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html
3+
*/
4+
5+
6+
package net.sourceforge.pmd.eclipse.runtime.cmd.internal;
7+
8+
import java.util.HashMap;
9+
import java.util.Map;
10+
11+
import net.sourceforge.pmd.cpd.Mark;
12+
import net.sourceforge.pmd.cpd.Match;
13+
14+
public class CpdMatchWithSourceCode {
15+
private final Match match;
16+
private final Map<Mark, CharSequence> sourceCodeSlices = new HashMap<>();
17+
18+
public CpdMatchWithSourceCode(CpdResult result, Match match) {
19+
this.match = match;
20+
for (Mark mark : this.match.getMarkSet()) {
21+
sourceCodeSlices.put(mark, result.getSourceCodeSlices().get(mark));
22+
}
23+
}
24+
25+
public Match getMatch() {
26+
return match;
27+
}
28+
29+
public Map<Mark, CharSequence> getSourceCodeSlices() {
30+
return sourceCodeSlices;
31+
}
32+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
/*
2+
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html
3+
*/
4+
5+
6+
package net.sourceforge.pmd.eclipse.runtime.cmd.internal;
7+
8+
import java.util.ArrayList;
9+
import java.util.HashMap;
10+
import java.util.List;
11+
import java.util.Map;
12+
13+
import net.sourceforge.pmd.cpd.CPDReport;
14+
import net.sourceforge.pmd.cpd.Mark;
15+
import net.sourceforge.pmd.cpd.Match;
16+
17+
public class CpdResult {
18+
private List<Match> matches = new ArrayList<>();
19+
private Map<Mark, CharSequence> sourceCodeSlices = new HashMap<>();
20+
21+
public CpdResult(CPDReport report) {
22+
matches.addAll(report.getMatches());
23+
for (Match match : matches) {
24+
for (Mark mark : match.getMarkSet()) {
25+
sourceCodeSlices.put(mark, report.getSourceCodeSlice(mark));
26+
}
27+
}
28+
}
29+
30+
public List<Match> getMatches() {
31+
return matches;
32+
}
33+
34+
public Map<Mark, CharSequence> getSourceCodeSlices() {
35+
return sourceCodeSlices;
36+
}
37+
}

0 commit comments

Comments
 (0)