Skip to content

Commit e49dc99

Browse files
committed
feat(generator-accessor-plugin): namespace configuration
1 parent 9619f55 commit e49dc99

File tree

6 files changed

+107
-30
lines changed

6 files changed

+107
-30
lines changed

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

+21-5
Original file line numberDiff line numberDiff line change
@@ -98,9 +98,16 @@ abstract class AccessorGeneratorExtension(protected val project: Project, protec
9898
abstract val accessorType: Property<AccessorType>
9999

100100
/**
101-
* Namespaces that should be used in accessors, empty if all namespaces should be used.
101+
* Namespaces that should be used in accessors, defaults to all supported namespaces ("mojang", "spigot", "yarn", "quilt", "searge", "intermediary" and "hashed").
102102
*/
103-
abstract val accessedNamespaces: ListProperty<String>
103+
abstract val namespaces: ListProperty<String>
104+
105+
/**
106+
* Alias for [namespaces].
107+
*/
108+
@Deprecated("Use namespaces.", ReplaceWith("namespaces"))
109+
val accessedNamespaces: ListProperty<String>
110+
get() = namespaces
104111

105112
/**
106113
* Namespaces that should be used for computing history, defaults to "mojang", "spigot", "searge" and "intermediary".
@@ -127,6 +134,7 @@ abstract class AccessorGeneratorExtension(protected val project: Project, protec
127134
cacheDirectory.convention(project.layout.buildDirectory.dir("takenaka/cache"))
128135
codeLanguage.convention(CodeLanguage.JAVA)
129136
accessorType.convention(AccessorType.NONE)
137+
namespaces.convention(listOf("mojang", "spigot", "yarn", "quilt", "searge", "intermediary", "hashed"))
130138
historyNamespaces.convention(listOf("mojang", "spigot", "searge", "intermediary"))
131139
historyIndexNamespace.convention(DEFAULT_INDEX_NS)
132140
relaxedCache.convention(true)
@@ -261,12 +269,20 @@ abstract class AccessorGeneratorExtension(protected val project: Project, protec
261269
}
262270

263271
/**
264-
* Adds new namespaces to the [accessedNamespaces] property.
272+
* Adds new namespaces to the [namespaces] property.
265273
*
266-
* @param accessedNamespaces the namespaces
274+
* @param namespaces the namespaces
275+
*/
276+
fun namespaces(vararg namespaces: String) {
277+
this.namespaces.addAll(*namespaces)
278+
}
279+
280+
/**
281+
* Alias for [namespaces].
267282
*/
283+
@Deprecated("Use namespaces(vararg String).", ReplaceWith("namespaces(*accessedNamespaces)"))
268284
fun accessedNamespaces(vararg accessedNamespaces: String) {
269-
this.accessedNamespaces.addAll(*accessedNamespaces)
285+
this.namespaces(*accessedNamespaces)
270286
}
271287

272288
/**

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

+3-2
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ class AccessorGeneratorPlugin : Plugin<Project> {
6060

6161
this.cacheDir.set(config.cacheDirectory)
6262
this.versions.set(config.versions)
63+
this.namespaces.set(project.provider { config.namespaces.get() + config.historyNamespaces.get() })
6364
this.relaxedCache.set(config.relaxedCache)
6465
this.manifest.set(manifest)
6566
this.mappingBundle.fileProvider(mappingBundle.flatMap { mb ->
@@ -84,7 +85,7 @@ class AccessorGeneratorPlugin : Plugin<Project> {
8485
this.accessors.set(config.accessors)
8586
this.codeLanguage.set(config.codeLanguage)
8687
this.accessorType.set(config.accessorType)
87-
this.accessedNamespaces.set(config.accessedNamespaces)
88+
this.namespaces.set(config.namespaces)
8889
this.historyNamespaces.set(config.historyNamespaces)
8990
this.historyIndexNamespace.set(config.historyIndexNamespace)
9091
this.namingStrategy.set(config.namingStrategy)
@@ -100,7 +101,7 @@ class AccessorGeneratorPlugin : Plugin<Project> {
100101
this.accessors.set(config.accessors)
101102
this.codeLanguage.set(config.codeLanguage)
102103
this.accessorType.set(config.accessorType)
103-
this.accessedNamespaces.set(config.accessedNamespaces)
104+
this.namespaces.set(config.namespaces)
104105
this.historyNamespaces.set(config.historyNamespaces)
105106
this.historyIndexNamespace.set(config.historyIndexNamespace)
106107
this.namingStrategy.set(config.namingStrategy)

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ abstract class GenerateAccessorsTask : GenerationTask() {
4141
codeLanguage = codeLanguage.get(),
4242
accessorType = accessorType.get(),
4343
namespaceFriendlinessIndex = namespaceFriendlinessIndex.get(),
44-
accessedNamespaces = accessedNamespaces.get(),
44+
accessedNamespaces = namespaces.get(),
4545
craftBukkitVersionReplaceCandidates = craftBukkitVersionReplaceCandidates.get(),
4646
namingStrategy = namingStrategy.get(),
4747
runtimePackage = runtimePackage.get()

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

+12-3
Original file line numberDiff line numberDiff line change
@@ -103,12 +103,20 @@ abstract class GenerationTask : DefaultTask() {
103103
abstract val accessorType: Property<AccessorType>
104104

105105
/**
106-
* Namespaces that should be used in accessors, empty if all namespaces should be used.
106+
* Namespaces that should be used in accessors, defaults to all supported namespaces ("mojang", "spigot", "yarn", "quilt", "searge", "intermediary" and "hashed").
107107
*
108-
* @see me.kcra.takenaka.generator.accessor.plugin.AccessorGeneratorExtension.accessedNamespaces
108+
* @see me.kcra.takenaka.generator.accessor.plugin.AccessorGeneratorExtension.namespaces
109109
*/
110110
@get:Input
111-
abstract val accessedNamespaces: ListProperty<String>
111+
abstract val namespaces: ListProperty<String>
112+
113+
/**
114+
* Alias for [namespaces].
115+
*/
116+
@get:Internal
117+
@Deprecated("Use namespaces.", ReplaceWith("namespaces"))
118+
val accessedNamespaces: ListProperty<String>
119+
get() = namespaces
112120

113121
/**
114122
* Namespaces that should have [me.kcra.takenaka.core.mapping.adapter.replaceCraftBukkitNMSVersion] applied
@@ -163,6 +171,7 @@ abstract class GenerationTask : DefaultTask() {
163171
codeLanguage.convention(CodeLanguage.JAVA)
164172
accessorType.convention(AccessorType.NONE)
165173
craftBukkitVersionReplaceCandidates.convention(listOf("spigot"))
174+
namespaces.convention(listOf("mojang", "spigot", "yarn", "quilt", "searge", "intermediary", "hashed"))
166175
historyNamespaces.convention(listOf("mojang", "spigot", "searge", "intermediary"))
167176
historyIndexNamespace.convention(DEFAULT_INDEX_NS)
168177
@Suppress("DEPRECATION")

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

+69-18
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,14 @@ import kotlinx.coroutines.runBlocking
2222
import me.kcra.takenaka.core.Version
2323
import me.kcra.takenaka.core.VersionManifest
2424
import me.kcra.takenaka.core.compositeWorkspace
25+
import me.kcra.takenaka.core.mapping.MappingContributor
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
2829
import me.kcra.takenaka.core.mapping.resolve.impl.*
30+
import me.kcra.takenaka.core.util.md5Digest
2931
import me.kcra.takenaka.core.util.objectMapper
32+
import me.kcra.takenaka.core.util.updateAndHex
3033
import me.kcra.takenaka.generator.accessor.plugin.PlatformTristate
3134
import me.kcra.takenaka.generator.common.provider.impl.BundledMappingProvider
3235
import me.kcra.takenaka.generator.common.provider.impl.ResolvingMappingProvider
@@ -35,6 +38,7 @@ import net.fabricmc.mappingio.tree.MappingTree
3538
import org.gradle.api.DefaultTask
3639
import org.gradle.api.file.DirectoryProperty
3740
import org.gradle.api.file.RegularFileProperty
41+
import org.gradle.api.provider.ListProperty
3842
import org.gradle.api.provider.MapProperty
3943
import org.gradle.api.provider.Property
4044
import org.gradle.api.provider.SetProperty
@@ -85,6 +89,17 @@ abstract class ResolveMappingsTask : DefaultTask() {
8589
@get:Input
8690
abstract val versions: SetProperty<String>
8791

92+
/**
93+
* Namespaces to be resolved, defaults to all supported namespaces ("mojang", "spigot", "yarn", "quilt", "searge", "intermediary" and "hashed").
94+
*
95+
* *This is ignored if a [mappingBundle] is specified.*
96+
*
97+
* @see me.kcra.takenaka.generator.accessor.plugin.AccessorGeneratorExtension.namespaces
98+
* @see me.kcra.takenaka.generator.accessor.plugin.AccessorGeneratorExtension.historyNamespaces
99+
*/
100+
@get:Input
101+
abstract val namespaces: ListProperty<String>
102+
88103
/**
89104
* Whether output cache verification constraints should be relaxed, defaults to true.
90105
*
@@ -144,6 +159,7 @@ abstract class ResolveMappingsTask : DefaultTask() {
144159
}
145160

146161
init {
162+
namespaces.convention(listOf("mojang", "spigot", "yarn", "quilt", "searge", "intermediary", "hashed"))
147163
cacheDir.convention(project.layout.buildDirectory.dir("takenaka/cache"))
148164
relaxedCache.convention(true)
149165
platform.convention(PlatformTristate.SERVER)
@@ -185,6 +201,12 @@ abstract class ResolveMappingsTask : DefaultTask() {
185201

186202
val requiredPlatform = platform.get()
187203
val requiredVersions = versions.get().toList()
204+
205+
val requiredNamespaces = namespaces.get().toSet()
206+
fun <T : MappingContributor> MutableCollection<T>.addIfSupported(contributor: T) {
207+
if (contributor.targetNamespace in requiredNamespaces) add(contributor)
208+
}
209+
188210
val resolvedMappings = runBlocking {
189211
// resolve mappings on this system, if a bundle is not available
190212
if (mappingBundle.isPresent) {
@@ -217,49 +239,78 @@ abstract class ResolveMappingsTask : DefaultTask() {
217239

218240
buildList {
219241
if (requiredPlatform.wantsServer) {
220-
add(VanillaServerMappingContributor(versionWorkspace, mojangProvider, relaxedCache.get()))
221-
add(MojangServerMappingResolver(versionWorkspace, mojangProvider))
242+
add(
243+
VanillaServerMappingContributor(
244+
versionWorkspace,
245+
mojangProvider,
246+
relaxedCache.get()
247+
)
248+
)
249+
addIfSupported(MojangServerMappingResolver(versionWorkspace, mojangProvider))
222250
}
223251
if (requiredPlatform.wantsClient) {
224-
add(VanillaClientMappingContributor(versionWorkspace, mojangProvider, relaxedCache.get()))
225-
add(MojangClientMappingResolver(versionWorkspace, mojangProvider))
252+
add(
253+
VanillaClientMappingContributor(
254+
versionWorkspace,
255+
mojangProvider,
256+
relaxedCache.get()
257+
)
258+
)
259+
addIfSupported(MojangClientMappingResolver(versionWorkspace, mojangProvider))
226260
}
227261

228-
add(IntermediaryMappingResolver(versionWorkspace, sharedCacheWorkspace))
229-
add(HashedMappingResolver(versionWorkspace))
230-
add(YarnMappingResolver(versionWorkspace, yarnProvider, relaxedCache.get()))
231-
add(QuiltMappingResolver(versionWorkspace, quiltProvider, relaxedCache.get()))
232-
add(SeargeMappingResolver(versionWorkspace, sharedCacheWorkspace, relaxedCache = relaxedCache.get()))
262+
addIfSupported(IntermediaryMappingResolver(versionWorkspace, sharedCacheWorkspace))
263+
addIfSupported(HashedMappingResolver(versionWorkspace))
264+
addIfSupported(YarnMappingResolver(versionWorkspace, yarnProvider, relaxedCache.get()))
265+
addIfSupported(QuiltMappingResolver(versionWorkspace, quiltProvider, relaxedCache.get()))
266+
addIfSupported(
267+
SeargeMappingResolver(
268+
versionWorkspace,
269+
sharedCacheWorkspace,
270+
relaxedCache = relaxedCache.get()
271+
)
272+
)
233273

234274
// Spigot resolvers have to be last
235275
if (requiredPlatform.wantsServer) {
236276
val link = LegacySpigotMappingPrepender.Link()
237277

238-
add(
278+
addIfSupported(
239279
// 1.16.5 mappings have been republished with proper packages, even though the reobfuscated JAR does not have those
240280
// See: https://hub.spigotmc.org/stash/projects/SPIGOT/repos/builddata/commits/80d35549ec67b87a0cdf0d897abbe826ba34ac27
241281
link.createPrependingContributor(
242-
SpigotClassMappingResolver(versionWorkspace, xmlMapper, spigotProvider, relaxedCache.get()),
282+
SpigotClassMappingResolver(
283+
versionWorkspace,
284+
xmlMapper,
285+
spigotProvider,
286+
relaxedCache.get()
287+
),
243288
prependEverything = versionWorkspace.version.id == "1.16.5"
244289
)
245290
)
246-
add(link.createPrependingContributor(SpigotMemberMappingResolver(versionWorkspace, xmlMapper, spigotProvider, relaxedCache.get())))
291+
addIfSupported(
292+
link.createPrependingContributor(
293+
SpigotMemberMappingResolver(
294+
versionWorkspace,
295+
xmlMapper,
296+
spigotProvider,
297+
relaxedCache.get()
298+
)
299+
)
300+
)
247301
}
248302
}
249303
}
250304

251305
joinedOutputPath { workspace ->
252-
val fileName = when (requiredPlatform) {
253-
PlatformTristate.CLIENT_SERVER -> "client+server.tiny"
254-
PlatformTristate.CLIENT -> "client.tiny"
255-
else -> "server.tiny"
256-
}
306+
val hash = md5Digest.updateAndHex(requiredNamespaces.sorted().joinToString(","))
257307

258-
workspace[fileName]
308+
workspace["$hash.$requiredPlatform.tiny"]
259309
}
260310
}
261311

262312
val analyzer = MappingAnalyzerImpl(
313+
// if the namespaces are missing, nothing happens anyway - no need to configure based on resolvedNamespaces
263314
AnalysisOptions(
264315
innerClassNameCompletionCandidates = setOf("spigot"),
265316
inheritanceAdditionalNamespaces = setOf("searge") // mojang could be here too for maximal parity, but that's in exchange for a little bit of performance

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ abstract class TraceAccessorsTask : GenerationTask() {
6464
codeLanguage = codeLanguage.get(),
6565
accessorType = accessorType.get(),
6666
namespaceFriendlinessIndex = namespaceFriendlinessIndex.get(),
67-
accessedNamespaces = accessedNamespaces.get(),
67+
accessedNamespaces = namespaces.get(),
6868
craftBukkitVersionReplaceCandidates = craftBukkitVersionReplaceCandidates.get(),
6969
namingStrategy = namingStrategy.get(),
7070
runtimePackage = runtimePackage.get()

0 commit comments

Comments
 (0)