[core] Remember forced language per file

Fixes #3970
This commit is contained in:
Andreas Dangel committed 2022-05-13 19:57:08 +02:00
1 parent 9d23d79802
commit 1b5f7e8bae
7 files changed
+70 -6

No files matched your search

+2
View File
@@ -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
@@ -222,7 +222,7 @@ public class SourceCodeProcessor {
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);
}
}
@@ -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 java.util.Objects;
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<String, LanguageVersion> forcedVersionByFile = new HashMap<>();
public LanguageVersionDiscoverer() {
this(null);
}
@@ -97,10 +102,13 @@ public class LanguageVersionDiscoverer {
* file.
*/
public LanguageVersion getDefaultLanguageVersionForFile(String fileName) {
List<Language> languages = getLanguagesForFile(fileName);
LanguageVersion languageVersion = null;
if (!languages.isEmpty()) {
languageVersion = getDefaultLanguageVersion(languages.get(0));
LanguageVersion languageVersion = forcedVersionByFile.get(fileName);
if (languageVersion == null) {
List<Language> languages = getLanguagesForFile(fileName);
if (!languages.isEmpty()) {
languageVersion = getDefaultLanguageVersion(languages.get(0));
}
}
return languageVersion;
}
@@ -142,4 +150,16 @@ public class LanguageVersionDiscoverer {
}
@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);
}
}
@@ -155,8 +155,10 @@ public final class FileCollector implements AutoCloseable {
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;
}
@@ -14,10 +14,17 @@ import static org.mockito.Mockito.times;
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 class PmdAnalysisTest {
}
}
@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<? extends Node> nodes, RuleContext ctx) {
ctx.addViolation(nodes.get(0));
}
}
}
@@ -16,4 +16,8 @@ public class Dummy2LanguageModule extends BaseLanguageModule {
super(NAME, null, TERSE_NAME, "dummy2");
addVersion("1.0", new DummyLanguageModule.Handler(), true);
}
public static Language getInstance() {
return LanguageRegistry.getLanguage(NAME);
}
}
@@ -0,0 +1 @@
A dummy file with file extension txt.