Skip to content

Commit 6b6781a

Browse files
authored
Merge pull request #176 from thecatcore/feature/class-tweaker
Switch from AccessWidener to ClassTweaker
2 parents d190ab1 + db4cad9 commit 6b6781a

File tree

9 files changed

+504
-496
lines changed

9 files changed

+504
-496
lines changed

build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ dependencies {
128128
}
129129
implementation(libs.jbsdiff)
130130

131-
implementation(libs.access.widener)
131+
implementation(libs.classtweaker)
132132

133133
implementation(libs.commons.io)
134134
implementation(libs.commons.compress)

gradle/libs.versions.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ jbsdiff = "1.0"
1919
commons-io = "2.20.0"
2020
commons-compress = "1.28.0"
2121

22-
access-widener = "2.1.0"
22+
classtweaker = "0.2"
2323

2424
# JGit 5.x is the last version that supports Java 8.
2525
jgit = "5.13.3.202401111512-r"
@@ -47,7 +47,7 @@ unimined-mapping-library-jvm = { module = "xyz.wagyourtail.unimined.mapping:unim
4747
binarypatcher = { module = "net.minecraftforge:binarypatcher", version.ref = "binarypatcher" }
4848
jbsdiff = { module = "io.sigpipe:jbsdiff", version.ref = "jbsdiff" }
4949

50-
access-widener = { module = "net.fabricmc:access-widener", version.ref = "access-widener" }
50+
classtweaker = { module = "net.fabricmc:class-tweaker", version.ref = "classtweaker" }
5151

5252
commons-io = { module = "commons-io:commons-io", version.ref = "commons-io" }
5353
commons-compress = { module = "org.apache.commons:commons-compress", version.ref = "commons-compress" }
Lines changed: 79 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -1,80 +1,80 @@
11
package xyz.wagyourtail.unimined.internal.mapping.at
2-
3-
import net.fabricmc.accesswidener.AccessWidenerReader
4-
import net.fabricmc.accesswidener.AccessWidenerVisitor
5-
import java.io.BufferedWriter
6-
7-
class AccessTransformerWriter(private val output: BufferedWriter): AccessWidenerVisitor, AutoCloseable {
8-
private val classes = mutableMapOf<String, MutableSet<AccessType>>()
9-
private val fields = mutableMapOf<String, MutableSet<AccessType>>()
10-
private val methods = mutableMapOf<String, MutableSet<AccessType>>()
11-
12-
override fun visitClass(name: String, access: AccessWidenerReader.AccessType, transitive: Boolean) {
13-
classes.getOrPut(name.replace("/", ".")) { mutableSetOf() }.addAll(
14-
when (access) {
15-
AccessWidenerReader.AccessType.ACCESSIBLE -> setOf(AccessType.PUBLIC)
16-
AccessWidenerReader.AccessType.EXTENDABLE -> setOf(AccessType.PUBLIC, AccessType.UNFINAL)
17-
AccessWidenerReader.AccessType.MUTABLE -> throw UnsupportedOperationException("AccessWidenerReader.AccessType.MUTABLE is not supported for classes")
18-
}
19-
)
20-
}
21-
22-
override fun visitField(
23-
owner: String,
24-
name: String,
25-
descriptor: String,
26-
access: AccessWidenerReader.AccessType,
27-
transitive: Boolean
28-
) {
29-
val desc = "${owner.replace("/", ".")} $name"
30-
fields.getOrPut(desc) { mutableSetOf() }.addAll(
31-
when (access) {
32-
AccessWidenerReader.AccessType.ACCESSIBLE -> setOf(AccessType.PUBLIC)
33-
AccessWidenerReader.AccessType.EXTENDABLE -> throw UnsupportedOperationException("AccessWidenerReader.AccessType.EXTENDABLE is not supported for fields")
34-
AccessWidenerReader.AccessType.MUTABLE -> setOf(AccessType.UNFINAL)
35-
}
36-
)
37-
}
38-
39-
override fun visitMethod(
40-
owner: String,
41-
name: String,
42-
descriptor: String,
43-
access: AccessWidenerReader.AccessType,
44-
transitive: Boolean
45-
) {
46-
val desc = "${owner.replace("/", ".")} $name$descriptor"
47-
methods.getOrPut(desc) { mutableSetOf() }.addAll(
48-
when (access) {
49-
AccessWidenerReader.AccessType.ACCESSIBLE -> setOf(AccessType.PUBLIC)
50-
AccessWidenerReader.AccessType.EXTENDABLE -> setOf(AccessType.PROTECTED, AccessType.UNFINAL)
51-
AccessWidenerReader.AccessType.MUTABLE -> throw UnsupportedOperationException("AccessWidenerReader.AccessType.MUTABLE is not supported for methods")
52-
}
53-
)
54-
}
55-
56-
enum class AccessType(val str: String) {
57-
PUBLIC("public"),
58-
PROTECTED("protected"),
59-
UNFINAL("-f"),
60-
}
61-
62-
override fun close() {
63-
classes.forEach { (name, access) ->
64-
if (access == setOf(AccessType.UNFINAL)) access.add(AccessType.PUBLIC)
65-
if (access.containsAll(setOf(AccessType.PUBLIC, AccessType.PROTECTED))) access.remove(AccessType.PROTECTED)
66-
output.write(access.sortedBy { it.ordinal }.joinToString("") { it.str } + " $name\n")
67-
}
68-
fields.forEach { (desc, access) ->
69-
if (access == setOf(AccessType.UNFINAL)) access.add(AccessType.PUBLIC)
70-
if (access.containsAll(setOf(AccessType.PUBLIC, AccessType.PROTECTED))) access.remove(AccessType.PROTECTED)
71-
output.write(access.sortedBy { it.ordinal }.joinToString("") { it.str } + " $desc\n")
72-
}
73-
methods.forEach { (desc, access) ->
74-
if (access == setOf(AccessType.UNFINAL)) access.add(AccessType.PUBLIC)
75-
if (access.containsAll(setOf(AccessType.PUBLIC, AccessType.PROTECTED))) access.remove(AccessType.PROTECTED)
76-
output.write(access.sortedBy { it.ordinal }.joinToString("") { it.str } + " $desc\n")
77-
}
78-
output.close()
79-
}
80-
}
2+
//
3+
//import net.fabricmc.accesswidener.AccessWidenerReader
4+
//import net.fabricmc.accesswidener.AccessWidenerVisitor
5+
//import java.io.BufferedWriter
6+
//
7+
//class AccessTransformerWriter(private val output: BufferedWriter): AccessWidenerVisitor, AutoCloseable {
8+
// private val classes = mutableMapOf<String, MutableSet<AccessType>>()
9+
// private val fields = mutableMapOf<String, MutableSet<AccessType>>()
10+
// private val methods = mutableMapOf<String, MutableSet<AccessType>>()
11+
//
12+
// override fun visitClass(name: String, access: AccessWidenerReader.AccessType, transitive: Boolean) {
13+
// classes.getOrPut(name.replace("/", ".")) { mutableSetOf() }.addAll(
14+
// when (access) {
15+
// AccessWidenerReader.AccessType.ACCESSIBLE -> setOf(AccessType.PUBLIC)
16+
// AccessWidenerReader.AccessType.EXTENDABLE -> setOf(AccessType.PUBLIC, AccessType.UNFINAL)
17+
// AccessWidenerReader.AccessType.MUTABLE -> throw UnsupportedOperationException("AccessWidenerReader.AccessType.MUTABLE is not supported for classes")
18+
// }
19+
// )
20+
// }
21+
//
22+
// override fun visitField(
23+
// owner: String,
24+
// name: String,
25+
// descriptor: String,
26+
// access: AccessWidenerReader.AccessType,
27+
// transitive: Boolean
28+
// ) {
29+
// val desc = "${owner.replace("/", ".")} $name"
30+
// fields.getOrPut(desc) { mutableSetOf() }.addAll(
31+
// when (access) {
32+
// AccessWidenerReader.AccessType.ACCESSIBLE -> setOf(AccessType.PUBLIC)
33+
// AccessWidenerReader.AccessType.EXTENDABLE -> throw UnsupportedOperationException("AccessWidenerReader.AccessType.EXTENDABLE is not supported for fields")
34+
// AccessWidenerReader.AccessType.MUTABLE -> setOf(AccessType.UNFINAL)
35+
// }
36+
// )
37+
// }
38+
//
39+
// override fun visitMethod(
40+
// owner: String,
41+
// name: String,
42+
// descriptor: String,
43+
// access: AccessWidenerReader.AccessType,
44+
// transitive: Boolean
45+
// ) {
46+
// val desc = "${owner.replace("/", ".")} $name$descriptor"
47+
// methods.getOrPut(desc) { mutableSetOf() }.addAll(
48+
// when (access) {
49+
// AccessWidenerReader.AccessType.ACCESSIBLE -> setOf(AccessType.PUBLIC)
50+
// AccessWidenerReader.AccessType.EXTENDABLE -> setOf(AccessType.PROTECTED, AccessType.UNFINAL)
51+
// AccessWidenerReader.AccessType.MUTABLE -> throw UnsupportedOperationException("AccessWidenerReader.AccessType.MUTABLE is not supported for methods")
52+
// }
53+
// )
54+
// }
55+
//
56+
// enum class AccessType(val str: String) {
57+
// PUBLIC("public"),
58+
// PROTECTED("protected"),
59+
// UNFINAL("-f"),
60+
// }
61+
//
62+
// override fun close() {
63+
// classes.forEach { (name, access) ->
64+
// if (access == setOf(AccessType.UNFINAL)) access.add(AccessType.PUBLIC)
65+
// if (access.containsAll(setOf(AccessType.PUBLIC, AccessType.PROTECTED))) access.remove(AccessType.PROTECTED)
66+
// output.write(access.sortedBy { it.ordinal }.joinToString("") { it.str } + " $name\n")
67+
// }
68+
// fields.forEach { (desc, access) ->
69+
// if (access == setOf(AccessType.UNFINAL)) access.add(AccessType.PUBLIC)
70+
// if (access.containsAll(setOf(AccessType.PUBLIC, AccessType.PROTECTED))) access.remove(AccessType.PROTECTED)
71+
// output.write(access.sortedBy { it.ordinal }.joinToString("") { it.str } + " $desc\n")
72+
// }
73+
// methods.forEach { (desc, access) ->
74+
// if (access == setOf(AccessType.UNFINAL)) access.add(AccessType.PUBLIC)
75+
// if (access.containsAll(setOf(AccessType.PUBLIC, AccessType.PROTECTED))) access.remove(AccessType.PROTECTED)
76+
// output.write(access.sortedBy { it.ordinal }.joinToString("") { it.str } + " $desc\n")
77+
// }
78+
// output.close()
79+
// }
80+
//}

src/mapping/kotlin/xyz/wagyourtail/unimined/internal/mapping/aw/AccessWidenerApplier.kt

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
package xyz.wagyourtail.unimined.internal.mapping.aw
22

33
import kotlinx.coroutines.runBlocking
4-
import net.fabricmc.accesswidener.*
4+
import net.fabricmc.classtweaker.api.ClassTweaker
5+
import net.fabricmc.classtweaker.api.ClassTweakerReader
6+
import net.fabricmc.classtweaker.api.ClassTweakerWriter
7+
import net.fabricmc.classtweaker.api.visitor.ClassTweakerVisitor
58
import net.fabricmc.tinyremapper.OutputConsumerPath
69
import net.fabricmc.tinyremapper.TinyRemapper
710
import okio.use
@@ -38,7 +41,9 @@ object AccessWidenerApplier {
3841
override fun canTransform(remapper: TinyRemapper, relativePath: Path): Boolean {
3942
// read the beginning of the file and see if it begins with "accessWidener"
4043
return relativePath.extension.equals("accesswidener", true) ||
41-
relativePath.extension.equals("aw", true)
44+
relativePath.extension.equals("aw", true) ||
45+
relativePath.extension.equals("classtweaker", true)||
46+
relativePath.extension.equals("ct", true)
4247
}
4348

4449
override fun transform(
@@ -47,13 +52,14 @@ object AccessWidenerApplier {
4752
input: InputStream,
4853
remapper: TinyRemapper
4954
) {
50-
val awr = AccessWidenerWriter()
5155
val aw = input.readBytes()
56+
val header = ClassTweakerReader.readHeader(aw)
57+
val awr = ClassTweakerWriter.create(header.version)
5258
try {
53-
AccessWidenerReader(AccessWidenerRemapper(awr, remapper.environment.remapper, source, target)).read(BufferedReader(InputStreamReader(ByteArrayInputStream(aw), StandardCharsets.UTF_8)))
59+
ClassTweakerReader.create(ClassTweakerVisitor.remap(awr, remapper.environment.remapper, source, target)).read(BufferedReader(InputStreamReader(ByteArrayInputStream(aw), StandardCharsets.UTF_8)))
5460
val output = destinationDirectory.resolve(relativePath)
5561
output.parent.createDirectories()
56-
Files.write(output, awr.write(), StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING)
62+
Files.write(output, awr.output, StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING)
5763
} catch (t: IllegalArgumentException) {
5864
if (t.message?.startsWith("Cannot remap access widener from namespace") != true) throw t
5965
if (!catchNsError) {
@@ -74,21 +80,21 @@ object AccessWidenerApplier {
7480
}
7581

7682
fun transform(
77-
accessWidener: Path,
83+
classTweaker: Path,
7884
namespace: String,
7985
baseMinecraft: Path,
8086
output: Path,
8187
throwIfNSWrong: Boolean,
8288
logger: Logger
8389
): Boolean {
84-
val aw = AccessWidener()
85-
AccessWidenerReader(aw).read(BufferedReader(accessWidener.reader()))
86-
if (aw.namespace == namespace) {
90+
val ct = ClassTweaker.newInstance()
91+
ClassTweakerReader.create(ct).read(BufferedReader(classTweaker.reader()))
92+
if (ct.namespace == namespace) {
8793
Files.copy(baseMinecraft, output, StandardCopyOption.REPLACE_EXISTING)
8894
try {
89-
val targets = aw.targets.toMutableSet()
95+
val targets = ct.targets.toMutableSet()
9096
ZipArchiveOutputStream(output.outputStream()).use { zipOutput ->
91-
logger.debug("Transforming $output with access widener $accessWidener and namespace $namespace")
97+
logger.debug("Transforming $output with class tweaker $classTweaker and namespace $namespace")
9298
baseMinecraft.forEachInZip { path, stream ->
9399
if (path.endsWith(".class")) {
94100
val target = path.removeSuffix(".class").replace("/", ".")
@@ -97,14 +103,14 @@ object AccessWidenerApplier {
97103
logger.debug("Transforming $path")
98104
val reader = ClassReader(stream)
99105
val writer = ClassWriter(0)
100-
val visitor = AccessWidenerClassVisitor.createClassVisitor(Opcodes.ASM9, writer, aw)
106+
val visitor = ct.createClassVisitor(Opcodes.ASM9, writer, null)
101107
reader.accept(visitor, 0)
102108
zipOutput.putArchiveEntry(ZipArchiveEntry(path))
103109
zipOutput.write(writer.toByteArray())
104110
zipOutput.closeArchiveEntry()
105111
} catch (e: Exception) {
106112
logger.warn(
107-
"An error occurred while transforming $target with access widener $accessWidener for namespace $namespace in $output",
113+
"An error occurred while transforming $target with class tweaker $classTweaker for namespace $namespace in $output",
108114
e
109115
)
110116
}
@@ -122,7 +128,7 @@ object AccessWidenerApplier {
122128
}
123129
}
124130
if (targets.isNotEmpty()) {
125-
logger.warn("AccessWidener $accessWidener did not find the following classes: $targets")
131+
logger.warn("ClassTweaker $classTweaker did not find the following classes: $targets")
126132
}
127133
} catch (e: Exception) {
128134
output.deleteIfExists()
@@ -131,9 +137,9 @@ object AccessWidenerApplier {
131137
return true
132138
}
133139
if (throwIfNSWrong) {
134-
throw IllegalStateException("AccessWidener namespace (${aw.namespace}) does not match minecraft namespace ($namespace)")
140+
throw IllegalStateException("ClassTweaker namespace (${ct.namespace}) does not match minecraft namespace ($namespace)")
135141
} else {
136-
logger.info("AccessWidener ($accessWidener) namespace (${aw.namespace}) does not match minecraft namespace ($namespace), it will not be applied!")
142+
logger.info("ClassTweaker ($classTweaker) namespace (${ct.namespace}) does not match minecraft namespace ($namespace), it will not be applied!")
137143
}
138144
return false
139145
}

0 commit comments

Comments
 (0)