Skip to content

Commit

Permalink
Share Kotlin metadata strings
Browse files Browse the repository at this point in the history
  • Loading branch information
fergal-whyte authored and tvoc-gs committed Nov 27, 2024
1 parent 18cef86 commit a1282b9
Showing 1 changed file with 32 additions and 1 deletion.
33 changes: 32 additions & 1 deletion base/src/main/java/proguard/classfile/util/StringSharer.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,14 +22,18 @@
import proguard.classfile.attribute.visitor.AttributeVisitor;
import proguard.classfile.constant.*;
import proguard.classfile.constant.visitor.ConstantVisitor;
import proguard.classfile.kotlin.KotlinClassKindMetadata;
import proguard.classfile.kotlin.KotlinMetadata;
import proguard.classfile.kotlin.visitor.KotlinMetadataVisitor;
import proguard.classfile.visitor.ClassVisitor;

/**
* This {@link ClassVisitor} shares strings in the class files that it visits.
*
* @author Eric Lafortune
*/
public class StringSharer implements ClassVisitor, ConstantVisitor, AttributeVisitor {
public class StringSharer
implements ClassVisitor, ConstantVisitor, AttributeVisitor, KotlinMetadataVisitor {
// A fields acting as an argument for the visitor methods.
private String name;
private String type;
Expand All @@ -50,6 +54,9 @@ public void visitProgramClass(ProgramClass programClass) {
// Replace attribute name strings in the constant pool by internalized
// strings.
programClass.attributesAccept(this);

// Replace strings in Kotlin metadata.
programClass.kotlinMetadataAccept(this);
}

@Override
Expand All @@ -73,6 +80,9 @@ public void visitLibraryClass(LibraryClass libraryClass) {
}
}
}

// Replace strings in Kotlin metadata.
libraryClass.kotlinMetadataAccept(this);
}

// Implementations for ConstantVisitor.
Expand Down Expand Up @@ -154,4 +164,25 @@ public void visitAnyAttribute(Clazz clazz, Attribute attribute) {
name = attribute.getAttributeName(clazz).intern();
clazz.constantPoolEntryAccept(attribute.u2attributeNameIndex, this);
}

// Implementations for KotlinMetadataVisitor.

public void visitAnyKotlinMetadata(Clazz clazz, KotlinMetadata kotlinMetadata) {}

public void visitKotlinClassMetadata(
Clazz clazz, KotlinClassKindMetadata kotlinClassKindMetadata) {
if (kotlinClassKindMetadata.referencedClass != null) {
kotlinClassKindMetadata.className = kotlinClassKindMetadata.referencedClass.getName();
}

if (kotlinClassKindMetadata.referencedCompanionClass != null) {
kotlinClassKindMetadata.companionObjectName =
kotlinClassKindMetadata.referencedCompanionField.getName(clazz);
}

if (kotlinClassKindMetadata.anonymousObjectOriginClass != null) {
kotlinClassKindMetadata.anonymousObjectOriginName =
kotlinClassKindMetadata.anonymousObjectOriginClass.getName();
}
}
}

0 comments on commit a1282b9

Please sign in to comment.