From 89e76e0688f8a88c8bc2f185af6a2a26a1a53415 Mon Sep 17 00:00:00 2001 From: Goooler Date: Mon, 16 Mar 2026 13:12:00 +0800 Subject: [PATCH] Eliminate data class from public APIs --- CHANGELOG.md | 1 + build.gradle | 1 + formats/api/formats.api | 22 ------------------- formats/build.gradle | 1 + .../jakewharton/diffuse/format/ArchiveFile.kt | 12 +++++++++- .../com/jakewharton/diffuse/format/Arsc.kt | 4 +++- .../com/jakewharton/diffuse/format/Member.kt | 21 ++++++++++++++++-- .../jakewharton/diffuse/format/Signatures.kt | 4 +++- gradle/libs.versions.toml | 1 + 9 files changed, 40 insertions(+), 27 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a56912b8..5ee40346 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ **Changed** - Replace `com.jakewharton.diffuse.io.Size` with `me.saket.bytesize.ByteSize` in the APIs. +- Eliminate `data class` from public APIs. **Fixed** - Significantly improve `.jar` diff performance. diff --git a/build.gradle b/build.gradle index e9799b9f..eb72ecf4 100644 --- a/build.gradle +++ b/build.gradle @@ -7,6 +7,7 @@ buildscript { classpath libs.mavenPublishPlugin classpath libs.spotlessPlugin classpath libs.buildConfigPlugin + classpath libs.pokoPlugin } repositories { mavenCentral() diff --git a/formats/api/formats.api b/formats/api/formats.api index 2c42f0f7..d4b0aacd 100644 --- a/formats/api/formats.api +++ b/formats/api/formats.api @@ -98,11 +98,6 @@ public final class com/jakewharton/diffuse/format/Apk$Companion { public final class com/jakewharton/diffuse/format/ArchiveFile { public fun (Ljava/lang/String;Lcom/jakewharton/diffuse/format/ArchiveFile$Type;Lme/saket/bytesize/ByteSize;Lme/saket/bytesize/ByteSize;Z)V - public final fun component1 ()Ljava/lang/String; - public final fun component2 ()Lcom/jakewharton/diffuse/format/ArchiveFile$Type; - public final fun component3 ()Lme/saket/bytesize/ByteSize; - public final fun component4 ()Lme/saket/bytesize/ByteSize; - public final fun component5 ()Z public final fun copy (Ljava/lang/String;Lcom/jakewharton/diffuse/format/ArchiveFile$Type;Lme/saket/bytesize/ByteSize;Lme/saket/bytesize/ByteSize;Z)Lcom/jakewharton/diffuse/format/ArchiveFile; public static synthetic fun copy$default (Lcom/jakewharton/diffuse/format/ArchiveFile;Ljava/lang/String;Lcom/jakewharton/diffuse/format/ArchiveFile$Type;Lme/saket/bytesize/ByteSize;Lme/saket/bytesize/ByteSize;ZILjava/lang/Object;)Lcom/jakewharton/diffuse/format/ArchiveFile; public fun equals (Ljava/lang/Object;)Z @@ -217,10 +212,6 @@ public final class com/jakewharton/diffuse/format/Arsc$Entry : java/lang/Compara public fun (Ljava/lang/String;Ljava/lang/String;)V public fun compareTo (Lcom/jakewharton/diffuse/format/Arsc$Entry;)I public synthetic fun compareTo (Ljava/lang/Object;)I - public final fun component1 ()Ljava/lang/String; - public final fun component2 ()Ljava/lang/String; - public final fun copy (Ljava/lang/String;Ljava/lang/String;)Lcom/jakewharton/diffuse/format/Arsc$Entry; - public static synthetic fun copy$default (Lcom/jakewharton/diffuse/format/Arsc$Entry;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lcom/jakewharton/diffuse/format/Arsc$Entry; public fun equals (Ljava/lang/Object;)Z public final fun getName ()Ljava/lang/String; public final fun getType ()Ljava/lang/String; @@ -276,9 +267,6 @@ public final class com/jakewharton/diffuse/format/Field : com/jakewharton/diffus public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/internal/DefaultConstructorMarker;)V public fun compareTo (Lcom/jakewharton/diffuse/format/Member;)I public synthetic fun compareTo (Ljava/lang/Object;)I - public final fun component1-BeHrSHk ()Ljava/lang/String; - public final fun component2 ()Ljava/lang/String; - public final fun component3-BeHrSHk ()Ljava/lang/String; public final fun copy-sziKtKI (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lcom/jakewharton/diffuse/format/Field; public static synthetic fun copy-sziKtKI$default (Lcom/jakewharton/diffuse/format/Field;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lcom/jakewharton/diffuse/format/Field; public fun equals (Ljava/lang/Object;)Z @@ -316,10 +304,6 @@ public final class com/jakewharton/diffuse/format/Method : com/jakewharton/diffu public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Ljava/lang/String;Lkotlin/jvm/internal/DefaultConstructorMarker;)V public fun compareTo (Lcom/jakewharton/diffuse/format/Member;)I public synthetic fun compareTo (Ljava/lang/Object;)I - public final fun component1-BeHrSHk ()Ljava/lang/String; - public final fun component2 ()Ljava/lang/String; - public final fun component3 ()Ljava/util/List; - public final fun component4-BeHrSHk ()Ljava/lang/String; public final fun copy-UgLDmOQ (Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Ljava/lang/String;)Lcom/jakewharton/diffuse/format/Method; public static synthetic fun copy-UgLDmOQ$default (Lcom/jakewharton/diffuse/format/Method;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Ljava/lang/String;ILjava/lang/Object;)Lcom/jakewharton/diffuse/format/Method; public fun equals (Ljava/lang/Object;)Z @@ -334,12 +318,6 @@ public final class com/jakewharton/diffuse/format/Method : com/jakewharton/diffu public final class com/jakewharton/diffuse/format/Signatures { public static final field Companion Lcom/jakewharton/diffuse/format/Signatures$Companion; public fun (Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;)V - public final fun component1 ()Ljava/util/List; - public final fun component2 ()Ljava/util/List; - public final fun component3 ()Ljava/util/List; - public final fun component4 ()Ljava/util/List; - public final fun copy (Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;)Lcom/jakewharton/diffuse/format/Signatures; - public static synthetic fun copy$default (Lcom/jakewharton/diffuse/format/Signatures;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;ILjava/lang/Object;)Lcom/jakewharton/diffuse/format/Signatures; public fun equals (Ljava/lang/Object;)Z public final fun getV1 ()Ljava/util/List; public final fun getV2 ()Ljava/util/List; diff --git a/formats/build.gradle b/formats/build.gradle index 4e351213..ef6a0f7c 100644 --- a/formats/build.gradle +++ b/formats/build.gradle @@ -1,6 +1,7 @@ apply plugin: 'org.jetbrains.kotlin.jvm' apply plugin: 'com.vanniktech.maven.publish' apply plugin: 'org.jetbrains.dokka' +apply plugin: "dev.drewhamilton.poko" dependencies { api projects.io diff --git a/formats/src/main/kotlin/com/jakewharton/diffuse/format/ArchiveFile.kt b/formats/src/main/kotlin/com/jakewharton/diffuse/format/ArchiveFile.kt index f3888c04..9191abe8 100644 --- a/formats/src/main/kotlin/com/jakewharton/diffuse/format/ArchiveFile.kt +++ b/formats/src/main/kotlin/com/jakewharton/diffuse/format/ArchiveFile.kt @@ -1,16 +1,26 @@ package com.jakewharton.diffuse.format import com.jakewharton.diffuse.format.Arsc as ArscFormat +import dev.drewhamilton.poko.Poko import java.util.Locale import me.saket.bytesize.ByteSize -data class ArchiveFile( +@Poko +class ArchiveFile( val path: String, val type: Type, val size: ByteSize, val uncompressedSize: ByteSize, val isCompressed: Boolean, ) { + fun copy( + path: String = this.path, + type: Type = this.type, + size: ByteSize = this.size, + uncompressedSize: ByteSize = this.uncompressedSize, + isCompressed: Boolean = this.isCompressed, + ): ArchiveFile = ArchiveFile(path, type, size, uncompressedSize, isCompressed) + enum class Type { Dex, Jar, diff --git a/formats/src/main/kotlin/com/jakewharton/diffuse/format/Arsc.kt b/formats/src/main/kotlin/com/jakewharton/diffuse/format/Arsc.kt index 1095f280..0897bc55 100644 --- a/formats/src/main/kotlin/com/jakewharton/diffuse/format/Arsc.kt +++ b/formats/src/main/kotlin/com/jakewharton/diffuse/format/Arsc.kt @@ -2,9 +2,11 @@ package com.jakewharton.diffuse.format import com.google.devrel.gmscore.tools.apk.arsc.ResourceTableChunk import com.jakewharton.diffuse.io.Input +import dev.drewhamilton.poko.Poko class Arsc private constructor(val configs: List, val entries: Map) { - data class Entry(val type: String, val name: String) : Comparable { + @Poko + class Entry(val type: String, val name: String) : Comparable { override fun compareTo(other: Entry) = comparator.compare(this, other) override fun toString() = "$type/$name" diff --git a/formats/src/main/kotlin/com/jakewharton/diffuse/format/Member.kt b/formats/src/main/kotlin/com/jakewharton/diffuse/format/Member.kt index d79fac24..17aed155 100644 --- a/formats/src/main/kotlin/com/jakewharton/diffuse/format/Member.kt +++ b/formats/src/main/kotlin/com/jakewharton/diffuse/format/Member.kt @@ -1,5 +1,7 @@ package com.jakewharton.diffuse.format +import dev.drewhamilton.poko.Poko + sealed class Member : Comparable { abstract val declaringType: TypeDescriptor abstract val name: String @@ -16,7 +18,8 @@ sealed class Member : Comparable { } } -data class Field( +@Poko +class Field( override val declaringType: TypeDescriptor, override val name: String, val type: TypeDescriptor, @@ -31,12 +34,19 @@ data class Field( return COMPARATOR.compare(this, other as Field) } + fun copy( + declaringType: TypeDescriptor = this.declaringType, + name: String = this.name, + type: TypeDescriptor = this.type, + ): Field = Field(declaringType, name, type) + private companion object { val COMPARATOR = compareBy(Field::name, Field::type) } } -data class Method( +@Poko +class Method( override val declaringType: TypeDescriptor, override val name: String, val parameterTypes: List, @@ -63,6 +73,13 @@ data class Method( return COMPARATOR.compare(this, other as Method) } + fun copy( + declaringType: TypeDescriptor = this.declaringType, + name: String = this.name, + parameterTypes: List = this.parameterTypes, + returnType: TypeDescriptor = this.returnType, + ): Method = Method(declaringType, name, parameterTypes, returnType) + private companion object { val VOID = TypeDescriptor("V") val COMPARATOR = diff --git a/formats/src/main/kotlin/com/jakewharton/diffuse/format/Signatures.kt b/formats/src/main/kotlin/com/jakewharton/diffuse/format/Signatures.kt index 8eaa1faf..f7dd0859 100644 --- a/formats/src/main/kotlin/com/jakewharton/diffuse/format/Signatures.kt +++ b/formats/src/main/kotlin/com/jakewharton/diffuse/format/Signatures.kt @@ -5,6 +5,7 @@ import com.android.apksig.util.DataSource import com.android.apksig.util.DataSources import com.jakewharton.diffuse.io.Input import com.jakewharton.diffuse.io.PathInput +import dev.drewhamilton.poko.Poko import java.io.Closeable import java.nio.channels.FileChannel import kotlin.contracts.InvocationKind @@ -12,7 +13,8 @@ import kotlin.contracts.contract import okio.ByteString import okio.ByteString.Companion.toByteString -data class Signatures( +@Poko +class Signatures( val v1: List, val v2: List, val v3: List, diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 393f1f2d..88b1048f 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -25,4 +25,5 @@ dokkaPlugin = "org.jetbrains.dokka:dokka-gradle-plugin:2.1.0" mavenPublishPlugin = "com.vanniktech:gradle-maven-publish-plugin:0.36.0" spotlessPlugin = "com.diffplug.spotless:spotless-plugin-gradle:8.3.0" buildConfigPlugin = "com.github.gmazzo.buildconfig:plugin:6.0.9" +pokoPlugin = "dev.drewhamilton.poko:dev.drewhamilton.poko.gradle.plugin:0.21.3" ktfmt = "com.facebook:ktfmt:0.61"