Skip to content

Commit 7d33aa5

Browse files
committed
Align project with swift implementation
1 parent ecf3acb commit 7d33aa5

File tree

13 files changed

+172
-160
lines changed

13 files changed

+172
-160
lines changed

src/main/kotlin/com/tomwyr/Command.kt

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.tomwyr
2+
3+
import com.tomwyr.common.Log
4+
import com.tomwyr.generator.NodeTreeGenerator
5+
import com.tomwyr.utils.GodotKotlinProject
6+
import org.gradle.api.Project
7+
8+
class GenerateTreeCommand {
9+
fun run(project: Project, config: GodotNodeTreeConfig) {
10+
val projectPath = project.projectDir.absolutePath
11+
val godotProject = GodotKotlinProject.create(projectPath, config)
12+
val treeInfo = NodeTreeGenerator().generate(godotProject)
13+
Log.nodeTreeGenerated(treeInfo)
14+
}
15+
}

src/main/kotlin/com/tomwyr/Generate.kt

Lines changed: 0 additions & 37 deletions
This file was deleted.

src/main/kotlin/com/tomwyr/Plugin.kt

Lines changed: 21 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,39 @@
11
package com.tomwyr
22

3-
import com.tomwyr.core.Log
4-
import com.tomwyr.core.Logger
3+
import com.tomwyr.common.Log
4+
import com.tomwyr.common.Logger
55
import org.gradle.api.Plugin
66
import org.gradle.api.Project
77
import org.jetbrains.kotlin.gradle.dsl.KotlinJvmProjectExtension
88

99
class GodotNodeTree : Plugin<Project> {
1010
override fun apply(project: Project) {
1111
initLog(project)
12-
configure(project)
12+
registerTask(project)
1313
addSourceSet(project)
1414
}
15-
}
1615

