Skip to content

Commit 73b8047

Browse files
committed
Flag to inherit access transformers on methods
Useful for modifying methods exposed by types with a lot of children to avoid specifying them all.
1 parent 387a38a commit 73b8047

File tree

17 files changed

+125
-10
lines changed

17 files changed

+125
-10
lines changed

accesstransformers/src/main/java/net/neoforged/jst/accesstransformers/AccessTransformersTransformer.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,12 @@ public class AccessTransformersTransformer implements SourceTransformer {
2525
@CommandLine.Option(names = "--access-transformer-validation", description = "The level of validation to use for ats")
2626
public AccessTransformerValidation validation = AccessTransformerValidation.LOG;
2727

28+
@CommandLine.Option(
29+
names = "--access-transformer-inherit-method",
30+
description = "Whether or not access transformers on methods should be inherited from parent types"
31+
)
32+
public boolean inheritMethodAccessTransformers = false;
33+
2834
private AccessTransformerFiles ats;
2935
private Map<Target, Transformation> pendingATs;
3036
private Logger logger;
@@ -64,7 +70,13 @@ public boolean afterRun(TransformContext context) {
6470

6571
@Override
6672
public void visitFile(PsiFile psiFile, Replacements replacements) {
67-
var visitor = new ApplyATsVisitor(ats, replacements, pendingATs, logger);
73+
var visitor = new ApplyATsVisitor(
74+
ats,
75+
replacements,
76+
pendingATs,
77+
this.inheritMethodAccessTransformers,
78+
logger
79+
);
6880
visitor.visitFile(psiFile);
6981
if (visitor.errored) {
7082
errored = true;

accesstransformers/src/main/java/net/neoforged/jst/accesstransformers/ApplyATsVisitor.java

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
import com.intellij.psi.PsiRecursiveElementVisitor;
1515
import com.intellij.psi.PsiWhiteSpace;
1616
import com.intellij.psi.util.ClassUtil;
17-
import com.intellij.psi.util.PsiClassUtil;
1817
import net.neoforged.accesstransformer.parser.AccessTransformerFiles;
1918
import net.neoforged.accesstransformer.parser.Target;
2019
import net.neoforged.accesstransformer.parser.Transformation;
@@ -46,12 +45,20 @@ class ApplyATsVisitor extends PsiRecursiveElementVisitor {
4645
private final AccessTransformerFiles ats;
4746
private final Replacements replacements;
4847
private final Map<Target, Transformation> pendingATs;
48+
private final boolean inheritMethodATs;
4949
private final Logger logger;
5050
boolean errored = false;
5151

52-
public ApplyATsVisitor(AccessTransformerFiles ats, Replacements replacements, Map<Target, Transformation> pendingATs, Logger logger) {
52+
public ApplyATsVisitor(
53+
AccessTransformerFiles ats,
54+
Replacements replacements,
55+
Map<Target, Transformation> pendingATs,
56+
boolean inheritMethodATs,
57+
Logger logger
58+
) {
5359
this.ats = ats;
5460
this.replacements = replacements;
61+
this.inheritMethodATs = inheritMethodATs;
5562
this.logger = logger;
5663
this.pendingATs = pendingATs;
5764
}
@@ -61,7 +68,7 @@ public void visitElement(@NotNull PsiElement element) {
6168
if (element instanceof PsiClass psiClass) {
6269
if (psiClass.getQualifiedName() != null) {
6370
String className = ClassUtil.getJVMClassName(psiClass);
64-
if (!ats.containsClassTarget(className)) {
71+
if (!inheritMethodATs && !ats.containsClassTarget(className)) {
6572
// Skip this class and its children, but not the inner classes
6673
for (PsiClass innerClass : psiClass.getInnerClasses()) {
6774
visitElement(innerClass);
@@ -106,10 +113,20 @@ public void visitElement(@NotNull PsiElement element) {
106113
apply(pendingATs.remove(new Target.FieldTarget(className, field.getName())), field, cls);
107114
}
108115
} else if (element instanceof PsiMethod method) {
109-
final var cls = method.getContainingClass();
110-
if (cls != null && cls.getQualifiedName() != null) {
111-
String className = ClassUtil.getJVMClassName(cls);
112-
apply(pendingATs.remove(method(className, method)), method, cls);
116+
final var owningType = method.getContainingClass();
117+
if (owningType != null) {
118+
// Locate transformation by searching owning type and its parents.
119+
// Remove if this is AT is defined for its immediate owning type.
120+
Transformation foundTransformation = this.pendingATs.remove(method(ClassUtil.getJVMClassName(owningType), method));
121+
PsiClass definedForSuperType = owningType;
122+
for (;
123+
this.inheritMethodATs && foundTransformation == null && definedForSuperType != null && definedForSuperType.getQualifiedName() != null;
124+
definedForSuperType = definedForSuperType.getSuperClass()
125+
) {
126+
foundTransformation = this.ats.getAccessTransformers().get(method(ClassUtil.getJVMClassName(definedForSuperType), method));
127+
}
128+
129+
apply(foundTransformation, method, owningType);
113130
}
114131
}
115132

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
public Parent flag()Z
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
class Child extends Parent {
2+
@Override
3+
public boolean flag() {
4+
return true;
5+
}
6+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
class Grandchild extends Child {
2+
@Override
3+
public boolean flag() {
4+
return false;
5+
}
6+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
class Parent {
2+
public boolean flag() {
3+
return false;
4+
}
5+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
class Child extends Parent {
2+
@Override
3+
protected boolean flag() {
4+
return true;
5+
}
6+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
class Grandchild extends Child {
2+
@Override
3+
protected boolean flag() {
4+
return false;
5+
}
6+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
class Parent {
2+
protected boolean flag() {
3+
return false;
4+
}
5+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
public Parent flag()Z

0 commit comments

Comments
 (0)