[core] Revamp the language version alias APIs

- The old experimental API allowed calls such as
`addVersions(langHandler, false)` which were not only invalid, but would
throw an `ArrayIndexOutOfBoundsException`, so we split the name
(required) and the aliases (varargs, and therefore optional)
 - In doing so, I was bothered by parameter order. The version name is
the most significant change when setting 2 versions for a language, so I
liked it being first as the old `addVersion` method did, so I moved
that ahead.
 - With that, I now had 2 methods that where equivalent, except one
allowed for varargs and the other didn't… so I merged them. This is not
100% binary compatible, but it is source compatible (that is, unless you
used reflection, all valid calls to the old non-experimental method
still work).
This commit is contained in:
Juan Martín Sotuyo Dodero
2020-05-14 16:03:45 -03:00
parent 2bce93c8b6
commit 8c7a49eb69
5 changed files with 31 additions and 36 deletions

View File

@ -11,8 +11,6 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import net.sourceforge.pmd.annotation.Experimental;
/**
* Created by christoferdutz on 21.09.14.
*/
@ -36,18 +34,18 @@ public abstract class BaseLanguageModule implements Language {
this.extensions = Arrays.asList(extensions);
}
@Experimental
protected void addVersions(LanguageVersionHandler languageVersionHandler, boolean isDefault, String ... languageVersions) {
protected void addVersion(String version, LanguageVersionHandler languageVersionHandler, boolean isDefault, String... versionAliases) {
if (versions == null) {
versions = new HashMap<>();
}
LanguageVersion languageVersion = new LanguageVersion(this, languageVersions[0], languageVersionHandler);
LanguageVersion languageVersion = new LanguageVersion(this, version, languageVersionHandler);
distinctVersions.add(languageVersion);
for (String version : languageVersions) {
versions.put(version, languageVersion);
for (String alias : versionAliases) {
versions.put(alias, languageVersion);
}
if (isDefault) {
@ -57,10 +55,6 @@ public abstract class BaseLanguageModule implements Language {
}
}
protected void addVersion(String version, LanguageVersionHandler languageVersionHandler, boolean isDefault) {
addVersions(languageVersionHandler, isDefault, version);
}
@Override
public String getName() {
return name;

View File

@ -166,7 +166,7 @@ public class RuleBuilder {
if (minimumVersion != null) {
LanguageVersion minimumLanguageVersion = rule.getLanguage().getVersion(minimumVersion);
if (minimumLanguageVersion == null) {
throwUnknownLanguageVersionException("minimum", minimumVersion);
throwUnknownLanguageVersionException("minimum", minimumVersion, rule.getLanguage());
} else {
rule.setMinimumLanguageVersion(minimumLanguageVersion);
}
@ -175,7 +175,7 @@ public class RuleBuilder {
if (maximumVersion != null) {
LanguageVersion maximumLanguageVersion = rule.getLanguage().getVersion(maximumVersion);
if (maximumLanguageVersion == null) {
throwUnknownLanguageVersionException("maximum", maximumVersion);
throwUnknownLanguageVersionException("maximum", maximumVersion, rule.getLanguage());
} else {
rule.setMaximumLanguageVersion(maximumLanguageVersion);
}
@ -184,12 +184,12 @@ public class RuleBuilder {
checkLanguageVersionsAreOrdered(rule);
}
private void throwUnknownLanguageVersionException(String minOrMax, String unknownVersion) {
private void throwUnknownLanguageVersionException(String minOrMax, String unknownVersion, Language lang) {
throw new IllegalArgumentException("Unknown " + minOrMax + " Language Version '" + unknownVersion
+ "' for Language '" + language.getTerseName()
+ "' for Language '" + lang.getTerseName()
+ "' for Rule " + name
+ "; supported Language Versions are: "
+ LanguageRegistry.commaSeparatedTerseNamesForLanguageVersion(language.getVersions()));
+ LanguageRegistry.commaSeparatedTerseNamesForLanguageVersion(lang.getVersions()));
}
public Rule build() throws ClassNotFoundException, IllegalAccessException, InstantiationException {

View File

@ -43,10 +43,10 @@ public class DummyLanguageModule extends BaseLanguageModule {
addVersion("1.2", new Handler(), false);
addVersion("1.3", new Handler(), false);
addVersion("1.4", new Handler(), false);
addVersions(new Handler(), false, "1.5", "5");
addVersions(new Handler(), false, "1.6", "6");
addVersions(new Handler(), true, "1.7", "7");
addVersions(new Handler(), false, "1.8", "8");
addVersion("1.5", new Handler(), false, "5");
addVersion("1.6", new Handler(), false, "6");
addVersion("1.7", new Handler(), true, "7");
addVersion("1.8", new Handler(), false, "8");
}
public static class DummyRuleChainVisitor extends AbstractRuleChainVisitor {

View File

@ -19,12 +19,12 @@ public class JavaLanguageModule extends BaseLanguageModule {
super(NAME, null, TERSE_NAME, JavaRuleChainVisitor.class, "java");
addVersion("1.3", new JavaLanguageHandler(3), false);
addVersion("1.4", new JavaLanguageHandler(4), false);
addVersions(new JavaLanguageHandler(5), false, "1.5", "5");
addVersions(new JavaLanguageHandler(6), false, "1.6", "6");
addVersions(new JavaLanguageHandler(7), false, "1.7", "7");
addVersions(new JavaLanguageHandler(8), false, "1.8", "8");
addVersions(new JavaLanguageHandler(9), false, "9", "1.9");
addVersions(new JavaLanguageHandler(10), false, "10", "1.10");
addVersion("1.5", new JavaLanguageHandler(5), false, "5");
addVersion("1.6", new JavaLanguageHandler(6), false, "6");
addVersion("1.7", new JavaLanguageHandler(7), false, "7");
addVersion("1.8", new JavaLanguageHandler(8), false, "8");
addVersion("9", new JavaLanguageHandler(9), false, "1.9");
addVersion("10", new JavaLanguageHandler(10), false, "1.10");
addVersion("11", new JavaLanguageHandler(11), false);
addVersion("12", new JavaLanguageHandler(12), false);
addVersion("13", new JavaLanguageHandler(13), false);

View File

@ -54,6 +54,7 @@ public class LanguageVersionTest extends AbstractLanguageVersionTest {
LanguageRegistry.getLanguage(JavaLanguageModule.NAME).getVersion("14-preview"), },
// this one won't be found: case sensitive!
{ "JAVA", "JAVA", "1.7", null, }, });
{ "JAVA", "JAVA", "1.7", null, },
});
}
}