remove enum based base class

This commit is contained in:
Clément Fournier committed 2022-07-21 03:56:42 +02:00
1 parent 94c4acbcc8
commit ea52a779e4
4 files changed
+4 -123

No files matched your search

@@ -9,9 +9,7 @@ import java.util.ServiceLoader;
/**
* Represents a language module, and provides access to language-specific
* functionality. You can get a language instance from {@link LanguageRegistry}.
* Using a language involves first selecting the relevant {@link LanguageVersion}
* for the sources, and accessing implemented services through {@link LanguageVersion#getLanguageVersionHandler()}.
* functionality. You can get a language instance from a {@link LanguageRegistry}.
*
* <p>Language instances must be registered with a {@linkplain ServiceLoader service file}
* to be picked up on by the {@link LanguageRegistry}.
@@ -35,7 +35,6 @@ public class LanguageVersion implements Comparable<LanguageVersion> {
private final Language language;
private final String version;
private final LanguageVersionHandler languageVersionHandler; // note: this is null if this is a cpd-only language...
/**
* @deprecated Use {@link Language#getVersion(String)}. This is only
@@ -43,10 +42,9 @@ public class LanguageVersion implements Comparable<LanguageVersion> {
*/
@Deprecated
@InternalApi
public LanguageVersion(Language language, String version, LanguageVersionHandler languageVersionHandler) {
public LanguageVersion(Language language, String version) {
this.language = language;
this.version = version;
this.languageVersionHandler = languageVersionHandler;
}
/**
@@ -64,14 +62,6 @@ public class LanguageVersion implements Comparable<LanguageVersion> {
return version;
}
/**
* Returns the {@link LanguageVersionHandler}, which provides access
* to version-specific services, like the parser.
*/
@Deprecated
public LanguageVersionHandler getLanguageVersionHandler() {
return languageVersionHandler;
}
/**
* Returns the name of this language version. This is the version string
@@ -21,8 +21,7 @@ import net.sourceforge.pmd.lang.LanguageVersion;
import net.sourceforge.pmd.lang.impl.LanguageModuleBase.LanguageMetadata.LangVersionMetadata;
/**
* The simplest implementation of a language with only a few versions,
* and a single handler for all of them.
* Base class for language modules.
*
* @author Clément Fournier
*/
@@ -50,7 +49,7 @@ public abstract class LanguageModuleBase implements Language {
for (LanguageMetadata.LangVersionMetadata versionId : metadata.versionMetadata) {
String versionStr = versionId.name;
LanguageVersion languageVersion = new LanguageVersion(this, versionStr, null);
LanguageVersion languageVersion = new LanguageVersion(this, versionStr);
versions.add(languageVersion);
@@ -1,106 +0,0 @@
/*
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html
*/
package net.sourceforge.pmd.lang.impl;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import org.apache.commons.lang3.EnumUtils;
import net.sourceforge.pmd.lang.LanguageVersion;
import net.sourceforge.pmd.lang.impl.LanguageModuleWithSeveralVersions.LanguageVersionId;
/**
* @author Clément Fournier
*/
public abstract class LanguageModuleWithSeveralVersions<V extends Enum<V> & LanguageVersionId> extends LanguageModuleBase {
private final List<LanguageVersion> distinctVersions;
private final Map<String, LanguageVersion> byName;
private final Map<LanguageVersion, V> versionToId;
private final LanguageVersion defaultVersion;
protected LanguageModuleWithSeveralVersions(LanguageMetadata metadata,
Class<V> versionIdClass) {
super(metadata);
List<V> versionIds = EnumUtils.getEnumList(versionIdClass);
List<LanguageVersion> versions = new ArrayList<>();
Map<String, LanguageVersion> byName = new HashMap<>();
Map<LanguageVersion, V> verToId = new HashMap<>();
LanguageVersion defaultVersion = null;
for (V versionId : versionIds) {
String versionStr = versionId.getVersionString();
LanguageVersion languageVersion = new LanguageVersion(this, versionStr, null);
versions.add(languageVersion);
checkNotPresent(versionStr);
byName.put(versionStr, languageVersion);
verToId.put(languageVersion, versionId);
for (String alias : versionId.getAliases()) {
checkNotPresent(alias);
byName.put(alias, languageVersion);
}
if (versionId.isDefault()) {
if (defaultVersion != null) {
throw new IllegalStateException(
"Default version already set to " + defaultVersion + ", cannot set it to " + languageVersion);
}
defaultVersion = languageVersion;
}
}
this.byName = Collections.unmodifiableMap(byName);
this.versionToId = Collections.unmodifiableMap(verToId);
this.distinctVersions = Collections.unmodifiableList(versions);
this.defaultVersion = Objects.requireNonNull(defaultVersion, "No default version for " + getId());
}
private void checkNotPresent(String alias) {
if (byName.containsKey(alias)) {
throw new IllegalArgumentException("Version key '" + alias + "' is duplicated");
}
}
protected V getIdOf(LanguageVersion v) {
V obj = versionToId.get(v);
if (obj == null) {
throw new NullPointerException("no such version " + v + " in " + getVersions());
}
return obj;
}
@Override
public List<LanguageVersion> getVersions() {
return distinctVersions;
}
@Override
public LanguageVersion getDefaultVersion() {
return defaultVersion;
}
@Override
public LanguageVersion getVersion(String version) {
return byName.get(version);
}
protected interface LanguageVersionId {
String getVersionString();
boolean isDefault();
default List<String> getAliases() {
return Collections.emptyList();
}
}
}