From 003f16682a2e0e5f0a6c633cd15bb9565b57323c Mon Sep 17 00:00:00 2001 From: Matyrobbrt Date: Sun, 14 Apr 2024 14:59:15 +0300 Subject: [PATCH 1/6] Start work on an AT plugin --- accesstransformers/build.gradle | 15 +++ .../jst/accesstransformers/ATsPlugin.java | 16 +++ .../accesstransformers/ATsTransformer.java | 42 +++++++ .../accesstransformers/ApplyATsVisitor.java | 109 ++++++++++++++++++ ....neoforged.jst.api.SourceTransformerPlugin | 1 + .../net/neoforged/jst/api/Replacements.java | 12 ++ cli/build.gradle | 5 + settings.gradle | 10 ++ 8 files changed, 210 insertions(+) create mode 100644 accesstransformers/build.gradle create mode 100644 accesstransformers/src/main/java/net/neoforged/jst/accesstransformers/ATsPlugin.java create mode 100644 accesstransformers/src/main/java/net/neoforged/jst/accesstransformers/ATsTransformer.java create mode 100644 accesstransformers/src/main/java/net/neoforged/jst/accesstransformers/ApplyATsVisitor.java create mode 100644 accesstransformers/src/resources/META-INF/services/net.neoforged.jst.api.SourceTransformerPlugin diff --git a/accesstransformers/build.gradle b/accesstransformers/build.gradle new file mode 100644 index 0000000..1d6dd96 --- /dev/null +++ b/accesstransformers/build.gradle @@ -0,0 +1,15 @@ +plugins { + id "java-library" +} + +dependencies { + implementation project(":api") + implementation 'net.neoforged:accesstransformers:10.0.6' + + testImplementation platform("org.junit:junit-bom:$junit_version") + testImplementation 'org.junit.jupiter:junit-jupiter' +} + +test { + useJUnitPlatform() +} diff --git a/accesstransformers/src/main/java/net/neoforged/jst/accesstransformers/ATsPlugin.java b/accesstransformers/src/main/java/net/neoforged/jst/accesstransformers/ATsPlugin.java new file mode 100644 index 0000000..4f5fa04 --- /dev/null +++ b/accesstransformers/src/main/java/net/neoforged/jst/accesstransformers/ATsPlugin.java @@ -0,0 +1,16 @@ +package net.neoforged.jst.accesstransformers; + +import net.neoforged.jst.api.SourceTransformer; +import net.neoforged.jst.api.SourceTransformerPlugin; + +public class ATsPlugin implements SourceTransformerPlugin { + @Override + public String getName() { + return "accesstransformers"; + } + + @Override + public SourceTransformer createTransformer() { + return new ATsTransformer(); + } +} diff --git a/accesstransformers/src/main/java/net/neoforged/jst/accesstransformers/ATsTransformer.java b/accesstransformers/src/main/java/net/neoforged/jst/accesstransformers/ATsTransformer.java new file mode 100644 index 0000000..e2e71b1 --- /dev/null +++ b/accesstransformers/src/main/java/net/neoforged/jst/accesstransformers/ATsTransformer.java @@ -0,0 +1,42 @@ +package net.neoforged.jst.accesstransformers; + +import com.intellij.psi.PsiFile; +import net.neoforged.accesstransformer.api.AccessTransformer; +import net.neoforged.accesstransformer.api.AccessTransformerEngine; +import net.neoforged.accesstransformer.parser.AccessTransformerList; +import net.neoforged.jst.api.Replacements; +import net.neoforged.jst.api.SourceTransformer; +import net.neoforged.jst.api.TransformContext; +import picocli.CommandLine; + +import java.io.IOException; +import java.io.UncheckedIOException; +import java.nio.file.Path; +import java.util.List; +import java.util.Map; + +public class ATsTransformer implements SourceTransformer { + + @CommandLine.Option(names = "--access-transformer-files", required = true) + public List atFiles; + + private Map> targets; + @Override + public void beforeRun(TransformContext context) { + final var engine = AccessTransformerEngine.newEngine(); + try { + for (Path path : atFiles) { + engine.loadATFromPath(path); + } + } catch (IOException ex) { + throw new UncheckedIOException(ex); + } + + targets = engine.getAccessTransformers(); + } + + @Override + public void visitFile(PsiFile psiFile, Replacements replacements) { + new ApplyATsVisitor(targets, replacements).visitFile(psiFile); + } +} diff --git a/accesstransformers/src/main/java/net/neoforged/jst/accesstransformers/ApplyATsVisitor.java b/accesstransformers/src/main/java/net/neoforged/jst/accesstransformers/ApplyATsVisitor.java new file mode 100644 index 0000000..e5e0ed3 --- /dev/null +++ b/accesstransformers/src/main/java/net/neoforged/jst/accesstransformers/ApplyATsVisitor.java @@ -0,0 +1,109 @@ +package net.neoforged.jst.accesstransformers; + +import com.intellij.psi.PsiClass; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiField; +import com.intellij.psi.PsiKeyword; +import com.intellij.psi.PsiMethod; +import com.intellij.psi.PsiModifier; +import com.intellij.psi.PsiModifierList; +import com.intellij.psi.PsiRecursiveElementVisitor; +import com.intellij.psi.util.ClassUtil; +import net.neoforged.accesstransformer.api.AccessTransformer; +import net.neoforged.accesstransformer.api.TargetType; +import net.neoforged.jst.api.Replacements; +import org.jetbrains.annotations.NotNull; + +import java.util.Arrays; +import java.util.EnumMap; +import java.util.List; +import java.util.Map; + +class ApplyATsVisitor extends PsiRecursiveElementVisitor { + private static final List ACCESS_MODIFIERS = List.of(PsiModifier.PUBLIC, PsiModifier.PRIVATE, PsiModifier.PROTECTED); + public static final EnumMap MODIFIER_TO_STRING = new EnumMap<>( + Map.of(AccessTransformer.Modifier.PRIVATE, PsiModifier.PRIVATE, AccessTransformer.Modifier.PUBLIC, PsiModifier.PUBLIC, AccessTransformer.Modifier.PROTECTED, PsiModifier.PROTECTED) + ); + + private final Map> ats; + private final Replacements replacements; + + public ApplyATsVisitor(Map> ats, Replacements replacements) { + this.ats = ats; + this.replacements = replacements; + } + + @Override + public void visitElement(@NotNull PsiElement element) { + if (element instanceof PsiClass psiClass) { + if (psiClass.getQualifiedName() != null) { + String className = ClassUtil.getJVMClassName(psiClass); + ats.getOrDefault(className, List.of()) + .forEach(accessTransformer -> { + if (accessTransformer.getTarget().getType() == TargetType.CLASS && accessTransformer.getTarget().targetName().equals(className)) { + apply(accessTransformer, psiClass.getModifierList()); + } + }); + } + } else if (element instanceof PsiField field) { + final var cls = field.getContainingClass(); + if (cls != null && cls.getQualifiedName() != null) { + String className = ClassUtil.getJVMClassName(cls); + ats.getOrDefault(className, List.of()) + .forEach(accessTransformer -> { + if ((accessTransformer.getTarget().getType() == TargetType.FIELD && accessTransformer.getTarget().targetName().equals(field.getName())) || accessTransformer.getTarget().getWildcardTarget() == TargetType.FIELD) { + apply(accessTransformer, field.getModifierList()); + } + }); + } + } else if (element instanceof PsiMethod method) { + final var cls = method.getContainingClass(); + if (cls != null && cls.getQualifiedName() != null) { + String className = ClassUtil.getJVMClassName(cls); + ats.getOrDefault(className, List.of()) + .forEach(accessTransformer -> { + if ((accessTransformer.getTarget().getType() == TargetType.METHOD && accessTransformer.getTarget().targetName().equals( + method.getName() + ClassUtil.getAsmMethodSignature(method) + )) || accessTransformer.getTarget().getWildcardTarget() == TargetType.METHOD) { + apply(accessTransformer, method.getModifierList()); + } + }); + } + } + + element.acceptChildren(this); + } + + private void apply(AccessTransformer at, PsiModifierList modifiers) { + if (!at.isValid()) return; + + var targetAcc = at.getTargetAccess(); + if (targetAcc != AccessTransformer.Modifier.DEFAULT && !modifiers.hasModifierProperty(MODIFIER_TO_STRING.get(targetAcc))) { + final var existingModifier = Arrays.stream(modifiers.getChildren()) + .filter(el -> el instanceof PsiKeyword) + .map(el -> (PsiKeyword) el) + .filter(kw -> ACCESS_MODIFIERS.contains(kw.getText())) + .findFirst(); + if (existingModifier.isPresent()) { + replacements.replace(existingModifier.get(), MODIFIER_TO_STRING.get(targetAcc)); + } else { + if (modifiers.getChildren().length == 0) { + // Empty modifiers are blank so we basically replace them + replacements.insertAfter(modifiers, MODIFIER_TO_STRING.get(targetAcc) + " "); + } else { + replacements.insertBefore(modifiers, MODIFIER_TO_STRING.get(targetAcc) + " "); + } + } + } + + var finalState = at.getTargetFinalState(); + if (finalState == AccessTransformer.FinalState.REMOVEFINAL && modifiers.hasModifierProperty(PsiModifier.FINAL)) { + Arrays.stream(modifiers.getChildren()) + .filter(el -> el instanceof PsiKeyword) + .map(el -> (PsiKeyword) el) + .filter(kw -> kw.getText().equals(PsiModifier.FINAL)) + .findFirst() + .ifPresent(replacements::remove); + } + } +} diff --git a/accesstransformers/src/resources/META-INF/services/net.neoforged.jst.api.SourceTransformerPlugin b/accesstransformers/src/resources/META-INF/services/net.neoforged.jst.api.SourceTransformerPlugin new file mode 100644 index 0000000..07b3902 --- /dev/null +++ b/accesstransformers/src/resources/META-INF/services/net.neoforged.jst.api.SourceTransformerPlugin @@ -0,0 +1 @@ +net.neoforged.jst.accesstransformers.ATsPlugin diff --git a/api/src/main/java/net/neoforged/jst/api/Replacements.java b/api/src/main/java/net/neoforged/jst/api/Replacements.java index 556afcf..2885813 100644 --- a/api/src/main/java/net/neoforged/jst/api/Replacements.java +++ b/api/src/main/java/net/neoforged/jst/api/Replacements.java @@ -17,6 +17,18 @@ public void replace(PsiElement element, String newText) { add(new Replacement(element.getTextRange(), newText)); } + public void remove(PsiElement element) { + final int pos = element.getTextRange().getEndOffset(); + if (element.getContainingFile().getText().charAt(pos) == ' ') { + add(new Replacement(new TextRange( + element.getTextRange().getStartOffset(), + pos + 1 + ), "")); + } else { + replace(element, ""); + } + } + public void insertBefore(PsiElement element, String newText) { var startOffset = element.getTextRange().getStartOffset(); add(new Replacement(new TextRange( diff --git a/cli/build.gradle b/cli/build.gradle index 4e0fb22..0900153 100644 --- a/cli/build.gradle +++ b/cli/build.gradle @@ -19,6 +19,7 @@ dependencies { implementation project(":api") implementation "info.picocli:picocli:$picocli_version" implementation project(":parchment") + implementation project(":accesstransformers") testImplementation platform("org.junit:junit-bom:$junit_version") testImplementation 'org.junit.jupiter:junit-jupiter' @@ -29,6 +30,10 @@ test { useJUnitPlatform() } +shadowJar { + mergeServiceFiles() +} + assemble.configure { dependsOn shadowJar } diff --git a/settings.gradle b/settings.gradle index ac9f6c8..94a0195 100644 --- a/settings.gradle +++ b/settings.gradle @@ -27,6 +27,15 @@ dependencyResolutionManagement { maven { url "https://maven.neoforged.net/releases/" } + maven { + name 'Maven for PR #8' // https://github.com/neoforged/AccessTransformers/pull/8 + url 'https://prmaven.neoforged.net/AccessTransformers/pr8' + content { + includeModule('net.neoforged', 'accesstransformers') + includeModule('net.neoforged.accesstransformers', 'at-cli') + includeModule('net.neoforged.accesstransformers', 'at-modlauncher') + } + } } } @@ -36,3 +45,4 @@ include 'api' include 'cli' include 'parchment' include 'tests' +include 'accesstransformers' From 9c13d222c8c83b32e09651f7e80c91d99927ff72 Mon Sep 17 00:00:00 2001 From: Matyrobbrt Date: Sun, 14 Apr 2024 15:13:07 +0300 Subject: [PATCH 2/6] Split tests --- .../accesstransformers/ATsTransformer.java | 2 +- ....neoforged.jst.api.SourceTransformerPlugin | 0 .../external_refs/expected/TestClass.java | 0 .../external_refs/parchment.json | 0 .../external_refs/source/TestClass.java | 0 .../javadoc/expected/ExistingJavadoc.java | 0 .../javadoc/expected/NoExistingJavadoc.java | 0 .../{ => parchment}/javadoc/parchment.json | 0 .../javadoc/source/ExistingJavadoc.java | 0 .../javadoc/source/NoExistingJavadoc.java | 0 .../nested/expected/DefaultPkgClass.java | 0 .../nested/expected/pkg/Outer.java | 0 .../nested/expected/pkg/SamePkgClass.java | 0 .../{ => parchment}/nested/parchment.json | 0 .../nested/source/DefaultPkgClass.java | 0 .../nested/source/pkg/Outer.java | 0 .../nested/source/pkg/SamePkgClass.java | 0 .../param_indices/expected/TestClass.java | 0 .../param_indices/expected/TestEnum.java | 0 .../param_indices/parchment.json | 0 .../param_indices/source/TestClass.java | 0 .../param_indices/source/TestEnum.java | 0 .../partial_matches/expected/TestClass.java | 0 .../partial_matches/parchment.json | 0 .../partial_matches/source/TestClass.java | 0 .../tsrg_file/expected/pkg/TestClass.java | 0 .../{ => parchment}/tsrg_file/merged.tsrg | 0 .../tsrg_file/source/pkg/TestClass.java | 0 .../net/neoforged/jst/tests/EmbeddedTest.java | 88 +++++++++++-------- 29 files changed, 50 insertions(+), 40 deletions(-) rename accesstransformers/src/{ => main}/resources/META-INF/services/net.neoforged.jst.api.SourceTransformerPlugin (100%) rename tests/data/{ => parchment}/external_refs/expected/TestClass.java (100%) rename tests/data/{ => parchment}/external_refs/parchment.json (100%) rename tests/data/{ => parchment}/external_refs/source/TestClass.java (100%) rename tests/data/{ => parchment}/javadoc/expected/ExistingJavadoc.java (100%) rename tests/data/{ => parchment}/javadoc/expected/NoExistingJavadoc.java (100%) rename tests/data/{ => parchment}/javadoc/parchment.json (100%) rename tests/data/{ => parchment}/javadoc/source/ExistingJavadoc.java (100%) rename tests/data/{ => parchment}/javadoc/source/NoExistingJavadoc.java (100%) rename tests/data/{ => parchment}/nested/expected/DefaultPkgClass.java (100%) rename tests/data/{ => parchment}/nested/expected/pkg/Outer.java (100%) rename tests/data/{ => parchment}/nested/expected/pkg/SamePkgClass.java (100%) rename tests/data/{ => parchment}/nested/parchment.json (100%) rename tests/data/{ => parchment}/nested/source/DefaultPkgClass.java (100%) rename tests/data/{ => parchment}/nested/source/pkg/Outer.java (100%) rename tests/data/{ => parchment}/nested/source/pkg/SamePkgClass.java (100%) rename tests/data/{ => parchment}/param_indices/expected/TestClass.java (100%) rename tests/data/{ => parchment}/param_indices/expected/TestEnum.java (100%) rename tests/data/{ => parchment}/param_indices/parchment.json (100%) rename tests/data/{ => parchment}/param_indices/source/TestClass.java (100%) rename tests/data/{ => parchment}/param_indices/source/TestEnum.java (100%) rename tests/data/{ => parchment}/partial_matches/expected/TestClass.java (100%) rename tests/data/{ => parchment}/partial_matches/parchment.json (100%) rename tests/data/{ => parchment}/partial_matches/source/TestClass.java (100%) rename tests/data/{ => parchment}/tsrg_file/expected/pkg/TestClass.java (100%) rename tests/data/{ => parchment}/tsrg_file/merged.tsrg (100%) rename tests/data/{ => parchment}/tsrg_file/source/pkg/TestClass.java (100%) diff --git a/accesstransformers/src/main/java/net/neoforged/jst/accesstransformers/ATsTransformer.java b/accesstransformers/src/main/java/net/neoforged/jst/accesstransformers/ATsTransformer.java index e2e71b1..a4fe87a 100644 --- a/accesstransformers/src/main/java/net/neoforged/jst/accesstransformers/ATsTransformer.java +++ b/accesstransformers/src/main/java/net/neoforged/jst/accesstransformers/ATsTransformer.java @@ -17,7 +17,7 @@ public class ATsTransformer implements SourceTransformer { - @CommandLine.Option(names = "--access-transformer-files", required = true) + @CommandLine.Option(names = "--access-transformer", required = true) public List atFiles; private Map> targets; diff --git a/accesstransformers/src/resources/META-INF/services/net.neoforged.jst.api.SourceTransformerPlugin b/accesstransformers/src/main/resources/META-INF/services/net.neoforged.jst.api.SourceTransformerPlugin similarity index 100% rename from accesstransformers/src/resources/META-INF/services/net.neoforged.jst.api.SourceTransformerPlugin rename to accesstransformers/src/main/resources/META-INF/services/net.neoforged.jst.api.SourceTransformerPlugin diff --git a/tests/data/external_refs/expected/TestClass.java b/tests/data/parchment/external_refs/expected/TestClass.java similarity index 100% rename from tests/data/external_refs/expected/TestClass.java rename to tests/data/parchment/external_refs/expected/TestClass.java diff --git a/tests/data/external_refs/parchment.json b/tests/data/parchment/external_refs/parchment.json similarity index 100% rename from tests/data/external_refs/parchment.json rename to tests/data/parchment/external_refs/parchment.json diff --git a/tests/data/external_refs/source/TestClass.java b/tests/data/parchment/external_refs/source/TestClass.java similarity index 100% rename from tests/data/external_refs/source/TestClass.java rename to tests/data/parchment/external_refs/source/TestClass.java diff --git a/tests/data/javadoc/expected/ExistingJavadoc.java b/tests/data/parchment/javadoc/expected/ExistingJavadoc.java similarity index 100% rename from tests/data/javadoc/expected/ExistingJavadoc.java rename to tests/data/parchment/javadoc/expected/ExistingJavadoc.java diff --git a/tests/data/javadoc/expected/NoExistingJavadoc.java b/tests/data/parchment/javadoc/expected/NoExistingJavadoc.java similarity index 100% rename from tests/data/javadoc/expected/NoExistingJavadoc.java rename to tests/data/parchment/javadoc/expected/NoExistingJavadoc.java diff --git a/tests/data/javadoc/parchment.json b/tests/data/parchment/javadoc/parchment.json similarity index 100% rename from tests/data/javadoc/parchment.json rename to tests/data/parchment/javadoc/parchment.json diff --git a/tests/data/javadoc/source/ExistingJavadoc.java b/tests/data/parchment/javadoc/source/ExistingJavadoc.java similarity index 100% rename from tests/data/javadoc/source/ExistingJavadoc.java rename to tests/data/parchment/javadoc/source/ExistingJavadoc.java diff --git a/tests/data/javadoc/source/NoExistingJavadoc.java b/tests/data/parchment/javadoc/source/NoExistingJavadoc.java similarity index 100% rename from tests/data/javadoc/source/NoExistingJavadoc.java rename to tests/data/parchment/javadoc/source/NoExistingJavadoc.java diff --git a/tests/data/nested/expected/DefaultPkgClass.java b/tests/data/parchment/nested/expected/DefaultPkgClass.java similarity index 100% rename from tests/data/nested/expected/DefaultPkgClass.java rename to tests/data/parchment/nested/expected/DefaultPkgClass.java diff --git a/tests/data/nested/expected/pkg/Outer.java b/tests/data/parchment/nested/expected/pkg/Outer.java similarity index 100% rename from tests/data/nested/expected/pkg/Outer.java rename to tests/data/parchment/nested/expected/pkg/Outer.java diff --git a/tests/data/nested/expected/pkg/SamePkgClass.java b/tests/data/parchment/nested/expected/pkg/SamePkgClass.java similarity index 100% rename from tests/data/nested/expected/pkg/SamePkgClass.java rename to tests/data/parchment/nested/expected/pkg/SamePkgClass.java diff --git a/tests/data/nested/parchment.json b/tests/data/parchment/nested/parchment.json similarity index 100% rename from tests/data/nested/parchment.json rename to tests/data/parchment/nested/parchment.json diff --git a/tests/data/nested/source/DefaultPkgClass.java b/tests/data/parchment/nested/source/DefaultPkgClass.java similarity index 100% rename from tests/data/nested/source/DefaultPkgClass.java rename to tests/data/parchment/nested/source/DefaultPkgClass.java diff --git a/tests/data/nested/source/pkg/Outer.java b/tests/data/parchment/nested/source/pkg/Outer.java similarity index 100% rename from tests/data/nested/source/pkg/Outer.java rename to tests/data/parchment/nested/source/pkg/Outer.java diff --git a/tests/data/nested/source/pkg/SamePkgClass.java b/tests/data/parchment/nested/source/pkg/SamePkgClass.java similarity index 100% rename from tests/data/nested/source/pkg/SamePkgClass.java rename to tests/data/parchment/nested/source/pkg/SamePkgClass.java diff --git a/tests/data/param_indices/expected/TestClass.java b/tests/data/parchment/param_indices/expected/TestClass.java similarity index 100% rename from tests/data/param_indices/expected/TestClass.java rename to tests/data/parchment/param_indices/expected/TestClass.java diff --git a/tests/data/param_indices/expected/TestEnum.java b/tests/data/parchment/param_indices/expected/TestEnum.java similarity index 100% rename from tests/data/param_indices/expected/TestEnum.java rename to tests/data/parchment/param_indices/expected/TestEnum.java diff --git a/tests/data/param_indices/parchment.json b/tests/data/parchment/param_indices/parchment.json similarity index 100% rename from tests/data/param_indices/parchment.json rename to tests/data/parchment/param_indices/parchment.json diff --git a/tests/data/param_indices/source/TestClass.java b/tests/data/parchment/param_indices/source/TestClass.java similarity index 100% rename from tests/data/param_indices/source/TestClass.java rename to tests/data/parchment/param_indices/source/TestClass.java diff --git a/tests/data/param_indices/source/TestEnum.java b/tests/data/parchment/param_indices/source/TestEnum.java similarity index 100% rename from tests/data/param_indices/source/TestEnum.java rename to tests/data/parchment/param_indices/source/TestEnum.java diff --git a/tests/data/partial_matches/expected/TestClass.java b/tests/data/parchment/partial_matches/expected/TestClass.java similarity index 100% rename from tests/data/partial_matches/expected/TestClass.java rename to tests/data/parchment/partial_matches/expected/TestClass.java diff --git a/tests/data/partial_matches/parchment.json b/tests/data/parchment/partial_matches/parchment.json similarity index 100% rename from tests/data/partial_matches/parchment.json rename to tests/data/parchment/partial_matches/parchment.json diff --git a/tests/data/partial_matches/source/TestClass.java b/tests/data/parchment/partial_matches/source/TestClass.java similarity index 100% rename from tests/data/partial_matches/source/TestClass.java rename to tests/data/parchment/partial_matches/source/TestClass.java diff --git a/tests/data/tsrg_file/expected/pkg/TestClass.java b/tests/data/parchment/tsrg_file/expected/pkg/TestClass.java similarity index 100% rename from tests/data/tsrg_file/expected/pkg/TestClass.java rename to tests/data/parchment/tsrg_file/expected/pkg/TestClass.java diff --git a/tests/data/tsrg_file/merged.tsrg b/tests/data/parchment/tsrg_file/merged.tsrg similarity index 100% rename from tests/data/tsrg_file/merged.tsrg rename to tests/data/parchment/tsrg_file/merged.tsrg diff --git a/tests/data/tsrg_file/source/pkg/TestClass.java b/tests/data/parchment/tsrg_file/source/pkg/TestClass.java similarity index 100% rename from tests/data/tsrg_file/source/pkg/TestClass.java rename to tests/data/parchment/tsrg_file/source/pkg/TestClass.java diff --git a/tests/src/test/java/net/neoforged/jst/tests/EmbeddedTest.java b/tests/src/test/java/net/neoforged/jst/tests/EmbeddedTest.java index ce4309d..665e3a2 100644 --- a/tests/src/test/java/net/neoforged/jst/tests/EmbeddedTest.java +++ b/tests/src/test/java/net/neoforged/jst/tests/EmbeddedTest.java @@ -15,6 +15,7 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.attribute.FileTime; +import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; @@ -106,7 +107,7 @@ void archiveOutput() throws Exception { class FolderSource { @Test void singleFileOutput() { - var sourceFolder = testDataRoot.resolve("nested/source"); + var sourceFolder = testDataRoot.resolve("parchment/nested/source"); var outputFile = tempDir.resolve("Output.java"); // We do not have a unified exception here @@ -118,7 +119,7 @@ void singleFileOutput() { @Test void folderOutput() throws Exception { - var sourceFolder = testDataRoot.resolve("nested/source"); + var sourceFolder = testDataRoot.resolve("parchment/nested/source"); runTool(sourceFolder.toString(), tempDir.toString()); @@ -127,7 +128,7 @@ void folderOutput() throws Exception { @Test void archiveOutput() throws Exception { - var sourceFolder = testDataRoot.resolve("nested/source"); + var sourceFolder = testDataRoot.resolve("parchment/nested/source"); var outputFile = tempDir.resolve("archive.zip"); runTool(sourceFolder.toString(), "--out-format", "archive", outputFile.toString()); @@ -146,7 +147,7 @@ class ArchiveSource { @BeforeEach void setUp() throws IOException { inputFile = tempDir.resolve("input.zip"); - var sourceFolder = testDataRoot.resolve("nested/source"); + var sourceFolder = testDataRoot.resolve("parchment/nested/source"); zipDirectory(sourceFolder, inputFile, p -> true); expectedContent = truncateTimes(loadDirToMap(sourceFolder)); } @@ -174,7 +175,7 @@ void folderOutput() throws Exception { @Test void archiveOutput() throws Exception { - var sourceFolder = testDataRoot.resolve("nested/source"); + var sourceFolder = testDataRoot.resolve("parchment/nested/source"); var outputFile = tempDir.resolve("archive.zip"); runTool(sourceFolder.toString(), "--out-format", "archive", outputFile.toString()); @@ -184,46 +185,57 @@ void archiveOutput() throws Exception { } } - @Test - void testInnerAndLocalClasses() throws Exception { - runTest("nested", "parchment.json"); - } + @Nested + class Parchment { + @Test + void testInnerAndLocalClasses() throws Exception { + runParchmentTest("nested", "parchment.json"); + } - @Test - void testExternalReferences() throws Exception { - runTest("external_refs", "parchment.json"); - } + @Test + void testExternalReferences() throws Exception { + runParchmentTest("external_refs", "parchment.json"); + } - @Test - void testPartialMatches() throws Exception { - runTest("partial_matches", "parchment.json"); - } + @Test + void testPartialMatches() throws Exception { + runParchmentTest("partial_matches", "parchment.json"); + } - @Test - void testParamIndices() throws Exception { - runTest("param_indices", "parchment.json"); + @Test + void testParamIndices() throws Exception { + runParchmentTest("param_indices", "parchment.json"); + } + + @Test + void testJavadoc() throws Exception { + runParchmentTest("javadoc", "parchment.json"); + } + + @Test + void testTsrgMappings() throws Exception { + runParchmentTest("tsrg_file", "merged.tsrg"); + } } - @Test - void testJavadoc() throws Exception { - runTest("javadoc", "parchment.json"); + protected final void runATTest(String testDirName) throws Exception { + testDirName = "accesstransformer/" + testDirName; + runTest(testDirName, "--enable-accesstransformers", "--access-transformer", testDataRoot.resolve(testDirName).resolve("accesstransformer.cfg").toString()); } - @Test - void testTsrgMappings() throws Exception { - runTest("tsrg_file", "merged.tsrg"); + protected final void runParchmentTest(String testDirName, String mappingsFilename) throws Exception { + testDirName = "parchment/" + testDirName; + runTest(testDirName, "--enable-parchment", "--parchment-mappings", testDataRoot.resolve(testDirName).resolve(mappingsFilename).toString()); } - protected final void runTest(String testDirName, String mappingsFilename) throws Exception { + protected final void runTest(String testDirName, String... args) throws Exception { var testDir = testDataRoot.resolve(testDirName); - var mappingsFile = testDir.resolve(mappingsFilename); var sourceDir = testDir.resolve("source"); var expectedDir = testDir.resolve("expected"); var inputFile = tempDir.resolve("input.jar"); - zipDirectory(sourceDir, inputFile, path -> { - return Files.isDirectory(path) || path.getFileName().toString().endsWith(".java"); - }); + zipDirectory(sourceDir, inputFile, path -> + Files.isDirectory(path) || path.getFileName().toString().endsWith(".java")); var outputFile = tempDir.resolve("output.jar"); @@ -232,16 +244,14 @@ protected final void runTest(String testDirName, String mappingsFilename) throws var librariesFile = tempDir.resolve("libraries.txt"); Files.write(librariesFile, List.of("-e=" + junitJarPath)); - runTool( + final List arguments = new ArrayList<>(Arrays.asList( "--max-queue-depth=1", "--libraries-list", - librariesFile.toString(), - "--enable-parchment", - "--parchment-mappings", - mappingsFile.toString(), - inputFile.toString(), - outputFile.toString() - ); + librariesFile.toString())); + arguments.addAll(Arrays.asList(args)); + arguments.add(inputFile.toString()); + arguments.add(outputFile.toString()); + runTool(arguments.toArray(String[]::new)); try (var zipFile = new ZipFile(outputFile.toFile())) { var it = zipFile.entries().asIterator(); From 01e1610f4f71acca3430407e5557f36b2cc10419 Mon Sep 17 00:00:00 2001 From: Matyrobbrt Date: Sun, 14 Apr 2024 15:23:31 +0300 Subject: [PATCH 3/6] Wildcard and inner tests --- .../accesstransformers/ApplyATsVisitor.java | 19 ++++++++++++------- .../inner_classes/accesstransformer.cfg | 2 ++ .../expected/com/example/RootClass.java | 9 +++++++++ .../source/com/example/RootClass.java | 9 +++++++++ .../wildcard/accesstransformer.cfg | 2 ++ .../wildcard/expected/TestClass.java | 12 ++++++++++++ .../wildcard/source/TestClass.java | 12 ++++++++++++ .../net/neoforged/jst/tests/EmbeddedTest.java | 13 +++++++++++++ 8 files changed, 71 insertions(+), 7 deletions(-) create mode 100644 tests/data/accesstransformer/inner_classes/accesstransformer.cfg create mode 100644 tests/data/accesstransformer/inner_classes/expected/com/example/RootClass.java create mode 100644 tests/data/accesstransformer/inner_classes/source/com/example/RootClass.java create mode 100644 tests/data/accesstransformer/wildcard/accesstransformer.cfg create mode 100644 tests/data/accesstransformer/wildcard/expected/TestClass.java create mode 100644 tests/data/accesstransformer/wildcard/source/TestClass.java diff --git a/accesstransformers/src/main/java/net/neoforged/jst/accesstransformers/ApplyATsVisitor.java b/accesstransformers/src/main/java/net/neoforged/jst/accesstransformers/ApplyATsVisitor.java index e5e0ed3..8cf78e9 100644 --- a/accesstransformers/src/main/java/net/neoforged/jst/accesstransformers/ApplyATsVisitor.java +++ b/accesstransformers/src/main/java/net/neoforged/jst/accesstransformers/ApplyATsVisitor.java @@ -78,20 +78,25 @@ private void apply(AccessTransformer at, PsiModifierList modifiers) { if (!at.isValid()) return; var targetAcc = at.getTargetAccess(); - if (targetAcc != AccessTransformer.Modifier.DEFAULT && !modifiers.hasModifierProperty(MODIFIER_TO_STRING.get(targetAcc))) { + if (targetAcc == AccessTransformer.Modifier.DEFAULT || !modifiers.hasModifierProperty(MODIFIER_TO_STRING.get(targetAcc))) { final var existingModifier = Arrays.stream(modifiers.getChildren()) .filter(el -> el instanceof PsiKeyword) .map(el -> (PsiKeyword) el) .filter(kw -> ACCESS_MODIFIERS.contains(kw.getText())) .findFirst(); - if (existingModifier.isPresent()) { - replacements.replace(existingModifier.get(), MODIFIER_TO_STRING.get(targetAcc)); + + if (targetAcc == AccessTransformer.Modifier.DEFAULT) { + existingModifier.ifPresent(replacements::remove); } else { - if (modifiers.getChildren().length == 0) { - // Empty modifiers are blank so we basically replace them - replacements.insertAfter(modifiers, MODIFIER_TO_STRING.get(targetAcc) + " "); + if (existingModifier.isPresent()) { + replacements.replace(existingModifier.get(), MODIFIER_TO_STRING.get(targetAcc)); } else { - replacements.insertBefore(modifiers, MODIFIER_TO_STRING.get(targetAcc) + " "); + if (modifiers.getChildren().length == 0) { + // Empty modifiers are blank so we basically replace them + replacements.insertAfter(modifiers, MODIFIER_TO_STRING.get(targetAcc) + " "); + } else { + replacements.insertBefore(modifiers, MODIFIER_TO_STRING.get(targetAcc) + " "); + } } } } diff --git a/tests/data/accesstransformer/inner_classes/accesstransformer.cfg b/tests/data/accesstransformer/inner_classes/accesstransformer.cfg new file mode 100644 index 0000000..9e44386 --- /dev/null +++ b/tests/data/accesstransformer/inner_classes/accesstransformer.cfg @@ -0,0 +1,2 @@ +public com.example.RootClass$InnerClass1 +protected-f com.example.RootClass$InnerClass1$InnerClassNested diff --git a/tests/data/accesstransformer/inner_classes/expected/com/example/RootClass.java b/tests/data/accesstransformer/inner_classes/expected/com/example/RootClass.java new file mode 100644 index 0000000..7171187 --- /dev/null +++ b/tests/data/accesstransformer/inner_classes/expected/com/example/RootClass.java @@ -0,0 +1,9 @@ +package com.example; + +class RootClass { + public class InnerClass1 { + protected static class InnerClassNested { + + } + } +} diff --git a/tests/data/accesstransformer/inner_classes/source/com/example/RootClass.java b/tests/data/accesstransformer/inner_classes/source/com/example/RootClass.java new file mode 100644 index 0000000..65b14a7 --- /dev/null +++ b/tests/data/accesstransformer/inner_classes/source/com/example/RootClass.java @@ -0,0 +1,9 @@ +package com.example; + +class RootClass { + class InnerClass1 { + static final class InnerClassNested { + + } + } +} diff --git a/tests/data/accesstransformer/wildcard/accesstransformer.cfg b/tests/data/accesstransformer/wildcard/accesstransformer.cfg new file mode 100644 index 0000000..cb512be --- /dev/null +++ b/tests/data/accesstransformer/wildcard/accesstransformer.cfg @@ -0,0 +1,2 @@ +default TestClass * +public TestClass *() diff --git a/tests/data/accesstransformer/wildcard/expected/TestClass.java b/tests/data/accesstransformer/wildcard/expected/TestClass.java new file mode 100644 index 0000000..6fe2277 --- /dev/null +++ b/tests/data/accesstransformer/wildcard/expected/TestClass.java @@ -0,0 +1,12 @@ +class TestClass { + String f1; + int f2; + + public void m1(int a) { + + } + + public static String m2(boolean ok) { + return "abc"; + } +} diff --git a/tests/data/accesstransformer/wildcard/source/TestClass.java b/tests/data/accesstransformer/wildcard/source/TestClass.java new file mode 100644 index 0000000..6f939d3 --- /dev/null +++ b/tests/data/accesstransformer/wildcard/source/TestClass.java @@ -0,0 +1,12 @@ +class TestClass { + private String f1; + private int f2; + + private void m1(int a) { + + } + + private static String m2(boolean ok) { + return "abc"; + } +} diff --git a/tests/src/test/java/net/neoforged/jst/tests/EmbeddedTest.java b/tests/src/test/java/net/neoforged/jst/tests/EmbeddedTest.java index 665e3a2..1b52138 100644 --- a/tests/src/test/java/net/neoforged/jst/tests/EmbeddedTest.java +++ b/tests/src/test/java/net/neoforged/jst/tests/EmbeddedTest.java @@ -218,6 +218,19 @@ void testTsrgMappings() throws Exception { } } + @Nested + class AccessTransformer { + @Test + void testInnerClasses() throws Exception { + runATTest("inner_classes"); + } + + @Test + void testWildcard() throws Exception { + runATTest("wildcard"); + } + } + protected final void runATTest(String testDirName) throws Exception { testDirName = "accesstransformer/" + testDirName; runTest(testDirName, "--enable-accesstransformers", "--access-transformer", testDataRoot.resolve(testDirName).resolve("accesstransformer.cfg").toString()); From beb48e0246d58ca8f1dc08e5c60cc67162106e3a Mon Sep 17 00:00:00 2001 From: Matyrobbrt Date: Sun, 14 Apr 2024 22:15:34 +0300 Subject: [PATCH 4/6] Add 3 more sets of tests --- .../classes/accesstransformer.cfg | 2 ++ .../accesstransformer/classes/expected/C1.java | 3 +++ .../accesstransformer/classes/expected/C2f.java | 3 +++ .../data/accesstransformer/classes/source/C1.java | 3 +++ .../accesstransformer/classes/source/C2f.java | 3 +++ .../fields/accesstransformer.cfg | 3 +++ .../accesstransformer/fields/expected/ABC.java | 5 +++++ .../data/accesstransformer/fields/source/ABC.java | 5 +++++ .../methods/accesstransformer.cfg | 3 +++ .../accesstransformer/methods/expected/ABC.java | 13 +++++++++++++ .../accesstransformer/methods/source/ABC.java | 13 +++++++++++++ .../net/neoforged/jst/tests/EmbeddedTest.java | 15 +++++++++++++++ 12 files changed, 71 insertions(+) create mode 100644 tests/data/accesstransformer/classes/accesstransformer.cfg create mode 100644 tests/data/accesstransformer/classes/expected/C1.java create mode 100644 tests/data/accesstransformer/classes/expected/C2f.java create mode 100644 tests/data/accesstransformer/classes/source/C1.java create mode 100644 tests/data/accesstransformer/classes/source/C2f.java create mode 100644 tests/data/accesstransformer/fields/accesstransformer.cfg create mode 100644 tests/data/accesstransformer/fields/expected/ABC.java create mode 100644 tests/data/accesstransformer/fields/source/ABC.java create mode 100644 tests/data/accesstransformer/methods/accesstransformer.cfg create mode 100644 tests/data/accesstransformer/methods/expected/ABC.java create mode 100644 tests/data/accesstransformer/methods/source/ABC.java diff --git a/tests/data/accesstransformer/classes/accesstransformer.cfg b/tests/data/accesstransformer/classes/accesstransformer.cfg new file mode 100644 index 0000000..f53af6f --- /dev/null +++ b/tests/data/accesstransformer/classes/accesstransformer.cfg @@ -0,0 +1,2 @@ +public C1 +default-f C2f diff --git a/tests/data/accesstransformer/classes/expected/C1.java b/tests/data/accesstransformer/classes/expected/C1.java new file mode 100644 index 0000000..65c03e4 --- /dev/null +++ b/tests/data/accesstransformer/classes/expected/C1.java @@ -0,0 +1,3 @@ +public class C1 { + +} diff --git a/tests/data/accesstransformer/classes/expected/C2f.java b/tests/data/accesstransformer/classes/expected/C2f.java new file mode 100644 index 0000000..fa5ba2f --- /dev/null +++ b/tests/data/accesstransformer/classes/expected/C2f.java @@ -0,0 +1,3 @@ +class C2f { + +} diff --git a/tests/data/accesstransformer/classes/source/C1.java b/tests/data/accesstransformer/classes/source/C1.java new file mode 100644 index 0000000..492c5d2 --- /dev/null +++ b/tests/data/accesstransformer/classes/source/C1.java @@ -0,0 +1,3 @@ +class C1 { + +} diff --git a/tests/data/accesstransformer/classes/source/C2f.java b/tests/data/accesstransformer/classes/source/C2f.java new file mode 100644 index 0000000..cdf8703 --- /dev/null +++ b/tests/data/accesstransformer/classes/source/C2f.java @@ -0,0 +1,3 @@ +final class C2f { + +} diff --git a/tests/data/accesstransformer/fields/accesstransformer.cfg b/tests/data/accesstransformer/fields/accesstransformer.cfg new file mode 100644 index 0000000..e7c0069 --- /dev/null +++ b/tests/data/accesstransformer/fields/accesstransformer.cfg @@ -0,0 +1,3 @@ +protected ABC s1 +public-f ABC s2 +public ABC b1 diff --git a/tests/data/accesstransformer/fields/expected/ABC.java b/tests/data/accesstransformer/fields/expected/ABC.java new file mode 100644 index 0000000..7aa1504 --- /dev/null +++ b/tests/data/accesstransformer/fields/expected/ABC.java @@ -0,0 +1,5 @@ +class ABC { + protected String s1; + public String s2 = ""; + public static boolean b1; +} diff --git a/tests/data/accesstransformer/fields/source/ABC.java b/tests/data/accesstransformer/fields/source/ABC.java new file mode 100644 index 0000000..df10592 --- /dev/null +++ b/tests/data/accesstransformer/fields/source/ABC.java @@ -0,0 +1,5 @@ +class ABC { + private String s1; + public final String s2 = ""; + protected static boolean b1; +} diff --git a/tests/data/accesstransformer/methods/accesstransformer.cfg b/tests/data/accesstransformer/methods/accesstransformer.cfg new file mode 100644 index 0000000..adff749 --- /dev/null +++ b/tests/data/accesstransformer/methods/accesstransformer.cfg @@ -0,0 +1,3 @@ +public-f ABC doThing()V +protected ABC ret(Z)I +default ABC m2(Ljava/lang/String;)V diff --git a/tests/data/accesstransformer/methods/expected/ABC.java b/tests/data/accesstransformer/methods/expected/ABC.java new file mode 100644 index 0000000..5598ac9 --- /dev/null +++ b/tests/data/accesstransformer/methods/expected/ABC.java @@ -0,0 +1,13 @@ +class ABC { + public void doThing() { + + } + + protected int ret(boolean b) { + return 0; + } + + static void m2(String str) { + + } +} diff --git a/tests/data/accesstransformer/methods/source/ABC.java b/tests/data/accesstransformer/methods/source/ABC.java new file mode 100644 index 0000000..5a60dea --- /dev/null +++ b/tests/data/accesstransformer/methods/source/ABC.java @@ -0,0 +1,13 @@ +class ABC { + public final void doThing() { + + } + + private int ret(boolean b) { + return 0; + } + + private static void m2(String str) { + + } +} diff --git a/tests/src/test/java/net/neoforged/jst/tests/EmbeddedTest.java b/tests/src/test/java/net/neoforged/jst/tests/EmbeddedTest.java index 1b52138..fbd14cd 100644 --- a/tests/src/test/java/net/neoforged/jst/tests/EmbeddedTest.java +++ b/tests/src/test/java/net/neoforged/jst/tests/EmbeddedTest.java @@ -220,6 +220,21 @@ void testTsrgMappings() throws Exception { @Nested class AccessTransformer { + @Test + void testFields() throws Exception { + runATTest("fields"); + } + + @Test + void testMethods() throws Exception { + runATTest("methods"); + } + + @Test + void testClasses() throws Exception { + runATTest("classes"); + } + @Test void testInnerClasses() throws Exception { runATTest("inner_classes"); From cdf334faf03c01729a210fe2e9d4d084c4251b56 Mon Sep 17 00:00:00 2001 From: Matyrobbrt Date: Sun, 14 Apr 2024 23:55:20 +0300 Subject: [PATCH 5/6] Switch to https://github.com/neoforged/AccessTransformers/pull/6 --- accesstransformers/build.gradle | 2 +- .../accesstransformers/ATsTransformer.java | 15 ++--- .../accesstransformers/ApplyATsVisitor.java | 66 +++++++++---------- settings.gradle | 5 +- 4 files changed, 42 insertions(+), 46 deletions(-) diff --git a/accesstransformers/build.gradle b/accesstransformers/build.gradle index 1d6dd96..e760427 100644 --- a/accesstransformers/build.gradle +++ b/accesstransformers/build.gradle @@ -4,7 +4,7 @@ plugins { dependencies { implementation project(":api") - implementation 'net.neoforged:accesstransformers:10.0.6' + implementation 'net.neoforged.accesstransformers:at-parser:10.0.15' testImplementation platform("org.junit:junit-bom:$junit_version") testImplementation 'org.junit.jupiter:junit-jupiter' diff --git a/accesstransformers/src/main/java/net/neoforged/jst/accesstransformers/ATsTransformer.java b/accesstransformers/src/main/java/net/neoforged/jst/accesstransformers/ATsTransformer.java index a4fe87a..5eea93b 100644 --- a/accesstransformers/src/main/java/net/neoforged/jst/accesstransformers/ATsTransformer.java +++ b/accesstransformers/src/main/java/net/neoforged/jst/accesstransformers/ATsTransformer.java @@ -1,9 +1,7 @@ package net.neoforged.jst.accesstransformers; import com.intellij.psi.PsiFile; -import net.neoforged.accesstransformer.api.AccessTransformer; -import net.neoforged.accesstransformer.api.AccessTransformerEngine; -import net.neoforged.accesstransformer.parser.AccessTransformerList; +import net.neoforged.accesstransformer.parser.AccessTransformerFiles; import net.neoforged.jst.api.Replacements; import net.neoforged.jst.api.SourceTransformer; import net.neoforged.jst.api.TransformContext; @@ -13,30 +11,27 @@ import java.io.UncheckedIOException; import java.nio.file.Path; import java.util.List; -import java.util.Map; public class ATsTransformer implements SourceTransformer { @CommandLine.Option(names = "--access-transformer", required = true) public List atFiles; - private Map> targets; + private AccessTransformerFiles ats; @Override public void beforeRun(TransformContext context) { - final var engine = AccessTransformerEngine.newEngine(); + ats = new AccessTransformerFiles(); try { for (Path path : atFiles) { - engine.loadATFromPath(path); + ats.loadFromPath(path); } } catch (IOException ex) { throw new UncheckedIOException(ex); } - - targets = engine.getAccessTransformers(); } @Override public void visitFile(PsiFile psiFile, Replacements replacements) { - new ApplyATsVisitor(targets, replacements).visitFile(psiFile); + new ApplyATsVisitor(ats, replacements).visitFile(psiFile); } } diff --git a/accesstransformers/src/main/java/net/neoforged/jst/accesstransformers/ApplyATsVisitor.java b/accesstransformers/src/main/java/net/neoforged/jst/accesstransformers/ApplyATsVisitor.java index 8cf78e9..e2903c4 100644 --- a/accesstransformers/src/main/java/net/neoforged/jst/accesstransformers/ApplyATsVisitor.java +++ b/accesstransformers/src/main/java/net/neoforged/jst/accesstransformers/ApplyATsVisitor.java @@ -9,10 +9,12 @@ import com.intellij.psi.PsiModifierList; import com.intellij.psi.PsiRecursiveElementVisitor; import com.intellij.psi.util.ClassUtil; -import net.neoforged.accesstransformer.api.AccessTransformer; -import net.neoforged.accesstransformer.api.TargetType; +import net.neoforged.accesstransformer.parser.AccessTransformerFiles; +import net.neoforged.accesstransformer.parser.Target; +import net.neoforged.accesstransformer.parser.Transformation; import net.neoforged.jst.api.Replacements; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.Arrays; import java.util.EnumMap; @@ -21,14 +23,14 @@ class ApplyATsVisitor extends PsiRecursiveElementVisitor { private static final List ACCESS_MODIFIERS = List.of(PsiModifier.PUBLIC, PsiModifier.PRIVATE, PsiModifier.PROTECTED); - public static final EnumMap MODIFIER_TO_STRING = new EnumMap<>( - Map.of(AccessTransformer.Modifier.PRIVATE, PsiModifier.PRIVATE, AccessTransformer.Modifier.PUBLIC, PsiModifier.PUBLIC, AccessTransformer.Modifier.PROTECTED, PsiModifier.PROTECTED) + public static final EnumMap MODIFIER_TO_STRING = new EnumMap<>( + Map.of(Transformation.Modifier.PRIVATE, PsiModifier.PRIVATE, Transformation.Modifier.PUBLIC, PsiModifier.PUBLIC, Transformation.Modifier.PROTECTED, PsiModifier.PROTECTED) ); - private final Map> ats; + private final AccessTransformerFiles ats; private final Replacements replacements; - public ApplyATsVisitor(Map> ats, Replacements replacements) { + public ApplyATsVisitor(AccessTransformerFiles ats, Replacements replacements) { this.ats = ats; this.replacements = replacements; } @@ -38,54 +40,52 @@ public void visitElement(@NotNull PsiElement element) { if (element instanceof PsiClass psiClass) { if (psiClass.getQualifiedName() != null) { String className = ClassUtil.getJVMClassName(psiClass); - ats.getOrDefault(className, List.of()) - .forEach(accessTransformer -> { - if (accessTransformer.getTarget().getType() == TargetType.CLASS && accessTransformer.getTarget().targetName().equals(className)) { - apply(accessTransformer, psiClass.getModifierList()); - } - }); + if (!ats.containsClassTarget(className)) return; // Skip this class and all its children + + apply(ats.getAccessTransformers().get(new Target.ClassTarget(className)), psiClass.getModifierList()); + var fieldWildcard = ats.getAccessTransformers().get(new Target.WildcardFieldTarget(className)); + if (fieldWildcard != null) { + for (PsiField field : psiClass.getFields()) { + apply(fieldWildcard, field.getModifierList()); + } + } + + var methodWildcard = ats.getAccessTransformers().get(new Target.WildcardMethodTarget(className)); + if (methodWildcard != null) { + for (PsiMethod method : psiClass.getMethods()) { + apply(methodWildcard, method.getModifierList()); + } + } } } else if (element instanceof PsiField field) { final var cls = field.getContainingClass(); if (cls != null && cls.getQualifiedName() != null) { String className = ClassUtil.getJVMClassName(cls); - ats.getOrDefault(className, List.of()) - .forEach(accessTransformer -> { - if ((accessTransformer.getTarget().getType() == TargetType.FIELD && accessTransformer.getTarget().targetName().equals(field.getName())) || accessTransformer.getTarget().getWildcardTarget() == TargetType.FIELD) { - apply(accessTransformer, field.getModifierList()); - } - }); + apply(ats.getAccessTransformers().get(new Target.FieldTarget(className, field.getName())), field.getModifierList()); } } else if (element instanceof PsiMethod method) { final var cls = method.getContainingClass(); if (cls != null && cls.getQualifiedName() != null) { String className = ClassUtil.getJVMClassName(cls); - ats.getOrDefault(className, List.of()) - .forEach(accessTransformer -> { - if ((accessTransformer.getTarget().getType() == TargetType.METHOD && accessTransformer.getTarget().targetName().equals( - method.getName() + ClassUtil.getAsmMethodSignature(method) - )) || accessTransformer.getTarget().getWildcardTarget() == TargetType.METHOD) { - apply(accessTransformer, method.getModifierList()); - } - }); + apply(ats.getAccessTransformers().get(new Target.MethodTarget(className, method.getName(), ClassUtil.getAsmMethodSignature(method))), method.getModifierList()); } } element.acceptChildren(this); } - private void apply(AccessTransformer at, PsiModifierList modifiers) { - if (!at.isValid()) return; + private void apply(@Nullable Transformation at, PsiModifierList modifiers) { + if (at == null || !at.isValid()) return; - var targetAcc = at.getTargetAccess(); - if (targetAcc == AccessTransformer.Modifier.DEFAULT || !modifiers.hasModifierProperty(MODIFIER_TO_STRING.get(targetAcc))) { + var targetAcc = at.modifier(); + if (targetAcc == Transformation.Modifier.DEFAULT || !modifiers.hasModifierProperty(MODIFIER_TO_STRING.get(targetAcc))) { final var existingModifier = Arrays.stream(modifiers.getChildren()) .filter(el -> el instanceof PsiKeyword) .map(el -> (PsiKeyword) el) .filter(kw -> ACCESS_MODIFIERS.contains(kw.getText())) .findFirst(); - if (targetAcc == AccessTransformer.Modifier.DEFAULT) { + if (targetAcc == Transformation.Modifier.DEFAULT) { existingModifier.ifPresent(replacements::remove); } else { if (existingModifier.isPresent()) { @@ -101,8 +101,8 @@ private void apply(AccessTransformer at, PsiModifierList modifiers) { } } - var finalState = at.getTargetFinalState(); - if (finalState == AccessTransformer.FinalState.REMOVEFINAL && modifiers.hasModifierProperty(PsiModifier.FINAL)) { + var finalState = at.finalState(); + if (finalState == Transformation.FinalState.REMOVEFINAL && modifiers.hasModifierProperty(PsiModifier.FINAL)) { Arrays.stream(modifiers.getChildren()) .filter(el -> el instanceof PsiKeyword) .map(el -> (PsiKeyword) el) diff --git a/settings.gradle b/settings.gradle index 94a0195..fcda124 100644 --- a/settings.gradle +++ b/settings.gradle @@ -28,10 +28,11 @@ dependencyResolutionManagement { url "https://maven.neoforged.net/releases/" } maven { - name 'Maven for PR #8' // https://github.com/neoforged/AccessTransformers/pull/8 - url 'https://prmaven.neoforged.net/AccessTransformers/pr8' + name 'Maven for PR #6' // https://github.com/neoforged/AccessTransformers/pull/6 + url 'https://prmaven.neoforged.net/AccessTransformers/pr6' content { includeModule('net.neoforged', 'accesstransformers') + includeModule('net.neoforged.accesstransformers', 'at-parser') includeModule('net.neoforged.accesstransformers', 'at-cli') includeModule('net.neoforged.accesstransformers', 'at-modlauncher') } From 3a52fde222cd23130ec02a9d6385e115487603e4 Mon Sep 17 00:00:00 2001 From: Matyrobbrt Date: Wed, 17 Apr 2024 23:55:23 +0300 Subject: [PATCH 6/6] Review comments --- accesstransformers/build.gradle | 2 +- .../{ATsPlugin.java => AccessTransformersPlugin.java} | 8 ++++++-- ...sformer.java => AccessTransformersTransformer.java} | 2 +- .../jst/accesstransformers/ApplyATsVisitor.java | 4 +++- .../net.neoforged.jst.api.SourceTransformerPlugin | 2 +- settings.gradle | 10 ---------- 6 files changed, 12 insertions(+), 16 deletions(-) rename accesstransformers/src/main/java/net/neoforged/jst/accesstransformers/{ATsPlugin.java => AccessTransformersPlugin.java} (50%) rename accesstransformers/src/main/java/net/neoforged/jst/accesstransformers/{ATsTransformer.java => AccessTransformersTransformer.java} (93%) diff --git a/accesstransformers/build.gradle b/accesstransformers/build.gradle index e760427..b3d29f9 100644 --- a/accesstransformers/build.gradle +++ b/accesstransformers/build.gradle @@ -4,7 +4,7 @@ plugins { dependencies { implementation project(":api") - implementation 'net.neoforged.accesstransformers:at-parser:10.0.15' + implementation 'net.neoforged.accesstransformers:at-parser:11.0.0' testImplementation platform("org.junit:junit-bom:$junit_version") testImplementation 'org.junit.jupiter:junit-jupiter' diff --git a/accesstransformers/src/main/java/net/neoforged/jst/accesstransformers/ATsPlugin.java b/accesstransformers/src/main/java/net/neoforged/jst/accesstransformers/AccessTransformersPlugin.java similarity index 50% rename from accesstransformers/src/main/java/net/neoforged/jst/accesstransformers/ATsPlugin.java rename to accesstransformers/src/main/java/net/neoforged/jst/accesstransformers/AccessTransformersPlugin.java index 4f5fa04..4efd424 100644 --- a/accesstransformers/src/main/java/net/neoforged/jst/accesstransformers/ATsPlugin.java +++ b/accesstransformers/src/main/java/net/neoforged/jst/accesstransformers/AccessTransformersPlugin.java @@ -3,7 +3,11 @@ import net.neoforged.jst.api.SourceTransformer; import net.neoforged.jst.api.SourceTransformerPlugin; -public class ATsPlugin implements SourceTransformerPlugin { +/** + * Access transformers allow modifying the access of classes, fields and methods. + * Mods can use ATs to remove the final modifier, or increase the visibility of a method. + */ +public class AccessTransformersPlugin implements SourceTransformerPlugin { @Override public String getName() { return "accesstransformers"; @@ -11,6 +15,6 @@ public String getName() { @Override public SourceTransformer createTransformer() { - return new ATsTransformer(); + return new AccessTransformersTransformer(); } } diff --git a/accesstransformers/src/main/java/net/neoforged/jst/accesstransformers/ATsTransformer.java b/accesstransformers/src/main/java/net/neoforged/jst/accesstransformers/AccessTransformersTransformer.java similarity index 93% rename from accesstransformers/src/main/java/net/neoforged/jst/accesstransformers/ATsTransformer.java rename to accesstransformers/src/main/java/net/neoforged/jst/accesstransformers/AccessTransformersTransformer.java index 5eea93b..0254ced 100644 --- a/accesstransformers/src/main/java/net/neoforged/jst/accesstransformers/ATsTransformer.java +++ b/accesstransformers/src/main/java/net/neoforged/jst/accesstransformers/AccessTransformersTransformer.java @@ -12,7 +12,7 @@ import java.nio.file.Path; import java.util.List; -public class ATsTransformer implements SourceTransformer { +public class AccessTransformersTransformer implements SourceTransformer { @CommandLine.Option(names = "--access-transformer", required = true) public List atFiles; diff --git a/accesstransformers/src/main/java/net/neoforged/jst/accesstransformers/ApplyATsVisitor.java b/accesstransformers/src/main/java/net/neoforged/jst/accesstransformers/ApplyATsVisitor.java index e2903c4..334ac85 100644 --- a/accesstransformers/src/main/java/net/neoforged/jst/accesstransformers/ApplyATsVisitor.java +++ b/accesstransformers/src/main/java/net/neoforged/jst/accesstransformers/ApplyATsVisitor.java @@ -40,7 +40,9 @@ public void visitElement(@NotNull PsiElement element) { if (element instanceof PsiClass psiClass) { if (psiClass.getQualifiedName() != null) { String className = ClassUtil.getJVMClassName(psiClass); - if (!ats.containsClassTarget(className)) return; // Skip this class and all its children + if (!ats.containsClassTarget(className)) { + return; // Skip this class and all its children + } apply(ats.getAccessTransformers().get(new Target.ClassTarget(className)), psiClass.getModifierList()); var fieldWildcard = ats.getAccessTransformers().get(new Target.WildcardFieldTarget(className)); diff --git a/accesstransformers/src/main/resources/META-INF/services/net.neoforged.jst.api.SourceTransformerPlugin b/accesstransformers/src/main/resources/META-INF/services/net.neoforged.jst.api.SourceTransformerPlugin index 07b3902..16e6b5f 100644 --- a/accesstransformers/src/main/resources/META-INF/services/net.neoforged.jst.api.SourceTransformerPlugin +++ b/accesstransformers/src/main/resources/META-INF/services/net.neoforged.jst.api.SourceTransformerPlugin @@ -1 +1 @@ -net.neoforged.jst.accesstransformers.ATsPlugin +net.neoforged.jst.accesstransformers.AccessTransformersPlugin diff --git a/settings.gradle b/settings.gradle index fcda124..abff962 100644 --- a/settings.gradle +++ b/settings.gradle @@ -27,16 +27,6 @@ dependencyResolutionManagement { maven { url "https://maven.neoforged.net/releases/" } - maven { - name 'Maven for PR #6' // https://github.com/neoforged/AccessTransformers/pull/6 - url 'https://prmaven.neoforged.net/AccessTransformers/pr6' - content { - includeModule('net.neoforged', 'accesstransformers') - includeModule('net.neoforged.accesstransformers', 'at-parser') - includeModule('net.neoforged.accesstransformers', 'at-cli') - includeModule('net.neoforged.accesstransformers', 'at-modlauncher') - } - } } }