Skip to content

Commit 13f62e3

Browse files
committed
重构代码生成模块,引入多种生成器(语言、框架、项目结构等),添加 ViewModel 桥接器及配置生成器实现,并优化 Gradle 配置与依赖管理。
1 parent 01c8301 commit 13f62e3

18 files changed

+1984
-4
lines changed

build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,4 @@ allprojects {
1919
}
2020
}
2121
}
22-
}
22+
}

composeApp/build.gradle.kts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ kotlin {
3535

3636
@OptIn(org.jetbrains.kotlin.gradle.ExperimentalWasmDsl::class)
3737
wasmJs {
38-
outputModuleName = "composeApp"
38+
//outputModuleName = "composeApp"
3939
useEsModules()
4040
browser {
4141
val projectDirPath = project.projectDir.path
@@ -77,6 +77,10 @@ kotlin {
7777
implementation(libs.kotlin.serialization.json)
7878
}
7979

80+
commonTest.dependencies {
81+
implementation(libs.kotlin.test)
82+
}
83+
8084
wasmJsMain.dependencies {
8185
implementation(project(":common"))
8286
// implementation(project(":jszip-kotlin"))
@@ -98,6 +102,10 @@ kotlin {
98102
// implementation(project(":code-generator"))
99103
// implementation(npm(dir))
100104
}
105+
106+
wasmJsTest.dependencies {
107+
implementation(libs.kotlin.test)
108+
}
101109
}
102110
}
103111

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
package love.forte.simbot.codegen.gen.bridge
2+
3+
import jszip.JSZip
4+
import love.forte.simbot.codegen.gen.GradleProjectViewModel
5+
import love.forte.simbot.codegen.gen.SimbotComponent
6+
import love.forte.simbot.codegen.gen.SimbotComponentWithVersion
7+
import love.forte.simbot.codegen.gen.ComponentVersion
8+
import love.forte.simbot.codegen.gen.core.CodeGenerator
9+
import love.forte.simbot.codegen.gen.core.Framework
10+
import love.forte.simbot.codegen.gen.core.ProgrammingLanguage
11+
import love.forte.simbot.codegen.gen.core.context.ComponentImpl
12+
import love.forte.simbot.codegen.gen.core.context.DependencyImpl
13+
import love.forte.simbot.codegen.gen.core.context.createGenerationContext
14+
import love.forte.simbot.codegen.gen.core.generators.ProjectGeneratorFactory
15+
16+
/**
17+
* 视图模型桥接器。
18+
*
19+
* 将现有的 [GradleProjectViewModel] 与新的代码生成架构桥接起来。
20+
*
21+
* @author ForteScarlet
22+
*/
23+
class ViewModelBridge(
24+
/**
25+
* 项目生成器工厂。
26+
*/
27+
private val generatorFactory: ProjectGeneratorFactory
28+
) {
29+
/**
30+
* 从视图模型生成项目。
31+
*
32+
* @param viewModel 视图模型
33+
* @return 生成的项目的 JSZip 对象
34+
*/
35+
suspend fun generateProject(viewModel: GradleProjectViewModel): JSZip {
36+
// 创建生成上下文
37+
val context = createGenerationContext {
38+
projectName = viewModel.projectName
39+
packageName = viewModel.projectPackage
40+
language = ProgrammingLanguage.Kotlin(viewModel.kotlinVersion)
41+
framework = if (viewModel.withSpring) {
42+
Framework.Spring("3.3.3") // 使用默认版本,后续可以从视图模型中获取
43+
} else {
44+
Framework.Core
45+
}
46+
47+
// 添加组件
48+
components.addAll(viewModel.components.map { componentWithVersion ->
49+
val (component, version) = componentWithVersion
50+
ComponentImpl(
51+
name = component.name,
52+
version = when (version) {
53+
is ComponentVersion.Value -> version.value
54+
else -> "latest" // 使用默认版本
55+
},
56+
simpleId = component.simpleId,
57+
display = component.display,
58+
owner = component.owner,
59+
repo = component.repo,
60+
doc = component.doc,
61+
botConfigDoc = component.botConfigDoc
62+
)
63+
})
64+
65+
// 添加依赖
66+
dependencies.addAll(viewModel.dependencies.map { dependency ->
67+
DependencyImpl(
68+
group = dependency.group,
69+
name = dependency.name,
70+
version = dependency.version?.version ?: "latest",
71+
configurationName = dependency.configName
72+
)
73+
})
74+
}
75+
76+
// 创建生成器
77+
val generator = generatorFactory.createGenerator(context)
78+
79+
// 生成项目
80+
val root = JSZip()
81+
generator.generate(root, context)
82+
83+
return root
84+
}
85+
}
86+
87+
/**
88+
* 将 [SimbotComponent] 转换为 [ComponentImpl]。
89+
*
90+
* @param version 组件版本
91+
* @return 转换后的 [ComponentImpl]
92+
*/
93+
fun SimbotComponent.toComponentImpl(version: String): ComponentImpl {
94+
return ComponentImpl(
95+
name = this.name,
96+
version = version,
97+
simpleId = this.simpleId,
98+
display = this.display,
99+
owner = this.owner,
100+
repo = this.repo,
101+
doc = this.doc,
102+
botConfigDoc = this.botConfigDoc
103+
)
104+
}
105+
106+
/**
107+
* 将 [SimbotComponentWithVersion] 转换为 [ComponentImpl]。
108+
*
109+
* @return 转换后的 [ComponentImpl]
110+
*/
111+
fun SimbotComponentWithVersion.toComponentImpl(): ComponentImpl {
112+
val versionStr = when (val v = this.version) {
113+
is ComponentVersion.Value -> v.value
114+
else -> "latest" // 使用默认版本
115+
}
116+
return this.component.toComponentImpl(versionStr)
117+
}
Lines changed: 196 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,196 @@
1+
package love.forte.simbot.codegen.gen.core
2+
3+
import jszip.JSZip
4+
5+
/**
6+
* 代码生成器的核心接口。
7+
*
8+
* 代码生成器负责生成特定类型的代码,例如项目结构、源代码文件、配置文件等。
9+
* 不同的代码生成器可以组合使用,以生成完整的项目。
10+
*
11+
* @author ForteScarlet
12+
*/
13+
interface CodeGenerator {
14+
/**
15+
* 生成代码并将结果写入指定的 [JSZip] 对象。
16+
*
17+
* @param zip 用于存储生成的文件的 JSZip 对象
18+
* @param context 代码生成的上下文信息
19+
*/
20+
suspend fun generate(zip: JSZip, context: GenerationContext)
21+
}
22+
23+
/**
24+
* 代码生成的上下文信息。
25+
*
26+
* 上下文包含生成代码所需的所有配置和状态信息。
27+
*/
28+
interface GenerationContext {
29+
/**
30+
* 项目名称
31+
*/
32+
val projectName: String
33+
34+
/**
35+
* 项目包名
36+
*/
37+
val packageName: String
38+
39+
/**
40+
* 项目语言
41+
*/
42+
val language: ProgrammingLanguage
43+
44+
/**
45+
* 项目框架
46+
*/
47+
val framework: Framework
48+
49+
/**
50+
* 项目组件
51+
*/
52+
val components: List<Component>
53+
54+
/**
55+
* 项目依赖
56+
*/
57+
val dependencies: List<Dependency>
58+
}
59+
60+
/**
61+
* 编程语言。
62+
*
63+
* 定义了项目使用的编程语言,例如 Kotlin 或 Java。
64+
*/
65+
sealed class ProgrammingLanguage {
66+
/**
67+
* 语言的名称
68+
*/
69+
abstract val name: String
70+
71+
/**
72+
* 语言的文件扩展名
73+
*/
74+
abstract val fileExtension: String
75+
76+
/**
77+
* Kotlin 语言
78+
*/
79+
data class Kotlin(
80+
/**
81+
* Kotlin 版本
82+
*/
83+
val version: String
84+
) : ProgrammingLanguage() {
85+
override val name: String = "Kotlin"
86+
override val fileExtension: String = "kt"
87+
}
88+
89+
/**
90+
* Java 语言
91+
*/
92+
data class Java(
93+
/**
94+
* Java 版本
95+
*/
96+
val version: String,
97+
98+
/**
99+
* API 风格:阻塞式或异步式
100+
*/
101+
val style: JavaStyle
102+
) : ProgrammingLanguage() {
103+
override val name: String = "Java"
104+
override val fileExtension: String = "java"
105+
}
106+
}
107+
108+
/**
109+
* Java API 风格
110+
*/
111+
enum class JavaStyle {
112+
/**
113+
* 阻塞式 API
114+
*/
115+
BLOCKING,
116+
117+
/**
118+
* 异步式 API
119+
*/
120+
ASYNC
121+
}
122+
123+
/**
124+
* 框架。
125+
*
126+
* 定义了项目使用的框架,例如 Spring 或非 Spring。
127+
*/
128+
sealed class Framework {
129+
/**
130+
* 框架的名称
131+
*/
132+
abstract val name: String
133+
134+
/**
135+
* Spring 框架
136+
*/
137+
data class Spring(
138+
/**
139+
* Spring Boot 版本
140+
*/
141+
val version: String
142+
) : Framework() {
143+
override val name: String = "Spring"
144+
}
145+
146+
/**
147+
* 非 Spring 框架(核心库)
148+
*/
149+
data object Core : Framework() {
150+
override val name: String = "Core"
151+
}
152+
}
153+
154+
/**
155+
* 组件。
156+
*
157+
* 定义了项目使用的 Simbot 组件,例如 QQ、KOOK 等。
158+
*/
159+
interface Component {
160+
/**
161+
* 组件的名称
162+
*/
163+
val name: String
164+
165+
/**
166+
* 组件的版本
167+
*/
168+
val version: String
169+
}
170+
171+
/**
172+
* 依赖。
173+
*
174+
* 定义了项目的依赖,例如库、框架等。
175+
*/
176+
interface Dependency {
177+
/**
178+
* 依赖的组 ID
179+
*/
180+
val group: String
181+
182+
/**
183+
* 依赖的名称
184+
*/
185+
val name: String
186+
187+
/**
188+
* 依赖的版本
189+
*/
190+
val version: String
191+
192+
/**
193+
* 依赖的配置名称,例如 implementation、api 等
194+
*/
195+
val configurationName: String
196+
}

0 commit comments

Comments
 (0)