[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:
@ -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;
|
||||
|
@ -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 {
|
||||
|
@ -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 {
|
||||
|
@ -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);
|
||||
|
@ -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, },
|
||||
});
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user