17-
open class GodotNodeTreeConfig(
18-
var projectPath: String? = null,
19-
var packageName: String? = null,
20-
)
21-
22-
private fun initLog(project: Project) {
23-
val logger = project.logger
24-
Log.logger = object : Logger {
25-
override fun debug(message: String) = logger.debug(message)
26-
override fun info(message: String) = logger.info(message)
27-
override fun warn(message: String) = logger.warn(message)
16+
private fun initLog(project: Project) {
17+
Log.logger = Logger.stdOut(project)
2818
}
29-
}
3019

31-
private fun configure(project: Project) {
32-
val config = project.extensions.create("godotNodeTree", GodotNodeTreeConfig::class.java)
33-
project.tasks.register("generateNodeTree") { task ->
34-
task.doLast {
35-
generate(project, config)
20+
private fun registerTask(project: Project) {
21+
val config = project.extensions.create("godotNodeTree", GodotNodeTreeConfig::class.java)
22+
project.tasks.register("generateNodeTree") { task ->
23+
task.doLast {
24+
GenerateTreeCommand().run(project, config)
25+
}
3626
}
3727
}
38-
}
3928

40-
private fun addSourceSet(project: Project) {
41-
val pluginExt = project.extensions.findByType(KotlinJvmProjectExtension::class.java)
42-
val sourceSet = pluginExt?.sourceSets?.getByName("main")?.kotlin
43-
sourceSet?.srcDirs("build/generated/godotNodeTree/kotlin")
29+
private fun addSourceSet(project: Project) {
30+
val pluginExt = project.extensions.findByType(KotlinJvmProjectExtension::class.java)
31+
val sourceSet = pluginExt?.sourceSets?.getByName("main")?.kotlin
32+
sourceSet?.srcDirs("build/generated/godotNodeTree/kotlin")
33+
}
4434
}
35+
36+
open class GodotNodeTreeConfig(
37+
var projectPath: String? = null,
38+
var packageName: String? = null,
39+
)
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.tomwyr.common
2+
3+
import com.tomwyr.generator.NodeParams
4+
5+
sealed class GeneratorException(message: String) : Exception(message)
6+
7+
class InvalidGodotProject :
8+
GeneratorException("The project in which GodotNodeTree annotation was used isn't a valid Godot project directory")
9+
10+
class UnexpectedNodeParameters(nodeParams: NodeParams) :
11+
GeneratorException("A node with unexpected set of parameters encountered: $nodeParams")
12+
13+
class UnexpectedSceneResource(instance: String) :
14+
GeneratorException("A node pointing to an unknown scene resource encountered with id: $instance")
15+
16+
class ParentNodeNotFound(sceneName: String) :
17+
GeneratorException("None of the parsed nodes was identified as the parent node of scene $sceneName")

src/main/kotlin/com/tomwyr/core/Log.kt renamed to src/main/kotlin/com/tomwyr/common/Log.kt

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,9 @@
1-
package com.tomwyr.core
1+
package com.tomwyr.common
22

3-
import com.tomwyr.utils.SceneData
4-
5-
interface Logger {
6-
fun debug(message: String)
7-
fun info(message: String)
8-
fun warn(message: String)
9-
}
3+
import org.gradle.api.Project
104

115
object Log : ProcessorLog, ParserLog, RendererLog, GeneratorLog, Logger {
12-
lateinit var logger: Logger
6+
var logger: Logger = Logger.noop()
137

148
override fun debug(message: String) = logger.debug(message)
159
override fun info(message: String) = logger.info(message)
@@ -121,3 +115,23 @@ interface GeneratorLog : Logger {
121115
info("Output file saved")
122116
}
123117
}
118+
119+
interface Logger {
120+
fun debug(message: String)
121+
fun info(message: String)
122+
fun warn(message: String)
123+
124+
companion object {
125+
fun noop() = object : Logger {
126+
override fun debug(message: String) {}
127+
override fun info(message: String) {}
128+
override fun warn(message: String) {}
129+
}
130+
131+
fun stdOut(project: Project) = object : Logger {
132+
override fun debug(message: String) = project.logger.debug(message)
133+
override fun info(message: String) = project.logger.info(message)
134+
override fun warn(message: String) = project.logger.warn(message)
135+
}
136+
}
137+
}

src/main/kotlin/com/tomwyr/core/Models.kt renamed to src/main/kotlin/com/tomwyr/common/Models.kt

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
1-
package com.tomwyr.core
1+
package com.tomwyr.common
22

33
import kotlin.math.max
44

5-
data class Scene(
6-
val name: String,
7-
val root: Node,
8-
) {
5+
class SceneData(val name: String, val content: String)
6+
7+
data class Scene(val name: String, val root: Node) {
98
val nodesCount: Int = root.flatten().size
109
val nodesDepth: Int = root.longestPath().size
1110
}

src/main/kotlin/com/tomwyr/core/Exceptions.kt

Lines changed: 0 additions & 15 deletions
This file was deleted.

src/main/kotlin/com/tomwyr/generator/Generator.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
package com.tomwyr.generator
22

3+
import com.tomwyr.common.Log
4+
import com.tomwyr.common.NodeTreeInfo
5+
import com.tomwyr.common.Scene
36
import com.tomwyr.utils.GodotKotlinProject
4-
import com.tomwyr.core.Log
5-
import com.tomwyr.core.NodeTreeInfo
6-
import com.tomwyr.core.Scene
77

88
class NodeTreeGenerator(
99
private val parser: SceneNodesParser = SceneNodesParser(),
@@ -16,7 +16,7 @@ class NodeTreeGenerator(
1616

1717
val scenes = scenesData.map { data ->
1818
Log.parsingScene(data)
19-
val root = parser.parse(data.content)
19+
val root = parser.parse(data)
2020
Scene(data.name, root)
2121
}.toList()
2222

src/main/kotlin/com/tomwyr/generator/Parser.kt

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,19 @@
11
package com.tomwyr.generator
22

3-
import com.tomwyr.core.*
3+
import com.tomwyr.common.*
44
import com.tomwyr.utils.capitalize
55

66
class SceneNodesParser {
7-
fun parse(sceneFileContent: String): Node {
8-
val scenePathsById = ScenesParser().parse(sceneFileContent)
9-
return NodesParser(scenePathsById).parse(sceneFileContent)
7+
fun parse(sceneData: SceneData): Node {
8+
val scenePathsById = ScenesParser().parse(sceneData)
9+
return NodesParser(scenePathsById).parse(sceneData)
1010
}
1111
}
1212

1313
private class ScenesParser {
14-
fun parse(sceneFileContent: String): Map<String, String> {
14+
fun parse(sceneData: SceneData): Map<String, String> {
1515
Log.parsingScenePaths()
16-
return splitToEntries(sceneFileContent, "ext_resource")
16+
return splitToEntries(sceneData.content, "ext_resource")
1717
.map(::parseEntryParams)
1818
.mapNotNull(::extractSceneIdToPath)
1919
.let(::getScenePathsById)
@@ -45,12 +45,12 @@ private class ScenesParser {
4545
}
4646

4747
private class NodesParser(val scenePathsById: Map<String, String>) {
48-
fun parse(sceneFileContent: String): Node {
48+
fun parse(sceneData: SceneData): Node {
4949
Log.parsingSceneNodes()
50-
return splitToEntries(sceneFileContent, "node")
50+
return splitToEntries(sceneData.content, "node")
5151
.map(::parseEntryParams)
5252
.mapNotNull(::extractNodeParams)
53-
.let(::createRootNode)
53+
.let { createRootNode(sceneData.name, it) }
5454
}
5555

5656

@@ -68,10 +68,10 @@ private class NodesParser(val scenePathsById: Map<String, String>) {
6868
return NodeParams(name = name, type = type, instance = instance, parent = parent)
6969
}
7070

71-
private fun createRootNode(params: List<NodeParams>): Node {
71+
private fun createRootNode(sceneName: String, params: List<NodeParams>): Node {
7272
Log.creatingRootNode()
7373
val childrenByParent = params.groupBy { it.parent }
74-
val rootParams = params.single { it.parent == null }
74+
val rootParams = params.firstOrNull { it.parent == null } ?: throw ParentNodeNotFound(sceneName)
7575
return rootParams.toNode(childrenByParent, scenePathsById)
7676
}
7777
}

src/main/kotlin/com/tomwyr/generator/Renderer.kt

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,29 @@
11
package com.tomwyr.generator
22

3-
import com.tomwyr.core.*
3+
import com.tomwyr.common.*
44
import com.tomwyr.utils.capitalize
55

6-
76
class NodeTreeRenderer {
87
fun render(packageName: String?, scenes: List<Scene>): String {
9-
val `package` = packageName?.let { "package $it" }
10-
val imports = renderImports()
8+
val header = renderHeader(packageName)
119
val nodeTree = renderNodeTree(scenes)
1210
val sceneNodes = scenes.map { renderScene(it) }.joinLines(spacing = 2)
13-
val nodeRef = renderNodeRef()
11+
val types = renderTypes()
1412

15-
return listOfNotNull(`package`, imports, nodeTree, sceneNodes, nodeRef)
13+
return listOfNotNull(header, nodeTree, sceneNodes, types)
1614
.joinLines(spacing = 2).plus("\n")
1715
}
1816

19-
private fun renderImports(): String {
17+
private fun renderHeader(packageName: String?): String {
18+
val packageOrEmpty = packageName?.let { "package $it" } ?: ""
19+
2020
return """
21+
|$packageOrEmpty
22+
|
2123
|import godot.*
2224
|import godot.core.NodePath
2325
|import kotlin.reflect.KProperty
24-
""".trimMargin()
26+
""".trimMargin().trim()
2527
}
2628

2729
private fun renderNodeTree(scenes: List<Scene>): String {
@@ -100,7 +102,7 @@ class NodeTreeRenderer {
100102
}
101103
}
102104

103-
private fun renderNodeRef(): String {
105+
private fun renderTypes(): String {
104106
return """
105107
|open class NodeRef<T : Node>(
106108
| private val path: String,
@@ -123,4 +125,4 @@ class NodeTreeRenderer {
123125

124126
private fun Iterable<String>.joinLines(spacing: Int = 1): String = joinToString("\n".repeat(spacing))
125127

126-
private fun String.indentLine(times: Int = 1) = lineSequence().joinToString("\n" + " ".repeat(times))
128+
private fun String.indentLine(times: Int = 1): String = lineSequence().joinToString("\n" + " ".repeat(times))

0 commit comments

Comments
 (0)