Add explicit language versions (#4120)

This commit is contained in:
Andreas Dangel
2023-02-09 12:15:43 +01:00
parent 6c95689ed3
commit d7d2ad541e
29 changed files with 146 additions and 50 deletions

View File

@ -4,22 +4,33 @@
package net.sourceforge.pmd.lang.apex;
import static net.sourceforge.pmd.util.CollectionUtil.listOf;
import java.util.List;
import net.sourceforge.pmd.lang.Language;
import net.sourceforge.pmd.lang.LanguageModuleBase;
import net.sourceforge.pmd.lang.LanguageProcessor;
import net.sourceforge.pmd.lang.LanguagePropertyBundle;
import net.sourceforge.pmd.lang.LanguageRegistry;
import apex.jorje.services.Version;
public class ApexLanguageModule extends LanguageModuleBase {
public static final String NAME = "Apex";
public static final String TERSE_NAME = "apex";
public static final List<String> VERSIONS = listOf("52", "53", "54", "55", "56", "57");
public ApexLanguageModule() {
super(LanguageMetadata.withId(TERSE_NAME).name(NAME).extensions("cls", "trigger")
.addDefaultVersion(String.valueOf((int) Version.CURRENT.getExternal())));
super(createMetadata());
}
private static LanguageMetadata createMetadata() {
LanguageMetadata languageMetadata = LanguageMetadata.withId(TERSE_NAME).name(NAME).extensions("cls", "trigger");
int lastVersion = VERSIONS.size() - 1;
VERSIONS.subList(0, lastVersion).forEach(languageMetadata::addVersion);
languageMetadata.addDefaultVersion(VERSIONS.get(lastVersion));
return languageMetadata;
}
@Override

View File

@ -12,7 +12,7 @@ import net.sourceforge.pmd.AbstractLanguageVersionTest;
class LanguageVersionTest extends AbstractLanguageVersionTest {
static Collection<TestDescriptor> data() {
return Arrays.asList(new TestDescriptor(ApexLanguageModule.NAME, ApexLanguageModule.TERSE_NAME, "35",
getLanguage("Apex").getVersion("35")));
return Arrays.asList(new TestDescriptor(ApexLanguageModule.NAME, ApexLanguageModule.TERSE_NAME, "57",
ApexLanguageModule.getInstance().getDefaultVersion()));
}
}

View File

@ -31,7 +31,9 @@ public final class PlainTextLanguage extends SimpleLanguageModuleBase {
static final String TERSE_NAME = "text";
private PlainTextLanguage() {
super(LanguageMetadata.withId(TERSE_NAME).name("Plain text").extensions("plain-text-file-goo-extension"),
super(LanguageMetadata.withId(TERSE_NAME).name("Plain text")
.extensions("plain-text-file-goo-extension")
.addDefaultVersion("default"),
new TextLvh());
}

View File

@ -30,16 +30,29 @@ class BinaryDistributionIT extends AbstractBinaryDistributionTest {
+ " kotlin, lua, matlab, modelica, objectivec, perl," + System.lineSeparator()
+ " php, plsql, python, ruby, scala, swift, tsql," + System.lineSeparator()
+ " vf, xml";
SUPPORTED_LANGUAGES_PMD = "Valid values: apex-54, ecmascript-ES6, html-," + System.lineSeparator()
+ " java-1.10, java-1.3, java-1.4, java-1.5, java-1." + System.lineSeparator()
+ " 6, java-1.7, java-1.8, java-1.9, java-10," + System.lineSeparator()
SUPPORTED_LANGUAGES_PMD = "Valid values: apex-52, apex-53, apex-54, apex-55," + System.lineSeparator()
+ " apex-56, apex-57, ecmascript-3, ecmascript-5," + System.lineSeparator()
+ " ecmascript-6, ecmascript-7, ecmascript-8," + System.lineSeparator()
+ " ecmascript-9, ecmascript-ES2015," + System.lineSeparator()
+ " ecmascript-ES2016, ecmascript-ES2017," + System.lineSeparator()
+ " ecmascript-ES2018, ecmascript-ES6, html-4," + System.lineSeparator()
+ " html-5, java-1.10, java-1.3, java-1.4, java-1.5," + System.lineSeparator()
+ " java-1.6, java-1.7, java-1.8, java-1.9, java-10," + System.lineSeparator()
+ " java-11, java-12, java-13, java-14, java-15," + System.lineSeparator()
+ " java-16, java-17, java-18, java-18-preview," + System.lineSeparator()
+ " java-19, java-19-preview, java-5, java-6, java-7," + System.lineSeparator()
+ " java-8, java-9, jsp-, kotlin-1.6, kotlin-1." + System.lineSeparator()
+ " 6-rfc+0.1, modelica-, plsql-, pom-, scala-2.10," + System.lineSeparator()
+ " scala-2.11, scala-2.12, scala-2.13, swift-, vf-," + System.lineSeparator()
+ " vm-, wsdl-, xml-, xsl-";
+ " java-8, java-9, jsp-2, jsp-3, kotlin-1.6," + System.lineSeparator()
+ " kotlin-1.7, modelica-3.4, modelica-3.5," + System.lineSeparator()
+ " plsql-11g, plsql-12.1, plsql-12.2," + System.lineSeparator()
+ " plsql-12c_Release_1, plsql-12c_Release_2," + System.lineSeparator()
+ " plsql-18c, plsql-19c, plsql-21c, pom-4.0.0," + System.lineSeparator()
+ " scala-2.10, scala-2.11, scala-2.12, scala-2.13," + System.lineSeparator()
+ " swift-4.2, swift-5.0, swift-5.1, swift-5.2," + System.lineSeparator()
+ " swift-5.3, swift-5.4, swift-5.5, swift-5.6," + System.lineSeparator()
+ " swift-5.7, vf-52, vf-53, vf-54, vf-55, vf-56," + System.lineSeparator()
+ " vf-57, vm-2.0, vm-2.1, vm-2.2, vm-2.3, wsdl-1.1," + System.lineSeparator()
+ " wsdl-2.0, xml-1.0, xml-1.1, xsl-1.0, xsl-2.0," + System.lineSeparator()
+ " xsl-3.0";
}
private final String srcDir = new File(".", "src/test/resources/sample-source/java/").getAbsolutePath();

View File

@ -15,7 +15,9 @@ public final class HtmlLanguageModule extends SimpleLanguageModuleBase {
public HtmlLanguageModule() {
super(LanguageMetadata.withId(TERSE_NAME).name(NAME)
.extensions("html", "htm", "xhtml", "xht", "shtml"),
.extensions("html", "htm", "xhtml", "xht", "shtml")
.addVersion("4")
.addDefaultVersion("5"),
new HtmlHandler());
}

View File

@ -12,7 +12,7 @@ import net.sourceforge.pmd.AbstractLanguageVersionTest;
class LanguageVersionTest extends AbstractLanguageVersionTest {
static Collection<TestDescriptor> data() {
return Arrays.asList(new TestDescriptor(HtmlLanguageModule.NAME, HtmlLanguageModule.TERSE_NAME, "",
return Arrays.asList(new TestDescriptor(HtmlLanguageModule.NAME, HtmlLanguageModule.TERSE_NAME, "5",
getLanguage(HtmlLanguageModule.NAME).getDefaultVersion()));
}
}

View File

@ -19,7 +19,12 @@ public class EcmascriptLanguageModule extends SimpleLanguageModuleBase {
public EcmascriptLanguageModule() {
super(LanguageMetadata.withId(TERSE_NAME).name(NAME).extensions("js")
.addDefaultVersion("ES6"),
.addVersion("3")
.addVersion("5")
.addVersion("6", "ES6", "ES2015")
.addVersion("7", "ES2016")
.addVersion("8", "ES2017")
.addDefaultVersion("9", "ES2018"),
properties -> () -> new EcmascriptParser(properties));
}

View File

@ -18,6 +18,7 @@ import org.mozilla.javascript.ast.ErrorCollector;
import org.mozilla.javascript.ast.ParseProblem;
import net.sourceforge.pmd.lang.LanguagePropertyBundle;
import net.sourceforge.pmd.lang.LanguageVersion;
import net.sourceforge.pmd.lang.ast.AstInfo;
import net.sourceforge.pmd.lang.ast.FileAnalysisException;
import net.sourceforge.pmd.lang.ast.ParseException;
@ -30,11 +31,11 @@ public final class EcmascriptParser implements net.sourceforge.pmd.lang.ast.Pars
this.properties = properties;
}
private AstRoot parseEcmascript(final String sourceCode, final List<ParseProblem> parseProblems) throws ParseException {
private AstRoot parseEcmascript(final String sourceCode, final LanguageVersion version, final List<ParseProblem> parseProblems) throws ParseException {
final CompilerEnvirons compilerEnvirons = new CompilerEnvirons();
compilerEnvirons.setRecordingComments(true);
compilerEnvirons.setRecordingLocalJsDocComments(true);
compilerEnvirons.setLanguageVersion(Context.VERSION_ES6);
compilerEnvirons.setLanguageVersion(determineRhinoLanguageVersion(version));
// Scope's don't appear to get set right without this
compilerEnvirons.setIdeMode(true);
compilerEnvirons.setWarnTrailingComma(true);
@ -52,10 +53,19 @@ public final class EcmascriptParser implements net.sourceforge.pmd.lang.ast.Pars
return astRoot;
}
private static int determineRhinoLanguageVersion(LanguageVersion version) {
switch (version.getVersion()) {
case "3": return Context.VERSION_1_5;
case "5": return Context.VERSION_1_8;
default: return Context.VERSION_ES6;
}
}
@Override
public RootNode parse(ParserTask task) throws FileAnalysisException {
final LanguageVersion version = task.getLanguageVersion();
final List<ParseProblem> parseProblems = new ArrayList<>();
final AstRoot astRoot = parseEcmascript(task.getSourceText(), parseProblems);
final AstRoot astRoot = parseEcmascript(task.getSourceText(), version, parseProblems);
final EcmascriptTreeBuilder treeBuilder = new EcmascriptTreeBuilder(parseProblems);
ASTAstRoot tree = (ASTAstRoot) treeBuilder.build(astRoot);

View File

@ -13,7 +13,7 @@ class LanguageVersionTest extends AbstractLanguageVersionTest {
static Collection<TestDescriptor> data() {
return Arrays.asList(
new TestDescriptor(EcmascriptLanguageModule.NAME, EcmascriptLanguageModule.TERSE_NAME, "ES6",
new TestDescriptor(EcmascriptLanguageModule.NAME, EcmascriptLanguageModule.TERSE_NAME, "9",
getLanguage(EcmascriptLanguageModule.NAME).getDefaultVersion()));
}
}

View File

@ -16,7 +16,9 @@ public class JspLanguageModule extends SimpleLanguageModuleBase {
public JspLanguageModule() {
super(LanguageMetadata.withId(TERSE_NAME).name(NAME).shortName("JSP")
.extensions("jsp", "jspx", "jspf", "tag"),
.extensions("jsp", "jspx", "jspf", "tag")
.addVersion("2")
.addDefaultVersion("3"),
new JspHandler());
}

View File

@ -12,7 +12,7 @@ import net.sourceforge.pmd.AbstractLanguageVersionTest;
class LanguageVersionTest extends AbstractLanguageVersionTest {
static Collection<TestDescriptor> data() {
return Arrays.asList(new TestDescriptor(JspLanguageModule.NAME, JspLanguageModule.TERSE_NAME, "",
return Arrays.asList(new TestDescriptor(JspLanguageModule.NAME, JspLanguageModule.TERSE_NAME, "3",
getLanguage(JspLanguageModule.NAME).getDefaultVersion()));
}
}

View File

@ -25,8 +25,8 @@ public class KotlinLanguageModule extends SimpleLanguageModuleBase {
*/
public KotlinLanguageModule() {
super(LanguageMetadata.withId(TERSE_NAME).name(NAME).extensions("kt", "ktm")
.addDefaultVersion("1.6-rfc+0.1", "1.6"),
.addVersion("1.6")
.addDefaultVersion("1.7"),
new KotlinHandler());
}
}

View File

@ -13,9 +13,7 @@ class LanguageVersionTest extends AbstractLanguageVersionTest {
static Collection<TestDescriptor> data() {
return Arrays.asList(
new TestDescriptor(KotlinLanguageModule.NAME, KotlinLanguageModule.TERSE_NAME, "1.6-rfc+0.1",
getLanguage(KotlinLanguageModule.NAME).getDefaultVersion()),
new TestDescriptor(KotlinLanguageModule.NAME, KotlinLanguageModule.TERSE_NAME, "1.6",
new TestDescriptor(KotlinLanguageModule.NAME, KotlinLanguageModule.TERSE_NAME, "1.7",
getLanguage(KotlinLanguageModule.NAME).getDefaultVersion()));
}
}

View File

@ -11,7 +11,10 @@ public class ModelicaLanguageModule extends SimpleLanguageModuleBase {
public static final String TERSE_NAME = "modelica";
public ModelicaLanguageModule() {
super(LanguageMetadata.withId(TERSE_NAME).name(NAME).extensions("mo"),
super(LanguageMetadata.withId(TERSE_NAME).name(NAME)
.extensions("mo")
.addVersion("3.4")
.addDefaultVersion("3.5"),
new ModelicaHandler());
}

View File

@ -12,7 +12,7 @@ import net.sourceforge.pmd.AbstractLanguageVersionTest;
class LanguageVersionTest extends AbstractLanguageVersionTest {
static Collection<TestDescriptor> data() {
return Arrays.asList(new TestDescriptor(ModelicaLanguageModule.NAME, ModelicaLanguageModule.TERSE_NAME, "",
return Arrays.asList(new TestDescriptor(ModelicaLanguageModule.NAME, ModelicaLanguageModule.TERSE_NAME, "3.5",
getLanguage(ModelicaLanguageModule.NAME).getDefaultVersion()));
}
}

View File

@ -27,7 +27,13 @@ public class PLSQLLanguageModule extends SimpleLanguageModuleBase {
"pck", "pks", "pkh", "pkb", // Packages
"typ", "tyb", // Object Types
"tps", "tpb" // Object Types
),
)
.addVersion("11g")
.addVersion("12c_Release_1", "12.1")
.addVersion("12c_Release_2", "12.2")
.addVersion("18c")
.addVersion("19c")
.addDefaultVersion("21c"),
new PLSQLHandler()
);
}

View File

@ -12,7 +12,7 @@ import net.sourceforge.pmd.AbstractLanguageVersionTest;
class LanguageVersionTest extends AbstractLanguageVersionTest {
static Collection<TestDescriptor> data() {
return Arrays.asList(new TestDescriptor(PLSQLLanguageModule.NAME, PLSQLLanguageModule.TERSE_NAME, "",
return Arrays.asList(new TestDescriptor(PLSQLLanguageModule.NAME, PLSQLLanguageModule.TERSE_NAME, "21c",
getLanguage(PLSQLLanguageModule.NAME).getDefaultVersion()));
}
}

View File

@ -20,6 +20,17 @@ public class SwiftLanguageModule extends SimpleLanguageModuleBase {
* Create a new instance of Swift Language Module.
*/
public SwiftLanguageModule() {
super(LanguageMetadata.withId(TERSE_NAME).name(NAME).extensions("swift"), new SwiftHandler());
super(LanguageMetadata.withId(TERSE_NAME).name(NAME)
.extensions("swift")
.addVersion("4.2")
.addVersion("5.0")
.addVersion("5.1")
.addVersion("5.2")
.addVersion("5.3")
.addVersion("5.4")
.addVersion("5.5")
.addVersion("5.6")
.addDefaultVersion("5.7"),
new SwiftHandler());
}
}

View File

@ -12,7 +12,7 @@ import net.sourceforge.pmd.AbstractLanguageVersionTest;
class LanguageVersionTest extends AbstractLanguageVersionTest {
static Collection<TestDescriptor> data() {
return Arrays.asList(new TestDescriptor(SwiftLanguageModule.NAME, SwiftLanguageModule.TERSE_NAME, "",
return Arrays.asList(new TestDescriptor(SwiftLanguageModule.NAME, SwiftLanguageModule.TERSE_NAME, "5.7",
getLanguage(SwiftLanguageModule.NAME).getDefaultVersion()));
}
}

View File

@ -20,12 +20,21 @@ public class VfLanguageModule extends SimpleLanguageModuleBase {
public static final String TERSE_NAME = "vf";
public VfLanguageModule() {
super(LanguageMetadata.withId(TERSE_NAME).name(NAME)
.extensions("page", "component")
.dependsOnLanguage(ApexLanguageModule.TERSE_NAME),
super(createMetdata(),
p -> new VfHandler((VfLanguageProperties) p));
}
private static LanguageMetadata createMetdata() {
LanguageMetadata languageMetadata = LanguageMetadata.withId(TERSE_NAME).name(NAME)
.extensions("page", "component")
.dependsOnLanguage(ApexLanguageModule.TERSE_NAME);
// use the same versions as in Apex
int lastVersion = ApexLanguageModule.VERSIONS.size() - 1;
ApexLanguageModule.VERSIONS.subList(0, lastVersion).forEach(languageMetadata::addVersion);
languageMetadata.addDefaultVersion(ApexLanguageModule.VERSIONS.get(lastVersion));
return languageMetadata;
}
@Override
public LanguagePropertyBundle newPropertyBundle() {
return new VfLanguageProperties();

View File

@ -8,11 +8,13 @@ import java.util.Arrays;
import java.util.Collection;
import net.sourceforge.pmd.AbstractLanguageVersionTest;
import net.sourceforge.pmd.lang.apex.ApexLanguageModule;
class LanguageVersionTest extends AbstractLanguageVersionTest {
static Collection<TestDescriptor> data() {
return Arrays.asList(new TestDescriptor(VfLanguageModule.NAME, VfLanguageModule.TERSE_NAME, "",
getLanguage(VfLanguageModule.NAME).getDefaultVersion()));
return Arrays.asList(new TestDescriptor(VfLanguageModule.NAME, VfLanguageModule.TERSE_NAME,
ApexLanguageModule.getInstance().getDefaultVersion().getVersion(),
getLanguage(VfLanguageModule.NAME).getDefaultVersion()));
}
}

View File

@ -15,7 +15,13 @@ public class VmLanguageModule extends SimpleLanguageModuleBase {
public static final String TERSE_NAME = "vm";
public VmLanguageModule() {
super(LanguageMetadata.withId(TERSE_NAME).name(NAME).extensions("vm"), new VmHandler());
super(LanguageMetadata.withId(TERSE_NAME).name(NAME)
.extensions("vm")
.addVersion("2.0")
.addVersion("2.1")
.addVersion("2.2")
.addDefaultVersion("2.3"),
new VmHandler());
}
}

View File

@ -12,7 +12,7 @@ import net.sourceforge.pmd.AbstractLanguageVersionTest;
class LanguageVersionTest extends AbstractLanguageVersionTest {
static Collection<TestDescriptor> data() {
return Arrays.asList(new TestDescriptor(VmLanguageModule.NAME, VmLanguageModule.TERSE_NAME, "",
return Arrays.asList(new TestDescriptor(VmLanguageModule.NAME, VmLanguageModule.TERSE_NAME, "2.3",
getLanguage(VmLanguageModule.NAME).getDefaultVersion()));
}
}

View File

@ -12,7 +12,10 @@ public class PomLanguageModule extends SimpleLanguageModuleBase {
public static final String TERSE_NAME = "pom";
public PomLanguageModule() {
super(LanguageMetadata.withId(TERSE_NAME).name(NAME).extensions("pom"), new XmlHandler());
super(LanguageMetadata.withId(TERSE_NAME).name(NAME)
.extensions("pom")
.addDefaultVersion("4.0.0"),
new XmlHandler());
}
}

View File

@ -15,7 +15,11 @@ public class WsdlLanguageModule extends SimpleLanguageModuleBase {
public static final String TERSE_NAME = "wsdl";
public WsdlLanguageModule() {
super(LanguageMetadata.withId(TERSE_NAME).name(NAME).extensions("wsdl"), new XmlHandler());
super(LanguageMetadata.withId(TERSE_NAME).name(NAME)
.extensions("wsdl")
.addVersion("1.1")
.addDefaultVersion("2.0"),
new XmlHandler());
}
}

View File

@ -15,6 +15,10 @@ public class XmlLanguageModule extends SimpleLanguageModuleBase {
public static final String TERSE_NAME = "xml";
public XmlLanguageModule() {
super(LanguageMetadata.withId(TERSE_NAME).name(NAME).extensions("xml"), new XmlHandler());
super(LanguageMetadata.withId(TERSE_NAME).name(NAME)
.extensions("xml")
.addVersion("1.0")
.addDefaultVersion("1.1"),
new XmlHandler());
}
}

View File

@ -16,7 +16,12 @@ public class XslLanguageModule extends SimpleLanguageModuleBase {
public static final String TERSE_NAME = "xsl";
public XslLanguageModule() {
super(LanguageMetadata.withId(TERSE_NAME).name(NAME).extensions("xsl", "xslt"), new XmlHandler());
super(LanguageMetadata.withId(TERSE_NAME).name(NAME)
.extensions("xsl", "xslt")
.addVersion("1.0")
.addVersion("2.0")
.addDefaultVersion("3.0"),
new XmlHandler());
}
}

View File

@ -16,13 +16,13 @@ class LanguageVersionTest extends AbstractLanguageVersionTest {
static Collection<TestDescriptor> data() {
return Arrays.asList(
new TestDescriptor(XmlLanguageModule.NAME, XmlLanguageModule.TERSE_NAME, "",
new TestDescriptor(XmlLanguageModule.NAME, XmlLanguageModule.TERSE_NAME, "1.1",
getLanguage(XmlLanguageModule.NAME).getDefaultVersion()),
new TestDescriptor(XslLanguageModule.NAME, XslLanguageModule.TERSE_NAME, "",
new TestDescriptor(XslLanguageModule.NAME, XslLanguageModule.TERSE_NAME, "3.0",
getLanguage(XslLanguageModule.NAME).getDefaultVersion()),
new TestDescriptor(WsdlLanguageModule.NAME, WsdlLanguageModule.TERSE_NAME, "",
new TestDescriptor(WsdlLanguageModule.NAME, WsdlLanguageModule.TERSE_NAME, "2.0",
getLanguage(WsdlLanguageModule.NAME).getDefaultVersion()),
new TestDescriptor(PomLanguageModule.NAME, PomLanguageModule.TERSE_NAME, "",
new TestDescriptor(PomLanguageModule.NAME, PomLanguageModule.TERSE_NAME, "4.0.0",
getLanguage(PomLanguageModule.NAME).getDefaultVersion()));
}
}

View File

@ -7,7 +7,7 @@
<target name="testXML">
<pmd rulesetfiles="${pmd.home}/src/main/resources/rulesets/xml/basic.xml">
<sourceLanguage name="xml" version="" />
<sourceLanguage name="xml" version="1.0" />
<formatter type="text" toConsole="true" />
<fileset dir="${pmd.home}/src/test/resources/ant/xml/">
<include name="*.xml" />