summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Bruneton <ebruneton@free.fr>2022-09-17 12:47:47 +0000
committerEric Bruneton <ebruneton@free.fr>2022-09-17 12:47:47 +0000
commit6593e131393c38f2b7331ae302421be231e3d3ef (patch)
treee13f6d9b6bf7332f33f15f2928ec5f66ba519bf0
parent4758ea55c119c0d70719659c3e78ae61736ea25f (diff)
parent4a739ecb78843375df1691f0924c4603e1af974d (diff)
downloadow2-asm-6593e131393c38f2b7331ae302421be231e3d3ef.tar.gz
Merge branch 'skip-remap-if-same' into 'master'
Skip remap inner class name if not changed See merge request asm/asm!363
-rw-r--r--asm-commons/src/main/java/org/objectweb/asm/commons/Remapper.java14
-rw-r--r--asm-commons/src/test/java/org/objectweb/asm/commons/ClassRemapperTest.java27
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 =