diff --git a/ReleaseNotes.md b/ReleaseNotes.md index 2da07934..bf66bf39 100644 --- a/ReleaseNotes.md +++ b/ReleaseNotes.md @@ -13,15 +13,27 @@ This is a minor release. ### New and noteworthy +* Updated to PMD 7.0.0-rc4 * Support for Eclipse 2023-06 added * Support for Eclipse 2022-06 removed ### Fixed Issues * [#181](https://github.com/pmd/pmd-eclipse-plugin/pull/181): Support eclipse 2023-06 +* [#182](https://github.com/pmd/pmd-eclipse-plugin/pull/182): Update to PMD 7.0.0-rc4 ### API Changes +* The deprecated field net.sourceforge.pmd.eclipse.runtime.PMDRuntimeConstants.MAX_VIOLATIONS_DESCRIPTOR has been + removed. +* The following deprecated classes have been removed + * net.sourceforge.pmd.eclipse.ui.preferences.br.FilterManager + * net.sourceforge.pmd.eclipse.ui.preferences.editors.FileEditorFactory + * net.sourceforge.pmd.eclipse.ui.preferences.editors.FloatEditorFactory +* The following packages are not exported anymore, as they don't exist anymore: + * net.sourceforge.pmd.cpd.renderer + * net.sourceforge.pmd.properties.constraints + ### External Contributions ## 30-May-2023: 7.0.0.v20230530-1924-rc3 diff --git a/net.sourceforge.pmd.eclipse.plugin/META-INF/MANIFEST.MF b/net.sourceforge.pmd.eclipse.plugin/META-INF/MANIFEST.MF index 78304be5..6165cd05 100644 --- a/net.sourceforge.pmd.eclipse.plugin/META-INF/MANIFEST.MF +++ b/net.sourceforge.pmd.eclipse.plugin/META-INF/MANIFEST.MF @@ -24,7 +24,6 @@ Bundle-ClassPath: ., target/lib/checker-qual.jar, target/lib/common_2.13.jar, target/lib/commons-lang3.jar, - target/lib/fastparse-v2_2.13.jar, target/lib/geny_2.13.jar, target/lib/groovy.jar, target/lib/gson.jar, @@ -32,7 +31,6 @@ Bundle-ClassPath: ., target/lib/jaxb-api.jar, target/lib/jaxb-core.jar, target/lib/jaxb-impl.jar, - target/lib/jcommander.jar, target/lib/jsoup.jar, target/lib/jul-to-slf4j.jar, target/lib/lenses_2.13.jar, @@ -96,7 +94,6 @@ Export-Package: ch.qos.logback.classic;x-friends:="net.sourceforge.pmd.eclipse.p net.sourceforge.pmd.lang.rule.properties, net.sourceforge.pmd.lang.dfa.report", net.sourceforge.pmd.cpd, - net.sourceforge.pmd.cpd.renderer, net.sourceforge.pmd.eclipse.core;uses:="net.sourceforge.pmd", net.sourceforge.pmd.eclipse.core.impl;x-friends:="net.sourceforge.pmd.eclipse.plugin.test", net.sourceforge.pmd.eclipse.plugin; @@ -138,7 +135,6 @@ Export-Package: ch.qos.logback.classic;x-friends:="net.sourceforge.pmd.eclipse.p net.sourceforge.pmd.lang.rule, net.sourceforge.pmd.lang.rule.xpath, net.sourceforge.pmd.properties, - net.sourceforge.pmd.properties.constraints, net.sourceforge.pmd.renderers, net.sourceforge.pmd.reporting, net.sourceforge.pmd.util;uses:="net.sourceforge.pmd.lang.java.ast", diff --git a/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/plugin/PMDPlugin.java b/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/plugin/PMDPlugin.java index 2dbbe9d2..bef6b3a7 100644 --- a/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/plugin/PMDPlugin.java +++ b/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/plugin/PMDPlugin.java @@ -84,7 +84,6 @@ import net.sourceforge.pmd.eclipse.ui.priority.PriorityDescriptorCache; import net.sourceforge.pmd.eclipse.ui.views.PriorityFilter; import net.sourceforge.pmd.eclipse.util.ResourceManager; -import net.sourceforge.pmd.lang.LanguageRegistry; import net.sourceforge.pmd.lang.LanguageVersion; import net.sourceforge.pmd.lang.java.JavaLanguageModule; import net.sourceforge.pmd.lang.rule.RuleReference; @@ -172,7 +171,7 @@ public static LanguageVersion javaVersionFor(IProject project) { if (jProject.exists()) { String compilerCompliance = jProject.getOption(JavaCore.COMPILER_COMPLIANCE, true); - return LanguageRegistry.getLanguage(JavaLanguageModule.NAME).getVersion(compilerCompliance); + return JavaLanguageModule.getInstance().getVersion(compilerCompliance); } return null; } diff --git a/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/runtime/PMDRuntimeConstants.java b/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/runtime/PMDRuntimeConstants.java index d42699e5..6a49552e 100644 --- a/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/runtime/PMDRuntimeConstants.java +++ b/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/runtime/PMDRuntimeConstants.java @@ -30,15 +30,6 @@ public final class PMDRuntimeConstants { public static final String[] ALL_MARKER_TYPES = new String[] { PMD_MARKER, PMD_DFA_MARKER, PMD_TASKMARKER, PMD_MARKER_1, PMD_MARKER_2, PMD_MARKER_3, PMD_MARKER_4, PMD_MARKER_5 }; - /** - * @deprecated not useful, as the property cannot occur on rules anyway. The default was used always, - * which was 1000 violations. - */ - @Deprecated - public static final net.sourceforge.pmd.properties.IntegerProperty MAX_VIOLATIONS_DESCRIPTOR = - new net.sourceforge.pmd.properties.IntegerProperty("maxviolations", - "Max allowable violations", 1, Integer.MAX_VALUE - 1, 1000, 0f); - public static final String ID_PERSPECTIVE = "net.sourceforge.pmd.eclipse.ui.views.pmdPerspective"; public static final String KEY_MARKERATT_RULENAME = "rulename"; diff --git a/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/runtime/cmd/BaseVisitor.java b/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/runtime/cmd/BaseVisitor.java index d1358e52..38a34bee 100644 --- a/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/runtime/cmd/BaseVisitor.java +++ b/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/runtime/cmd/BaseVisitor.java @@ -275,7 +275,7 @@ protected final void reviewResource(IResource resource) { LanguageVersion languageVersion = languageDiscoverer.getDefaultLanguageVersionForFile(file.getName()); // in case it is java, select the correct java version if (languageVersion != null - && LanguageRegistry.getLanguage(JavaLanguageModule.NAME).equals(languageVersion.getLanguage())) { + && JavaLanguageModule.getInstance().equals(languageVersion.getLanguage())) { languageVersion = PMDPlugin.javaVersionFor(file.getProject()); } if (languageVersion != null) { diff --git a/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/runtime/cmd/CPDVisitor.java b/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/runtime/cmd/CPDVisitor.java index eeee9f87..b4aeba70 100644 --- a/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/runtime/cmd/CPDVisitor.java +++ b/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/runtime/cmd/CPDVisitor.java @@ -17,7 +17,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import net.sourceforge.pmd.cpd.Language; +import net.sourceforge.pmd.cpd.CpdCapableLanguage; import net.sourceforge.pmd.eclipse.runtime.properties.PropertiesException; /** @@ -32,7 +32,7 @@ public class CPDVisitor implements IResourceVisitor { private static final Logger LOG = LoggerFactory.getLogger(CPDVisitor.class); private boolean includeDerivedFiles; private ResourceWorkingSetFilter workingSetFilter; - private Language language; + private CpdCapableLanguage language; private List files; /** @@ -56,7 +56,7 @@ public void setWorkingSet(IWorkingSet workingSet) { * @param language * Only add files with that language */ - public void setLanguage(Language language) { + public void setLanguage(CpdCapableLanguage language) { this.language = language; } @@ -88,7 +88,8 @@ public boolean visit(IResource resource) throws CoreException { File ioFile = file.getLocation().toFile(); try { if (StringUtils.isNotBlank(file.getFileExtension()) - && language.getFileFilter().accept(ioFile, file.getName()) && isFileInWorkingSet(file) + && language.hasExtension(file.getFileExtension()) + && isFileInWorkingSet(file) && (includeDerivedFiles || !file.isDerived())) { LOG.debug("Add file " + resource.getName()); files.add(ioFile); diff --git a/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/runtime/cmd/DetectCutAndPasteCmd.java b/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/runtime/cmd/DetectCutAndPasteCmd.java index 36ed3bd2..10d0306c 100644 --- a/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/runtime/cmd/DetectCutAndPasteCmd.java +++ b/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/runtime/cmd/DetectCutAndPasteCmd.java @@ -11,9 +11,12 @@ import java.io.InputStream; import java.io.OutputStreamWriter; import java.io.Writer; +import java.nio.charset.Charset; import java.util.ArrayList; import java.util.Iterator; import java.util.List; +import java.util.concurrent.atomic.AtomicReference; +import java.util.function.Consumer; import org.apache.commons.lang3.StringUtils; import org.eclipse.core.resources.IFile; @@ -25,16 +28,17 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import net.sourceforge.pmd.cpd.CPD; import net.sourceforge.pmd.cpd.CPDConfiguration; import net.sourceforge.pmd.cpd.CPDReport; -import net.sourceforge.pmd.cpd.Language; -import net.sourceforge.pmd.cpd.LanguageFactory; -import net.sourceforge.pmd.cpd.renderer.CPDReportRenderer; +import net.sourceforge.pmd.cpd.CPDReportRenderer; +import net.sourceforge.pmd.cpd.CpdAnalysis; +import net.sourceforge.pmd.cpd.CpdCapableLanguage; import net.sourceforge.pmd.eclipse.plugin.PMDPlugin; import net.sourceforge.pmd.eclipse.runtime.PMDRuntimeConstants; +import net.sourceforge.pmd.eclipse.runtime.cmd.internal.CpdResult; import net.sourceforge.pmd.eclipse.runtime.properties.IProjectProperties; import net.sourceforge.pmd.eclipse.runtime.properties.PropertiesException; +import net.sourceforge.pmd.lang.LanguageRegistry; /** * This command produces a report of the Cut And Paste detector. @@ -44,7 +48,7 @@ */ public class DetectCutAndPasteCmd extends AbstractProjectCommand { - private Language language; + private CpdCapableLanguage language; private int minTileSize; private CPDReportRenderer renderer; private String reportName; @@ -65,13 +69,13 @@ public DetectCutAndPasteCmd() { listeners = new ArrayList<>(); } - private void notifyListeners(final CPDReport cpdResult) { + private void notifyListeners(final CpdResult cpdResult) { // trigger event propertyChanged for all listeners Display.getDefault().asyncExec(new Runnable() { @Override public void run() { for (IPropertyListener listener : listeners) { - listener.propertyChanged(cpdResult.getMatches(), PMDRuntimeConstants.PROPERTY_CPD); + listener.propertyChanged(cpdResult, PMDRuntimeConstants.PROPERTY_CPD); } } }); @@ -90,13 +94,15 @@ public void execute() { setStepCount(files.size()); beginTask("Finding suspect Cut And Paste", getStepCount() * 2); + Consumer renderer = null; + if (createReport) { + renderer = this::renderReport; + } + if (!isCanceled()) { - final CPDReport cpdResult = detectCutAndPaste(files); + final CpdResult cpdResult = detectCutAndPaste(files, renderer); if (!isCanceled()) { - if (createReport) { - renderReport(cpdResult); - } notifyListeners(cpdResult); } } @@ -130,7 +136,7 @@ public void reset() { * The language to set. */ public void setLanguage(String theLanguage) { - language = LanguageFactory.createLanguage(theLanguage); + language = (CpdCapableLanguage) LanguageRegistry.CPD.getLanguageById(theLanguage); } /** @@ -206,39 +212,41 @@ private List findCandidateFiles() throws PropertiesException, CoreExceptio * @return the CPD itself for retrieving the matches. * @throws CoreException */ - private CPDReport detectCutAndPaste(final List files) { + private CpdResult detectCutAndPaste(final List files, final Consumer renderer) { LOG.debug("Searching for project files"); - final CPD cpd = newCPD(); + final AtomicReference reportResult = new AtomicReference<>(); - subTask("Collecting files for CPD"); - final Iterator fileIterator = files.iterator(); - while (fileIterator.hasNext() && !isCanceled()) { - final File file = fileIterator.next(); - try { - cpd.add(file); + CPDConfiguration config = new CPDConfiguration(); + config.setMinimumTileSize(minTileSize); + config.setOnlyRecognizeLanguage(language); + config.setSourceEncoding(Charset.defaultCharset()); + + try (CpdAnalysis cpd = CpdAnalysis.create(config)) { + subTask("Collecting files for CPD"); + final Iterator fileIterator = files.iterator(); + while (fileIterator.hasNext() && !isCanceled()) { + final File file = fileIterator.next(); + cpd.files().addFile(file.toPath()); worked(1); - } catch (IOException e) { - LOG.warn("IOException when adding file " + file.getName() + " to CPD. Continuing.", e); } - } - if (!isCanceled()) { - subTask("Performing CPD"); - LOG.debug("Performing CPD"); - cpd.go(); - worked(getStepCount()); + if (!isCanceled()) { + subTask("Performing CPD"); + LOG.debug("Performing CPD"); + cpd.performAnalysis(r -> { + if (renderer != null) { + renderer.accept(r); + } + reportResult.set(new CpdResult(r)); + }); + worked(getStepCount()); + } + } catch (IOException e) { + LOG.error("IOException while executing CPD", e); } - return cpd.toReport(); - } - - private CPD newCPD() { - CPDConfiguration config = new CPDConfiguration(); - config.setMinimumTileSize(minTileSize); - config.setLanguage(language); - config.setSourceEncoding(System.getProperty("file.encoding")); - return new CPD(config); + return reportResult.get(); } /** diff --git a/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/runtime/cmd/internal/CpdMarkWithSourceCode.java b/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/runtime/cmd/internal/CpdMarkWithSourceCode.java new file mode 100644 index 00000000..01f765f5 --- /dev/null +++ b/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/runtime/cmd/internal/CpdMarkWithSourceCode.java @@ -0,0 +1,26 @@ +/* + * BSD-style license; for more info see http://pmd.sourceforge.net/license.html + */ + + +package net.sourceforge.pmd.eclipse.runtime.cmd.internal; + +import net.sourceforge.pmd.cpd.Mark; + +public class CpdMarkWithSourceCode { + private final Mark mark; + private final CharSequence sourceCode; + + public CpdMarkWithSourceCode(CpdResult result, Mark mark) { + this.mark = mark; + sourceCode = result.getSourceCodeSlices().get(this.mark); + } + + public Mark getMark() { + return mark; + } + + public CharSequence getSourceCode() { + return sourceCode; + } +} diff --git a/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/runtime/cmd/internal/CpdMatchWithSourceCode.java b/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/runtime/cmd/internal/CpdMatchWithSourceCode.java new file mode 100644 index 00000000..94a27512 --- /dev/null +++ b/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/runtime/cmd/internal/CpdMatchWithSourceCode.java @@ -0,0 +1,32 @@ +/* + * BSD-style license; for more info see http://pmd.sourceforge.net/license.html + */ + + +package net.sourceforge.pmd.eclipse.runtime.cmd.internal; + +import java.util.HashMap; +import java.util.Map; + +import net.sourceforge.pmd.cpd.Mark; +import net.sourceforge.pmd.cpd.Match; + +public class CpdMatchWithSourceCode { + private final Match match; + private final Map sourceCodeSlices = new HashMap<>(); + + public CpdMatchWithSourceCode(CpdResult result, Match match) { + this.match = match; + for (Mark mark : this.match.getMarkSet()) { + sourceCodeSlices.put(mark, result.getSourceCodeSlices().get(mark)); + } + } + + public Match getMatch() { + return match; + } + + public Map getSourceCodeSlices() { + return sourceCodeSlices; + } +} diff --git a/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/runtime/cmd/internal/CpdResult.java b/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/runtime/cmd/internal/CpdResult.java new file mode 100644 index 00000000..d77cd1c0 --- /dev/null +++ b/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/runtime/cmd/internal/CpdResult.java @@ -0,0 +1,37 @@ +/* + * BSD-style license; for more info see http://pmd.sourceforge.net/license.html + */ + + +package net.sourceforge.pmd.eclipse.runtime.cmd.internal; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import net.sourceforge.pmd.cpd.CPDReport; +import net.sourceforge.pmd.cpd.Mark; +import net.sourceforge.pmd.cpd.Match; + +public class CpdResult { + private List matches = new ArrayList<>(); + private Map sourceCodeSlices = new HashMap<>(); + + public CpdResult(CPDReport report) { + matches.addAll(report.getMatches()); + for (Match match : matches) { + for (Mark mark : match.getMarkSet()) { + sourceCodeSlices.put(mark, report.getSourceCodeSlice(mark)); + } + } + } + + public List getMatches() { + return matches; + } + + public Map getSourceCodeSlices() { + return sourceCodeSlices; + } +} diff --git a/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/search/RuleSearchPage.java b/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/search/RuleSearchPage.java index 79df5c03..8f6fa053 100755 --- a/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/search/RuleSearchPage.java +++ b/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/search/RuleSearchPage.java @@ -62,7 +62,7 @@ public void buildLanguageCombo(Composite parent) { Combo languageCombo = new Combo(parent, SWT.READ_ONLY); - Language defaultLanguage = LanguageRegistry.PMD.getLanguageById(JavaLanguageModule.TERSE_NAME); + Language defaultLanguage = JavaLanguageModule.getInstance(); int selectionIndex = -1; int i = 0; diff --git a/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/actions/CPDCheckProjectAction.java b/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/actions/CPDCheckProjectAction.java index 8a9b3e95..f3c65440 100644 --- a/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/actions/CPDCheckProjectAction.java +++ b/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/actions/CPDCheckProjectAction.java @@ -5,6 +5,7 @@ package net.sourceforge.pmd.eclipse.ui.actions; import java.util.Iterator; +import java.util.stream.Collectors; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.IAdaptable; @@ -20,17 +21,18 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import net.sourceforge.pmd.cpd.CPDReportRenderer; import net.sourceforge.pmd.cpd.CSVRenderer; -import net.sourceforge.pmd.cpd.LanguageFactory; import net.sourceforge.pmd.cpd.SimpleRenderer; import net.sourceforge.pmd.cpd.XMLRenderer; -import net.sourceforge.pmd.cpd.renderer.CPDReportRenderer; import net.sourceforge.pmd.eclipse.runtime.PMDRuntimeConstants; import net.sourceforge.pmd.eclipse.runtime.cmd.DetectCutAndPasteCmd; import net.sourceforge.pmd.eclipse.ui.PMDUiConstants; import net.sourceforge.pmd.eclipse.ui.dialogs.CPDCheckDialog; import net.sourceforge.pmd.eclipse.ui.nls.StringKeys; import net.sourceforge.pmd.eclipse.ui.views.cpd2.CPDView2; +import net.sourceforge.pmd.lang.Language; +import net.sourceforge.pmd.lang.LanguageRegistry; /** * Process CPD action menu. Run CPD against the selected project. @@ -52,8 +54,11 @@ public void run(final IAction action) { // NOPMD:UnusedFormalParameter final IWorkbenchPartSite site = targetPartSite(); final ISelection sel = targetSelection(); final Shell shell = site.getShell(); - final String[] languages = LanguageFactory.supportedLanguages; - + final String[] languages = LanguageRegistry.CPD.getLanguages().stream() + .map(Language::getId) + .collect(Collectors.toList()) + .toArray(new String[0]); + final String[] formats = { SIMPLE_KEY, XML_KEY, diff --git a/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/actions/PMDGenerateASTAction.java b/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/actions/PMDGenerateASTAction.java index b03f5fdf..90bab229 100644 --- a/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/actions/PMDGenerateASTAction.java +++ b/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/actions/PMDGenerateASTAction.java @@ -33,10 +33,9 @@ import net.sourceforge.pmd.eclipse.runtime.writer.IAstWriter; import net.sourceforge.pmd.eclipse.runtime.writer.WriterException; import net.sourceforge.pmd.eclipse.ui.nls.StringKeys; -import net.sourceforge.pmd.lang.Language; import net.sourceforge.pmd.lang.LanguageProcessor; import net.sourceforge.pmd.lang.LanguageProcessorRegistry; -import net.sourceforge.pmd.lang.LanguageRegistry; +import net.sourceforge.pmd.lang.PmdCapableLanguage; import net.sourceforge.pmd.lang.ast.ParseException; import net.sourceforge.pmd.lang.ast.Parser; import net.sourceforge.pmd.lang.ast.Parser.ParserTask; @@ -84,7 +83,7 @@ public void run(IAction action) { */ private void generateAST(IFile file) { LOG.info("Generating AST for file " + file.getName()); - Language javaLanguage = LanguageRegistry.PMD.getLanguageById(JavaLanguageModule.TERSE_NAME); + PmdCapableLanguage javaLanguage = JavaLanguageModule.getInstance(); try (Reader reader = new InputStreamReader(file.getContents(), file.getCharset()); ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); LanguageProcessor javaProcessor = javaLanguage.createProcessor(new JavaLanguageProperties()); diff --git a/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/preferences/br/FilterManager.java b/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/preferences/br/FilterManager.java deleted file mode 100644 index 974f083d..00000000 --- a/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/preferences/br/FilterManager.java +++ /dev/null @@ -1,136 +0,0 @@ -/** - * BSD-style license; for more info see http://pmd.sourceforge.net/license.html - */ - -package net.sourceforge.pmd.eclipse.ui.preferences.br; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.apache.commons.lang3.StringUtils; - -import net.sourceforge.pmd.Rule; -import net.sourceforge.pmd.properties.StringProperty; - -/** - * - * @author BrianRemedios - * @deprecated unused and incomplete - */ -@Deprecated -public class FilterManager { - - private String newFilterPrefix; - private final StringProperty filterPropertyDesc; - - private Map> rulesByFilterName; - private Map namesByFilterHash; - - public FilterManager(StringProperty filterDesc, String filterPrefix) { - filterPropertyDesc = filterDesc; - newFilterPrefix = filterPrefix; - } - - public void addFilter(String name, String source) { - // TODO - } - - public void addFilterFrom(Rule rule) { - - if (rulesByFilterName == null) { - rulesByFilterName = new HashMap<>(); - namesByFilterHash = new HashMap<>(); - } - - String filter = rule.getProperty(filterPropertyDesc); - if (StringUtils.isBlank(filter)) { - return; - } - - filter = filter.trim(); - - int hashCode = filter.hashCode(); - String name = namesByFilterHash.get(hashCode); - if (name == null) { - name = newName(); - namesByFilterHash.put(hashCode, name); - rulesByFilterName.put(name, new ArrayList()); - } - - rulesByFilterName.get(name).add(rule); - } - - public void setFilter(String name, Rule rule) { - // TODO - } - - private String newName() { - return newFilterPrefix + namesByFilterHash.size(); - } - - public void setName(String name, String filterSource) { - int code = filterSource.trim().hashCode(); - namesByFilterHash.put(code, name); - } - - public String[] names() { - if (rulesByFilterName == null) { - return new String[0]; - } - return rulesByFilterName.keySet().toArray(new String[rulesByFilterName.size()]); - } - - public int referencesTo(String name) { - if (rulesByFilterName == null) { - return 0; - } - List rules = rulesByFilterName.get(name); - return rules == null ? 0 : rules.size(); - } - - public void modify(String name, String newSource) { - - if (rulesByFilterName == null) { - return; - } - - String theSource = newSource.trim(); - int hash = theSource.hashCode(); - namesByFilterHash.put(hash, name); - - for (Rule rule : rulesByFilterName.get(name)) { - rule.setProperty(filterPropertyDesc, theSource); - } - } - - public void rename(String oldName, String newName) { - // TODO - } - - public void remove(String name) { - for (Rule rule : rulesByFilterName.get(name)) { - rule.setProperty(filterPropertyDesc, null); - } - rulesByFilterName.remove(name); - - int hashKey = 0; // do a reverse lookup - for (Map.Entry entry : namesByFilterHash.entrySet()) { - if (entry.getValue().equals(name)) { - hashKey = entry.getKey(); - break; - } - } - - namesByFilterHash.remove(hashKey); - } - - public void load() { - // TODO - } - - public void save() { - // TODO - } -} diff --git a/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/preferences/br/RuleFieldAccessor.java b/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/preferences/br/RuleFieldAccessor.java index 60075422..10ab46a2 100644 --- a/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/preferences/br/RuleFieldAccessor.java +++ b/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/preferences/br/RuleFieldAccessor.java @@ -7,6 +7,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Set; +import java.util.regex.Pattern; import net.sourceforge.pmd.Rule; import net.sourceforge.pmd.eclipse.plugin.UISettings; @@ -164,14 +165,17 @@ public Comparable valueFor(Rule rule) { RuleFieldAccessor VIOLATION_REGEX = new BasicRuleFieldAccessor() { @Override public Comparable valueFor(Rule rule) { - return rule.getProperty(Rule.VIOLATION_SUPPRESS_REGEX_DESCRIPTOR); + return rule.getProperty(Rule.VIOLATION_SUPPRESS_REGEX_DESCRIPTOR) + .map(Pattern::toString) + .orElse(""); } }; RuleFieldAccessor VIOLATION_XPATH = new BasicRuleFieldAccessor() { @Override public Comparable valueFor(Rule rule) { - return rule.getProperty(Rule.VIOLATION_SUPPRESS_XPATH_DESCRIPTOR); + return rule.getProperty(Rule.VIOLATION_SUPPRESS_XPATH_DESCRIPTOR) + .orElse(""); } }; diff --git a/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/preferences/br/RuleGroup.java b/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/preferences/br/RuleGroup.java index 6208f470..c5c3cfc7 100644 --- a/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/preferences/br/RuleGroup.java +++ b/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/preferences/br/RuleGroup.java @@ -12,7 +12,7 @@ import org.apache.commons.lang3.StringUtils; import net.sourceforge.pmd.Rule; -import net.sourceforge.pmd.properties.StringProperty; +import net.sourceforge.pmd.properties.PropertyDescriptor; /** * Holds a collection of rules as assembled by the tree widget manager. @@ -106,15 +106,16 @@ public Rule[] rules() { * @return String */ // TODO make this into a Generic method - public String commonStringProperty(StringProperty desc) { + public

