Skip to content

Commit 72f505f

Browse files
committed
Merge branch 'main' into feature/better-versioning
2 parents 51a731b + faa3e98 commit 72f505f

File tree

22 files changed

+172
-85
lines changed

22 files changed

+172
-85
lines changed

.github/workflows/build.yml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,12 @@ jobs:
1818
fail-fast: true
1919
steps:
2020
- uses: actions/checkout@v4
21-
- uses: gradle/actions/wrapper-validation@v3
2221
- name: JDK ${{ matrix.java }}
2322
uses: actions/setup-java@v4
2423
with:
2524
java-version: ${{ matrix.java }}
2625
distribution: 'temurin'
27-
- uses: gradle/actions/setup-gradle@v3
26+
- uses: gradle/actions/setup-gradle@v4
2827
- name: Build
2928
run: ./gradlew build --stacktrace
3029
- name: Determine Status

reflection-rewriter/rewriter/src/main/java/io/papermc/reflectionrewriter/DefineClassRule.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,11 @@ private DefineClassRule(final String proxyClassName, final boolean assumeClassLo
4040
this.assumeClassLoader = assumeClassLoader;
4141
}
4242

43+
@Override
44+
public boolean shouldProcess(final ClassProcessingContext context, final int opcode, final String owner, final String name, final String descriptor, final boolean isInterface, final boolean isInvokeDynamic) {
45+
return true; // see comment below
46+
}
47+
4348
// We could split this into multiple rules and return false for shouldProcess when the processing class doesn't
4449
// extend (S)CL. However since the MethodHandles.Lookup portion always needs to run, the actual benefit would
4550
// be beyond minute (if not actually worse).

src/main/java/io/papermc/asm/rules/builder/RuleFactory.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package io.papermc.asm.rules.builder;
22

