Skip to content

Commit b8e1c1d

Browse files
Misat11zlataovce
andauthored
feat: support for unobfuscated versions (#55)
* feat: initial support for unobfuscated versions * fix: remove extra param from constructor * fix: accessor generation * fix: keep mojang mappings badge for unobfuscated in version list page * feat: param names * refactor: copy the names instead of changing the source ns, sorry misat it's less invasive * fix: extra import * fix: missed stuff * fix: dumb LVT * fix: dumb LVT * fix: UNOBFUSCATED does indeed exist * fix: should be >= and not > * fix: skip params with null or blank name you HAVE to skip that otherwise everything goes crazy if it ever finds empty param name (which it does on older versions) --------- Co-authored-by: Matouš Kučera <[email protected]>
1 parent 30d331e commit b8e1c1d

File tree

6 files changed

+71
-17
lines changed

6 files changed

+71
-17
lines changed

core/src/main/kotlin/me/kcra/takenaka/core/VersionManifest.kt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -199,9 +199,15 @@ data class Version(
199199
val complianceLevel: Int
200200
) : Comparable<Version>, Serializable {
201201
enum class Type {
202-
RELEASE, SNAPSHOT, OLD_BETA, OLD_ALPHA
202+
RELEASE, SNAPSHOT, OLD_BETA, OLD_ALPHA, UNOBFUSCATED
203203
}
204204

205+
/**
206+
* Whether this version may lack mappings due to being unobfuscated.
207+
*/
208+
val maybeUnobfuscated: Boolean
209+
get() = releaseTime.toEpochMilli() >= 1762265228000
210+
205211
/**
206212
* Compares the release date of this version to another version.
207213
*

core/src/main/kotlin/me/kcra/takenaka/core/mapping/adapter/MethodArgSourceFilter.kt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,6 @@ import net.fabricmc.mappingio.adapter.ForwardingMappingVisitor
2323
/**
2424
* A [MappingVisitor] that filters out source (obfuscated) names of method parameters.
2525
*
26-
* In most cases, you won't have obfuscated names of method parameters, so they are a filler that mapping vendors put in (like in Searge).
27-
*
2826
* @param next the visitor to delegate to
2927
* @author Matouš Kučera
3028
*/

core/src/main/kotlin/me/kcra/takenaka/core/mapping/resolve/impl/MojangMappingResolver.kt

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,12 @@ import me.kcra.takenaka.core.mapping.MappingContributor
2626
import me.kcra.takenaka.core.mapping.resolve.*
2727
import me.kcra.takenaka.core.util.*
2828
import io.github.oshai.kotlinlogging.KotlinLogging
29+
import me.kcra.takenaka.core.mapping.util.unwrap
2930
import net.fabricmc.mappingio.MappingUtil
3031
import net.fabricmc.mappingio.MappingVisitor
3132
import net.fabricmc.mappingio.adapter.MappingSourceNsSwitch
3233
import net.fabricmc.mappingio.format.ProGuardReader
34+
import net.fabricmc.mappingio.tree.MappingTree
3335
import java.net.URL
3436
import java.nio.file.Path
3537
import kotlin.io.path.bufferedReader
@@ -133,11 +135,32 @@ abstract class AbstractMojangMappingResolver(
133135
* @param visitor the visitor
134136
*/
135137
override fun accept(visitor: MappingVisitor) {
138+
val visitor0 = visitor.unwrap()
136139
val mappingPath by mappingOutput
137140

138-
// Mojang maps are original -> obfuscated, so we need to switch it beforehand
139-
mappingPath?.reader()?.use {
140-
ProGuardReader.read(it, targetNamespace, MappingUtil.NS_SOURCE_FALLBACK, MappingSourceNsSwitch(visitor, MappingUtil.NS_SOURCE_FALLBACK))
141+
val isUnobfuscated = workspace.version.maybeUnobfuscated && mappingPath == null
142+
if (isUnobfuscated && visitor0 is MappingTree) {
143+
visitor0.visitNamespaces(visitor0.srcNamespace, visitor0.dstNamespaces + targetNamespace)
144+
145+
// copy everything verbatim to the "mojang" namespace
146+
val nsId = visitor0.getNamespaceId(targetNamespace)
147+
visitor0.classes.forEach { klass ->
148+
klass.setDstName(klass.srcName, nsId)
149+
klass.fields.forEach { field ->
150+
field.setDstName(field.srcName, nsId)
151+
}
152+
klass.methods.forEach { method ->
153+
method.setDstName(method.srcName, nsId)
154+
method.args.forEach { arg ->
155+
arg.setDstName(arg.srcName, nsId)
156+
}
157+
}
158+
}
159+
} else {
160+
// Mojang maps are original -> obfuscated, so we need to switch it beforehand
161+
mappingPath?.reader()?.use {
162+
ProGuardReader.read(it, targetNamespace, MappingUtil.NS_SOURCE_FALLBACK, MappingSourceNsSwitch(visitor, MappingUtil.NS_SOURCE_FALLBACK))
163+
}
141164
}
142165

143166
val licensePath by licenseOutput

core/src/main/kotlin/me/kcra/takenaka/core/mapping/resolve/impl/VanillaMappingContributor.kt

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -132,8 +132,8 @@ abstract class AbstractVanillaMappingContributor(
132132
.filter { !it.isDirectory && it.name.matches(CLASS_PATTERN) }
133133
.forEach { entry ->
134134
zf.getInputStream(entry).use { inputStream ->
135-
// ignore any method content and debugging data
136-
ClassReader(inputStream).accept(classVisitor, ClassReader.SKIP_CODE or ClassReader.SKIP_DEBUG)
135+
// ignore any method content
136+
ClassReader(inputStream).accept(classVisitor, ClassReader.SKIP_CODE)
137137
}
138138
}
139139
}
@@ -254,6 +254,21 @@ abstract class AbstractVanillaMappingContributor(
254254
visitor.visitDstName(MappedElementKind.METHOD, 1, signature)
255255
// TODO: exception mapping?
256256
visitor.visitElementContent(MappedElementKind.METHOD)
257+
258+
val type = Type.getMethodType(descriptor)
259+
return object : MethodVisitor(Opcodes.ASM9) {
260+
var paramIndex = 0
261+
var lvIndex = if ((access and Opcodes.ACC_STATIC) == 0) 1 else 0
262+
263+
override fun visitParameter(name: String?, paramAccess: Int) {
264+
if (name != null && name.isNotBlank()) {
265+
visitor.visitMethodArg(paramIndex, lvIndex, name)
266+
}
267+
268+
lvIndex += type.argumentTypes.getOrNull(paramIndex)?.let(Type::getSize) ?: 1
269+
paramIndex++
270+
}
271+
}
257272
}
258273

259274
return null

generator/accessor-plugin/src/main/kotlin/me/kcra/takenaka/generator/accessor/plugin/tasks/ResolveMappingsTask.kt

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import me.kcra.takenaka.core.Version
2222
import me.kcra.takenaka.core.VersionManifest
2323
import me.kcra.takenaka.core.compositeWorkspace
2424
import me.kcra.takenaka.core.mapping.MappingContributor
25+
import me.kcra.takenaka.core.mapping.WrappingContributor
2526
import me.kcra.takenaka.core.mapping.adapter.*
2627
import me.kcra.takenaka.core.mapping.analysis.impl.AnalysisOptions
2728
import me.kcra.takenaka.core.mapping.analysis.impl.MappingAnalyzerImpl
@@ -222,8 +223,6 @@ abstract class ResolveMappingsTask : DefaultTask() {
222223
intercept(::StaticInitializerFilter)
223224
// remove overrides of java/lang/Object, they are implicit
224225
intercept(::ObjectOverrideFilter)
225-
// remove obfuscated method parameter names, they are a filler from Searge
226-
intercept(::MethodArgSourceFilter)
227226
// intern names to save memory
228227
intercept(::StringPoolingAdapter)
229228

@@ -258,10 +257,14 @@ abstract class ResolveMappingsTask : DefaultTask() {
258257
addIfSupported(YarnMappingResolver(versionWorkspace, yarnProvider, relaxedCache.get()))
259258
addIfSupported(QuiltMappingResolver(versionWorkspace, quiltProvider, relaxedCache.get()))
260259
addIfSupported(
261-
SeargeMappingResolver(
262-
versionWorkspace,
263-
sharedCacheWorkspace,
264-
relaxedCache = relaxedCache.get()
260+
WrappingContributor(
261+
SeargeMappingResolver(
262+
versionWorkspace,
263+
sharedCacheWorkspace,
264+
relaxedCache = relaxedCache.get()
265+
),
266+
// remove obfuscated method parameter names, they are a filler from Searge
267+
::MethodArgSourceFilter
265268
)
266269
)
267270

generator/web-cli/src/main/kotlin/me/kcra/takenaka/generator/web/cli/Main.kt

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ import me.kcra.takenaka.generator.web.*
3939
import me.kcra.takenaka.generator.web.transformers.CSSInliningTransformer
4040
import me.kcra.takenaka.generator.web.transformers.MinifyingTransformer
4141
import io.github.oshai.kotlinlogging.KotlinLogging
42+
import me.kcra.takenaka.core.mapping.WrappingContributor
4243
import kotlin.system.exitProcess
4344
import kotlin.system.measureTimeMillis
4445

@@ -165,8 +166,6 @@ fun main(args: Array<String>) {
165166
intercept(::StaticInitializerFilter)
166167
// remove overrides of java/lang/Object, they are implicit
167168
intercept(::ObjectOverrideFilter)
168-
// remove obfuscated method parameter names, they are a filler from Searge
169-
intercept(::MethodArgSourceFilter)
170169
// intern names to save memory
171170
intercept(::StringPoolingAdapter)
172171

@@ -188,7 +187,17 @@ fun main(args: Array<String>) {
188187
addIfSupported(HashedMappingResolver(versionWorkspace))
189188
addIfSupported(YarnMappingResolver(versionWorkspace, yarnProvider, relaxedCache = !strictCache))
190189
addIfSupported(QuiltMappingResolver(versionWorkspace, quiltProvider, relaxedCache = !strictCache))
191-
addIfSupported(SeargeMappingResolver(versionWorkspace, sharedCache, relaxedCache = !strictCache))
190+
addIfSupported(
191+
WrappingContributor(
192+
SeargeMappingResolver(
193+
versionWorkspace,
194+
sharedCache,
195+
relaxedCache = !strictCache
196+
),
197+
// remove obfuscated method parameter names, they are a filler from Searge
198+
::MethodArgSourceFilter
199+
)
200+
)
192201

193202
// Spigot resolvers have to be last
194203
if (server) {

0 commit comments

Comments
 (0)