[Editor] Add support for generating asset index classes
This commit is contained in:
@@ -0,0 +1,97 @@
|
|||||||
|
package com.bartlomiejpluta.base.editor.code.build.generator
|
||||||
|
|
||||||
|
import com.bartlomiejpluta.base.editor.asset.model.Asset
|
||||||
|
import com.bartlomiejpluta.base.editor.project.context.ProjectContext
|
||||||
|
import com.bartlomiejpluta.base.editor.project.model.Project
|
||||||
|
import com.squareup.javapoet.*
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired
|
||||||
|
import org.springframework.stereotype.Component
|
||||||
|
import javax.lang.model.element.Modifier
|
||||||
|
|
||||||
|
@Component
|
||||||
|
class AssetMapCodeGenerator : CodeGenerator {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private lateinit var projectContext: ProjectContext
|
||||||
|
|
||||||
|
override fun generate() {
|
||||||
|
projectContext.project?.let(::generateAssetClasses)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun generateAssetClasses(project: Project) {
|
||||||
|
listOf(
|
||||||
|
generateAssetClass("maps", project.maps),
|
||||||
|
generateAssetClass("tilesets", project.tileSets),
|
||||||
|
generateAssetClass("entsets", project.entitySets),
|
||||||
|
generateAssetClass("images", project.images),
|
||||||
|
generateAssetClass("animations", project.animations),
|
||||||
|
generateAssetClass("fonts", project.fonts),
|
||||||
|
generateAssetClass("widgets", project.widgets),
|
||||||
|
generateAssetClass("sounds", project.sounds)
|
||||||
|
).forEach {
|
||||||
|
JavaFile
|
||||||
|
.builder("A", it)
|
||||||
|
.build()
|
||||||
|
.writeTo(project.buildGeneratedCodeDirectory)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun generateAssetClass(name: String, assets: List<Asset>): TypeSpec {
|
||||||
|
val className = ClassName.get("A", name)
|
||||||
|
return TypeSpec
|
||||||
|
.classBuilder(className)
|
||||||
|
.addModifiers(Modifier.PUBLIC, Modifier.FINAL)
|
||||||
|
.addField(
|
||||||
|
FieldSpec.builder(ParameterizedTypeName.get(
|
||||||
|
ClassName.get(java.util.Map::class.java),
|
||||||
|
ClassName.get(String::class.java),
|
||||||
|
className
|
||||||
|
), "_map", Modifier.PRIVATE, Modifier.STATIC, Modifier.FINAL)
|
||||||
|
.initializer("new \$T<>()", java.util.HashMap::class.java)
|
||||||
|
.build()
|
||||||
|
)
|
||||||
|
.addStaticBlock(CodeBlock.builder()
|
||||||
|
.apply {
|
||||||
|
assets.forEach {
|
||||||
|
addStatement("_map.put(\"${it.name}\", ${getAssetName(it)})")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.build()
|
||||||
|
)
|
||||||
|
.addField(String::class.java, "uid", Modifier.PUBLIC, Modifier.FINAL)
|
||||||
|
.addMethod(
|
||||||
|
MethodSpec
|
||||||
|
.constructorBuilder()
|
||||||
|
.addModifiers(Modifier.PRIVATE)
|
||||||
|
.addParameter(TypeName.get(String::class.java), "uid")
|
||||||
|
.addStatement("this.uid = uid")
|
||||||
|
.build()
|
||||||
|
)
|
||||||
|
.addMethod(
|
||||||
|
MethodSpec
|
||||||
|
.methodBuilder("get")
|
||||||
|
.addModifiers(Modifier.PUBLIC, Modifier.FINAL, Modifier.STATIC)
|
||||||
|
.returns(className)
|
||||||
|
.addParameter(TypeName.get(String::class.java), "name")
|
||||||
|
.addStatement("return _map.get(name)")
|
||||||
|
.build()
|
||||||
|
)
|
||||||
|
.apply {
|
||||||
|
assets.forEach {
|
||||||
|
addField(
|
||||||
|
FieldSpec
|
||||||
|
.builder(className, getAssetName(it), Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL)
|
||||||
|
.initializer("new ${className}(\"\$L\")", it.uid)
|
||||||
|
.build()
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.build()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getAssetName(asset: Asset) = asset.name
|
||||||
|
.split("\\s+".toRegex())
|
||||||
|
.joinToString("_") { it.lowercase() }
|
||||||
|
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user