22
33import io .papermc .asm .ClassProcessingContext ;
44import io .papermc .asm .rules .builder .RuleFactory ;
5+ import io .papermc .asm .util .DescriptorUtils ;
56import java .lang .constant .ClassDesc ;
67import java .util .ArrayList ;
78import java .util .Arrays ;
@@ -26,7 +27,7 @@ static RewriteRule forOwnerClass(final Class<?> owner, final Consumer<? super Ru
2627
2728 @ SafeVarargs
2829 static RewriteRule forOwnerClasses (final Set <Class <?>> owners , final Consumer <? super RuleFactory > firstFactoryConsumer , final Consumer <? super RuleFactory >... factoryConsumers ) {
29- return forOwners (owners .stream ().map (c -> c . describeConstable (). orElseThrow () ).collect (Collectors .toUnmodifiableSet ()), firstFactoryConsumer , factoryConsumers );
30+ return forOwners (owners .stream ().map (DescriptorUtils :: desc ).collect (Collectors .toUnmodifiableSet ()), firstFactoryConsumer , factoryConsumers );
3031 }
3132
3233 @ SafeVarargs
@@ -49,7 +50,13 @@ static RewriteRule chain(final RewriteRule... rules) {
4950 }
5051
5152 static RewriteRule chain (final Collection <? extends RewriteRule > rules ) {
52- return new Chain (List .copyOf (rules ));
53+ final List <? extends RewriteRule > filteredRules = rules .stream ().filter (r -> r != EMPTY ).toList ();
54+ if (filteredRules .isEmpty ()) {
55+ return EMPTY ;
56+ } else if (filteredRules .size () == 1 ) {
57+ return filteredRules .iterator ().next ();
58+ }
59+ return new Chain (filteredRules );
5360 }
5461
5562 static ChainBuilder chain () {
@@ -73,16 +80,17 @@ default ClassVisitor createVisitor(final int api, final ClassVisitor parent, fin
7380 }
7481 }
7582
76- record Chain (List <RewriteRule > rules ) implements RewriteRule {
77- public Chain ( final List < RewriteRule > rules ) {
78- this . rules = List .copyOf (rules );
83+ record Chain (List <? extends RewriteRule > rules ) implements RewriteRule {
84+ public Chain {
85+ rules = List .copyOf (rules );
7986 }
8087
8188 @ Override
8289 public ClassVisitor createVisitor (final int api , final ClassVisitor parent , final ClassProcessingContext context ) {
8390 ClassVisitor visitor = parent ;
84- for (final RewriteRule rule : this .rules ) {
85- visitor = rule .createVisitor (api , visitor , context );
91+ // iterate over this.rules backwards to ensure the first rule is the outermost visitor
92+ for (int i = this .rules .size () - 1 ; i >= 0 ; i --) {
93+ visitor = this .rules .get (i ).createVisitor (api , visitor , context );
8694 }
8795 return visitor ;
8896 }
@@ -109,7 +117,7 @@ public ChainBuilder then(final RewriteRule... rules) {
109117 }
110118
111119 public RewriteRule build () {
112- return new Chain (this .rules );
120+ return RewriteRule . chain (this .rules );
113121 }
114122 }
115123}
0 commit comments