Skip to content

Commit ef9e945

Browse files
committed
only run modifications if the modifers don't match
1 parent e0b76de commit ef9e945

File tree

6 files changed

+83
-4
lines changed

6 files changed

+83
-4
lines changed

src/main/java/io/papermc/restamp/RestampContextConfiguration.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ public Builder accessTransformers(@NotNull final Path accessTransformerPath, @No
120120
* @return this builder.
121121
*/
122122
@NotNull
123-
@Contract(value = "_,_ -> this", mutates = "this")
123+
@Contract(value = "_ -> this", mutates = "this")
124124
public Builder accessTransformSet(@NotNull final AccessTransformSet accessTransformSet) {
125125
this.accessTransformSet = AccessTransformSet.create();
126126
this.accessTransformSet.merge(accessTransformSet);

src/main/java/io/papermc/restamp/at/ModifierTransformer.java

+38
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,44 @@ public class ModifierTransformer {
3030
J.Modifier.Type.Final
3131
);
3232

33+
/**
34+
* Checks if the provided list of modifiers doesn't already match the requested
35+
* access transform.
36+
* <p>
37+
* Assumes that 1 or 0 visibility modifiers are present in the list.
38+
*
39+
* @param accessTransform the access transform to check against.
40+
* @param modifiers the modifiers to check.
41+
* @return true if the modifiers should be transformed, false otherwise.
42+
*/
43+
public boolean shouldTransform(@NotNull final AccessTransform accessTransform,
44+
@NotNull final List<J.Modifier> modifiers) {
45+
final AccessChange accessChange = accessTransform.getAccess();
46+
@Nullable final J.Modifier.Type accessTypeToKeep = RecipeHelper.typeFromAccessChange(accessChange);
47+
48+
boolean foundFinal = false;
49+
for (final J.Modifier modifier : modifiers) {
50+
if (!KNOWN_MUTABLE_TYPES.contains(modifier.getType())) {
51+
continue;
52+
}
53+
54+
if (modifier.getType() == J.Modifier.Type.Final) {
55+
if (accessTransform.getFinal() == ModifierChange.REMOVE) {
56+
return true;
57+
} else {
58+
foundFinal = true;
59+
}
60+
continue;
61+
}
62+
63+
if (modifier.getType() != accessTypeToKeep) {
64+
return true;
65+
}
66+
}
67+
68+
return !foundFinal && accessTransform.getFinal() == ModifierChange.ADD;
69+
}
70+
3371
/**
3472
* Transforms the modifiers passed in as the list to match the access transform goal passed to the method.
3573
* <p>

src/main/java/io/papermc/restamp/recipe/ClassATMutator.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ public J.ClassDeclaration visitClassDeclaration(@NotNull final J.ClassDeclaratio
5151
if (transformerClass == null) return classDeclaration;
5252

5353
final AccessTransform accessTransform = transformerClass.get();
54-
if (accessTransform.isEmpty()) return classDeclaration;
54+
if (accessTransform.isEmpty() || !modifierTransformer.shouldTransform(accessTransform, classDeclaration.getModifiers())) return classDeclaration;
5555

5656
transformerClass.replace(AccessTransform.EMPTY); // Mark as consumed
5757

src/main/java/io/papermc/restamp/recipe/FieldATMutator.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ public J.VariableDeclarations visitVariableDeclarations(@NotNull final J.Variabl
6464
.filter(Objects::nonNull)
6565
.reduce(AccessTransform::merge)
6666
.orElse(AccessTransform.EMPTY);
67-
if (accessTransformToApply.isEmpty()) return variableDeclarations;
67+
if (accessTransformToApply.isEmpty() || !modifierTransformer.shouldTransform(accessTransformToApply, variableDeclarations.getModifiers())) return variableDeclarations;
6868

6969
// Compute and set new módifiers
7070
final ModifierTransformationResult transformationResult = modifierTransformer.transformModifiers(

src/main/java/io/papermc/restamp/recipe/MethodATMutator.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ public J.MethodDeclaration visitMethodDeclaration(@NotNull final J.MethodDeclara
103103
final AccessTransform accessTransform = transformerClass.replaceMethod(new MethodSignature(
104104
atMethodName, new MethodDescriptor(parameterTypes, returnType)
105105
), AccessTransform.EMPTY);
106-
if (accessTransform == null || accessTransform.isEmpty()) return methodDeclaration;
106+
if (accessTransform == null || accessTransform.isEmpty() || !modifierTransformer.shouldTransform(accessTransform, methodDeclaration.getModifiers())) return methodDeclaration;
107107

108108
final TypeTree returnTypeExpression = methodDeclaration.getReturnTypeExpression();
109109
final ModifierTransformationResult transformationResult = modifierTransformer.transformModifiers(

src/test/java/io/papermc/restamp/at/ModifierTransformerTest.java

+41
Original file line numberDiff line numberDiff line change
@@ -10,21 +10,62 @@
1010
import org.junit.jupiter.api.Assertions;
1111
import org.junit.jupiter.api.Test;
1212
import org.junit.jupiter.params.ParameterizedTest;
13+
import org.junit.jupiter.params.provider.Arguments;
1314
import org.junit.jupiter.params.provider.ArgumentsSource;
15+
import org.junit.jupiter.params.provider.MethodSource;
1416
import org.openrewrite.java.tree.J;
1517
import org.openrewrite.java.tree.Space;
1618
import org.openrewrite.java.tree.TextComment;
1719
import org.openrewrite.marker.Markers;
1820

1921
import java.util.ArrayList;
2022
import java.util.List;
23+
import java.util.stream.Stream;
2124

2225
import static io.papermc.restamp.RestampFunctionTestHelper.modifierFrom;
2326

2427
class ModifierTransformerTest {
2528

2629
private final ModifierTransformer transformer = new ModifierTransformer();
2730

31+
static Stream<Arguments> testSkipModifyTransformation() {
32+
return Stream.of(
33+
Arguments.of(
34+
AccessTransform.of(AccessChange.PUBLIC, ModifierChange.REMOVE),
35+
List.of(modifierFrom(Space.EMPTY, J.Modifier.Type.Public)),
36+
false
37+
),
38+
Arguments.of(
39+
AccessTransform.of(AccessChange.PACKAGE_PRIVATE, ModifierChange.ADD),
40+
List.of(modifierFrom(Space.EMPTY, J.Modifier.Type.Final)),
41+
false
42+
),
43+
Arguments.of(
44+
AccessTransform.of(AccessChange.PUBLIC),
45+
List.of(modifierFrom(Space.EMPTY, J.Modifier.Type.Private)),
46+
true
47+
),
48+
Arguments.of(
49+
AccessTransform.of(AccessChange.PUBLIC),
50+
List.of(modifierFrom(Space.EMPTY, J.Modifier.Type.Private), modifierFrom(Space.EMPTY, J.Modifier.Type.Final)),
51+
true
52+
),
53+
Arguments.of(
54+
AccessTransform.of(ModifierChange.REMOVE),
55+
List.of(modifierFrom(Space.EMPTY, J.Modifier.Type.Public), modifierFrom(Space.EMPTY, J.Modifier.Type.Final)),
56+
true
57+
)
58+
);
59+
}
60+
61+
@MethodSource()
62+
@ParameterizedTest
63+
public void testSkipModifyTransformation(@NotNull final AccessTransform transform,
64+
@NotNull final List<J.Modifier> modifiers,
65+
final boolean expected) {
66+
Assertions.assertEquals(expected, this.transformer.shouldTransform(transform, modifiers));
67+
}
68+
2869
@ParameterizedTest
2970
@ArgumentsSource(RestampFunctionTestHelper.CartesianVisibilityArgumentProvider.class)
3071
public void testModifyVisibilityTransformation(@NotNull final AccessTransform current,

0 commit comments

Comments
 (0)