From 1b5f7e8baedb07e0ea2067adb384cddf3e100dea Mon Sep 17 00:00:00 2001 From: Andreas Dangel Date: Fri, 13 May 2022 19:56:47 +0200 Subject: [PATCH 1/3] [core] Remember forced language per file Fixes #3970 --- docs/pages/release_notes.md | 2 ++ .../sourceforge/pmd/SourceCodeProcessor.java | 2 +- .../pmd/lang/LanguageVersionDiscoverer.java | 28 ++++++++++++--- .../pmd/lang/document/FileCollector.java | 4 ++- .../net/sourceforge/pmd/PmdAnalysisTest.java | 35 +++++++++++++++++++ .../pmd/lang/Dummy2LanguageModule.java | 4 +++ .../resources/sample-source/dummy/foo.txt | 1 + 7 files changed, 70 insertions(+), 6 deletions(-) create mode 100644 pmd-core/src/test/resources/sample-source/dummy/foo.txt diff --git a/docs/pages/release_notes.md b/docs/pages/release_notes.md index c31a705241f..1770a48672d 100644 --- a/docs/pages/release_notes.md +++ b/docs/pages/release_notes.md @@ -16,6 +16,8 @@ This is a {{ site.pmd.release_type }} release. ### Fixed Issues +* core + * [#3970](https://github.com/pmd/pmd/issues/3970): \[core] FileCollector.addFile ignores language parameter * javascript * [#3948](https://github.com/pmd/pmd/issues/3948): \[js] Invalid operator error for method property in object literal diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/SourceCodeProcessor.java b/pmd-core/src/main/java/net/sourceforge/pmd/SourceCodeProcessor.java index 7d1838c2977..f52b0f2a2ac 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/SourceCodeProcessor.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/SourceCodeProcessor.java @@ -222,7 +222,7 @@ private void determineLanguage(RuleContext ctx) { ctx.setLanguageVersion(forceLanguage); } else { // otherwise determine by file extension - LanguageVersion languageVersion = configuration.getLanguageVersionOfFile(ctx.getSourceCodeFilename()); + LanguageVersion languageVersion = configuration.getLanguageVersionOfFile(ctx.getSourceCodeFile().toString()); ctx.setLanguageVersion(languageVersion); } } diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/lang/LanguageVersionDiscoverer.java b/pmd-core/src/main/java/net/sourceforge/pmd/lang/LanguageVersionDiscoverer.java index 4e22b03a4f1..27c72898e1e 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/lang/LanguageVersionDiscoverer.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/lang/LanguageVersionDiscoverer.java @@ -5,6 +5,8 @@ package net.sourceforge.pmd.lang; import java.io.File; +import java.io.IOException; +import java.nio.file.Path; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -12,6 +14,7 @@ import org.apache.commons.lang3.StringUtils; +import net.sourceforge.pmd.annotation.InternalApi; import net.sourceforge.pmd.internal.util.AssertionUtil; /** @@ -24,6 +27,8 @@ public class LanguageVersionDiscoverer { private LanguageVersion forcedVersion; + private Map forcedVersionByFile = new HashMap<>(); + public LanguageVersionDiscoverer() { this(null); } @@ -97,10 +102,13 @@ public LanguageVersion getDefaultLanguageVersionForFile(File sourceFile) { * file. */ public LanguageVersion getDefaultLanguageVersionForFile(String fileName) { - List languages = getLanguagesForFile(fileName); - LanguageVersion languageVersion = null; - if (!languages.isEmpty()) { - languageVersion = getDefaultLanguageVersion(languages.get(0)); + LanguageVersion languageVersion = forcedVersionByFile.get(fileName); + + if (languageVersion == null) { + List languages = getLanguagesForFile(fileName); + if (!languages.isEmpty()) { + languageVersion = getDefaultLanguageVersion(languages.get(0)); + } } return languageVersion; } @@ -142,4 +150,16 @@ private String getExtension(String fileName) { } + + @InternalApi + @Deprecated + public void recordLanguageVersionForFile(Path file, LanguageVersion languageVersion) { + String fileName; + try { + fileName = file.toRealPath().toString(); + } catch (IOException e) { + fileName = file.toAbsolutePath().toString(); + } + forcedVersionByFile.put(fileName, languageVersion); + } } diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/lang/document/FileCollector.java b/pmd-core/src/main/java/net/sourceforge/pmd/lang/document/FileCollector.java index 8db97175c36..51d84106c4a 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/lang/document/FileCollector.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/lang/document/FileCollector.java @@ -155,8 +155,10 @@ public boolean addFile(Path file, Language language) { reporter.error("Not a regular file {0}", file); return false; } - NioTextFile nioTextFile = new NioTextFile(file, charset, discoverer.getDefaultLanguageVersion(language), getDisplayName(file)); + LanguageVersion languageVersion = discoverer.getDefaultLanguageVersion(language); + NioTextFile nioTextFile = new NioTextFile(file, charset, languageVersion, getDisplayName(file)); addFileImpl(nioTextFile); + discoverer.recordLanguageVersionForFile(file, languageVersion); return true; } diff --git a/pmd-core/src/test/java/net/sourceforge/pmd/PmdAnalysisTest.java b/pmd-core/src/test/java/net/sourceforge/pmd/PmdAnalysisTest.java index 4ec5555cf97..797f4e0569d 100644 --- a/pmd-core/src/test/java/net/sourceforge/pmd/PmdAnalysisTest.java +++ b/pmd-core/src/test/java/net/sourceforge/pmd/PmdAnalysisTest.java @@ -14,10 +14,17 @@ import static org.mockito.Mockito.verify; import java.io.IOException; +import java.nio.file.Paths; +import java.util.List; +import org.junit.Assert; import org.junit.Test; import org.mockito.ArgumentMatchers; +import net.sourceforge.pmd.lang.Dummy2LanguageModule; +import net.sourceforge.pmd.lang.Language; +import net.sourceforge.pmd.lang.ast.Node; +import net.sourceforge.pmd.lang.rule.AbstractRule; import net.sourceforge.pmd.renderers.Renderer; /** @@ -72,4 +79,32 @@ public void testRulesetWhenSomeoneHasAnError() { } } + @Test + public void testFileWithSpecificLanguage() { + final Language language = Dummy2LanguageModule.getInstance(); + PMDConfiguration config = new PMDConfiguration(); + config.setIgnoreIncrementalAnalysis(true); + RuleSet ruleset = RuleSet.forSingleRule(new TestRule()); + + try (PmdAnalysis pmd = PmdAnalysis.create(config)) { + pmd.addRuleSet(ruleset); + pmd.files().addFile(Paths.get("src", "test", "resources", "sample-source", "dummy", "foo.txt"), language); + Report report = pmd.performAnalysisAndCollectReport(); + Assert.assertEquals(0, report.getProcessingErrors().size()); + Assert.assertEquals(1, report.getViolations().size()); + } + } + + public static class TestRule extends AbstractRule { + public TestRule() { + setLanguage(Dummy2LanguageModule.getInstance()); + setMessage("dummy 2 test rule"); + } + + @Override + public void apply(List nodes, RuleContext ctx) { + ctx.addViolation(nodes.get(0)); + } + } + } diff --git a/pmd-core/src/test/java/net/sourceforge/pmd/lang/Dummy2LanguageModule.java b/pmd-core/src/test/java/net/sourceforge/pmd/lang/Dummy2LanguageModule.java index e5a8de77cb6..9d71d220101 100644 --- a/pmd-core/src/test/java/net/sourceforge/pmd/lang/Dummy2LanguageModule.java +++ b/pmd-core/src/test/java/net/sourceforge/pmd/lang/Dummy2LanguageModule.java @@ -16,4 +16,8 @@ public Dummy2LanguageModule() { super(NAME, null, TERSE_NAME, "dummy2"); addVersion("1.0", new DummyLanguageModule.Handler(), true); } + + public static Language getInstance() { + return LanguageRegistry.getLanguage(NAME); + } } diff --git a/pmd-core/src/test/resources/sample-source/dummy/foo.txt b/pmd-core/src/test/resources/sample-source/dummy/foo.txt new file mode 100644 index 00000000000..adaad871778 --- /dev/null +++ b/pmd-core/src/test/resources/sample-source/dummy/foo.txt @@ -0,0 +1 @@ +A dummy file with file extension txt. From 815242a39af6d9e84eaaf638d5c62d73e1fd541e Mon Sep 17 00:00:00 2001 From: Andreas Dangel Date: Fri, 29 Jul 2022 12:12:39 +0200 Subject: [PATCH 2/3] [core] Store languageVersion in DataSource in order to support FileCollector.addFile with language Fixes #3970 --- .../sourceforge/pmd/SourceCodeProcessor.java | 2 +- .../pmd/lang/LanguageVersionDiscoverer.java | 28 +++---------------- .../pmd/lang/document/FileCollector.java | 4 +-- .../pmd/lang/document/NioTextFile.java | 4 +-- .../pmd/lang/document/StringTextFile.java | 7 +++-- .../pmd/processor/PmdRunnable.java | 4 +++ .../internal/FileDataSourceWithLanguage.java | 26 +++++++++++++++++ .../internal/LanguageAwareDataSource.java | 13 +++++++++ .../ReaderDataSourceWithLanguage.java | 26 +++++++++++++++++ .../net/sourceforge/pmd/PmdAnalysisTest.java | 23 +++++++++++++++ .../pmd/lang/document/SimpleTestTextFile.java | 17 +++++++++++ 11 files changed, 121 insertions(+), 33 deletions(-) create mode 100644 pmd-core/src/main/java/net/sourceforge/pmd/util/datasource/internal/FileDataSourceWithLanguage.java create mode 100644 pmd-core/src/main/java/net/sourceforge/pmd/util/datasource/internal/LanguageAwareDataSource.java create mode 100644 pmd-core/src/main/java/net/sourceforge/pmd/util/datasource/internal/ReaderDataSourceWithLanguage.java create mode 100644 pmd-core/src/test/java/net/sourceforge/pmd/lang/document/SimpleTestTextFile.java diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/SourceCodeProcessor.java b/pmd-core/src/main/java/net/sourceforge/pmd/SourceCodeProcessor.java index f52b0f2a2ac..7d1838c2977 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/SourceCodeProcessor.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/SourceCodeProcessor.java @@ -222,7 +222,7 @@ private void determineLanguage(RuleContext ctx) { ctx.setLanguageVersion(forceLanguage); } else { // otherwise determine by file extension - LanguageVersion languageVersion = configuration.getLanguageVersionOfFile(ctx.getSourceCodeFile().toString()); + LanguageVersion languageVersion = configuration.getLanguageVersionOfFile(ctx.getSourceCodeFilename()); ctx.setLanguageVersion(languageVersion); } } diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/lang/LanguageVersionDiscoverer.java b/pmd-core/src/main/java/net/sourceforge/pmd/lang/LanguageVersionDiscoverer.java index 27c72898e1e..4e22b03a4f1 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/lang/LanguageVersionDiscoverer.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/lang/LanguageVersionDiscoverer.java @@ -5,8 +5,6 @@ package net.sourceforge.pmd.lang; import java.io.File; -import java.io.IOException; -import java.nio.file.Path; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -14,7 +12,6 @@ import org.apache.commons.lang3.StringUtils; -import net.sourceforge.pmd.annotation.InternalApi; import net.sourceforge.pmd.internal.util.AssertionUtil; /** @@ -27,8 +24,6 @@ public class LanguageVersionDiscoverer { private LanguageVersion forcedVersion; - private Map forcedVersionByFile = new HashMap<>(); - public LanguageVersionDiscoverer() { this(null); } @@ -102,13 +97,10 @@ public LanguageVersion getDefaultLanguageVersionForFile(File sourceFile) { * file. */ public LanguageVersion getDefaultLanguageVersionForFile(String fileName) { - LanguageVersion languageVersion = forcedVersionByFile.get(fileName); - - if (languageVersion == null) { - List languages = getLanguagesForFile(fileName); - if (!languages.isEmpty()) { - languageVersion = getDefaultLanguageVersion(languages.get(0)); - } + List languages = getLanguagesForFile(fileName); + LanguageVersion languageVersion = null; + if (!languages.isEmpty()) { + languageVersion = getDefaultLanguageVersion(languages.get(0)); } return languageVersion; } @@ -150,16 +142,4 @@ private String getExtension(String fileName) { } - - @InternalApi - @Deprecated - public void recordLanguageVersionForFile(Path file, LanguageVersion languageVersion) { - String fileName; - try { - fileName = file.toRealPath().toString(); - } catch (IOException e) { - fileName = file.toAbsolutePath().toString(); - } - forcedVersionByFile.put(fileName, languageVersion); - } } diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/lang/document/FileCollector.java b/pmd-core/src/main/java/net/sourceforge/pmd/lang/document/FileCollector.java index 51d84106c4a..8db97175c36 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/lang/document/FileCollector.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/lang/document/FileCollector.java @@ -155,10 +155,8 @@ public boolean addFile(Path file, Language language) { reporter.error("Not a regular file {0}", file); return false; } - LanguageVersion languageVersion = discoverer.getDefaultLanguageVersion(language); - NioTextFile nioTextFile = new NioTextFile(file, charset, languageVersion, getDisplayName(file)); + NioTextFile nioTextFile = new NioTextFile(file, charset, discoverer.getDefaultLanguageVersion(language), getDisplayName(file)); addFileImpl(nioTextFile); - discoverer.recordLanguageVersionForFile(file, languageVersion); return true; } diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/lang/document/NioTextFile.java b/pmd-core/src/main/java/net/sourceforge/pmd/lang/document/NioTextFile.java index c7d77e1de88..8fc154967a1 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/lang/document/NioTextFile.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/lang/document/NioTextFile.java @@ -17,7 +17,7 @@ import net.sourceforge.pmd.lang.LanguageVersion; import net.sourceforge.pmd.util.IOUtil; import net.sourceforge.pmd.util.datasource.DataSource; -import net.sourceforge.pmd.util.datasource.FileDataSource; +import net.sourceforge.pmd.util.datasource.internal.FileDataSourceWithLanguage; /** * A {@link TextFile} backed by a file in some {@link FileSystem}. @@ -73,7 +73,7 @@ public String readContents() throws IOException { @Override public DataSource toDataSourceCompat() { - return new FileDataSource(path.toFile()); + return new FileDataSourceWithLanguage(path.toFile(), languageVersion); } @Override diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/lang/document/StringTextFile.java b/pmd-core/src/main/java/net/sourceforge/pmd/lang/document/StringTextFile.java index 598823e555c..db2f537eeeb 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/lang/document/StringTextFile.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/lang/document/StringTextFile.java @@ -11,7 +11,7 @@ import net.sourceforge.pmd.internal.util.AssertionUtil; import net.sourceforge.pmd.lang.LanguageVersion; import net.sourceforge.pmd.util.datasource.DataSource; -import net.sourceforge.pmd.util.datasource.ReaderDataSource; +import net.sourceforge.pmd.util.datasource.internal.ReaderDataSourceWithLanguage; /** * Read-only view on a string. @@ -64,9 +64,10 @@ public String readContents() { @Override public DataSource toDataSourceCompat() { - return new ReaderDataSource( + return new ReaderDataSourceWithLanguage( new StringReader(content), - pathId + pathId, + languageVersion ); } diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/processor/PmdRunnable.java b/pmd-core/src/main/java/net/sourceforge/pmd/processor/PmdRunnable.java index da91fbd95a6..e4b1d75de62 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/processor/PmdRunnable.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/processor/PmdRunnable.java @@ -21,6 +21,7 @@ import net.sourceforge.pmd.benchmark.TimeTracker; import net.sourceforge.pmd.renderers.Renderer; import net.sourceforge.pmd.util.datasource.DataSource; +import net.sourceforge.pmd.util.datasource.internal.LanguageAwareDataSource; /** * @@ -82,6 +83,9 @@ public Report call() { try (InputStream stream = new BufferedInputStream(dataSource.getInputStream())) { tc.ruleContext.setLanguageVersion(null); + if (dataSource instanceof LanguageAwareDataSource) { + tc.ruleContext.setLanguageVersion(((LanguageAwareDataSource) dataSource).getLanguageVersion()); + } sourceCodeProcessor.processSourceCode(stream, tc.ruleSets, tc.ruleContext); } catch (PMDException pmde) { addError(report, pmde, "Error while processing file: " + fileName); diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/util/datasource/internal/FileDataSourceWithLanguage.java b/pmd-core/src/main/java/net/sourceforge/pmd/util/datasource/internal/FileDataSourceWithLanguage.java new file mode 100644 index 00000000000..7ca0e1c8a46 --- /dev/null +++ b/pmd-core/src/main/java/net/sourceforge/pmd/util/datasource/internal/FileDataSourceWithLanguage.java @@ -0,0 +1,26 @@ +/* + * BSD-style license; for more info see http://pmd.sourceforge.net/license.html + */ + +package net.sourceforge.pmd.util.datasource.internal; + +import java.io.File; + +import net.sourceforge.pmd.annotation.InternalApi; +import net.sourceforge.pmd.lang.LanguageVersion; +import net.sourceforge.pmd.util.datasource.FileDataSource; + +@InternalApi +public class FileDataSourceWithLanguage extends FileDataSource implements LanguageAwareDataSource { + private final LanguageVersion languageVersion; + + public FileDataSourceWithLanguage(File file, LanguageVersion languageVersion) { + super(file); + this.languageVersion = languageVersion; + } + + @Override + public LanguageVersion getLanguageVersion() { + return languageVersion; + } +} diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/util/datasource/internal/LanguageAwareDataSource.java b/pmd-core/src/main/java/net/sourceforge/pmd/util/datasource/internal/LanguageAwareDataSource.java new file mode 100644 index 00000000000..69dbf67059d --- /dev/null +++ b/pmd-core/src/main/java/net/sourceforge/pmd/util/datasource/internal/LanguageAwareDataSource.java @@ -0,0 +1,13 @@ +/* + * BSD-style license; for more info see http://pmd.sourceforge.net/license.html + */ + +package net.sourceforge.pmd.util.datasource.internal; + +import net.sourceforge.pmd.annotation.InternalApi; +import net.sourceforge.pmd.lang.LanguageVersion; + +@InternalApi +public interface LanguageAwareDataSource { + LanguageVersion getLanguageVersion(); +} diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/util/datasource/internal/ReaderDataSourceWithLanguage.java b/pmd-core/src/main/java/net/sourceforge/pmd/util/datasource/internal/ReaderDataSourceWithLanguage.java new file mode 100644 index 00000000000..e96429e65d6 --- /dev/null +++ b/pmd-core/src/main/java/net/sourceforge/pmd/util/datasource/internal/ReaderDataSourceWithLanguage.java @@ -0,0 +1,26 @@ +/* + * BSD-style license; for more info see http://pmd.sourceforge.net/license.html + */ + +package net.sourceforge.pmd.util.datasource.internal; + +import java.io.Reader; + +import net.sourceforge.pmd.annotation.InternalApi; +import net.sourceforge.pmd.lang.LanguageVersion; +import net.sourceforge.pmd.util.datasource.ReaderDataSource; + +@InternalApi +public class ReaderDataSourceWithLanguage extends ReaderDataSource implements LanguageAwareDataSource { + private final LanguageVersion languageVersion; + + public ReaderDataSourceWithLanguage(Reader reader, String dataSourceName, LanguageVersion languageVersion) { + super(reader, dataSourceName); + this.languageVersion = languageVersion; + } + + @Override + public LanguageVersion getLanguageVersion() { + return languageVersion; + } +} diff --git a/pmd-core/src/test/java/net/sourceforge/pmd/PmdAnalysisTest.java b/pmd-core/src/test/java/net/sourceforge/pmd/PmdAnalysisTest.java index 797f4e0569d..a1f2f0f1569 100644 --- a/pmd-core/src/test/java/net/sourceforge/pmd/PmdAnalysisTest.java +++ b/pmd-core/src/test/java/net/sourceforge/pmd/PmdAnalysisTest.java @@ -24,6 +24,7 @@ import net.sourceforge.pmd.lang.Dummy2LanguageModule; import net.sourceforge.pmd.lang.Language; import net.sourceforge.pmd.lang.ast.Node; +import net.sourceforge.pmd.lang.document.SimpleTestTextFile; import net.sourceforge.pmd.lang.rule.AbstractRule; import net.sourceforge.pmd.renderers.Renderer; @@ -90,6 +91,28 @@ public void testFileWithSpecificLanguage() { pmd.addRuleSet(ruleset); pmd.files().addFile(Paths.get("src", "test", "resources", "sample-source", "dummy", "foo.txt"), language); Report report = pmd.performAnalysisAndCollectReport(); + for (Report.ProcessingError error : report.getProcessingErrors()) { + System.out.println("error = " + error.getMsg() + ": " + error.getDetail()); + } + Assert.assertEquals(0, report.getProcessingErrors().size()); + Assert.assertEquals(1, report.getViolations().size()); + } + } + + @Test + public void testTextFileWithSpecificLanguage() { + final Language language = Dummy2LanguageModule.getInstance(); + PMDConfiguration config = new PMDConfiguration(); + config.setIgnoreIncrementalAnalysis(true); + RuleSet ruleset = RuleSet.forSingleRule(new TestRule()); + + try (PmdAnalysis pmd = PmdAnalysis.create(config)) { + pmd.addRuleSet(ruleset); + pmd.files().addFile(new SimpleTestTextFile("test content foo", "foo.txt", "foo.txt", language.getDefaultVersion())); + Report report = pmd.performAnalysisAndCollectReport(); + for (Report.ProcessingError error : report.getProcessingErrors()) { + System.out.println("error = " + error.getMsg() + ": " + error.getDetail()); + } Assert.assertEquals(0, report.getProcessingErrors().size()); Assert.assertEquals(1, report.getViolations().size()); } diff --git a/pmd-core/src/test/java/net/sourceforge/pmd/lang/document/SimpleTestTextFile.java b/pmd-core/src/test/java/net/sourceforge/pmd/lang/document/SimpleTestTextFile.java new file mode 100644 index 00000000000..6f663471427 --- /dev/null +++ b/pmd-core/src/test/java/net/sourceforge/pmd/lang/document/SimpleTestTextFile.java @@ -0,0 +1,17 @@ +/* + * BSD-style license; for more info see http://pmd.sourceforge.net/license.html + */ + +package net.sourceforge.pmd.lang.document; + +import net.sourceforge.pmd.lang.LanguageVersion; + +/** + * Makes {@link StringTextFile} publicly available for unit tests. + */ +public class SimpleTestTextFile extends StringTextFile { + + public SimpleTestTextFile(String content, String pathId, String displayName, LanguageVersion languageVersion) { + super(content, pathId, displayName, languageVersion); + } +} From ca87fe51e37676d613f68c1a9d9d7bd222dbee69 Mon Sep 17 00:00:00 2001 From: Andreas Dangel Date: Fri, 29 Jul 2022 15:24:30 +0200 Subject: [PATCH 3/3] Fixups from review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Clément Fournier --- .../pmd/lang/document/NioTextFile.java | 5 +-- .../pmd/lang/document/StringTextFile.java | 7 ++-- .../internal/FileDataSourceWithLanguage.java | 26 --------------- .../internal/LanguageAwareDataSource.java | 33 +++++++++++++++++-- .../ReaderDataSourceWithLanguage.java | 26 --------------- 5 files changed, 38 insertions(+), 59 deletions(-) delete mode 100644 pmd-core/src/main/java/net/sourceforge/pmd/util/datasource/internal/FileDataSourceWithLanguage.java delete mode 100644 pmd-core/src/main/java/net/sourceforge/pmd/util/datasource/internal/ReaderDataSourceWithLanguage.java diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/lang/document/NioTextFile.java b/pmd-core/src/main/java/net/sourceforge/pmd/lang/document/NioTextFile.java index 8fc154967a1..16ab46f93ff 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/lang/document/NioTextFile.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/lang/document/NioTextFile.java @@ -17,7 +17,8 @@ import net.sourceforge.pmd.lang.LanguageVersion; import net.sourceforge.pmd.util.IOUtil; import net.sourceforge.pmd.util.datasource.DataSource; -import net.sourceforge.pmd.util.datasource.internal.FileDataSourceWithLanguage; +import net.sourceforge.pmd.util.datasource.FileDataSource; +import net.sourceforge.pmd.util.datasource.internal.LanguageAwareDataSource; /** * A {@link TextFile} backed by a file in some {@link FileSystem}. @@ -73,7 +74,7 @@ public String readContents() throws IOException { @Override public DataSource toDataSourceCompat() { - return new FileDataSourceWithLanguage(path.toFile(), languageVersion); + return new LanguageAwareDataSource(new FileDataSource(path.toFile()), languageVersion); } @Override diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/lang/document/StringTextFile.java b/pmd-core/src/main/java/net/sourceforge/pmd/lang/document/StringTextFile.java index db2f537eeeb..c4d286d8950 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/lang/document/StringTextFile.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/lang/document/StringTextFile.java @@ -11,7 +11,8 @@ import net.sourceforge.pmd.internal.util.AssertionUtil; import net.sourceforge.pmd.lang.LanguageVersion; import net.sourceforge.pmd.util.datasource.DataSource; -import net.sourceforge.pmd.util.datasource.internal.ReaderDataSourceWithLanguage; +import net.sourceforge.pmd.util.datasource.ReaderDataSource; +import net.sourceforge.pmd.util.datasource.internal.LanguageAwareDataSource; /** * Read-only view on a string. @@ -64,9 +65,9 @@ public String readContents() { @Override public DataSource toDataSourceCompat() { - return new ReaderDataSourceWithLanguage( + return new LanguageAwareDataSource(new ReaderDataSource( new StringReader(content), - pathId, + pathId), languageVersion ); } diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/util/datasource/internal/FileDataSourceWithLanguage.java b/pmd-core/src/main/java/net/sourceforge/pmd/util/datasource/internal/FileDataSourceWithLanguage.java deleted file mode 100644 index 7ca0e1c8a46..00000000000 --- a/pmd-core/src/main/java/net/sourceforge/pmd/util/datasource/internal/FileDataSourceWithLanguage.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * BSD-style license; for more info see http://pmd.sourceforge.net/license.html - */ - -package net.sourceforge.pmd.util.datasource.internal; - -import java.io.File; - -import net.sourceforge.pmd.annotation.InternalApi; -import net.sourceforge.pmd.lang.LanguageVersion; -import net.sourceforge.pmd.util.datasource.FileDataSource; - -@InternalApi -public class FileDataSourceWithLanguage extends FileDataSource implements LanguageAwareDataSource { - private final LanguageVersion languageVersion; - - public FileDataSourceWithLanguage(File file, LanguageVersion languageVersion) { - super(file); - this.languageVersion = languageVersion; - } - - @Override - public LanguageVersion getLanguageVersion() { - return languageVersion; - } -} diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/util/datasource/internal/LanguageAwareDataSource.java b/pmd-core/src/main/java/net/sourceforge/pmd/util/datasource/internal/LanguageAwareDataSource.java index 69dbf67059d..407001e1028 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/util/datasource/internal/LanguageAwareDataSource.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/util/datasource/internal/LanguageAwareDataSource.java @@ -4,10 +4,39 @@ package net.sourceforge.pmd.util.datasource.internal; +import java.io.IOException; +import java.io.InputStream; + import net.sourceforge.pmd.annotation.InternalApi; import net.sourceforge.pmd.lang.LanguageVersion; +import net.sourceforge.pmd.util.datasource.DataSource; @InternalApi -public interface LanguageAwareDataSource { - LanguageVersion getLanguageVersion(); +public class LanguageAwareDataSource implements DataSource { + private final DataSource base; // delegate DataSource methods to this + private final LanguageVersion version; + + public LanguageAwareDataSource(DataSource base, LanguageVersion version) { + this.base = base; + this.version = version; + } + + public LanguageVersion getLanguageVersion() { + return version; + } + + @Override + public InputStream getInputStream() throws IOException { + return base.getInputStream(); + } + + @Override + public String getNiceFileName(boolean shortNames, String inputFileName) { + return base.getNiceFileName(shortNames, inputFileName); + } + + @Override + public void close() throws IOException { + base.close(); + } } diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/util/datasource/internal/ReaderDataSourceWithLanguage.java b/pmd-core/src/main/java/net/sourceforge/pmd/util/datasource/internal/ReaderDataSourceWithLanguage.java deleted file mode 100644 index e96429e65d6..00000000000 --- a/pmd-core/src/main/java/net/sourceforge/pmd/util/datasource/internal/ReaderDataSourceWithLanguage.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * BSD-style license; for more info see http://pmd.sourceforge.net/license.html - */ - -package net.sourceforge.pmd.util.datasource.internal; - -import java.io.Reader; - -import net.sourceforge.pmd.annotation.InternalApi; -import net.sourceforge.pmd.lang.LanguageVersion; -import net.sourceforge.pmd.util.datasource.ReaderDataSource; - -@InternalApi -public class ReaderDataSourceWithLanguage extends ReaderDataSource implements LanguageAwareDataSource { - private final LanguageVersion languageVersion; - - public ReaderDataSourceWithLanguage(Reader reader, String dataSourceName, LanguageVersion languageVersion) { - super(reader, dataSourceName); - this.languageVersion = languageVersion; - } - - @Override - public LanguageVersion getLanguageVersion() { - return languageVersion; - } -}