String commonStringProperty(PropertyDescriptor

desc) { if (rules.isEmpty()) { return null; } - String value = rules.get(0).getProperty(desc); + String value = desc.serializer().toString(rules.get(0).getProperty(desc)); for (int i = 1; i < rules.size(); i++) { - if (!StringUtils.equals(StringUtils.stripToNull(rules.get(i).getProperty(desc)), + String other = desc.serializer().toString(rules.get(i).getProperty(desc)); + if (!StringUtils.equals(StringUtils.stripToNull(other), StringUtils.stripToNull(value))) { return null; } diff --git a/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/preferences/br/RuleSelection.java b/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/preferences/br/RuleSelection.java index ec0df765..0b09d670 100644 --- a/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/preferences/br/RuleSelection.java +++ b/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/preferences/br/RuleSelection.java @@ -25,7 +25,6 @@ import net.sourceforge.pmd.lang.rule.RuleReference; import net.sourceforge.pmd.lang.rule.XPathRule; import net.sourceforge.pmd.properties.PropertyDescriptor; -import net.sourceforge.pmd.properties.StringProperty; /** * Represents a set of selected rules in a rule selection widget. Provides @@ -210,8 +209,12 @@ public static ImplementationType implementationType(Rule rule) { } } - public static String commonStringValueFor(Object item, StringProperty desc) { - return item instanceof Rule ? ((Rule) item).getProperty(desc) : ((RuleGroup) item).commonStringProperty(desc); + public static String commonStringValueFor(Object item, PropertyDescriptor desc) { + if (item instanceof Rule) { + T value = ((Rule) item).getProperty(desc); + return desc.serializer().toString(value); + } + return ((RuleGroup) item).commonStringProperty(desc); } public void setLanguage(final Language language) { @@ -326,7 +329,7 @@ public boolean accept(Rule rule) { return rules; } - public String commonStringValue(StringProperty desc) { + public String commonStringValue(PropertyDescriptor desc) { if (ruleItems == null || ruleItems.length == 0 || desc == null) { return null; } @@ -346,7 +349,7 @@ public String commonStringValue(StringProperty desc) { return value; } - public void setValue(final StringProperty desc, final String value) { + public void setValue(final PropertyDescriptor desc, final String value) { if (ruleItems == null || ruleItems.length == 0) { return; } @@ -354,7 +357,7 @@ public void setValue(final StringProperty desc, final String value) { RuleVisitor visitor = new RuleVisitor() { @Override public boolean accept(Rule rule) { - rule.setProperty(desc, value); + rule.setProperty(desc, desc.serializer().fromString(value)); return true; } }; diff --git a/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/preferences/br/RuleUIUtil.java b/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/preferences/br/RuleUIUtil.java index f4b052a9..2ef8e000 100644 --- a/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/preferences/br/RuleUIUtil.java +++ b/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/preferences/br/RuleUIUtil.java @@ -4,11 +4,13 @@ package net.sourceforge.pmd.eclipse.ui.preferences.br; +import java.lang.reflect.Array; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Locale; import java.util.Map; +import java.util.regex.Pattern; import org.eclipse.swt.SWT; import org.eclipse.swt.events.VerifyEvent; @@ -21,6 +23,7 @@ import net.sourceforge.pmd.eclipse.ui.preferences.panelmanagers.Configuration; import net.sourceforge.pmd.eclipse.util.FontBuilder; import net.sourceforge.pmd.properties.PropertyDescriptor; +import net.sourceforge.pmd.properties.PropertyTypeId; /** * @@ -108,7 +111,48 @@ private static int formatValueOn(StringBuilder target, Map.Entry datatype = entry.getKey().type(); + Class datatype = null; + PropertyTypeId typeId = entry.getKey().getTypeId(); + switch (typeId) { + case BOOLEAN: + datatype = Boolean.class; + break; + case CHARACTER: + datatype = Character.class; + break; + case CHARACTER_LIST: + datatype = Array.newInstance(Character.class, 0).getClass(); + break; + case DOUBLE: + datatype = Double.class; + break; + case DOUBLE_LIST: + datatype = Array.newInstance(Double.class, 0).getClass(); + break; + case INTEGER: + datatype = Integer.class; + break; + case INTEGER_LIST: + datatype = Array.newInstance(Integer.class, 0).getClass(); + break; + case LONG: + datatype = Long.class; + break; + case LONG_LIST: + datatype = Array.newInstance(Long.class, 0).getClass(); + break; + case REGEX: + datatype = Pattern.class; + break; + case STRING: + datatype = String.class; + break; + case STRING_LIST: + datatype = Array.newInstance(String.class, 0).getClass(); + break; + default: + throw new IllegalStateException("Unsupported type: " + typeId); + } boolean isModified = !RuleUtil.isDefaultValue(entry); if (isModified) { diff --git a/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/preferences/editors/DoubleEditorFactory.java b/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/preferences/editors/DoubleEditorFactory.java index a43c0792..af22ccdf 100644 --- a/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/preferences/editors/DoubleEditorFactory.java +++ b/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/preferences/editors/DoubleEditorFactory.java @@ -12,10 +12,10 @@ import net.sourceforge.pmd.eclipse.ui.preferences.br.SizeChangeListener; import net.sourceforge.pmd.eclipse.ui.preferences.br.ValueChangeListener; +import net.sourceforge.pmd.properties.NumericConstraints; import net.sourceforge.pmd.properties.PropertyDescriptor; import net.sourceforge.pmd.properties.PropertyFactory; import net.sourceforge.pmd.properties.PropertySource; -import net.sourceforge.pmd.properties.constraints.NumericConstraints; /** * @author Brian Remedios diff --git a/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/preferences/editors/FileEditorFactory.java b/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/preferences/editors/FileEditorFactory.java deleted file mode 100644 index 6d9f8ded..00000000 --- a/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/preferences/editors/FileEditorFactory.java +++ /dev/null @@ -1,105 +0,0 @@ -/** - * BSD-style license; for more info see http://pmd.sourceforge.net/license.html - */ - -package net.sourceforge.pmd.eclipse.ui.preferences.editors; - -import java.io.File; -import java.util.Objects; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Event; -import org.eclipse.swt.widgets.Listener; - -import net.sourceforge.pmd.eclipse.ui.preferences.br.SizeChangeListener; -import net.sourceforge.pmd.eclipse.ui.preferences.br.ValueChangeListener; -import net.sourceforge.pmd.properties.FileProperty; -import net.sourceforge.pmd.properties.PropertyDescriptor; -import net.sourceforge.pmd.properties.PropertySource; - -/** - * @author Brian Remedios - * - * @deprecated will be removed - */ -@Deprecated -public class FileEditorFactory extends AbstractEditorFactory { - - - public static final FileEditorFactory INSTANCE = new FileEditorFactory(); - - - protected FileEditorFactory() { - // protected default constructor for subclassing - } - - - @Override - public PropertyDescriptor createDescriptor(String name, String description, Control[] otherData) { - return new FileProperty( - name, - description, - new File(""), - 0.0f - ); - } - - - @Override - public Control newEditorOn(Composite parent, final PropertyDescriptor desc, final PropertySource source, - final ValueChangeListener listener, SizeChangeListener sizeListener) { - - final FilePicker picker = new FilePicker(parent, SWT.SINGLE | SWT.BORDER, "Open", null); - picker.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); - - fillWidget(picker, desc, source); - - picker.addFocusOutListener(new Listener() { - @Override - public void handleEvent(Event event) { - File newValue = picker.getFile(); - File existingValue = valueFor(source, desc); - if (areSemanticEquals(existingValue, newValue)) { - return; - } - - setValue(source, desc, newValue); - fillWidget(picker, desc, source); // redraw - listener.changed(source, desc, newValue); - } - }); - - return picker; - } - - - protected void fillWidget(FilePicker fileWidget, PropertyDescriptor desc, PropertySource source) { - File val = valueFor(source, desc); - fileWidget.setFile(val); - adjustRendering(source, desc, fileWidget); - } - - - public static boolean areSemanticEquals(File fileA, File fileB) { - return Objects.equals(fileA, fileB); - } - - - private void setValue(PropertySource source, PropertyDescriptor desc, File value) { - - if (!source.hasDescriptor(desc)) { - return; - } - source.setProperty(desc, value); - } - - - @Override - protected File valueFrom(Control valueControl) { - return ((FilePicker) valueControl).getFile(); - } - -} diff --git a/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/preferences/editors/FloatEditorFactory.java b/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/preferences/editors/FloatEditorFactory.java deleted file mode 100644 index b9d35623..00000000 --- a/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/preferences/editors/FloatEditorFactory.java +++ /dev/null @@ -1,76 +0,0 @@ -/** - * BSD-style license; for more info see http://pmd.sourceforge.net/license.html - */ - -package net.sourceforge.pmd.eclipse.ui.preferences.editors; - -import org.eclipse.swt.events.ModifyEvent; -import org.eclipse.swt.events.ModifyListener; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Spinner; - -import net.sourceforge.pmd.eclipse.ui.preferences.br.SizeChangeListener; -import net.sourceforge.pmd.eclipse.ui.preferences.br.ValueChangeListener; -import net.sourceforge.pmd.properties.FloatProperty; -import net.sourceforge.pmd.properties.NumericPropertyDescriptor; -import net.sourceforge.pmd.properties.PropertyDescriptor; -import net.sourceforge.pmd.properties.PropertySource; - -/** - * @author Brian Remedios - * - * @deprecated This type is unused and won't be supported in the future by PMD - */ -@Deprecated -public final class FloatEditorFactory extends AbstractRealNumberEditor { - - public static final FloatEditorFactory INSTANCE = new FloatEditorFactory(); - - - private FloatEditorFactory() { } - - - @Override - public PropertyDescriptor createDescriptor(String name, String description, Control[] otherData) { - return new FloatProperty( - name, - description, - defaultIn(otherData).floatValue(), - minimumIn(otherData).floatValue(), - maximumIn(otherData).floatValue(), - 0.0f - ); - } - - - @Override - protected Float valueFrom(Control valueControl) { - return (float) (((Spinner) valueControl).getSelection() / SCALE); - } - - - @Override - public Control newEditorOn(Composite parent, final PropertyDescriptor desc, final PropertySource source, - final ValueChangeListener listener, SizeChangeListener sizeListener) { - - final Spinner spinner = newSpinnerFor(parent, source, (NumericPropertyDescriptor) desc); - - spinner.addModifyListener(new ModifyListener() { - @Override - public void modifyText(ModifyEvent event) { - Float newValue = (float) (spinner.getSelection() / SCALE); - if (newValue.equals(valueFor(source, desc))) { - return; - } - - source.setProperty(desc, newValue); - listener.changed(source, desc, newValue); - - adjustRendering(source, desc, spinner); - } - }); - - return spinner; - } -} diff --git a/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/preferences/editors/IntegerEditorFactory.java b/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/preferences/editors/IntegerEditorFactory.java index 35b7d41f..c5bcc751 100644 --- a/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/preferences/editors/IntegerEditorFactory.java +++ b/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/preferences/editors/IntegerEditorFactory.java @@ -12,10 +12,10 @@ import net.sourceforge.pmd.eclipse.ui.preferences.br.SizeChangeListener; import net.sourceforge.pmd.eclipse.ui.preferences.br.ValueChangeListener; +import net.sourceforge.pmd.properties.NumericConstraints; import net.sourceforge.pmd.properties.PropertyDescriptor; import net.sourceforge.pmd.properties.PropertyFactory; import net.sourceforge.pmd.properties.PropertySource; -import net.sourceforge.pmd.properties.constraints.NumericConstraints; /** * @author Brian Remedios diff --git a/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/preferences/editors/MultiEnumerationEditorFactory.java b/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/preferences/editors/MultiEnumerationEditorFactory.java index 86a9312b..193b8ce8 100755 --- a/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/preferences/editors/MultiEnumerationEditorFactory.java +++ b/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/preferences/editors/MultiEnumerationEditorFactory.java @@ -16,7 +16,6 @@ import org.eclipse.swt.widgets.Text; import net.sourceforge.pmd.eclipse.ui.preferences.br.ValueChangeListener; -import net.sourceforge.pmd.properties.EnumeratedPropertyDescriptor; import net.sourceforge.pmd.properties.PropertyDescriptor; import net.sourceforge.pmd.properties.PropertySource; @@ -66,10 +65,7 @@ protected Object addValueIn(Control widget, PropertyDescriptor> des @Override protected boolean canAddNewRowFor(PropertyDescriptor> desc, PropertySource source) { - EnumeratedPropertyDescriptor> multi - = (EnumeratedPropertyDescriptor>) desc; - - Object[] choices = choices(multi); + Object[] choices = choices(desc); List values = source.getProperty(desc); return choices.length > values.size(); @@ -81,12 +77,9 @@ protected Control addWidget(Composite parent, Object value, PropertyDescriptor> ep - = (EnumeratedPropertyDescriptor>) desc; - // TODO remove all choices already chosen by previous widgets - combo.setItems(SWTUtil.labelsIn(choices(ep), 0)); - int selectionIdx = EnumerationEditorFactory.indexOf(value, choices(ep)); + combo.setItems(SWTUtil.labelsIn(choices(desc), 0)); + int selectionIdx = EnumerationEditorFactory.indexOf(value, choices(desc)); if (selectionIdx >= 0) { combo.select(selectionIdx); } diff --git a/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/preferences/editors/MultiIntegerEditorFactory.java b/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/preferences/editors/MultiIntegerEditorFactory.java index 77c5c6f0..c2120f47 100644 --- a/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/preferences/editors/MultiIntegerEditorFactory.java +++ b/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/preferences/editors/MultiIntegerEditorFactory.java @@ -17,10 +17,10 @@ import org.eclipse.swt.widgets.Text; import net.sourceforge.pmd.eclipse.ui.preferences.br.ValueChangeListener; +import net.sourceforge.pmd.properties.NumericConstraints; import net.sourceforge.pmd.properties.PropertyDescriptor; import net.sourceforge.pmd.properties.PropertyFactory; import net.sourceforge.pmd.properties.PropertySource; -import net.sourceforge.pmd.properties.constraints.NumericConstraints; /** * Behaviour: Provide a set of widgets that allows the user to pick a range of integer values. The selected values can diff --git a/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/preferences/panelmanagers/AbstractRulePanelManager.java b/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/preferences/panelmanagers/AbstractRulePanelManager.java index 63c52728..f586427c 100644 --- a/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/preferences/panelmanagers/AbstractRulePanelManager.java +++ b/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/preferences/panelmanagers/AbstractRulePanelManager.java @@ -32,7 +32,6 @@ import net.sourceforge.pmd.eclipse.util.ColourManager; import net.sourceforge.pmd.eclipse.util.ResourceManager; import net.sourceforge.pmd.properties.PropertyDescriptor; -import net.sourceforge.pmd.properties.StringProperty; /** * Concrete subclasses can also be used as tab folders outside of a wizard @@ -220,7 +219,7 @@ protected Rule soleRule() { return rules.soleRule(); } - protected void addTextListeners(final Text control, final StringProperty desc) { + protected void addTextListeners(final Text control, final PropertyDescriptor desc) { control.addListener(SWT.FocusOut, new Listener() { @Override public void handleEvent(Event event) { @@ -229,7 +228,7 @@ public void handleEvent(Event event) { }); } - protected void addTextListeners(final StyledText control, final StringProperty desc) { + protected void addTextListeners(final StyledText control, final PropertyDescriptor desc) { control.addListener(SWT.FocusOut, new Listener() { @Override public void handleEvent(Event event) { @@ -259,7 +258,7 @@ protected void initializeOn(Composite parent) { // changeListener.changed(rules, null, ""); // } - protected void changed(StringProperty property, String newValue) { + protected void changed(PropertyDescriptor property, String newValue) { if (rules == null) { return; } diff --git a/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/preferences/panelmanagers/ExclusionPanelManager.java b/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/preferences/panelmanagers/ExclusionPanelManager.java index 8f62523e..cef7b56c 100644 --- a/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/preferences/panelmanagers/ExclusionPanelManager.java +++ b/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/preferences/panelmanagers/ExclusionPanelManager.java @@ -25,7 +25,7 @@ import net.sourceforge.pmd.eclipse.ui.preferences.br.ValueChangeListener; import net.sourceforge.pmd.eclipse.ui.preferences.editors.SWTUtil; import net.sourceforge.pmd.eclipse.util.ColourManager; -import net.sourceforge.pmd.properties.StringProperty; +import net.sourceforge.pmd.properties.PropertyDescriptor; /** * Manages the UI form for rule exclusion fields for a designated property rule. @@ -74,7 +74,7 @@ protected List fieldErrors() { return Collections.emptyList(); } - private void addListeners(final Text control, final StringProperty desc, final Control colourWindow) { + private void addListeners(final Text control, final PropertyDescriptor desc, final Control colourWindow) { addTextListeners(control, desc); control.addModifyListener(new ModifyListener() { @@ -89,7 +89,7 @@ public void modifyText(ModifyEvent e) { }); } - private void addListeners(final StyledText control, final StringProperty desc, final Control colourWindow) { + private void addListeners(final StyledText control, final PropertyDescriptor desc, final Control colourWindow) { addTextListeners(control, desc); control.addModifyListener(new ModifyListener() { diff --git a/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/preferences/panelmanagers/FormArranger.java b/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/preferences/panelmanagers/FormArranger.java index f7e3c59b..66527bea 100644 --- a/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/preferences/panelmanagers/FormArranger.java +++ b/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/preferences/panelmanagers/FormArranger.java @@ -13,6 +13,7 @@ import java.util.Locale; import java.util.Map; import java.util.Objects; +import java.util.regex.Pattern; import org.eclipse.jface.window.Window; import org.eclipse.swt.SWT; @@ -38,6 +39,7 @@ import net.sourceforge.pmd.lang.rule.XPathRule; import net.sourceforge.pmd.properties.PropertyDescriptor; import net.sourceforge.pmd.properties.PropertySource; +import net.sourceforge.pmd.properties.PropertyTypeId; /** * Takes in a property source instance, extracts its properties, creates a series of type-specific editors for each, and @@ -98,8 +100,62 @@ protected void register(PropertyDescriptor property, Control[] controls) { } private EditorFactory factoryFor(PropertyDescriptor desc) { - Class type = desc.type(); - if (desc.isMultiValue()) { + PropertyTypeId typeId = desc.getTypeId(); + boolean multivalued; + Class type; + switch (typeId) { + case BOOLEAN: + type = Boolean.class; + multivalued = false; + break; + case CHARACTER: + type = Character.class; + multivalued = false; + break; + case CHARACTER_LIST: + type = Character.class; + multivalued = true; + break; + case DOUBLE: + type = Double.class; + multivalued = false; + break; + case DOUBLE_LIST: + type = Double.class; + multivalued = true; + break; + case INTEGER: + type = Integer.class; + multivalued = false; + break; + case INTEGER_LIST: + type = Integer.class; + multivalued = true; + break; + case LONG: + type = Long.class; + multivalued = false; + break; + case LONG_LIST: + type = Long.class; + multivalued = true; + break; + case STRING: + type = String.class; + multivalued = false; + break; + case STRING_LIST: + type = String.class; + multivalued = true; + break; + case REGEX: + type = Pattern.class; + multivalued = false; + break; + default: + throw new IllegalStateException("Unsupported type: " + typeId); + } + if (multivalued) { // assume it is a array type (type[]) type = Array.newInstance(type, 0).getClass(); } diff --git a/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/preferences/panelmanagers/RulePanelManager.java b/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/preferences/panelmanagers/RulePanelManager.java index f3509ecd..937940c9 100755 --- a/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/preferences/panelmanagers/RulePanelManager.java +++ b/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/preferences/panelmanagers/RulePanelManager.java @@ -491,7 +491,7 @@ private Combo buildLanguageCombo(Composite parent) { final Combo combo = new Combo(parent, SWT.READ_ONLY); - Language deflt = LanguageRegistry.PMD.getLanguageById(JavaLanguageModule.TERSE_NAME); + Language deflt = JavaLanguageModule.getInstance(); int selectionIndex = -1; for (int i = 0; i < languages.size(); i++) { diff --git a/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/preferences/panelmanagers/SummaryPanelManager.java b/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/preferences/panelmanagers/SummaryPanelManager.java index 3f3618a7..a7636627 100755 --- a/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/preferences/panelmanagers/SummaryPanelManager.java +++ b/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/preferences/panelmanagers/SummaryPanelManager.java @@ -96,7 +96,7 @@ public void showFor(Rule rule) { int longest = longestNameIn(valuesByDescriptor); for (Map.Entry, Object> entry : valuesByDescriptor.entrySet()) { PropertyDescriptor desc = entry.getKey(); - pb.addText(pad(desc.name(), longest, ' ') + '\t' + asLabel(desc.type())); + pb.addText(pad(desc.name(), longest, ' ') + '\t' + asLabel(entry.getValue().getClass())); } } diff --git a/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/reports/ReportManager.java b/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/reports/ReportManager.java index 484a7516..e8d35247 100644 --- a/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/reports/ReportManager.java +++ b/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/reports/ReportManager.java @@ -132,7 +132,7 @@ private static boolean loadReportProperties(String propertyFilename) { for (PropertyDescriptor pDesc : renderer.getPropertyDescriptors()) { String key = keyOf(renderer, pDesc); if (props.containsKey(key)) { - Object value = pDesc.valueFrom((String) props.get(key)); + Object value = pDesc.serializer().fromString(props.getProperty(key)); renderer.setProperty(pDesc, value); } } @@ -154,7 +154,7 @@ private static void saveReportProperties(String propertyFilename) { Map, Object> valuesByProp = renderer.getPropertiesByPropertyDescriptor(); for (Map.Entry, Object> entry : valuesByProp.entrySet()) { PropertyDescriptor desc = entry.getKey(); - props.put(keyOf(renderer, desc), desc.asDelimitedString(entry.getValue())); + props.put(keyOf(renderer, desc), desc.serializer().toString(entry.getValue())); } } diff --git a/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/views/ast/XPathEvaluator.java b/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/views/ast/XPathEvaluator.java index a1ec9848..34546824 100644 --- a/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/views/ast/XPathEvaluator.java +++ b/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/views/ast/XPathEvaluator.java @@ -13,7 +13,6 @@ import net.sourceforge.pmd.RuleViolation; import net.sourceforge.pmd.eclipse.ui.actions.RuleSetUtil; import net.sourceforge.pmd.eclipse.util.internal.SpyingRule; -import net.sourceforge.pmd.lang.LanguageRegistry; import net.sourceforge.pmd.lang.LanguageVersion; import net.sourceforge.pmd.lang.ast.Node; import net.sourceforge.pmd.lang.document.FileId; @@ -52,7 +51,7 @@ public Node getCompilationUnit(String source) { } private LanguageVersion getLanguageVersion() { - return LanguageRegistry.PMD.getLanguageByFullName(JavaLanguageModule.NAME).getDefaultVersion(); + return JavaLanguageModule.getInstance().getDefaultVersion(); } /** diff --git a/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/views/cpd/CPDView.java b/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/views/cpd/CPDView.java index 85333ff8..b5dd0bc3 100644 --- a/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/views/cpd/CPDView.java +++ b/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/views/cpd/CPDView.java @@ -25,6 +25,9 @@ import net.sourceforge.pmd.cpd.Match; import net.sourceforge.pmd.eclipse.plugin.PMDPlugin; import net.sourceforge.pmd.eclipse.runtime.PMDRuntimeConstants; +import net.sourceforge.pmd.eclipse.runtime.cmd.internal.CpdMarkWithSourceCode; +import net.sourceforge.pmd.eclipse.runtime.cmd.internal.CpdMatchWithSourceCode; +import net.sourceforge.pmd.eclipse.runtime.cmd.internal.CpdResult; import net.sourceforge.pmd.eclipse.ui.nls.StringKeys; /** @@ -120,29 +123,28 @@ public void setFocus() { /** * Sets input for the table. - * @param matches CPD Command that contain the matches from the CPD + * @param result CPD results with matches and source code slices from the CPD */ - public void setData(Iterator matches) { + public void setData(CpdResult result) { List elements = new ArrayList<>(); - if (matches != null) { - // iterate the matches - for (int count = 0; matches.hasNext() && count < MAX_MATCHES; count++) { - Match match = matches.next(); - - // create a treenode for the match and add to the list - TreeNode matchNode = new TreeNode(match); // NOPMD by Sven on 02.11.06 11:27 - elements.add(matchNode); - - // create the children of the match - TreeNode[] children = new TreeNode[match.getMarkCount()]; // NOPMD by Sven on 02.11.06 11:28 - Iterator entryIterator = match.getMarkSet().iterator(); - for (int j = 0; entryIterator.hasNext(); j++) { - final Mark entry = entryIterator.next(); - children[j] = new TreeNode(entry); // NOPMD by Sven on 02.11.06 11:28 - children[j].setParent(matchNode); - } - matchNode.setChildren(children); + // iterate the matches + for (int count = 0; count < result.getMatches().size() && count < MAX_MATCHES; count++) { + Match match = result.getMatches().get(count); + CpdMatchWithSourceCode data = new CpdMatchWithSourceCode(result, match); + + // create a treenode for the match and add to the list + TreeNode matchNode = new TreeNode(data); // NOPMD by Sven on 02.11.06 11:27 + elements.add(matchNode); + + // create the children of the match + TreeNode[] children = new TreeNode[match.getMarkCount()]; // NOPMD by Sven on 02.11.06 11:28 + Iterator entryIterator = match.getMarkSet().iterator(); + for (int j = 0; entryIterator.hasNext(); j++) { + final CpdMarkWithSourceCode entry = new CpdMarkWithSourceCode(result, entryIterator.next()); + children[j] = new TreeNode(entry); // NOPMD by Sven on 02.11.06 11:28 + children[j].setParent(matchNode); } + matchNode.setChildren(children); } // set the children of the rootnode: the matches @@ -154,11 +156,11 @@ public void setData(Iterator matches) { */ @Override public void propertyChanged(Object source, int propId) { - if (propId == PMDRuntimeConstants.PROPERTY_CPD && source instanceof Iterator) { - Iterator iter = (Iterator) source; + if (propId == PMDRuntimeConstants.PROPERTY_CPD && source instanceof CpdResult) { + CpdResult result = (CpdResult) source; // after setdata(iter) iter.hasNext will always return false - boolean hasResults = iter.hasNext(); - setData(iter); + boolean hasResults = !result.getMatches().isEmpty(); + setData(result); if (!hasResults) { // no entries MessageBox box = new MessageBox(this.treeViewer.getControl().getShell()); diff --git a/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/views/cpd/CPDViewDoubleClickEventListener.java b/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/views/cpd/CPDViewDoubleClickEventListener.java index 644e2e73..77c3c6a7 100644 --- a/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/views/cpd/CPDViewDoubleClickEventListener.java +++ b/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/views/cpd/CPDViewDoubleClickEventListener.java @@ -21,10 +21,13 @@ import org.eclipse.ui.ide.IDE; import org.eclipse.ui.texteditor.ITextEditor; +import net.sourceforge.pmd.cpd.Mark; import net.sourceforge.pmd.cpd.Match; -import net.sourceforge.pmd.cpd.TokenEntry; import net.sourceforge.pmd.eclipse.plugin.PMDPlugin; +import net.sourceforge.pmd.eclipse.runtime.cmd.internal.CpdMarkWithSourceCode; +import net.sourceforge.pmd.eclipse.runtime.cmd.internal.CpdMatchWithSourceCode; import net.sourceforge.pmd.eclipse.ui.nls.StringKeys; +import net.sourceforge.pmd.lang.document.FileLocation; /** * @@ -49,7 +52,7 @@ public void doubleClick(DoubleClickEvent event) { final Object value = node.getValue(); final TreeViewer treeViewer = view.getTreeViewer(); - if (value instanceof Match) { + if (value instanceof CpdMatchWithSourceCode) { if (treeViewer.getExpandedState(node)) { // the node is expanded, so collapse treeViewer.collapseToLevel(node, TreeViewer.ALL_LEVELS); @@ -57,17 +60,20 @@ public void doubleClick(DoubleClickEvent event) { // the node is collapsed, so expand treeViewer.expandToLevel(node, 1); } - } else if (value instanceof TokenEntry) { - final TokenEntry entry = (TokenEntry) value; - final Match match = (Match) node.getParent().getValue(); + } else if (value instanceof CpdMarkWithSourceCode) { + final CpdMarkWithSourceCode entry = (CpdMarkWithSourceCode) value; + final CpdMatchWithSourceCode match = (CpdMatchWithSourceCode) node.getParent().getValue(); highlightText(match, entry); } } - private void highlightText(Match match, TokenEntry entry) { + private void highlightText(CpdMatchWithSourceCode matchWithSource, CpdMarkWithSourceCode markWithSource) { // open file and jump to the startline + Match match = matchWithSource.getMatch(); + Mark entry = markWithSource.getMark(); + FileLocation location = entry.getLocation(); - final IPath path = Path.fromOSString(entry.getTokenSrcID()); + final IPath path = Path.fromOSString(location.getFileId().getOriginalPath()); final IFile file = ResourcesPlugin.getWorkspace().getRoot().getFileForLocation(path); if (file == null) { return; @@ -81,8 +87,8 @@ private void highlightText(Match match, TokenEntry entry) { // select text final ITextEditor textEditor = (ITextEditor) part; final IDocument document = textEditor.getDocumentProvider().getDocument(textEditor.getEditorInput()); - final int offset = document.getLineOffset(entry.getBeginLine() - 1); - final int length = document.getLineOffset(entry.getBeginLine() - 1 + match.getLineCount()) - offset - 1; + final int offset = document.getLineOffset(location.getStartLine() - 1); + final int length = document.getLineOffset(location.getStartLine() - 1 + match.getLineCount()) - offset - 1; textEditor.selectAndReveal(offset, length); } } catch (PartInitException | BadLocationException pie) { diff --git a/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/views/cpd/CPDViewLabelProvider.java b/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/views/cpd/CPDViewLabelProvider.java index 78ac1b87..b047c990 100644 --- a/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/views/cpd/CPDViewLabelProvider.java +++ b/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/views/cpd/CPDViewLabelProvider.java @@ -16,8 +16,11 @@ import org.eclipse.ui.PlatformUI; import org.eclipse.ui.ide.IDE.SharedImages; +import net.sourceforge.pmd.cpd.Mark; import net.sourceforge.pmd.cpd.Match; -import net.sourceforge.pmd.cpd.TokenEntry; +import net.sourceforge.pmd.eclipse.runtime.cmd.internal.CpdMarkWithSourceCode; +import net.sourceforge.pmd.eclipse.runtime.cmd.internal.CpdMatchWithSourceCode; +import net.sourceforge.pmd.lang.document.FileLocation; /** * @@ -37,9 +40,9 @@ public Image getColumnImage(Object element, int columnIndex) { // the second Column gets an Image depending on, // if the Element is a Match or TokenEntry if (columnIndex == 1) { - if (value instanceof Match) { + if (value instanceof CpdMatchWithSourceCode) { image = PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJS_ERROR_TSK); - } else if (value instanceof TokenEntry) { + } else if (value instanceof CpdMarkWithSourceCode) { image = PlatformUI.getWorkbench().getSharedImages().getImage(SharedImages.IMG_OPEN_MARKER); } } @@ -58,8 +61,9 @@ public String getColumnText(Object element, int columnIndex) { switch (columnIndex) { // show the message case 2: - if (value instanceof Match) { - final Match match = (Match) value; + if (value instanceof CpdMatchWithSourceCode) { + final CpdMatchWithSourceCode data = (CpdMatchWithSourceCode) value; + final Match match = data.getMatch(); final StringBuilder buffer = new StringBuilder(50); buffer.append("Found suspect cut & paste ("); buffer.append(match.getMarkCount()).append(" matches,"); @@ -70,12 +74,14 @@ public String getColumnText(Object element, int columnIndex) { buffer.append(" lines)"); } result = buffer.toString(); - } else if (value instanceof TokenEntry) { - final TokenEntry entry = (TokenEntry) value; - final Match match = (Match) node.getParent().getValue(); - final int startLine = entry.getBeginLine(); - final int endLine = entry.getBeginLine() + match.getLineCount() - 1; - final IPath path = Path.fromOSString(entry.getTokenSrcID()); + } else if (value instanceof CpdMarkWithSourceCode) { + final CpdMarkWithSourceCode data = (CpdMarkWithSourceCode) value; + final Mark entry = data.getMark(); + final FileLocation location = entry.getLocation(); + final Match match = ((CpdMatchWithSourceCode) node.getParent().getValue()).getMatch(); + final int startLine = location.getStartLine(); + final int endLine = location.getStartLine() + match.getLineCount() - 1; + final IPath path = Path.fromOSString(location.getFileId().getOriginalPath()); final StringBuilder buffer = new StringBuilder(100); if (startLine == endLine) { buffer.append("line ").append(startLine); @@ -87,9 +93,9 @@ public String getColumnText(Object element, int columnIndex) { } break; case 3: - if (value instanceof TokenEntry) { - final TokenEntry entry = (TokenEntry) value; - final IPath path = Path.fromOSString(entry.getTokenSrcID()); + if (value instanceof CpdMarkWithSourceCode) { + final CpdMarkWithSourceCode data = (CpdMarkWithSourceCode) value; + final IPath path = Path.fromOSString(data.getMark().getLocation().getFileId().getOriginalPath()); final IResource resource = ResourcesPlugin.getWorkspace().getRoot().getContainerForLocation(path); if (resource != null) { result = resource.getProjectRelativePath().removeFileExtension().toString().replace(IPath.SEPARATOR, '.'); diff --git a/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/views/cpd/CPDViewTooltipListener.java b/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/views/cpd/CPDViewTooltipListener.java index 367564b7..7a985cb8 100644 --- a/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/views/cpd/CPDViewTooltipListener.java +++ b/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/views/cpd/CPDViewTooltipListener.java @@ -19,7 +19,8 @@ import org.eclipse.swt.widgets.Tree; import org.eclipse.swt.widgets.TreeItem; -import net.sourceforge.pmd.cpd.Match; +import net.sourceforge.pmd.cpd.Mark; +import net.sourceforge.pmd.eclipse.runtime.cmd.internal.CpdMatchWithSourceCode; /** * This class is created for showing the source code of a tablerow via a @@ -89,8 +90,8 @@ public void handleEvent(Event event) { case SWT.MouseHover: if (item != null) { final TreeNode node = (TreeNode) item.getData(); - if (node.getValue() instanceof Match) { - final Match match = (Match) node.getValue(); + if (node.getValue() instanceof CpdMatchWithSourceCode) { + final CpdMatchWithSourceCode match = (CpdMatchWithSourceCode) node.getValue(); final String text = createText(match); showTooltip(item, text); } @@ -102,8 +103,9 @@ public void handleEvent(Event event) { } } - private String createText(Match match) { - final String text = match.getSourceCodeSlice().replaceAll("\t", " "); + private String createText(CpdMatchWithSourceCode match) { + Mark firstMark = match.getMatch().getFirstMark(); + final String text = match.getSourceCodeSlices().get(firstMark).toString().replaceAll("\t", " "); final StringBuilder outputString = new StringBuilder(); final StringTokenizer lines = new StringTokenizer(text, "\n"); for (int i = 0; lines.hasMoreTokens(); i++) { diff --git a/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/views/cpd2/CPDView2.java b/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/views/cpd2/CPDView2.java index 07ab240e..e9c21077 100644 --- a/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/views/cpd2/CPDView2.java +++ b/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/views/cpd2/CPDView2.java @@ -35,9 +35,12 @@ import org.eclipse.ui.PartInitException; import org.eclipse.ui.part.ViewPart; +import net.sourceforge.pmd.cpd.Mark; import net.sourceforge.pmd.cpd.Match; import net.sourceforge.pmd.eclipse.plugin.PMDPlugin; import net.sourceforge.pmd.eclipse.runtime.PMDRuntimeConstants; +import net.sourceforge.pmd.eclipse.runtime.cmd.internal.CpdMatchWithSourceCode; +import net.sourceforge.pmd.eclipse.runtime.cmd.internal.CpdResult; import net.sourceforge.pmd.eclipse.ui.nls.StringKeys; import net.sourceforge.pmd.eclipse.util.internal.StringUtil; @@ -89,9 +92,10 @@ public static String[] partsOf(String fullName) { return new String[] { fullName.substring(0, pos + 1), fullName.substring(pos + 1) }; } - public static String[] sourceLinesFrom(Match match, boolean trimLeadingWhitespace) { + public static String[] sourceLinesFrom(CpdMatchWithSourceCode match, boolean trimLeadingWhitespace) { + Mark firstMark = match.getMatch().getFirstMark(); - final String text = match.getSourceCodeSlice().replaceAll("\t", TAB_EQUIVALENT); + final String text = match.getSourceCodeSlices().get(firstMark).toString().replaceAll("\t", TAB_EQUIVALENT); final StringTokenizer lines = new StringTokenizer(text, "\n"); List sourceLines = new ArrayList<>(); @@ -344,30 +348,28 @@ public void setFocus() { /** * Sets input for the table. * - * @param matches - * CPD Command that contain the matches from the CPD + * @param result CPD results with matches and source code from CPD */ - public void setData(Iterator matches) { + public void setData(CpdResult result) { List elements = new ArrayList<>(); - if (matches != null) { - for (Match match : asList(matches)) { - // create a treenode for the match and add to the list - TreeNode matchNode = new TreeNode(match); - elements.add(matchNode); - - String[] lines = sourceLinesFrom(match, true); - TreeNode[] children = new TreeNode[lines.length]; - - for (int j = 0; j < lines.length; j++) { - String line = lines[j]; - if (line == null) { - System.out.println(); - } - children[j] = new TreeNode(line); - children[j].setParent(matchNode); + for (Match match : asList(result.getMatches().iterator())) { + CpdMatchWithSourceCode matchWithSource = new CpdMatchWithSourceCode(result, match); + // create a treenode for the match and add to the list + TreeNode matchNode = new TreeNode(matchWithSource); + elements.add(matchNode); + + String[] lines = sourceLinesFrom(matchWithSource, true); + TreeNode[] children = new TreeNode[lines.length]; + + for (int j = 0; j < lines.length; j++) { + String line = lines[j]; + if (line == null) { + System.out.println(); } - matchNode.setChildren(children); + children[j] = new TreeNode(line); + children[j].setParent(matchNode); } + matchNode.setChildren(children); } // set the children of the rootnode: the matches @@ -380,11 +382,11 @@ public void setData(Iterator matches) { */ @Override public void propertyChanged(Object source, int propId) { - if (propId == PMDRuntimeConstants.PROPERTY_CPD && source instanceof Iterator) { - Iterator iter = (Iterator) source; + if (propId == PMDRuntimeConstants.PROPERTY_CPD && source instanceof CpdResult) { + CpdResult result = (CpdResult) source; // after setdata(iter) iter.hasNext will always return false - boolean hasResults = iter.hasNext(); - setData(iter); + boolean hasResults = !result.getMatches().isEmpty(); + setData(result); if (!hasResults) { // no entries MessageBox box = new MessageBox(this.treeViewer.getControl().getShell()); diff --git a/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/views/cpd2/CPDViewLabelProvider2.java b/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/views/cpd2/CPDViewLabelProvider2.java index 11380911..45ed01a3 100644 --- a/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/views/cpd2/CPDViewLabelProvider2.java +++ b/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/views/cpd2/CPDViewLabelProvider2.java @@ -22,7 +22,8 @@ import net.sourceforge.pmd.cpd.Mark; import net.sourceforge.pmd.cpd.Match; -import net.sourceforge.pmd.cpd.TokenEntry; +import net.sourceforge.pmd.eclipse.runtime.cmd.internal.CpdMarkWithSourceCode; +import net.sourceforge.pmd.eclipse.runtime.cmd.internal.CpdMatchWithSourceCode; /** * @@ -42,10 +43,10 @@ public Image getColumnImage(Object element, int columnIndex) { // the second Column gets an Image depending on, // if the Element is a Match or TokenEntry if (columnIndex == 0) { - if (value instanceof Match) { + if (value instanceof CpdMatchWithSourceCode) { // image = // PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJS_ERROR_TSK); - } else if (value instanceof TokenEntry) { + } else if (value instanceof CpdMarkWithSourceCode) { image = PlatformUI.getWorkbench().getSharedImages().getImage(SharedImages.IMG_OPEN_MARKER); } } @@ -67,7 +68,7 @@ private int lineCountFor(TreeNode node) { } public static String pathFor(Mark entry) { - final IPath path = Path.fromOSString(entry.getFilename()); + final IPath path = Path.fromOSString(entry.getLocation().getFileId().getOriginalPath()); final IResource resource = ResourcesPlugin.getWorkspace().getRoot().getContainerForLocation(path); if (resource != null) { return resource.getProjectRelativePath().removeFileExtension().toString().replace(IPath.SEPARATOR, '.'); diff --git a/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/views/cpd2/CPDViewTooltipListener2.java b/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/views/cpd2/CPDViewTooltipListener2.java index 7e269eb6..d36188ed 100644 --- a/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/views/cpd2/CPDViewTooltipListener2.java +++ b/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/views/cpd2/CPDViewTooltipListener2.java @@ -30,6 +30,7 @@ import net.sourceforge.pmd.cpd.Match; import net.sourceforge.pmd.eclipse.plugin.PMDPlugin; import net.sourceforge.pmd.eclipse.ui.nls.StringKeys; +import net.sourceforge.pmd.lang.document.FileLocation; /** * @@ -54,8 +55,9 @@ private void initialize() { // open file and jump to the startline private void highlight(Match match, Mark entry) { + FileLocation location = entry.getLocation(); - IPath path = Path.fromOSString(entry.getFilename()); + IPath path = Path.fromOSString(location.getFileId().getOriginalPath()); IFile file = ResourcesPlugin.getWorkspace().getRoot().getFileForLocation(path); if (file == null) { return; @@ -69,8 +71,8 @@ private void highlight(Match match, Mark entry) { // select text ITextEditor textEditor = (ITextEditor) part; IDocument document = textEditor.getDocumentProvider().getDocument(textEditor.getEditorInput()); - int offset = document.getLineOffset(entry.getBeginLine() - 1); - int length = document.getLineOffset(entry.getBeginLine() - 1 + match.getLineCount()) - offset - 1; + int offset = document.getLineOffset(location.getStartLine() - 1); + int length = document.getLineOffset(location.getStartLine() - 1 + match.getLineCount()) - offset - 1; textEditor.selectAndReveal(offset, length); } } catch (PartInitException | BadLocationException pie) { diff --git a/pom.xml b/pom.xml index 74353229..fe6cc713 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ 3.0.4 UTF-8 - 7.0.0-rc3 + 7.0.0-SNAPSHOT 22 10.7.0 3.2.2