首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >KotlinPoet:如何生成带有参数的DSL

KotlinPoet:如何生成带有参数的DSL
EN

Stack Overflow用户
提问于 2022-07-21 12:23:13
回答 1查看 110关注 0票数 0

我正在尝试生成包含带有参数的DSL的Kotlin代码:

代码语言:javascript
复制
listOf(
    navArgument(QUERY_PARAM) {
        type = NavType.StringType
        nullable = true
        defaultValue = null
    },
)

是否有比手动构建字符串更好的方法来向DSL提供参数?

代码语言:javascript
复制
CodeBlock.builder()
    .addStatement("listOf(")
    .indent()
    .beginControlFlow("%M(${queryParam})", MEMBER_NAME_NAV_ARGUMENT)
    .addStatement([...])
    .endControlFlow()
    .unindent()
    .add(")")
    .build(),
EN

回答 1

Stack Overflow用户

发布于 2022-07-23 19:52:55

KotlinPoet的API主要建模语言结构--类型、函数、属性,对于函数、构造函数的模型体没有太多特殊的API。也就是说,除了格式修饰符之外,CodeBlock中还有一些方法可以帮助减少手工构建的字符串的数量。下面是我想出来的,希望其中的一些能有所帮助:

代码语言:javascript
复制
@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。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73066111

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档