7 files changed
+70
-6
No files matched your search
@@ -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.
|
||||
Reference in new issue
Block a user