diff --git a/src/main/java/io/papermc/restamp/at/ModifierTransformer.java b/src/main/java/io/papermc/restamp/at/ModifierTransformer.java index ef9fab0..519e718 100644 --- a/src/main/java/io/papermc/restamp/at/ModifierTransformer.java +++ b/src/main/java/io/papermc/restamp/at/ModifierTransformer.java @@ -78,11 +78,9 @@ public ModifierTransformationResult transformModifiers(@NotNull final AccessTran continue; } - // Do not touch access modifiers if no change was requested. - if (accessTransform.getAccess() == AccessChange.NONE) continue; - // Drop unwanted visibility modifiers and record potential position for new modifier. - if (modifier.getType() != accessTypeToKeep) { + // Do not touch access modifiers if no change was requested. + if (accessTransform.getAccess() != AccessChange.NONE && modifier.getType() != accessTypeToKeep) { transformationProgress.dropModifier(modifier); transformationProgress.proposeValidVisibilitySpot(); continue; diff --git a/src/test/java/io/papermc/restamp/RestampFunctionTestHelper.java b/src/test/java/io/papermc/restamp/RestampFunctionTestHelper.java index 6c2c733..634c38d 100644 --- a/src/test/java/io/papermc/restamp/RestampFunctionTestHelper.java +++ b/src/test/java/io/papermc/restamp/RestampFunctionTestHelper.java @@ -94,6 +94,23 @@ public static String accessChangeToModifierString(@NotNull final AccessChange ac return stringBuilder.toString(); } + /** + * Replaces all none changes in the base access transformer with the respective values found in the replaceFrom transform. + * + * @param base the base access transform instance which should be returned but with its NONE values replaced. + * @param replaceFrom the access transform instance to source the replacement values from. + * + * @return the replaced/filled in access transform. + */ + @NotNull + public static AccessTransform replaceNoneFrom(@NotNull final AccessTransform base, + @NotNull final AccessTransform replaceFrom) { + return AccessTransform.of( + base.getAccess() == AccessChange.NONE ? replaceFrom.getAccess() : base.getAccess(), + base.getFinal() == ModifierChange.NONE ? replaceFrom.getFinal() : base.getFinal() + ); + } + /** * An argument provider that provides all combinations of known visibility modifiers (private, public, protected and nothing (package private)). */ @@ -105,19 +122,30 @@ public static final class CartesianVisibilityArgumentProvider implements Argumen */ private static final List MODIFIERS = List.of( AccessTransform.of(AccessChange.PRIVATE, ModifierChange.ADD), + AccessTransform.of(AccessChange.PRIVATE, ModifierChange.NONE), AccessTransform.of(AccessChange.PRIVATE, ModifierChange.REMOVE), AccessTransform.of(AccessChange.PUBLIC, ModifierChange.ADD), + AccessTransform.of(AccessChange.PUBLIC, ModifierChange.NONE), AccessTransform.of(AccessChange.PUBLIC, ModifierChange.REMOVE), + AccessTransform.of(AccessChange.PROTECTED, ModifierChange.ADD), + AccessTransform.of(AccessChange.PROTECTED, ModifierChange.NONE), + AccessTransform.of(AccessChange.PROTECTED, ModifierChange.REMOVE), AccessTransform.of(AccessChange.PACKAGE_PRIVATE, ModifierChange.ADD), - AccessTransform.of(AccessChange.PACKAGE_PRIVATE, ModifierChange.REMOVE) + AccessTransform.of(AccessChange.PACKAGE_PRIVATE, ModifierChange.NONE), + AccessTransform.of(AccessChange.PACKAGE_PRIVATE, ModifierChange.REMOVE), + AccessTransform.of(AccessChange.NONE, ModifierChange.ADD), + AccessTransform.of(AccessChange.NONE, ModifierChange.NONE), + AccessTransform.of(AccessChange.NONE, ModifierChange.REMOVE) ); @Override public Stream provideArguments(final ExtensionContext context) { - return MODIFIERS.stream().flatMap(given -> + return MODIFIERS.stream() + .filter(a -> a.getAccess() != AccessChange.NONE && a.getFinal() != ModifierChange.NONE) // Do not start with a given none value. + .flatMap(given -> MODIFIERS.stream().flatMap(target -> Stream.of("static", null).map(staticModifier -> Arguments.of( - given, target, staticModifier + given, replaceNoneFrom(target, given), target, staticModifier )) ) ); diff --git a/src/test/java/io/papermc/restamp/at/ModifierTransformerTest.java b/src/test/java/io/papermc/restamp/at/ModifierTransformerTest.java index 32e64cb..3a94f46 100644 --- a/src/test/java/io/papermc/restamp/at/ModifierTransformerTest.java +++ b/src/test/java/io/papermc/restamp/at/ModifierTransformerTest.java @@ -69,11 +69,12 @@ public void testSkipModifyTransformation(@NotNull final AccessTransform transfor @ParameterizedTest @ArgumentsSource(RestampFunctionTestHelper.CartesianVisibilityArgumentProvider.class) - public void testModifyVisibilityTransformation(@NotNull final AccessTransform current, - @NotNull final AccessTransform wanted, + public void testModifyVisibilityTransformation(@NotNull final AccessTransform currentState, + @NotNull final AccessTransform targetState, + @NotNull final AccessTransform instruction, @Nullable final String staticModifierExisting) { final List modifiers = new ArrayList<>(); - final J.Modifier.Type type = switch (current.getAccess()) { + final J.Modifier.Type type = switch (currentState.getAccess()) { case PRIVATE -> J.Modifier.Type.Private; case PROTECTED -> J.Modifier.Type.Protected; case PUBLIC -> J.Modifier.Type.Public; @@ -83,23 +84,23 @@ public void testModifyVisibilityTransformation(@NotNull final AccessTransform cu modifiers.add(modifierFrom(Space.EMPTY, type)); } if (staticModifierExisting != null) modifiers.add(modifierFrom(Space.SINGLE_SPACE, J.Modifier.Type.Static)); - if (current.getFinal() == ModifierChange.ADD) modifiers.add(modifierFrom(Space.SINGLE_SPACE, J.Modifier.Type.Final)); + if (currentState.getFinal() == ModifierChange.ADD) modifiers.add(modifierFrom(Space.SINGLE_SPACE, J.Modifier.Type.Final)); - final ModifierTransformationResult result = transformer.transformModifiers(wanted, modifiers, Space.SINGLE_SPACE); + final ModifierTransformationResult result = transformer.transformModifiers(instruction, modifiers, Space.SINGLE_SPACE); final List newModifiers = result.newModifiers(); int expectedModifierSize = 0; - if (wanted.getAccess() != AccessChange.PACKAGE_PRIVATE) expectedModifierSize++; - if (wanted.getFinal() == ModifierChange.ADD) expectedModifierSize++; + if (targetState.getAccess() != AccessChange.PACKAGE_PRIVATE) expectedModifierSize++; + if (targetState.getFinal() == ModifierChange.ADD) expectedModifierSize++; if (staticModifierExisting != null) expectedModifierSize++; Assertions.assertEquals(expectedModifierSize, newModifiers.size()); - if (wanted.getAccess() != AccessChange.PACKAGE_PRIVATE) { - Assertions.assertEquals(RecipeHelper.typeFromAccessChange(wanted.getAccess()), newModifiers.remove(0).getType()); + if (targetState.getAccess() != AccessChange.PACKAGE_PRIVATE) { + Assertions.assertEquals(RecipeHelper.typeFromAccessChange(targetState.getAccess()), newModifiers.remove(0).getType()); } if (staticModifierExisting != null) Assertions.assertEquals(J.Modifier.Type.Static, newModifiers.remove(0).getType()); - if (wanted.getFinal() == ModifierChange.ADD) Assertions.assertEquals(J.Modifier.Type.Final, newModifiers.remove(0).getType()); + if (targetState.getFinal() == ModifierChange.ADD) Assertions.assertEquals(J.Modifier.Type.Final, newModifiers.remove(0).getType()); } @Test diff --git a/src/test/java/io/papermc/restamp/function/RestampClassFunctionTest.java b/src/test/java/io/papermc/restamp/function/RestampClassFunctionTest.java index b974439..1720433 100644 --- a/src/test/java/io/papermc/restamp/function/RestampClassFunctionTest.java +++ b/src/test/java/io/papermc/restamp/function/RestampClassFunctionTest.java @@ -26,9 +26,10 @@ public class RestampClassFunctionTest { @ArgumentsSource(RestampFunctionTestHelper.CartesianVisibilityArgumentProvider.class) public void testAccessTransformerOnClass(@NotNull final AccessTransform given, @NotNull final AccessTransform target, + @NotNull final AccessTransform instruction, @Nullable final String staticModifier) { final AccessTransformSet accessTransformSet = AccessTransformSet.create(); - accessTransformSet.getOrCreateClass("io.papermc.test.Test").replace(target); + accessTransformSet.getOrCreateClass("io.papermc.test.Test").replace(instruction); final RestampInput input = RestampFunctionTestHelper.inputFromSourceString(accessTransformSet, constructClassTest( accessChangeToModifierString(given.getAccess(), staticModifier, given.getFinal() == ModifierChange.ADD ? "final" : null) diff --git a/src/test/java/io/papermc/restamp/function/RestampFieldFunctionTest.java b/src/test/java/io/papermc/restamp/function/RestampFieldFunctionTest.java index aab38bf..6b613eb 100644 --- a/src/test/java/io/papermc/restamp/function/RestampFieldFunctionTest.java +++ b/src/test/java/io/papermc/restamp/function/RestampFieldFunctionTest.java @@ -26,9 +26,10 @@ public class RestampFieldFunctionTest { @ArgumentsSource(RestampFunctionTestHelper.CartesianVisibilityArgumentProvider.class) public void testAccessTransformerOnField(@NotNull final AccessTransform given, @NotNull final AccessTransform target, + @NotNull final AccessTransform instruction, @Nullable final String staticModifier) { final AccessTransformSet accessTransformSet = AccessTransformSet.create(); - accessTransformSet.getOrCreateClass("io.papermc.test.Test").replaceField("passphrase", target); + accessTransformSet.getOrCreateClass("io.papermc.test.Test").replaceField("passphrase", instruction); final RestampInput input = RestampFunctionTestHelper.inputFromSourceString(accessTransformSet, constructFieldTest( accessChangeToModifierString(given.getAccess(), staticModifier, given.getFinal() == ModifierChange.ADD ? "final" : null) diff --git a/src/test/java/io/papermc/restamp/function/RestampMethodFunctionTest.java b/src/test/java/io/papermc/restamp/function/RestampMethodFunctionTest.java index 1215b83..1cd8a09 100644 --- a/src/test/java/io/papermc/restamp/function/RestampMethodFunctionTest.java +++ b/src/test/java/io/papermc/restamp/function/RestampMethodFunctionTest.java @@ -27,10 +27,11 @@ public class RestampMethodFunctionTest { @ArgumentsSource(RestampFunctionTestHelper.CartesianVisibilityArgumentProvider.class) public void testAccessTransformerOnMethod(@NotNull final AccessTransform given, @NotNull final AccessTransform target, + @NotNull final AccessTransform instruction, @Nullable final String staticModifier) { final AccessTransformSet accessTransformSet = AccessTransformSet.create(); accessTransformSet.getOrCreateClass("io.papermc.test.Test").replaceMethod( - MethodSignature.of("test", "(Ljava.lang.Object;)Ljava.lang.String;"), target + MethodSignature.of("test", "(Ljava.lang.Object;)Ljava.lang.String;"), instruction ); final RestampInput input = RestampFunctionTestHelper.inputFromSourceString(accessTransformSet, constructMethodTest(