-
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
5569ad7
commit 51a731b
Showing
13 changed files
with
267 additions
and
108 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,8 +1,26 @@ | ||
package io.papermc.asm.rules.rename; | ||
|
||
import java.lang.constant.ClassDesc; | ||
import java.util.HashMap; | ||
import java.util.Map; | ||
import java.util.Objects; | ||
import org.checkerframework.checker.nullness.qual.Nullable; | ||
|
||
public record EnumRenamer(ClassDesc typeDesc, @Nullable ClassDesc optionalReplacementImpl, Map<String, String> fieldRenames) { | ||
public record EnumRenamer(ClassDesc typeDesc, @Nullable ClassDesc alternateValueOfOwner, Map<String, String> fieldRenames) { | ||
|
||
public EnumRenamer { | ||
fieldRenames = Map.copyOf(fieldRenames); | ||
} | ||
|
||
EnumRenamer overwrite(final EnumRenamer other) { | ||
if (!this.typeDesc.equals(other.typeDesc)) { | ||
throw new IllegalArgumentException("Cannot merge EnumRenamers with different typeDesc"); | ||
} else if (!Objects.equals(this.alternateValueOfOwner, other.alternateValueOfOwner)) { | ||
throw new IllegalArgumentException("Cannot merge EnumRenamers with different alternateValueOfOwner"); | ||
} | ||
final Map<String, String> newFieldRenames = new HashMap<>(); | ||
newFieldRenames.putAll(this.fieldRenames); | ||
newFieldRenames.putAll(other.fieldRenames); | ||
return new EnumRenamer(this.typeDesc, this.alternateValueOfOwner, newFieldRenames); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
98 changes: 34 additions & 64 deletions
98
src/main/java/io/papermc/asm/rules/rename/RenameRuleBuilder.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,116 +1,86 @@ | ||
package io.papermc.asm.rules.rename; | ||
|
||
import io.papermc.asm.util.Builder; | ||
import java.lang.constant.ClassDesc; | ||
import java.lang.constant.MethodTypeDesc; | ||
import java.util.HashMap; | ||
import java.util.Map; | ||
import java.util.Set; | ||
import java.util.function.Consumer; | ||
|
||
import static io.papermc.asm.util.DescriptorUtils.desc; | ||
import static io.papermc.asm.util.DescriptorUtils.toOwner; | ||
|
||
public final class RenameRuleBuilder implements io.papermc.asm.util.Builder<RenameRule> { | ||
public interface RenameRuleBuilder extends Builder<RenameRule> { | ||
|
||
RenameRuleBuilder() { | ||
} | ||
|
||
final Map<String, String> mappings = new HashMap<>(); | ||
final Map<ClassDesc, EnumRenamer> enumValueOfFieldRenames = new HashMap<>(); | ||
|
||
public RenameRuleBuilder methodByDesc(final Iterable<ClassDesc> owners, final String legacyMethodName, final MethodTypeDesc desc, final String newMethodName) { | ||
for (final ClassDesc owner : owners) { | ||
this.methodByDesc(owner, legacyMethodName, desc, newMethodName); | ||
//<editor-fold desc="methods" defaultstate="collapsed"> | ||
default RenameRuleBuilder methodByClass(final Set<Class<?>> owners, final String legacyMethodName, final MethodTypeDesc methodDesc, final String newMethodName) { | ||
for (final Class<?> owner : owners) { | ||
this.methodByClass(owner, legacyMethodName, methodDesc, newMethodName); | ||
} | ||
return this; | ||
} | ||
|
||
public RenameRuleBuilder methodByDesc(final ClassDesc owner, final String legacyMethodName, final MethodTypeDesc desc, final String newMethodName) { | ||
return this.methodByInternal(toOwner(owner), legacyMethodName, desc.descriptorString(), newMethodName); | ||
default RenameRuleBuilder methodByClass(final Class<?> owner, final String legacyMethodName, final MethodTypeDesc methodDesc, final String newMethodName) { | ||
return this.method(desc(owner), legacyMethodName, methodDesc, newMethodName); | ||
} | ||
|
||
public RenameRuleBuilder methodByInternal(final Iterable<String> owners, final String legacyMethodName, final MethodTypeDesc desc, final String newMethodName) { | ||
for (final String owner : owners) { | ||
this.methodByInternal(owner, legacyMethodName, desc.descriptorString(), newMethodName); | ||
default RenameRuleBuilder method(final Set<ClassDesc> owners, final String legacyMethodName, final MethodTypeDesc methodDesc, final String newMethodName) { | ||
for (final ClassDesc owner : owners) { | ||
this.method(owner, legacyMethodName, methodDesc, newMethodName); | ||
} | ||
return this; | ||
} | ||
|
||
public RenameRuleBuilder methodByInternal(final String owner, final String legacyMethodName, final String desc, final String newMethodName) { | ||
this.mappings.put("%s.%s%s".formatted(owner, legacyMethodName, desc), newMethodName); | ||
return this; | ||
} | ||
RenameRuleBuilder method(ClassDesc owner, String legacyMethodName, MethodTypeDesc methodDesc, final String newMethodName); | ||
//</editor-fold> | ||
|
||
public RenameRuleBuilder fieldByDesc(final Iterable<ClassDesc> owners, final String legacyFieldName, final String newFieldName) { | ||
for (final ClassDesc owner : owners) { | ||
this.fieldByDesc(owner, legacyFieldName, newFieldName); | ||
//<editor-fold desc="fields" defaultstate="collapsed"> | ||
default RenameRuleBuilder fieldByClass(final Set<Class<?>> owners, final String legacyFieldName, final String newFieldName) { | ||
for (final Class<?> owner : owners) { | ||
this.fieldByClass(owner, legacyFieldName, newFieldName); | ||
} | ||
return this; | ||
} | ||
|
||
public RenameRuleBuilder fieldByDesc(final ClassDesc owner, final String legacyFieldName, final String newFieldName) { | ||
return this.fieldByInternal(toOwner(owner), legacyFieldName, newFieldName); | ||
default RenameRuleBuilder fieldByClass(final Class<?> owner, final String legacyFieldName, final String newFieldName) { | ||
return this.field(desc(owner), legacyFieldName, newFieldName); | ||
} | ||
|
||
public RenameRuleBuilder fieldByInternal(final Iterable<String> owners, final String legacyFieldName, final String newFieldName) { | ||
for (final String owner : owners) { | ||
this.fieldByInternal(owner, legacyFieldName, newFieldName); | ||
default RenameRuleBuilder field(final Set<ClassDesc> owners, final String legacyFieldName, final String newFieldName) { | ||
for (final ClassDesc owner : owners) { | ||
this.field(owner, legacyFieldName, newFieldName); | ||
} | ||
return this; | ||
} | ||
|
||
public RenameRuleBuilder fieldByInternal(final String owner, final String legacyFieldName, final String newFieldName) { | ||
this.mappings.put("%s.%s".formatted(owner, legacyFieldName), newFieldName); | ||
return this; | ||
} | ||
RenameRuleBuilder field(ClassDesc owner, String legacyFieldName, String newFieldName); | ||
//</editor-fold> | ||
|
||
/** | ||
* Note that you also have to remap the method for the annotation attribute. | ||
*/ | ||
public RenameRuleBuilder annotationAttribute(final ClassDesc owner, final String legacyName, final String newName) { | ||
return this.annotationAttribute(owner.descriptorString(), legacyName, newName); | ||
default RenameRuleBuilder annotationAttribute(final Class<?> owner, final String legacyName, final String newName) { | ||
return this.annotationAttribute(desc(owner), legacyName, newName); | ||
} | ||
|
||
/** | ||
* Note that you also have to remap the method for the annotation attribute. | ||
*/ | ||
public RenameRuleBuilder annotationAttribute(final String ownerDescriptor, final String legacyName, final String newName) { | ||
if (!ownerDescriptor.startsWith("L") || !ownerDescriptor.endsWith(";")) { | ||
throw new IllegalArgumentException("Invalid owner descriptor: %s".formatted(ownerDescriptor)); | ||
} | ||
// for some reason the remapper wants the Lpkg/name; format, but just for annotation attributes | ||
this.mappings.put("%s.%s".formatted(ownerDescriptor, legacyName), newName); | ||
return this; | ||
} | ||
RenameRuleBuilder annotationAttribute(ClassDesc owner, String legacyName, String newName); | ||
|
||
/** | ||
* Use {@code /} instead of {@code .}. | ||
*/ | ||
public RenameRuleBuilder type(final String legacyType, final ClassDesc newType) { | ||
this.mappings.put(legacyType, toOwner(newType)); | ||
return this; | ||
default RenameRuleBuilder type(final String legacyType, final Class<?> newType) { | ||
return this.type(legacyType, desc(newType)); | ||
} | ||
|
||
/** | ||
* Use {@code /} instead of {@code .}. | ||
*/ | ||
public RenameRuleBuilder type(final String legacyType, final String newType) { | ||
this.mappings.put(legacyType, newType); | ||
return this; | ||
} | ||
RenameRuleBuilder type(String legacyType, ClassDesc newType); | ||
|
||
public RenameRuleBuilder editEnum(final Class<?> enumTypeDesc, final Consumer<EnumRenameBuilder> renamer) { | ||
return this.editEnum(desc(enumTypeDesc), renamer); | ||
default RenameRuleBuilder editEnum(final Class<?> enumType, final Consumer<EnumRenameBuilder> renameBuilder) { | ||
return this.editEnum(desc(enumType), renameBuilder); | ||
} | ||
|
||
public RenameRuleBuilder editEnum(final ClassDesc enumTypeDesc, final Consumer<EnumRenameBuilder> renamer) { | ||
final EnumRenameBuilder enumRenamer = new EnumRenameBuilder(enumTypeDesc); | ||
renamer.accept(enumRenamer); | ||
enumRenamer.apply(this); | ||
return this; | ||
} | ||
|
||
@Override | ||
public RenameRule build() { | ||
return new RenameRule(this.mappings, this.enumValueOfFieldRenames); | ||
} | ||
RenameRuleBuilder editEnum(ClassDesc enumTypeDesc, Consumer<EnumRenameBuilder> renameBuilder); | ||
} |
64 changes: 64 additions & 0 deletions
64
src/main/java/io/papermc/asm/rules/rename/RenameRuleBuilderImpl.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,64 @@ | ||
package io.papermc.asm.rules.rename; | ||
|
||
import java.lang.constant.ClassDesc; | ||
import java.lang.constant.MethodTypeDesc; | ||
import java.util.HashMap; | ||
import java.util.Map; | ||
import java.util.function.Consumer; | ||
|
||
import static io.papermc.asm.util.DescriptorUtils.toOwner; | ||
|
||
final class RenameRuleBuilderImpl implements RenameRuleBuilder { | ||
|
||
RenameRuleBuilderImpl() { | ||
} | ||
|
||
final Map<String, String> mappings = new HashMap<>(); | ||
final Map<ClassDesc, EnumRenamer> enumValueOfFieldRenames = new HashMap<>(); | ||
|
||
@Override | ||
public RenameRuleBuilder method(final ClassDesc owner, final String legacyMethodName, final MethodTypeDesc methodDesc, final String newMethodName) { | ||
this.mappings.put("%s.%s%s".formatted(toOwner(owner), legacyMethodName, methodDesc.descriptorString()), newMethodName); | ||
return this; | ||
} | ||
|
||
@Override | ||
public RenameRuleBuilder field(final ClassDesc owner, final String legacyFieldName, final String newFieldName) { | ||
this.mappings.put("%s.%s".formatted(toOwner(owner), legacyFieldName), newFieldName); | ||
return this; | ||
} | ||
|
||
@Override | ||
public RenameRuleBuilder annotationAttribute(final ClassDesc owner, final String legacyName, final String newName) { | ||
final String ownerDescriptor = owner.descriptorString(); | ||
if (!ownerDescriptor.startsWith("L") || !ownerDescriptor.endsWith(";")) { | ||
throw new IllegalArgumentException("Invalid owner descriptor: %s".formatted(ownerDescriptor)); | ||
} | ||
// for some reason the remapper wants the Lpkg/name; format, but just for annotation attributes | ||
this.mappings.put("%s.%s".formatted(ownerDescriptor, legacyName), newName); | ||
return this; | ||
} | ||
|
||
@Override | ||
public RenameRuleBuilder type(final String legacyType, final ClassDesc newType) { | ||
this.mappings.put(legacyType, toOwner(newType)); | ||
return this; | ||
} | ||
|
||
@Override | ||
public RenameRuleBuilder editEnum(final ClassDesc enumTypeDesc, final Consumer<EnumRenameBuilder> renamer) { | ||
final EnumRenameBuilder enumRenamerBuilder = new EnumRenameBuilder(enumTypeDesc); | ||
renamer.accept(enumRenamerBuilder); | ||
final EnumRenamer enumRenamer = enumRenamerBuilder.build(); | ||
enumRenamer.fieldRenames().forEach((legacyName, newName) -> { | ||
this.field(enumTypeDesc, legacyName, newName); | ||
}); | ||
this.enumValueOfFieldRenames.put(enumTypeDesc, enumRenamer); | ||
return this; | ||
} | ||
|
||
@Override | ||
public RenameRule build() { | ||
return new RenameRule(this.mappings, this.enumValueOfFieldRenames); | ||
} | ||
} |
Oops, something went wrong.