diff options
author | Karlatemp <kar@kasukusakura.com> | 2022-09-13 23:01:53 +0800 |
---|---|---|
committer | Karlatemp <kar@kasukusakura.com> | 2022-09-14 12:43:17 +0800 |
commit | 4a739ecb78843375df1691f0924c4603e1af974d (patch) | |
tree | e13f6d9b6bf7332f33f15f2928ec5f66ba519bf0 | |
parent | 4758ea55c119c0d70719659c3e78ae61736ea25f (diff) | |
download | ow2-asm-4a739ecb78843375df1691f0924c4603e1af974d.tar.gz |
Skip remap inner class name if not changed
-rw-r--r-- | asm-commons/src/main/java/org/objectweb/asm/commons/Remapper.java | 14 | ||||
-rw-r--r-- | asm-commons/src/test/java/org/objectweb/asm/commons/ClassRemapperTest.java | 27 |
2 files changed, 41 insertions, 0 deletions
diff --git a/asm-commons/src/main/java/org/objectweb/asm/commons/Remapper.java b/asm-commons/src/main/java/org/objectweb/asm/commons/Remapper.java index 414edcec..00c5e99a 100644 --- a/asm-commons/src/main/java/org/objectweb/asm/commons/Remapper.java +++ b/asm-commons/src/main/java/org/objectweb/asm/commons/Remapper.java @@ -263,6 +263,20 @@ public abstract class Remapper { public String mapInnerClassName( final String name, final String ownerName, final String innerName) { final String remappedInnerName = this.mapType(name); + + if (remappedInnerName.equals(name)) { + return innerName; + } else { + int originSplit = name.lastIndexOf('/'); + int remappedSplit = remappedInnerName.lastIndexOf('/'); + if (originSplit != -1 && remappedSplit != -1) { + if (name.substring(originSplit).equals(remappedInnerName.substring(remappedSplit))) { + // class name not changed + return innerName; + } + } + } + if (remappedInnerName.contains("$")) { int index = remappedInnerName.lastIndexOf('$') + 1; while (index < remappedInnerName.length() diff --git a/asm-commons/src/test/java/org/objectweb/asm/commons/ClassRemapperTest.java b/asm-commons/src/test/java/org/objectweb/asm/commons/ClassRemapperTest.java index 3cb9e168..697125f3 100644 --- a/asm-commons/src/test/java/org/objectweb/asm/commons/ClassRemapperTest.java +++ b/asm-commons/src/test/java/org/objectweb/asm/commons/ClassRemapperTest.java @@ -149,6 +149,33 @@ class ClassRemapperTest extends AsmTest { } @Test + void testVisitInnerClass_specialRemap() { + ClassNode classNode = new ClassNode(); + ClassRemapper remapper = + new ClassRemapper( + classNode, + new Remapper() { + @Override + public String map(final String internalName) { + if ("pkg/C".equals(internalName)) { + return "pkg2/C"; + } + if ("pkg/C$$a".equals(internalName)) { + return "pkg2/C$$a"; + } + return internalName; + } + }); + remapper.visit(Opcodes.V1_5, Opcodes.ACC_PUBLIC, "pkg/C", null, "java/lang/Object", null); + + remapper.visitInnerClass("pkg/C$$a", "pkg/C", "$a", Opcodes.ACC_PUBLIC); + + assertEquals("pkg2/C$$a", classNode.innerClasses.get(0).name); + assertEquals("pkg2/C", classNode.innerClasses.get(0).outerName); + assertEquals("$a", classNode.innerClasses.get(0).innerName); + } + + @Test void testVisitAttribute_moduleHashes() { ClassNode classNode = new ClassNode(); ClassRemapper classRemapper = |