33
import io.papermc.asm.rules.RewriteRule;
4-
import io.papermc.asm.rules.builder.matcher.field.FieldMatcher;
4+
import io.papermc.asm.rules.builder.matcher.field.FieldMatcherBuilder;
55
import io.papermc.asm.rules.builder.matcher.method.MethodMatcher;
66
import io.papermc.asm.rules.builder.matcher.method.targeted.TargetedMethodMatcher;
77
import java.lang.constant.ClassDesc;
@@ -28,6 +28,8 @@ static RuleFactory.Factory combine(final RuleFactory.Factory... factories) {
2828

2929
void plainStaticRewrite(ClassDesc newOwner, MethodMatcher methodMatcher);
3030

31+
void plainStaticRewrite(ClassDesc newOwner, MethodMatcher methodMatcher, String staticMethodName);
32+
3133
default void changeParamToSuper(final Class<?> oldParamType, final Class<?> newParamType, final MethodMatcher methodMatcher) {
3234
if (!newParamType.isAssignableFrom(oldParamType)) {
3335
throw new IllegalArgumentException(newParamType + " is not a superclass of " + oldParamType);
@@ -70,7 +72,7 @@ default void changeReturnTypeDirectWithContext(final Class<?> newReturnType, fin
7072

7173
void changeReturnTypeDirectWithContext(ClassDesc newReturnType, Method staticHandler, TargetedMethodMatcher targetedMethodMatcher);
7274

73-
void changeFieldToMethod(@Nullable String getterName, @Nullable String setterName, boolean isInterfaceMethod, Consumer<? super FieldMatcher.Builder> builderConsumer);
75+
void changeFieldToMethod(@Nullable String getterName, @Nullable String setterName, boolean isInterfaceMethod, Consumer<? super FieldMatcherBuilder> builderConsumer);
7476

7577
default void moveInstanceMethod(final Class<?> newOwner, final String newMethodName, final MethodMatcher methodMatcher) {
7678
this.moveInstanceMethod(desc(newOwner), newMethodName, methodMatcher);

src/main/java/io/papermc/asm/rules/builder/RuleFactoryImpl.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import io.papermc.asm.rules.RewriteRule;
44
import io.papermc.asm.rules.builder.matcher.field.FieldMatcher;
5+
import io.papermc.asm.rules.builder.matcher.field.FieldMatcherBuilder;
56
import io.papermc.asm.rules.builder.matcher.method.MethodMatcher;
67
import io.papermc.asm.rules.builder.matcher.method.targeted.TargetedMethodMatcher;
78
import io.papermc.asm.rules.field.FieldToMethodRewrite;
@@ -43,6 +44,11 @@ public void plainStaticRewrite(final ClassDesc newOwner, final MethodMatcher met
4344
this.addRule(new DirectStaticRewrite(this.owners, methodMatcher, newOwner));
4445
}
4546

47+
@Override
48+
public void plainStaticRewrite(final ClassDesc newOwner, final MethodMatcher methodMatcher, final String staticMethodName) {
49+
this.addRule(new DirectStaticRewrite(this.owners, staticMethodName, methodMatcher, newOwner));
50+
}
51+
4652
@Override
4753
public void changeParamToSuper(final ClassDesc legacyParamType, final ClassDesc newParamType, final MethodMatcher methodMatcher) {
4854
this.addRule(new SuperTypeParamRewrite(this.owners, methodMatcher, legacyParamType, newParamType));
@@ -78,7 +84,7 @@ private void changeReturnTypeDirect(final ClassDesc newReturnType, final Method
7884
}
7985

8086
@Override
81-
public void changeFieldToMethod(final @Nullable String getterName, final @Nullable String setterName, final boolean isInterfaceMethod, final Consumer<? super FieldMatcher.Builder> builderConsumer) {
87+
public void changeFieldToMethod(final @Nullable String getterName, final @Nullable String setterName, final boolean isInterfaceMethod, final Consumer<? super FieldMatcherBuilder> builderConsumer) {
8288
this.addRule(new FieldToMethodRewrite(this.owners, build(builderConsumer, FieldMatcher::builder), getterName, setterName, isInterfaceMethod));
8389
}
8490

Lines changed: 6 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,16 @@
11
package io.papermc.asm.rules.builder.matcher.field;
22

3-
import java.lang.constant.ClassDesc;
4-
import java.util.Collection;
5-
import java.util.List;
6-
import java.util.function.Predicate;
7-
8-
import static java.util.function.Predicate.isEqual;
9-
3+
@FunctionalInterface
104
public interface FieldMatcher {
115

12-
boolean matchesName(String name);
6+
static FieldMatcherBuilderImpl builder() {
7+
return new FieldMatcherBuilderImpl();
8+
}
139

1410
boolean matches(String name, String descriptor);
1511

16-
static Builder builder() {
17-
return new Builder();
12+
default FieldMatcher or(final FieldMatcher other) {
13+
return (name, descriptor) -> this.matches(name, descriptor) || other.matches(name, descriptor);
1814
}
1915

20-
final class Builder implements io.papermc.asm.util.Builder<FieldMatcher> {
21-
22-
private Predicate<String> byName = $ -> false;
23-
private Predicate<? super ClassDesc> byType = $ -> true;
24-
25-
private Builder() {
26-
}
27-
28-
public Builder names(final String... names) {
29-
return this.names(List.of(names));
30-
}
31-
32-
public Builder names(final Collection<String> names) {
33-
this.byName = this.byName.or(names::contains);
34-
return this;
35-
}
36-
37-
public Builder desc(final ClassDesc desc) {
38-
return this.desc(isEqual(desc));
39-
}
40-
41-
public Builder desc(final Predicate<? super ClassDesc> predicate) {
42-
this.byType = predicate;
43-
return this;
44-
}
45-
46-
@Override
47-
public FieldMatcher build() {
48-
return new FieldMatcherImpl(this.byName, this.byType);
49-
}
50-
}
5116
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package io.papermc.asm.rules.builder.matcher.field;
2+
3+
import io.papermc.asm.util.Builder;
4+
import java.lang.constant.ClassDesc;
5+
import java.util.Collection;
6+
import java.util.List;
7+
import java.util.function.Predicate;
8+
9+
import static java.util.function.Predicate.isEqual;
10+
11+
public interface FieldMatcherBuilder extends Builder<FieldMatcher> {
12+
13+
default FieldMatcherBuilder match(final String fieldName) {
14+
return this.match(fieldName, $ -> true);
15+
}
16+
17+
default FieldMatcherBuilder match(final String fieldName, final ClassDesc fieldDesc) {
18+
return this.match(fieldName, isEqual(fieldDesc));
19+
}
20+
21+
default FieldMatcherBuilder match(final String fieldName, final Predicate<ClassDesc> fieldDescPredicate) {
22+
return this.match(isEqual(fieldName), fieldDescPredicate);
23+
}
24+
25+
default FieldMatcherBuilder match(final Collection<String> fieldNames) {
26+
return this.match(fieldNames, $ -> true);
27+
}
28+
29+
default FieldMatcherBuilder match(final Collection<String> fieldNames, final ClassDesc fieldDesc) {
30+
return this.match(fieldNames, isEqual(fieldDesc));
31+
}
32+
33+
default FieldMatcherBuilder match(final Collection<String> fieldNames, final Predicate<ClassDesc> fieldDescPredicate) {
34+
final List<String> copy = List.copyOf(fieldNames);
35+
return this.match(copy::contains, fieldDescPredicate);
36+
}
37+
38+
default FieldMatcherBuilder match(final Predicate<String> fieldNamePredicate) {
39+
return this.match(fieldNamePredicate, $ -> true);
40+
}
41+
42+
default FieldMatcherBuilder match(final Predicate<String> fieldNamePredicate, final ClassDesc fieldDesc) {
43+
return this.match(fieldNamePredicate, isEqual(fieldDesc));
44+
}
45+
46+
FieldMatcherBuilder match(Predicate<String> fieldNamePredicate, Predicate<ClassDesc> fieldDescPredicate);
47+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package io.papermc.asm.rules.builder.matcher.field;
2+
3+
import java.lang.constant.ClassDesc;
4+
import java.util.function.Predicate;
5+
6+
public final class FieldMatcherBuilderImpl implements FieldMatcherBuilder {
7+
8+
private FieldMatcher matcher = (name, descriptor) -> false;
9+
10+
FieldMatcherBuilderImpl() {
11+
}
12+
13+
@Override
14+
public FieldMatcherBuilder match(final Predicate<String> fieldNamePredicate, final Predicate<ClassDesc> fieldDescPredicate) {
15+
this.matcher = this.matcher.or((name, descriptor) -> fieldNamePredicate.test(name) && fieldDescPredicate.test(ClassDesc.ofDescriptor(descriptor)));
16+
return this;
17+
}
18+
19+
@Override
20+
public FieldMatcher build() {
21+
return this.matcher;
22+
}
23+
}

src/main/java/io/papermc/asm/rules/builder/matcher/field/FieldMatcherImpl.java

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,6 @@ public FieldMatcherImpl(final Predicate<? super String> byName, final Predicate<
1515
this.byDesc = byDesc;
1616
}
1717

18-
@Override
19-
public boolean matchesName(final String name) {
20-
return this.byName.test(name);
21-
}
22-
2318
@Override
2419
public boolean matches(final String name, final String descriptor) {
2520
return this.byName.test(name) && this.byDesc.test(classDesc(descriptor));

src/main/java/io/papermc/asm/rules/builder/matcher/method/MethodMatcher.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package io.papermc.asm.rules.builder.matcher.method;
22

33
import java.lang.constant.MethodTypeDesc;
4+
import java.util.function.Consumer;
45
import java.util.function.Predicate;
56

67
@FunctionalInterface
@@ -10,6 +11,10 @@ static MethodMatcherBuilder builder() {
1011
return new MethodMatcherBuilderImpl();
1112
}
1213

14+
static MethodMatcher single(final String name, final Consumer<MethodMatcherBuilder.MatchBuilder> matchBuilderConsumer) {
15+
return builder().match(name, matchBuilderConsumer).build();
16+
}
17+
1318
boolean matches(int opcode, boolean isInvokeDynamic, String name, String descriptor);
1419

1520
default boolean matches(final int opcode, final boolean isInvokeDynamic, final String name, final MethodTypeDesc descriptor) {

src/main/java/io/papermc/asm/rules/classes/EnumToInterfaceRule.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ private static MethodMatcher createStaticMatcher(final ClassDesc legacyEnumType)
7171
.build();
7272
}
7373

74-
final class EnumVirtualMethods implements GeneratedStaticRewrite {
74+
final class EnumVirtualMethods implements GeneratedStaticRewrite, OwnableMethodRewriteRule.Filtered {
7575

7676
@Override
7777
public MethodMatcher methodMatcher() {

0 commit comments

Comments
 (0)