diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/PMD.java b/pmd-core/src/main/java/net/sourceforge/pmd/PMD.java index 0d18d7c9fb..19e316c387 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/PMD.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/PMD.java @@ -31,8 +31,8 @@ import net.sourceforge.pmd.cli.PMDCommandLineInterface; import net.sourceforge.pmd.cli.PmdParametersParseResult; import net.sourceforge.pmd.cli.internal.CliMessages; import net.sourceforge.pmd.internal.Slf4jSimpleConfiguration; -import net.sourceforge.pmd.lang.document.TextFile; import net.sourceforge.pmd.lang.LanguageRegistry; +import net.sourceforge.pmd.lang.document.TextFile; import net.sourceforge.pmd.renderers.Renderer; import net.sourceforge.pmd.reporting.ReportStats; import net.sourceforge.pmd.util.datasource.DataSource; diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/cli/PMDParameters.java b/pmd-core/src/main/java/net/sourceforge/pmd/cli/PMDParameters.java index d935d91df4..c1e0d85452 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/cli/PMDParameters.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/cli/PMDParameters.java @@ -9,8 +9,8 @@ import java.util.Arrays; import java.util.List; import java.util.Properties; -import org.checkerframework.checker.nullness.qual.NonNull; import org.apache.commons.lang3.StringUtils; +import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; import net.sourceforge.pmd.PMD; diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/lang/LanguageRegistry.java b/pmd-core/src/main/java/net/sourceforge/pmd/lang/LanguageRegistry.java index e9caa5e653..13f0475a31 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/lang/LanguageRegistry.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/lang/LanguageRegistry.java @@ -40,6 +40,10 @@ public final class LanguageRegistry implements Iterable { private final Map languagesById; private final Map languagesByFullName; + /** + * Create a new registry that contains the given set of languages. + * @throws NullPointerException If the parameter is null + */ public LanguageRegistry(Set languages) { this.languages = languages.stream() .sorted(Comparator.comparing(Language::getTerseName, String::compareToIgnoreCase)) diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/lang/LanguageVersion.java b/pmd-core/src/main/java/net/sourceforge/pmd/lang/LanguageVersion.java index b1ac43e348..84324e3357 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/lang/LanguageVersion.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/lang/LanguageVersion.java @@ -24,7 +24,7 @@ import net.sourceforge.pmd.annotation.InternalApi; * *

Example usage: *

- * Language javaLanguage = LanguageRegistry.{@link LanguageRegistry#getLanguage(String) getLanguage}("Java");
+ * Language javaLanguage = LanguageRegistry.PMD.{@link LanguageRegistry#getLanguageById(String) getLanguageById}("java");
  * LanguageVersion java11 = javaLanguage.{@link Language#getVersion(String) getVersion}("11");
  * LanguageVersionHandler handler = java11.getLanguageVersionHandler();
  * Parser parser = handler.getParser(handler.getDefaultParserOptions());
diff --git a/pmd-core/src/test/java/net/sourceforge/pmd/lang/LanguageVersionDiscovererTest.java b/pmd-core/src/test/java/net/sourceforge/pmd/lang/LanguageVersionDiscovererTest.java
deleted file mode 100644
index 282c8c07e7..0000000000
--- a/pmd-core/src/test/java/net/sourceforge/pmd/lang/LanguageVersionDiscovererTest.java
+++ /dev/null
@@ -1,16 +0,0 @@
-/*
- * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
- */
-
-package net.sourceforge.pmd.lang;
-
-/**
- * @author Clément Fournier
- */
-public class LanguageVersionDiscovererTest {
-
-    public static LanguageVersionDiscoverer createForcedDiscoverer(LanguageVersion forcedVersion) {
-        return new LanguageVersionDiscoverer(LanguageRegistry.PMD, forcedVersion);
-    }
-
-}
diff --git a/pmd-core/src/test/java/net/sourceforge/pmd/lang/document/FileCollectorTest.java b/pmd-core/src/test/java/net/sourceforge/pmd/lang/document/FileCollectorTest.java
index 2ff198b08d..db4eef2608 100644
--- a/pmd-core/src/test/java/net/sourceforge/pmd/lang/document/FileCollectorTest.java
+++ b/pmd-core/src/test/java/net/sourceforge/pmd/lang/document/FileCollectorTest.java
@@ -24,9 +24,9 @@ import org.junit.jupiter.api.io.TempDir;
 
 import net.sourceforge.pmd.lang.DummyLanguageModule;
 import net.sourceforge.pmd.lang.Language;
+import net.sourceforge.pmd.lang.LanguageRegistry;
 import net.sourceforge.pmd.lang.LanguageVersion;
 import net.sourceforge.pmd.lang.LanguageVersionDiscoverer;
-import net.sourceforge.pmd.lang.LanguageVersionDiscovererTest;
 
 /**
  * @author Clément Fournier
@@ -131,7 +131,7 @@ class FileCollectorTest {
     }
 
     private FileCollector newCollector(LanguageVersion forcedVersion) {
-        LanguageVersionDiscoverer discoverer = LanguageVersionDiscovererTest.createForcedDiscoverer(forcedVersion);
+        LanguageVersionDiscoverer discoverer = new LanguageVersionDiscoverer(LanguageRegistry.PMD, forcedVersion);
         FileCollector collector = FileCollector.newCollector(discoverer, new TestMessageReporter());
         collector.relativizeWith(tempFolder.toAbsolutePath().toString());
         return collector;
diff --git a/pmd-core/src/test/java/net/sourceforge/pmd/lang/document/TextFilesTest.java b/pmd-core/src/test/java/net/sourceforge/pmd/lang/document/TextFilesTest.java
index d0c4d97362..4ba43ed4d8 100644
--- a/pmd-core/src/test/java/net/sourceforge/pmd/lang/document/TextFilesTest.java
+++ b/pmd-core/src/test/java/net/sourceforge/pmd/lang/document/TextFilesTest.java
@@ -88,7 +88,7 @@ public class TextFilesTest extends PmdContextualizedTest {
 
         DataSource ds = new FileDataSource(file.toFile());
         PMDConfiguration config = new PMDConfiguration();
-        config.setForceLanguageVersion(dummyVersion);
+        config.setForceLanguageVersion(DummyLanguageModule.getInstance().getDefaultVersion());
         try (TextFile tf = TextFile.dataSourceCompat(ds, config)) {
             assertEquals(ds.getNiceFileName(false, null), tf.getPathId());
             assertEquals(ds.getNiceFileName(false, null), tf.getDisplayName());
@@ -102,6 +102,7 @@ public class TextFilesTest extends PmdContextualizedTest {
 
         DataSource ds = new FileDataSource(file.toFile());
         PMDConfiguration config = new PMDConfiguration();
+        config.setForceLanguageVersion(DummyLanguageModule.getInstance().getDefaultVersion());
         config.setSourceEncoding(StandardCharsets.UTF_16BE.name());
         try (TextFile tf = TextFile.dataSourceCompat(ds, config)) {
             assertEquals(Chars.wrap("some content"), tf.readContents().getNormalizedText());
diff --git a/pmd-html/src/main/java/net/sourceforge/pmd/lang/html/rule/AbstractHtmlRule.java b/pmd-html/src/main/java/net/sourceforge/pmd/lang/html/rule/AbstractHtmlRule.java
index 246b3dc0eb..3740d51245 100644
--- a/pmd-html/src/main/java/net/sourceforge/pmd/lang/html/rule/AbstractHtmlRule.java
+++ b/pmd-html/src/main/java/net/sourceforge/pmd/lang/html/rule/AbstractHtmlRule.java
@@ -5,18 +5,12 @@
 package net.sourceforge.pmd.lang.html.rule;
 
 import net.sourceforge.pmd.RuleContext;
-import net.sourceforge.pmd.lang.LanguageRegistry;
 import net.sourceforge.pmd.lang.ast.Node;
-import net.sourceforge.pmd.lang.html.HtmlLanguageModule;
 import net.sourceforge.pmd.lang.html.ast.HtmlVisitor;
 import net.sourceforge.pmd.lang.rule.AbstractRule;
 
 public abstract class AbstractHtmlRule extends AbstractRule implements HtmlVisitor {
 
-    public AbstractHtmlRule() {
-        super.setLanguage(LanguageRegistry.getLanguage(HtmlLanguageModule.NAME));
-    }
-
     @Override
     public Object visitNode(Node node, Object param) {
         node.children().forEach(c -> c.acceptVisitor(this, param));
diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/JavaLanguageModule.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/JavaLanguageModule.java
index 88e6129c17..25085f84b4 100644
--- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/JavaLanguageModule.java
+++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/JavaLanguageModule.java
@@ -5,6 +5,8 @@
 package net.sourceforge.pmd.lang.java;
 
 import net.sourceforge.pmd.lang.BaseLanguageModule;
+import net.sourceforge.pmd.lang.Language;
+import net.sourceforge.pmd.lang.LanguageRegistry;
 import net.sourceforge.pmd.lang.java.internal.JavaLanguageHandler;
 
 /**
@@ -38,4 +40,7 @@ public class JavaLanguageModule extends BaseLanguageModule {
         addVersion("19-preview", new JavaLanguageHandler(19, true));
     }
 
+    public static Language getInstance() {
+        return LanguageRegistry.PMD.getLanguageByFullName(NAME);
+    }
 }
diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/AbstractJavaRule.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/AbstractJavaRule.java
index 166e515cb3..f230d40b2a 100644
--- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/AbstractJavaRule.java
+++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/AbstractJavaRule.java
@@ -5,9 +5,7 @@
 package net.sourceforge.pmd.lang.java.rule;
 
 import net.sourceforge.pmd.RuleContext;
-import net.sourceforge.pmd.lang.LanguageRegistry;
 import net.sourceforge.pmd.lang.ast.Node;
-import net.sourceforge.pmd.lang.java.JavaLanguageModule;
 import net.sourceforge.pmd.lang.java.ast.JavaParserVisitor;
 import net.sourceforge.pmd.lang.rule.AbstractRule;
 
@@ -21,10 +19,6 @@ import net.sourceforge.pmd.lang.rule.AbstractRule;
  */
 public abstract class AbstractJavaRule extends AbstractRule implements JavaParserVisitor {
 
-    public AbstractJavaRule() {
-        super.setLanguage(LanguageRegistry.getLanguage(JavaLanguageModule.NAME));
-    }
-
     @Override
     public void apply(Node target, RuleContext ctx) {
         target.acceptVisitor(this, ctx);
diff --git a/pmd-java/src/test/java/net/sourceforge/pmd/LanguageVersionDiscovererTest.java b/pmd-java/src/test/java/net/sourceforge/pmd/LanguageVersionDiscovererTest.java
index 9da6aa61ae..4b190e8689 100644
--- a/pmd-java/src/test/java/net/sourceforge/pmd/LanguageVersionDiscovererTest.java
+++ b/pmd-java/src/test/java/net/sourceforge/pmd/LanguageVersionDiscovererTest.java
@@ -4,37 +4,39 @@
 
 package net.sourceforge.pmd;
 
-import static org.junit.Assert.assertEquals;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
 
 import java.io.File;
 
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 
+import net.sourceforge.pmd.lang.Language;
 import net.sourceforge.pmd.lang.LanguageRegistry;
 import net.sourceforge.pmd.lang.LanguageVersion;
 import net.sourceforge.pmd.lang.LanguageVersionDiscoverer;
 import net.sourceforge.pmd.lang.java.JavaLanguageModule;
 
-public class LanguageVersionDiscovererTest {
+class LanguageVersionDiscovererTest {
 
     /**
      * Test on Java file with default options.
      * Always the latest non-preview version will be the default version.
      */
     @Test
-    public void testJavaFileUsingDefaults() {
-        LanguageVersionDiscoverer discoverer = new LanguageVersionDiscoverer();
+    void testJavaFileUsingDefaults() {
+        LanguageVersionDiscoverer discoverer = new LanguageVersionDiscoverer(LanguageRegistry.PMD);
         File javaFile = new File("/path/to/MyClass.java");
 
         LanguageVersion latest = determineLatestNonPreviewVersion();
 
         LanguageVersion languageVersion = discoverer.getDefaultLanguageVersionForFile(javaFile);
-        assertEquals("Latest language version must be default", latest, languageVersion);
+        assertEquals(latest, languageVersion, "Latest language version must be default");
     }
 
     private LanguageVersion determineLatestNonPreviewVersion() {
         LanguageVersion latest = null;
-        for (LanguageVersion lv : LanguageRegistry.getLanguage(JavaLanguageModule.NAME).getVersions()) {
+        for (LanguageVersion lv : JavaLanguageModule.getInstance().getVersions()) {
             if (!lv.getName().endsWith("preview")) {
                 latest = lv;
             }
@@ -46,27 +48,28 @@ public class LanguageVersionDiscovererTest {
      * Test on Java file with Java version set to 1.4.
      */
     @Test
-    public void testJavaFileUsing14() {
-        LanguageVersionDiscoverer discoverer = new LanguageVersionDiscoverer();
-        discoverer.setDefaultLanguageVersion(LanguageRegistry.getLanguage(JavaLanguageModule.NAME).getVersion("1.4"));
+    void testJavaFileUsing14() {
+        LanguageVersionDiscoverer discoverer = new LanguageVersionDiscoverer(LanguageRegistry.PMD);
+        Language java = JavaLanguageModule.getInstance();
+        discoverer.setDefaultLanguageVersion(java.getVersion("1.4"));
         File javaFile = new File("/path/to/MyClass.java");
 
         LanguageVersion languageVersion = discoverer.getDefaultLanguageVersionForFile(javaFile);
-        assertEquals("LanguageVersion must be Java 1.4!",
-                LanguageRegistry.getLanguage(JavaLanguageModule.NAME).getVersion("1.4"), languageVersion);
+        assertEquals(java.getVersion("1.4"), languageVersion);
     }
 
     @Test
-    public void testLanguageVersionDiscoverer() {
+    void testLanguageVersionDiscoverer() {
         PMDConfiguration configuration = new PMDConfiguration();
         LanguageVersionDiscoverer languageVersionDiscoverer = configuration.getLanguageVersionDiscoverer();
-        assertEquals("Default Java version", determineLatestNonPreviewVersion(),
-                languageVersionDiscoverer
-                        .getDefaultLanguageVersion(LanguageRegistry.getLanguage(JavaLanguageModule.NAME)));
+        Language java = JavaLanguageModule.getInstance();
+        assertEquals(determineLatestNonPreviewVersion(),
+                     languageVersionDiscoverer.getDefaultLanguageVersion(java),
+                     "Default Java version");
         configuration
-                .setDefaultLanguageVersion(LanguageRegistry.getLanguage(JavaLanguageModule.NAME).getVersion("1.5"));
-        assertEquals("Modified Java version", LanguageRegistry.getLanguage(JavaLanguageModule.NAME).getVersion("1.5"),
-                languageVersionDiscoverer
-                        .getDefaultLanguageVersion(LanguageRegistry.getLanguage(JavaLanguageModule.NAME)));
+                .setDefaultLanguageVersion(java.getVersion("1.5"));
+        assertEquals(java.getVersion("1.5"),
+                     languageVersionDiscoverer.getDefaultLanguageVersion(java),
+                     "Modified Java version");
     }
 }
diff --git a/pmd-java/src/test/java/net/sourceforge/pmd/LanguageVersionTest.java b/pmd-java/src/test/java/net/sourceforge/pmd/LanguageVersionTest.java
index 286f5bc959..993d4abd6d 100644
--- a/pmd-java/src/test/java/net/sourceforge/pmd/LanguageVersionTest.java
+++ b/pmd-java/src/test/java/net/sourceforge/pmd/LanguageVersionTest.java
@@ -9,7 +9,7 @@ import java.util.Collection;
 
 import org.junit.runners.Parameterized.Parameters;
 
-import net.sourceforge.pmd.lang.LanguageRegistry;
+import net.sourceforge.pmd.lang.Language;
 import net.sourceforge.pmd.lang.LanguageVersion;
 import net.sourceforge.pmd.lang.java.JavaLanguageModule;
 
@@ -21,41 +21,42 @@ public class LanguageVersionTest extends AbstractLanguageVersionTest {
 
     @Parameters
     public static Collection data() {
+        Language java = getLanguage(JavaLanguageModule.NAME);
         return Arrays.asList(new Object[][] {
             { JavaLanguageModule.NAME, JavaLanguageModule.TERSE_NAME, "1.3",
-                LanguageRegistry.getLanguage(JavaLanguageModule.NAME).getVersion("1.3"), },
+              java.getVersion("1.3"), },
             { JavaLanguageModule.NAME, JavaLanguageModule.TERSE_NAME, "1.4",
-                LanguageRegistry.getLanguage(JavaLanguageModule.NAME).getVersion("1.4"), },
+              java.getVersion("1.4"), },
             { JavaLanguageModule.NAME, JavaLanguageModule.TERSE_NAME, "1.5",
-                LanguageRegistry.getLanguage(JavaLanguageModule.NAME).getVersion("1.5"), },
+              java.getVersion("1.5"), },
             { JavaLanguageModule.NAME, JavaLanguageModule.TERSE_NAME, "1.6",
-                LanguageRegistry.getLanguage(JavaLanguageModule.NAME).getVersion("1.6"), },
+              java.getVersion("1.6"), },
             { JavaLanguageModule.NAME, JavaLanguageModule.TERSE_NAME, "1.7",
-                LanguageRegistry.getLanguage(JavaLanguageModule.NAME).getVersion("1.7"), },
+              java.getVersion("1.7"), },
             { JavaLanguageModule.NAME, JavaLanguageModule.TERSE_NAME, "1.8",
-                LanguageRegistry.getLanguage(JavaLanguageModule.NAME).getVersion("1.8"), },
+              java.getVersion("1.8"), },
             { JavaLanguageModule.NAME, JavaLanguageModule.TERSE_NAME, "9",
-                LanguageRegistry.getLanguage(JavaLanguageModule.NAME).getVersion("9"), },
+              java.getVersion("9"), },
             { JavaLanguageModule.NAME, JavaLanguageModule.TERSE_NAME, "10",
-                LanguageRegistry.getLanguage(JavaLanguageModule.NAME).getVersion("10"), },
+              java.getVersion("10"), },
             { JavaLanguageModule.NAME, JavaLanguageModule.TERSE_NAME, "11",
-                LanguageRegistry.getLanguage(JavaLanguageModule.NAME).getVersion("11"), },
+              java.getVersion("11"), },
             { JavaLanguageModule.NAME, JavaLanguageModule.TERSE_NAME, "12",
-                LanguageRegistry.getLanguage(JavaLanguageModule.NAME).getVersion("12"), },
+              java.getVersion("12"), },
             { JavaLanguageModule.NAME, JavaLanguageModule.TERSE_NAME, "13",
-                LanguageRegistry.getLanguage(JavaLanguageModule.NAME).getVersion("13"), },
+              java.getVersion("13"), },
             { JavaLanguageModule.NAME, JavaLanguageModule.TERSE_NAME, "14",
-                LanguageRegistry.getLanguage(JavaLanguageModule.NAME).getVersion("14"), },
+              java.getVersion("14"), },
             { JavaLanguageModule.NAME, JavaLanguageModule.TERSE_NAME, "15",
-                LanguageRegistry.getLanguage(JavaLanguageModule.NAME).getVersion("15"), },
+              java.getVersion("15"), },
             { JavaLanguageModule.NAME, JavaLanguageModule.TERSE_NAME, "16",
-                    LanguageRegistry.getLanguage(JavaLanguageModule.NAME).getVersion("16"), },
+              java.getVersion("16"), },
             { JavaLanguageModule.NAME, JavaLanguageModule.TERSE_NAME, "16-preview",
-                LanguageRegistry.getLanguage(JavaLanguageModule.NAME).getVersion("16-preview"), },
+              java.getVersion("16-preview"), },
             { JavaLanguageModule.NAME, JavaLanguageModule.TERSE_NAME, "17",
-                    LanguageRegistry.getLanguage(JavaLanguageModule.NAME).getVersion("17"), },
+              java.getVersion("17"), },
             { JavaLanguageModule.NAME, JavaLanguageModule.TERSE_NAME, "17-preview",
-                LanguageRegistry.getLanguage(JavaLanguageModule.NAME).getVersion("17-preview"), },
+              java.getVersion("17-preview"), },
 
             // this one won't be found: case sensitive!
             { "JAVA", "JAVA", "1.7", null, },
diff --git a/pmd-java/src/test/java/net/sourceforge/pmd/ReportTest.java b/pmd-java/src/test/java/net/sourceforge/pmd/ReportTest.java
index baa95be954..0e03f83cbe 100644
--- a/pmd-java/src/test/java/net/sourceforge/pmd/ReportTest.java
+++ b/pmd-java/src/test/java/net/sourceforge/pmd/ReportTest.java
@@ -10,8 +10,6 @@ import static org.junit.Assert.assertFalse;
 
 import org.junit.Test;
 
-import net.sourceforge.pmd.lang.LanguageRegistry;
-import net.sourceforge.pmd.lang.java.JavaLanguageModule;
 import net.sourceforge.pmd.lang.java.JavaParsingHelper;
 
 public class ReportTest {
@@ -45,7 +43,6 @@ public class ReportTest {
 
     @Test
     public void testExclusionsInReportWithAnnotations() {
-        LanguageRegistry.getLanguage(JavaLanguageModule.NAME).getVersion("1.5");
         Report rpt =
             java.executeRule(new FooRule(), TEST2);
         assertSize(rpt, 0);
@@ -54,7 +51,6 @@ public class ReportTest {
 
     @Test
     public void testExclusionsInReportWithAnnotationsFullName() {
-        LanguageRegistry.getLanguage(JavaLanguageModule.NAME).getVersion("1.5");
         Report rpt = java.executeRule(new FooRule(), TEST2_FULL);
         assertSize(rpt, 0);
         assertSuppressed(rpt, 1);
diff --git a/pmd-java/src/test/java/net/sourceforge/pmd/coverage/PMDCoverageTest.java b/pmd-java/src/test/java/net/sourceforge/pmd/coverage/PMDCoverageTest.java
index c7cab54408..992d008467 100644
--- a/pmd-java/src/test/java/net/sourceforge/pmd/coverage/PMDCoverageTest.java
+++ b/pmd-java/src/test/java/net/sourceforge/pmd/coverage/PMDCoverageTest.java
@@ -23,7 +23,6 @@ import org.junit.contrib.java.lang.system.SystemOutRule;
 import org.junit.rules.TemporaryFolder;
 
 import net.sourceforge.pmd.PMD;
-import net.sourceforge.pmd.lang.LanguageRegistry;
 import net.sourceforge.pmd.lang.LanguageVersion;
 import net.sourceforge.pmd.lang.java.JavaLanguageModule;
 import net.sourceforge.pmd.util.IOUtil;
@@ -52,7 +51,7 @@ public class PMDCoverageTest {
 
     @Test
     public void runAllJavaPmdOnTestResourcesWithLatestJavaVersion() {
-        List versions = LanguageRegistry.getLanguage(JavaLanguageModule.NAME).getVersions();
+        List versions = JavaLanguageModule.getInstance().getVersions();
         LanguageVersion latest = versions.get(versions.size() - 1);
 
         runPmd("-d src/test/resources -f text -R rulesets/internal/all-java.xml -language java -version " + latest.getVersion());
diff --git a/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/JavaLanguageModuleTest.java b/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/JavaLanguageModuleTest.java
index 3dcafd789f..f9a4f675e7 100644
--- a/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/JavaLanguageModuleTest.java
+++ b/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/JavaLanguageModuleTest.java
@@ -9,38 +9,35 @@ import java.util.List;
 import org.junit.Assert;
 import org.junit.Test;
 
-import net.sourceforge.pmd.lang.Language;
-import net.sourceforge.pmd.lang.LanguageRegistry;
 import net.sourceforge.pmd.lang.LanguageVersion;
 
 public class JavaLanguageModuleTest {
-    private Language javaLanguage = LanguageRegistry.getLanguage(JavaLanguageModule.NAME);
 
     @Test
     public void java9IsSmallerThanJava10() {
-        LanguageVersion java9 = javaLanguage.getVersion("9");
-        LanguageVersion java10 = javaLanguage.getVersion("10");
+        LanguageVersion java9 = JavaLanguageModule.getInstance().getVersion("9");
+        LanguageVersion java10 = JavaLanguageModule.getInstance().getVersion("10");
 
         Assert.assertTrue("java9 should be smaller than java10", java9.compareTo(java10) < 0);
     }
 
     @Test
     public void previewVersionShouldBeGreaterThanNonPreview() {
-        LanguageVersion java18 = javaLanguage.getVersion("18");
-        LanguageVersion java18p = javaLanguage.getVersion("18-preview");
+        LanguageVersion java18 = JavaLanguageModule.getInstance().getVersion("18");
+        LanguageVersion java18p = JavaLanguageModule.getInstance().getVersion("18-preview");
 
         Assert.assertTrue("java18-preview should be greater than java18", java18p.compareTo(java18) > 0);
     }
 
     @Test
     public void testCompareToVersion() {
-        LanguageVersion java9 = javaLanguage.getVersion("9");
+        LanguageVersion java9 = JavaLanguageModule.getInstance().getVersion("9");
         Assert.assertTrue("java9 should be smaller than java10", java9.compareToVersion("10") < 0);
     }
 
     @Test
     public void allVersions() {
-        List versions = javaLanguage.getVersions();
+        List versions = JavaLanguageModule.getInstance().getVersions();
         for (int i = 1; i < versions.size(); i++) {
             LanguageVersion previous = versions.get(i - 1);
             LanguageVersion current = versions.get(i);
diff --git a/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/rule/XPathRuleTest.java b/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/rule/XPathRuleTest.java
index ef00d1de9d..26d645eb60 100644
--- a/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/rule/XPathRuleTest.java
+++ b/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/rule/XPathRuleTest.java
@@ -16,9 +16,7 @@ import net.sourceforge.pmd.PMD;
 import net.sourceforge.pmd.Report;
 import net.sourceforge.pmd.Rule;
 import net.sourceforge.pmd.RuleViolation;
-import net.sourceforge.pmd.lang.LanguageRegistry;
 import net.sourceforge.pmd.lang.ast.Node;
-import net.sourceforge.pmd.lang.java.JavaLanguageModule;
 import net.sourceforge.pmd.lang.java.JavaParsingHelper;
 import net.sourceforge.pmd.lang.java.ast.ASTCompilationUnit;
 import net.sourceforge.pmd.lang.java.ast.JavaNode;
@@ -29,22 +27,18 @@ import net.sourceforge.pmd.lang.rule.xpath.internal.DeprecatedAttrLogger;
 import net.sourceforge.pmd.lang.rule.xpath.internal.SaxonXPathRuleQuery;
 import net.sourceforge.pmd.properties.PropertyDescriptor;
 import net.sourceforge.pmd.properties.PropertyFactory;
-import net.sourceforge.pmd.testframework.RuleTst;
 
 /**
  * @author daniels
  */
-public class XPathRuleTest extends RuleTst {
+public class XPathRuleTest {
 
     private XPathRule makeXPath(String expression) {
-        XPathRule rule = new XPathRule(XPathVersion.XPATH_2_0, expression);
-        rule.setLanguage(LanguageRegistry.getLanguage(JavaLanguageModule.NAME));
-        rule.setMessage("XPath Rule Failed");
-        return rule;
+        return JavaParsingHelper.DEFAULT.newXpathRule(expression);
     }
 
     @Test
-    public void testPluginname() throws Exception {
+    public void testPluginname() {
         XPathRule rule = makeXPath("//VariableDeclaratorId[string-length(@Name) < 3]");
         rule.setMessage("{0}");
         Report report = getReportForTestString(rule, TEST1);
diff --git a/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/rule/xpath/internal/BaseXPathFunctionTest.java b/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/rule/xpath/internal/BaseXPathFunctionTest.java
index b0e8901217..69c06cc770 100644
--- a/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/rule/xpath/internal/BaseXPathFunctionTest.java
+++ b/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/rule/xpath/internal/BaseXPathFunctionTest.java
@@ -15,7 +15,6 @@ import org.junit.Assert;
 
 import net.sourceforge.pmd.Report;
 import net.sourceforge.pmd.Rule;
-import net.sourceforge.pmd.lang.LanguageRegistry;
 import net.sourceforge.pmd.lang.ast.FileAnalysisException;
 import net.sourceforge.pmd.lang.ast.test.TestUtilsKt;
 import net.sourceforge.pmd.lang.java.BaseParserTest;
@@ -42,7 +41,7 @@ public class BaseXPathFunctionTest extends BaseParserTest {
         XPathRule rule = new XPathRule(XPathVersion.DEFAULT, xpath);
         rule.setName("$rule_name");
         rule.setMessage(VIOLATION_MESSAGE);
-        rule.setLanguage(LanguageRegistry.getLanguage(JavaLanguageModule.NAME));
+        rule.setLanguage(JavaLanguageModule.getInstance());
         return rule;
     }
 
diff --git a/pmd-java/src/test/kotlin/net/sourceforge/pmd/lang/java/ast/KotlinTestingDsl.kt b/pmd-java/src/test/kotlin/net/sourceforge/pmd/lang/java/ast/KotlinTestingDsl.kt
index 08ef90f37f..766fe93695 100644
--- a/pmd-java/src/test/kotlin/net/sourceforge/pmd/lang/java/ast/KotlinTestingDsl.kt
+++ b/pmd-java/src/test/kotlin/net/sourceforge/pmd/lang/java/ast/KotlinTestingDsl.kt
@@ -36,7 +36,7 @@ enum class JavaVersion : Comparable {
     /** Name suitable for use with e.g. [JavaParsingHelper.parse] */
     val pmdName: String = name.removePrefix("J").replaceFirst("__", "-").replace('_', '.').toLowerCase()
 
-    val pmdVersion get() = LanguageRegistry.getLanguage(JavaLanguageModule.NAME).getVersion(pmdName)
+    val pmdVersion get() = JavaLanguageModule.getInstance().getVersion(pmdName)
 
     val parser: JavaParsingHelper = DEFAULT.withDefaultVersion(pmdName)
 
diff --git a/pmd-javascript/src/test/java/net/sourceforge/pmd/LanguageVersionTest.java b/pmd-javascript/src/test/java/net/sourceforge/pmd/LanguageVersionTest.java
index da95b90039..5786dc0e26 100644
--- a/pmd-javascript/src/test/java/net/sourceforge/pmd/LanguageVersionTest.java
+++ b/pmd-javascript/src/test/java/net/sourceforge/pmd/LanguageVersionTest.java
@@ -9,7 +9,6 @@ import java.util.Collection;
 
 import org.junit.runners.Parameterized.Parameters;
 
-import net.sourceforge.pmd.lang.LanguageRegistry;
 import net.sourceforge.pmd.lang.LanguageVersion;
 import net.sourceforge.pmd.lang.ecmascript.EcmascriptLanguageModule;
 
@@ -23,6 +22,6 @@ public class LanguageVersionTest extends AbstractLanguageVersionTest {
     public static Collection data() {
         return Arrays.asList(new Object[][] { { EcmascriptLanguageModule.NAME, EcmascriptLanguageModule.TERSE_NAME,
                 "ES6",
-                LanguageRegistry.getLanguage(EcmascriptLanguageModule.NAME).getDefaultVersion(), }, });
+                getLanguage(EcmascriptLanguageModule.NAME).getDefaultVersion(), }, });
     }
 }
diff --git a/pmd-jsp/src/main/java/net/sourceforge/pmd/lang/jsp/rule/AbstractJspRule.java b/pmd-jsp/src/main/java/net/sourceforge/pmd/lang/jsp/rule/AbstractJspRule.java
index 09aa1d202c..ffe3a7b4cc 100644
--- a/pmd-jsp/src/main/java/net/sourceforge/pmd/lang/jsp/rule/AbstractJspRule.java
+++ b/pmd-jsp/src/main/java/net/sourceforge/pmd/lang/jsp/rule/AbstractJspRule.java
@@ -5,18 +5,12 @@
 package net.sourceforge.pmd.lang.jsp.rule;
 
 import net.sourceforge.pmd.RuleContext;
-import net.sourceforge.pmd.lang.LanguageRegistry;
 import net.sourceforge.pmd.lang.ast.Node;
-import net.sourceforge.pmd.lang.jsp.JspLanguageModule;
 import net.sourceforge.pmd.lang.jsp.ast.JspParserVisitor;
 import net.sourceforge.pmd.lang.rule.AbstractRule;
 
 public abstract class AbstractJspRule extends AbstractRule implements JspParserVisitor {
 
-    public AbstractJspRule() {
-        super.setLanguage(LanguageRegistry.getLanguage(JspLanguageModule.NAME));
-    }
-
     @Override
     public void apply(Node target, RuleContext ctx) {
         target.acceptVisitor(this, ctx);
diff --git a/pmd-lang-test/src/main/kotlin/net/sourceforge/pmd/lang/ast/test/BaseParsingHelper.kt b/pmd-lang-test/src/main/kotlin/net/sourceforge/pmd/lang/ast/test/BaseParsingHelper.kt
index 05943601da..984b8834f9 100644
--- a/pmd-lang-test/src/main/kotlin/net/sourceforge/pmd/lang/ast/test/BaseParsingHelper.kt
+++ b/pmd-lang-test/src/main/kotlin/net/sourceforge/pmd/lang/ast/test/BaseParsingHelper.kt
@@ -9,10 +9,12 @@ import net.sourceforge.pmd.lang.LanguageRegistry
 import net.sourceforge.pmd.lang.LanguageVersion
 import net.sourceforge.pmd.lang.LanguageVersionHandler
 import net.sourceforge.pmd.lang.ast.*
-import net.sourceforge.pmd.processor.AbstractPMDProcessor
-import net.sourceforge.pmd.reporting.GlobalAnalysisListener
 import net.sourceforge.pmd.lang.document.TextDocument
 import net.sourceforge.pmd.lang.document.TextFile
+import net.sourceforge.pmd.lang.rule.XPathRule
+import net.sourceforge.pmd.lang.rule.xpath.XPathVersion
+import net.sourceforge.pmd.processor.AbstractPMDProcessor
+import net.sourceforge.pmd.reporting.GlobalAnalysisListener
 import net.sourceforge.pmd.util.IOUtil
 import java.io.InputStream
 import java.nio.charset.StandardCharsets
@@ -203,6 +205,12 @@ abstract class BaseParsingHelper, T : RootNode
         return consume(input)
     }
 
+    @JvmOverloads
+    fun newXpathRule(expr: String, version: XPathVersion = XPathVersion.DEFAULT) =
+        XPathRule(version, expr).apply {
+            language = this@BaseParsingHelper.language
+            message = "XPath Rule Failed"
+        }
 
     /**
      * Execute the given [rule] on the [code]. Produce a report with the violations
diff --git a/pmd-modelica/src/main/java/net/sourceforge/pmd/lang/modelica/rule/AbstractModelicaRule.java b/pmd-modelica/src/main/java/net/sourceforge/pmd/lang/modelica/rule/AbstractModelicaRule.java
index 5950b7fe9c..900cf1eea7 100644
--- a/pmd-modelica/src/main/java/net/sourceforge/pmd/lang/modelica/rule/AbstractModelicaRule.java
+++ b/pmd-modelica/src/main/java/net/sourceforge/pmd/lang/modelica/rule/AbstractModelicaRule.java
@@ -5,9 +5,7 @@
 package net.sourceforge.pmd.lang.modelica.rule;
 
 import net.sourceforge.pmd.RuleContext;
-import net.sourceforge.pmd.lang.LanguageRegistry;
 import net.sourceforge.pmd.lang.ast.Node;
-import net.sourceforge.pmd.lang.modelica.ModelicaLanguageModule;
 import net.sourceforge.pmd.lang.modelica.ast.ModelicaParserVisitor;
 import net.sourceforge.pmd.lang.rule.AbstractRule;
 
@@ -15,9 +13,6 @@ import net.sourceforge.pmd.lang.rule.AbstractRule;
  * Base class for rules for Modelica language.
  */
 public abstract class AbstractModelicaRule extends AbstractRule implements ModelicaParserVisitor {
-    public AbstractModelicaRule() {
-        super.setLanguage(LanguageRegistry.getLanguage(ModelicaLanguageModule.NAME));
-    }
 
     @Override
     public void apply(Node target, RuleContext ctx) {
diff --git a/pmd-plsql/src/main/java/net/sourceforge/pmd/lang/plsql/rule/AbstractPLSQLRule.java b/pmd-plsql/src/main/java/net/sourceforge/pmd/lang/plsql/rule/AbstractPLSQLRule.java
index 97e226c28e..afa94e1f6c 100644
--- a/pmd-plsql/src/main/java/net/sourceforge/pmd/lang/plsql/rule/AbstractPLSQLRule.java
+++ b/pmd-plsql/src/main/java/net/sourceforge/pmd/lang/plsql/rule/AbstractPLSQLRule.java
@@ -6,9 +6,7 @@ package net.sourceforge.pmd.lang.plsql.rule;
 
 
 import net.sourceforge.pmd.RuleContext;
-import net.sourceforge.pmd.lang.LanguageRegistry;
 import net.sourceforge.pmd.lang.ast.Node;
-import net.sourceforge.pmd.lang.plsql.PLSQLLanguageModule;
 import net.sourceforge.pmd.lang.plsql.ast.ASTInput;
 import net.sourceforge.pmd.lang.plsql.ast.ASTPackageBody;
 import net.sourceforge.pmd.lang.plsql.ast.ASTPackageSpecification;
@@ -21,9 +19,6 @@ import net.sourceforge.pmd.lang.rule.AbstractRule;
 
 public abstract class AbstractPLSQLRule extends AbstractRule implements PLSQLParserVisitor {
 
-    public AbstractPLSQLRule() {
-        super.setLanguage(LanguageRegistry.getLanguage(PLSQLLanguageModule.NAME));
-    }
 
     @Override
     public void apply(Node target, RuleContext ctx) {
diff --git a/pmd-scala-modules/pmd-scala-common/src/main/java/net/sourceforge/pmd/lang/scala/rule/ScalaRule.java b/pmd-scala-modules/pmd-scala-common/src/main/java/net/sourceforge/pmd/lang/scala/rule/ScalaRule.java
index 972bd80ccb..a385df3465 100644
--- a/pmd-scala-modules/pmd-scala-common/src/main/java/net/sourceforge/pmd/lang/scala/rule/ScalaRule.java
+++ b/pmd-scala-modules/pmd-scala-common/src/main/java/net/sourceforge/pmd/lang/scala/rule/ScalaRule.java
@@ -5,10 +5,8 @@
 package net.sourceforge.pmd.lang.scala.rule;
 
 import net.sourceforge.pmd.RuleContext;
-import net.sourceforge.pmd.lang.LanguageRegistry;
 import net.sourceforge.pmd.lang.ast.Node;
 import net.sourceforge.pmd.lang.rule.AbstractRule;
-import net.sourceforge.pmd.lang.scala.ScalaLanguageModule;
 import net.sourceforge.pmd.lang.scala.ast.ScalaNode;
 import net.sourceforge.pmd.lang.scala.ast.ScalaParserVisitor;
 
@@ -18,14 +16,6 @@ import net.sourceforge.pmd.lang.scala.ast.ScalaParserVisitor;
  */
 public class ScalaRule extends AbstractRule implements ScalaParserVisitor {
 
-    /**
-     * Create a new Scala Rule.
-     */
-    public ScalaRule() {
-        super.setLanguage(LanguageRegistry.getLanguage(ScalaLanguageModule.NAME));
-    }
-
-
     @Override
     public void apply(Node target, RuleContext ctx) {
         ((ScalaNode) target).accept(this, ctx);
diff --git a/pmd-scala-modules/pmd-scala-common/src/test/java/net/sourceforge/pmd/lang/scala/rule/XPathRuleTest.java b/pmd-scala-modules/pmd-scala-common/src/test/java/net/sourceforge/pmd/lang/scala/rule/XPathRuleTest.java
index a115be553c..38d23b5309 100644
--- a/pmd-scala-modules/pmd-scala-common/src/test/java/net/sourceforge/pmd/lang/scala/rule/XPathRuleTest.java
+++ b/pmd-scala-modules/pmd-scala-common/src/test/java/net/sourceforge/pmd/lang/scala/rule/XPathRuleTest.java
@@ -10,10 +10,7 @@ import org.junit.Test;
 
 import net.sourceforge.pmd.Report;
 import net.sourceforge.pmd.RuleViolation;
-import net.sourceforge.pmd.lang.LanguageRegistry;
 import net.sourceforge.pmd.lang.rule.XPathRule;
-import net.sourceforge.pmd.lang.rule.xpath.XPathVersion;
-import net.sourceforge.pmd.lang.scala.ScalaLanguageModule;
 import net.sourceforge.pmd.lang.scala.ast.BaseScalaTest;
 
 public class XPathRuleTest extends BaseScalaTest {
@@ -28,9 +25,7 @@ public class XPathRuleTest extends BaseScalaTest {
     }
 
     private Report evaluate(String testSource, String xpath) {
-        XPathRule rule = new XPathRule(XPathVersion.XPATH_2_0, xpath);
-        rule.setLanguage(LanguageRegistry.getLanguage(ScalaLanguageModule.NAME));
-        rule.setMessage("XPath Rule Failed");
+        XPathRule rule = scala.newXpathRule(xpath);
         return scala.executeRuleOnResource(rule, testSource);
     }
 }
diff --git a/pmd-test/src/main/java/net/sourceforge/pmd/AbstractLanguageVersionTest.java b/pmd-test/src/main/java/net/sourceforge/pmd/AbstractLanguageVersionTest.java
index f08f7cf8bd..dd99117639 100644
--- a/pmd-test/src/main/java/net/sourceforge/pmd/AbstractLanguageVersionTest.java
+++ b/pmd-test/src/main/java/net/sourceforge/pmd/AbstractLanguageVersionTest.java
@@ -70,7 +70,7 @@ public class AbstractLanguageVersionTest {
     }
 
     protected static Language getLanguage(String name) {
-        return LanguageRegistry.STATIC.getLanguage(name);
+        return LanguageRegistry.PMD.getLanguageByFullName(name);
     }
 
     /**
diff --git a/pmd-test/src/main/java/net/sourceforge/pmd/AbstractRuleSetFactoryTest.java b/pmd-test/src/main/java/net/sourceforge/pmd/AbstractRuleSetFactoryTest.java
index 08b5a96440..2825adbb4a 100644
--- a/pmd-test/src/main/java/net/sourceforge/pmd/AbstractRuleSetFactoryTest.java
+++ b/pmd-test/src/main/java/net/sourceforge/pmd/AbstractRuleSetFactoryTest.java
@@ -273,7 +273,7 @@ public abstract class AbstractRuleSetFactoryTest {
     private List getRuleSetFileNames() throws IOException {
         List result = new ArrayList<>();
 
-        for (Language language : LanguageRegistry.getLanguages()) {
+        for (Language language : LanguageRegistry.PMD.getLanguages()) {
             if (this.languagesToSkip.contains(language.getTerseName())) {
                 continue;
             }
diff --git a/pmd-test/src/main/java/net/sourceforge/pmd/PmdContextualizedTest.java b/pmd-test/src/main/java/net/sourceforge/pmd/PmdContextualizedTest.java
index b19970804a..e1a835b742 100644
--- a/pmd-test/src/main/java/net/sourceforge/pmd/PmdContextualizedTest.java
+++ b/pmd-test/src/main/java/net/sourceforge/pmd/PmdContextualizedTest.java
@@ -13,7 +13,7 @@ public class PmdContextualizedTest {
     private final LanguageRegistry registry;
 
     public PmdContextualizedTest() {
-        this.registry = LanguageRegistry.STATIC;
+        this.registry = LanguageRegistry.PMD;
     }
 
     public final LanguageRegistry languageRegistry() {
diff --git a/pmd-test/src/main/java/net/sourceforge/pmd/test/lang/DummyLanguageModule.java b/pmd-test/src/main/java/net/sourceforge/pmd/test/lang/DummyLanguageModule.java
index 4dfb091642..f5938c7454 100644
--- a/pmd-test/src/main/java/net/sourceforge/pmd/test/lang/DummyLanguageModule.java
+++ b/pmd-test/src/main/java/net/sourceforge/pmd/test/lang/DummyLanguageModule.java
@@ -46,7 +46,7 @@ public class DummyLanguageModule extends BaseLanguageModule {
     }
 
     public static DummyLanguageModule getInstance() {
-        return (DummyLanguageModule) LanguageRegistry.getLanguage(NAME);
+        return (DummyLanguageModule) LanguageRegistry.PMD.getLanguageByFullName(NAME);
     }
 
     public static DummyRootNode parse(String code, String filename) {
diff --git a/pmd-test/src/main/java/net/sourceforge/pmd/testframework/RuleTst.java b/pmd-test/src/main/java/net/sourceforge/pmd/testframework/RuleTst.java
index 592bc60387..1abd2ff0e6 100644
--- a/pmd-test/src/main/java/net/sourceforge/pmd/testframework/RuleTst.java
+++ b/pmd-test/src/main/java/net/sourceforge/pmd/testframework/RuleTst.java
@@ -51,7 +51,6 @@ import net.sourceforge.pmd.RuleSet;
 import net.sourceforge.pmd.RuleSetLoadException;
 import net.sourceforge.pmd.RuleSetLoader;
 import net.sourceforge.pmd.RuleViolation;
-import net.sourceforge.pmd.lang.Language;
 import net.sourceforge.pmd.lang.LanguageVersion;
 import net.sourceforge.pmd.lang.document.Chars;
 import net.sourceforge.pmd.lang.document.TextFile;
diff --git a/pmd-test/src/test/java/net/sourceforge/pmd/testframework/RuleTstTest.java b/pmd-test/src/test/java/net/sourceforge/pmd/testframework/RuleTstTest.java
index ce97476706..68accc94db 100644
--- a/pmd-test/src/test/java/net/sourceforge/pmd/testframework/RuleTstTest.java
+++ b/pmd-test/src/test/java/net/sourceforge/pmd/testframework/RuleTstTest.java
@@ -16,11 +16,8 @@ import org.junit.jupiter.api.Test;
 import org.mockito.Mockito;
 
 import net.sourceforge.pmd.PmdContextualizedTest;
-import net.sourceforge.pmd.Report;
 import net.sourceforge.pmd.Rule;
 import net.sourceforge.pmd.RuleContext;
-import net.sourceforge.pmd.RuleViolation;
-import net.sourceforge.pmd.lang.LanguageRegistry;
 import net.sourceforge.pmd.lang.LanguageVersion;
 import net.sourceforge.pmd.lang.ast.Node;
 import net.sourceforge.pmd.lang.document.TextRegion;
diff --git a/pmd-test/src/test/java/net/sourceforge/pmd/testframework/TestDescriptorTest.java b/pmd-test/src/test/java/net/sourceforge/pmd/testframework/TestDescriptorTest.java
index b3f4f308cb..d28756274c 100644
--- a/pmd-test/src/test/java/net/sourceforge/pmd/testframework/TestDescriptorTest.java
+++ b/pmd-test/src/test/java/net/sourceforge/pmd/testframework/TestDescriptorTest.java
@@ -9,7 +9,7 @@ import org.junit.jupiter.api.Test;
 
 import net.sourceforge.pmd.RuleContext;
 import net.sourceforge.pmd.lang.Language;
-import net.sourceforge.pmd.lang.LanguageRegistry;
+import net.sourceforge.pmd.lang.PlainTextLanguage;
 import net.sourceforge.pmd.lang.ast.Node;
 import net.sourceforge.pmd.lang.rule.AbstractRule;
 
@@ -32,7 +32,7 @@ public class TestDescriptorTest {
     private static final class MockRule extends AbstractRule {
         @Override
         public Language getLanguage() {
-            return LanguageRegistry.getDefaultLanguage();
+            return PlainTextLanguage.getInstance();
         }
 
         @Override
diff --git a/pmd-visualforce/src/main/java/net/sourceforge/pmd/lang/vf/ast/ApexClassPropertyTypes.java b/pmd-visualforce/src/main/java/net/sourceforge/pmd/lang/vf/ast/ApexClassPropertyTypes.java
index 356c4d048a..bebf85d0ed 100644
--- a/pmd-visualforce/src/main/java/net/sourceforge/pmd/lang/vf/ast/ApexClassPropertyTypes.java
+++ b/pmd-visualforce/src/main/java/net/sourceforge/pmd/lang/vf/ast/ApexClassPropertyTypes.java
@@ -67,7 +67,7 @@ class ApexClassPropertyTypes extends SalesforceFieldTypes {
     }
 
     static Node parseApex(Path apexFilePath) {
-        LanguageVersion languageVersion = LanguageRegistry.getLanguage(ApexLanguageModule.NAME).getDefaultVersion();
+        LanguageVersion languageVersion = LanguageRegistry.PMD.getLanguage(ApexLanguageModule.NAME).getDefaultVersion();
         try (TextFile file = TextFile.forPath(apexFilePath, StandardCharsets.UTF_8, languageVersion);
              TextDocument textDocument = TextDocument.create(file)) {
 
diff --git a/pmd-visualforce/src/main/java/net/sourceforge/pmd/lang/vf/rule/AbstractVfRule.java b/pmd-visualforce/src/main/java/net/sourceforge/pmd/lang/vf/rule/AbstractVfRule.java
index 23cef3e9f0..4fb6e82f79 100644
--- a/pmd-visualforce/src/main/java/net/sourceforge/pmd/lang/vf/rule/AbstractVfRule.java
+++ b/pmd-visualforce/src/main/java/net/sourceforge/pmd/lang/vf/rule/AbstractVfRule.java
@@ -5,18 +5,12 @@
 package net.sourceforge.pmd.lang.vf.rule;
 
 import net.sourceforge.pmd.RuleContext;
-import net.sourceforge.pmd.lang.LanguageRegistry;
 import net.sourceforge.pmd.lang.ast.Node;
 import net.sourceforge.pmd.lang.rule.AbstractRule;
-import net.sourceforge.pmd.lang.vf.VfLanguageModule;
 import net.sourceforge.pmd.lang.vf.ast.VfParserVisitor;
 
 public abstract class AbstractVfRule extends AbstractRule implements VfParserVisitor {
 
-    public AbstractVfRule() {
-        super.setLanguage(LanguageRegistry.getLanguage(VfLanguageModule.NAME));
-    }
-
     @Override
     public void apply(Node target, RuleContext ctx) {
         target.acceptVisitor(this, ctx);
diff --git a/pmd-vm/src/main/java/net/sourceforge/pmd/lang/vm/rule/AbstractVmRule.java b/pmd-vm/src/main/java/net/sourceforge/pmd/lang/vm/rule/AbstractVmRule.java
index 9892992abd..b309c8edf1 100644
--- a/pmd-vm/src/main/java/net/sourceforge/pmd/lang/vm/rule/AbstractVmRule.java
+++ b/pmd-vm/src/main/java/net/sourceforge/pmd/lang/vm/rule/AbstractVmRule.java
@@ -5,18 +5,12 @@
 package net.sourceforge.pmd.lang.vm.rule;
 
 import net.sourceforge.pmd.RuleContext;
-import net.sourceforge.pmd.lang.LanguageRegistry;
 import net.sourceforge.pmd.lang.ast.Node;
 import net.sourceforge.pmd.lang.rule.AbstractRule;
-import net.sourceforge.pmd.lang.vm.VmLanguageModule;
 import net.sourceforge.pmd.lang.vm.ast.VmParserVisitor;
 
 public abstract class AbstractVmRule extends AbstractRule implements VmParserVisitor {
 
-    public AbstractVmRule() {
-        super.setLanguage(LanguageRegistry.getLanguage(VmLanguageModule.NAME));
-    }
-
     @Override
     public void apply(Node target, RuleContext ctx) {
         target.acceptVisitor(this, ctx);