Kotlinpoet:从生成的类型和属性中省略冗余的“public”修饰符

m_k*_*kis 6 code-generation kotlin kotlinpoet

有什么方法可以省略public通过 KotlinPoetTypeSpec.BuilderPropertySpec.Builder分别生成的类型和属性中的冗余修饰符吗?

m_k*_*kis 6

叶戈尔上面的答案是正确的。在 KotlinPoet 中无法省略多余的public修饰符,这是有充分理由的。

然而,所有这些(对我来说是不必要的)警告都让我心烦意乱,我必须找到一些方法来摆脱它们。我最终想到的是将它们抑制在 KotlinPoet 生成的文件中。

这是一个扩展,使FileSpec.Builder您能够抑制特定生成文件的警告。

internal fun FileSpec.Builder.suppressWarningTypes(vararg types: String) {
    if (types.isEmpty()) {
        return
    }

    val format = "%S,".repeat(types.count()).trimEnd(',')
    addAnnotation(
        AnnotationSpec.builder(ClassName("", "Suppress"))
            .addMember(format, *types)
            .build()
    )
}
Run Code Online (Sandbox Code Playgroud)

下面是如何使用它来消除生成文件中冗余可见性修饰符警告的示例:

val fileBuilder = FileSpec.builder(myPackageName, myClassName)
fileBuilder.suppressWarningTypes("RedundantVisibilityModifier")
Run Code Online (Sandbox Code Playgroud)

该扩展还支持抑制多种警告类型:

fileBuilder.suppressWarningTypes("RedundantVisibilityModifier", "USELESS_CAST")
Run Code Online (Sandbox Code Playgroud)

请注意,我绝不建议您消除生成代码中所有困扰您的警告!请谨慎使用此代码!


Ego*_*gor 0

不,也没有计划支持此类功能。如果您的用例不具有显式public修饰符很重要,那么一个好的解决方案是使用删除它们的脚本对输出进行后处理。

  • 很好奇为什么做出这个决定,因为 Kotlin 编码约定建议删除多余的 public 修饰符。https://kotlinlang.org/docs/reference/coding-conventions.html#modifiers (4认同)
  • 我理解你的观点,但我尊重地不同意。在我看来,图书馆的目标应该是在各种情况下具有多功能性和实用性。通过提供可以适应不同需求的灵活的代码实用程序。 (3认同)
  • “除非您正在开发库,否则请省略多余的修饰符(例如 public)。” KotlinPoet 通常由生成代码的更高级别库(例如 SQLDelight、Wire)使用。对于这类库,生成代码的正确性非常重要,代码风格并不是那么重要。显式 API 模式有助于防止因省略修饰符和显式类型而导致的细微错误。 (2认同)