Skip to content

Commit e95e515

Browse files
committed
rework some parts of resolving to be more efficient
1 parent 729587e commit e95e515

File tree

3 files changed

+46
-23
lines changed

3 files changed

+46
-23
lines changed

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,4 @@ kotlin.code.style=official
33
group=xyz.wagyourtail.unimined.mapping
44
archives_base_name=unimined-mapping-library
55

6-
version=1.0.0
6+
version=1.0.1

src/commonMain/kotlin/xyz/wagyourtail/unimined/mapping/resolver/MappingResolver.kt

Lines changed: 44 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -6,25 +6,24 @@ import kotlinx.coroutines.sync.withLock
66
import okio.Buffer
77
import okio.BufferedSource
88
import okio.use
9-
import xyz.wagyourtail.commonskt.collection.finalizable.finalizableListOf
9+
import xyz.wagyourtail.commonskt.collection.defaultedMapOf
1010
import xyz.wagyourtail.commonskt.collection.finalizable.finalizableMapOf
1111
import xyz.wagyourtail.commonskt.collection.finalizable.finalizableSetOf
1212
import xyz.wagyourtail.commonskt.properties.FinalizeOnRead
1313
import xyz.wagyourtail.commonskt.properties.LazyMutable
1414
import xyz.wagyourtail.commonskt.utils.associateWithNonNull
15-
import xyz.wagyourtail.commonskt.utils.coroutines.parallelMap
1615
import xyz.wagyourtail.unimined.mapping.EnvType
1716
import xyz.wagyourtail.unimined.mapping.Namespace
1817
import xyz.wagyourtail.unimined.mapping.formats.FormatProvider
1918
import xyz.wagyourtail.unimined.mapping.formats.FormatRegistry
2019
import xyz.wagyourtail.unimined.mapping.formats.umf.UMFWriter
2120
import xyz.wagyourtail.unimined.mapping.formats.zip.ZipFS
21+
import xyz.wagyourtail.unimined.mapping.tree.AbstractMappingTree
2222
import xyz.wagyourtail.unimined.mapping.tree.MemoryMappingTree
2323
import xyz.wagyourtail.unimined.mapping.util.*
2424
import xyz.wagyourtail.unimined.mapping.visitor.MappingVisitor
25-
import xyz.wagyourtail.unimined.mapping.visitor.delegate.DelegateClassVisitor
26-
import xyz.wagyourtail.unimined.mapping.visitor.delegate.NameCopyDelegate
2725
import xyz.wagyourtail.unimined.mapping.visitor.delegate.nsFiltered
26+
import xyz.wagyourtail.unimined.mapping.visitor.fixes.renest
2827
import kotlin.jvm.JvmOverloads
2928
import kotlin.time.measureTime
3029

