我正在尝试生成包含带有参数的DSL的Kotlin代码:
listOf(
navArgument(QUERY_PARAM) {
type = NavType.StringType
nullable = true
defaultValue = null
},
)是否有比手动构建字符串更好的方法来向DSL提供参数?
CodeBlock.builder()
.addStatement("listOf(")
.indent()
.beginControlFlow("%M(${queryParam})", MEMBER_NAME_NAV_ARGUMENT)
.addStatement([...])
.endControlFlow()
.unindent()
.add(")")
.build(),发布于 2022-07-23 19:52:55
KotlinPoet的API主要建模语言结构--类型、函数、属性,对于函数、构造函数的模型体没有太多特殊的API。也就是说,除了格式修饰符之外,CodeBlock中还有一些方法可以帮助减少手工构建的字符串的数量。下面是我想出来的,希望其中的一些能有所帮助:
@Test fun dsl() {
val queryParam = "QUERY_PARAM"
val navArgument = MemberName(packageName = "", simpleName = "navArgument")
val stringType = ClassName(packageName = "", simpleNames = listOf("NavType", "StringType"))
val navArgumentConfiguration = listOf(
CodeBlock.of("type = %T", stringType),
CodeBlock.of("nullable = %L", true),
Companion.of("defaultValue = %L", null),
)
val navArgumentCall = CodeBlock.builder()
.beginControlFlow("%M(%L)", navArgument, queryParam)
.add(navArgumentConfiguration.joinToCode(separator = "\n", suffix = "\n"))
.endControlFlow()
.build()
.trim()
val navArgumentCalls = listOf(navArgumentCall)
.joinToCode(prefix = "listOf(⇥\n", separator = ",\n", suffix = ",⇤\n)")
assertThat(navArgumentCalls.toString()).isEqualTo(
"""
listOf(
navArgument(QUERY_PARAM) {
type = NavType.StringType
nullable = true
defaultValue = null
}
,
)
""".trimIndent()
)
}注意这个悬空的, --这似乎是我刚归档的一个bug。
https://stackoverflow.com/questions/73066111
复制相似问题