From 4a739ecb78843375df1691f0924c4603e1af974d Mon Sep 17 00:00:00 2001 From: Karlatemp Date: Tue, 13 Sep 2022 23:01:53 +0800 Subject: Skip remap inner class name if not changed --- .../java/org/objectweb/asm/commons/Remapper.java | 14 +++++++++++ .../objectweb/asm/commons/ClassRemapperTest.java | 27 ++++++++++++++++++++++ 2 files changed, 41 insertions(+) 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 @@ -148,6 +148,33 @@ class ClassRemapperTest extends AsmTest { assertEquals("b", classNode.innerClasses.get(0).innerName); } + @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(); -- cgit v1.2.3