@@ -42,8 +41,6 @@ abstract class MappingResolver<T : MappingResolver<T>>(val name: String) {
4241
private val _entries = finalizableMapOf<String, MappingEntry>()
4342
val entries: Map<String, MappingEntry> get() = _entries
4443

45-
val afterLoad = finalizableListOf<MemoryMappingTree.() -> Unit>()
46-
4744
lateinit var namespaces: Map<Namespace, Boolean>
4845
private set
4946

@@ -89,7 +86,6 @@ abstract class MappingResolver<T : MappingResolver<T>>(val name: String) {
8986
finalized = true
9087
_entries.finalize()
9188
_entries.values.forEach { it.finalize() }
92-
afterLoad.finalize()
9389
}
9490

9591
fun addDependency(key: String, dependency: MappingEntry) {
@@ -99,11 +95,14 @@ abstract class MappingResolver<T : MappingResolver<T>>(val name: String) {
9995
_entries[key] = dependency
10096
}
10197

102-
abstract fun createForPostProcess(key: String): T
98+
abstract fun createForPostProcess(key: String, process: MemoryMappingTree.() -> Unit): T
10399

104100
@JvmOverloads
105-
fun postProcessDependency(key: String, intern: @Scoped T.() -> Unit, postProcess: MappingEntry.() -> Unit = {}) {
106-
val resolver = createForPostProcess(key)
101+
fun postProcessDependency(key: String,
102+
intern: @Scoped T.() -> Unit,
103+
process: MemoryMappingTree.() -> Unit,
104+
postProcess: MappingEntry.() -> Unit) {
105+
val resolver = createForPostProcess(key, process)
107106
resolver.intern()
108107

109108
addDependency(key, MappingEntry(object : ContentProvider {
@@ -133,10 +132,6 @@ abstract class MappingResolver<T : MappingResolver<T>>(val name: String) {
133132

134133
open suspend fun writeCache(key: String, tree: MemoryMappingTree) {}
135134

136-
open suspend fun afterLoad(tree: MemoryMappingTree) {
137-
afterLoad.forEach { it(tree) }
138-
}
139-
140135
open suspend fun resolve(): MemoryMappingTree {
141136
if (::resolved.isInitialized) return resolved
142137
return resolveLock.withLock {
@@ -201,13 +196,25 @@ abstract class MappingResolver<T : MappingResolver<T>>(val name: String) {
201196
it(acc)
202197
}
203198
try {
199+
val target = if (entry.preProcess.isNotEmpty()) {
200+
MemoryMappingTree()
201+
} else {
202+
visitor
203+
}
204204
entry.provider.read(
205205
entry.content.content(),
206206
resolved,
207-
visitor,
207+
target,
208208
envType,
209209
entry.mapNs.map { it.key.name to it.value.name }.toMap()
210210
)
211+
if (target != visitor) {
212+
target as MemoryMappingTree
213+
for (it in entry.preProcess) {
214+
it(target)
215+
}
216+
target.accept(visitor)
217+
}
211218
} catch (e: Throwable) {
212219
throw IllegalStateException("Error reading $entry", e)
213220
}
@@ -232,12 +239,16 @@ abstract class MappingResolver<T : MappingResolver<T>>(val name: String) {
232239
LOGGER.info { "Propagated in $it" }
233240
}
234241

235-
LOGGER.info { "Post processing..." }
242+
LOGGER.info { "Renesting inner classes..." }
236243

237-
measureTime {
238-
afterLoad(resolved!!)
239-
}.also {
240-
LOGGER.info { "Post processed in $it" }
244+
val renest = defaultedMapOf<Namespace, MutableSet<Namespace>> { mutableSetOf() }
245+
for (entry in sorted) {
246+
renest[entry.requires].addAll(entry.renest)
247+
}
248+
for ((key, value) in renest) {
249+
if (value.isNotEmpty()) {
250+
resolved!!.renest(key, value)
251+
}
241252
}
242253

243254
LOGGER.info { "Re-resolving fields and methods..." }
@@ -336,10 +347,12 @@ abstract class MappingResolver<T : MappingResolver<T>>(val name: String) {
336347
var requires: Namespace by FinalizeOnRead(Namespace("official"))
337348
val provides = finalizableSetOf<Pair<Namespace, Boolean>>()
338349
val mapNs = finalizableMapOf<Namespace, Namespace>()
350+
val renest = finalizableSetOf<Namespace>()
339351

340352
var skip by FinalizeOnRead(false)
341353

342354
val insertInto = finalizableSetOf<(MappingVisitor) -> MappingVisitor>()
355+
val preProcess = finalizableSetOf<(AbstractMappingTree) -> Unit>()
343356

344357
var provider by FinalizeOnRead(LazyMutable {
345358
val format = FormatRegistry.autodetectFormat(envType, content.fileName(), content.content())
@@ -366,6 +379,14 @@ abstract class MappingResolver<T : MappingResolver<T>>(val name: String) {
366379
mapNs.putAll(ns.map { Namespace(it.first) to Namespace(it.second) })
367380
}
368381

382+
fun renest() {
383+
renest.addAll(provides.map { it.first })
384+
}
385+
386+
fun renest(vararg ns: String) {
387+
renest.addAll(ns.map { Namespace(it) })
388+
}
389+
369390
fun combineWith(other: MappingConfig) {
370391
requires = other.requires
371392
provides.addAll(other.provides)
@@ -378,6 +399,9 @@ abstract class MappingResolver<T : MappingResolver<T>>(val name: String) {
378399
requires.name
379400
provides.finalize()
380401
insertInto.finalize()
402+
mapNs.finalize()
403+
renest.finalize()
404+
preProcess.finalize()
381405
}
382406

383407
}

src/commonMain/kotlin/xyz/wagyourtail/unimined/mapping/visitor/fixes/Renester.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,8 @@ fun AbstractMappingTree.renest(srcNs: Namespace, namespaces: Set<Namespace>, fix
4747
fixNest(cls.second(), srcNs, namespace)
4848
}
4949
}
50-
5150
}
5251

5352
fun AbstractMappingTree.renest(srcNs: String, vararg namespaces: String, fixInner: Boolean = true) {
5453
renest(Namespace(srcNs), namespaces.map { Namespace(it) }.toSet(), fixInner)
55-
}
54+
}

0 commit comments

Comments
 (0)