跳到内容

更新日志

未发布

感谢 [@IRus][IRus] 为此版本做出贡献。

2025-04-15

  • 新增:支持上下文参数 (Context Parameters) (#2094)

版本 2.1.0

感谢 @ForteScarlet, @TrevorSStone, @RaoPrashanth, @damianw, @ansehoon1999, @TheMrMilchmann 为此版本做出贡献。

2025-02-25

  • 新增:Kotlin 2.1.10。
  • 新增:KSP 2.1.10-1.0.30。
  • 修复:支持匿名类的委托 (delegates)。(#2034)
  • 修复:防止别名导入 (aliased imports) 与现有导入冲突。(#2052)
  • 修复:TypeName.MUTABLE_MAP_ENTRY 现在正确使用 MutableEntry 嵌套类名称。(#2061)
  • 修复:对类型的可空版本和不可空版本使用相同的别名导入。(#2068)
  • 修复:如果函数式接口具有父接口,则允许其包含零个方法。(#2075)

版本 2.0.0

感谢 @brokenhappy, @tajobe, @niyajali, @ForteScarlet 为此版本做出贡献。

2024-10-23

此版本与 KotlinPoet 1.x 源码和二进制兼容。

此版本最重要的行为变更是,生成的代码中的空格默认不再换行。

KotlinPoet 1.x 过去会在代码行超出长度限制时用换行符替换空格。这通常能改善代码格式,但也可能导致生成的代码出现编译错误。不间断空格可以用 · 字符标记,但这个功能的易发现性不高。

即使包含空格的代码行超出长度限制,KotlinPoet 2.0 也不再对空格进行换行。新引入的 字符可用于标记那些可安全换行的空格,这能改善代码格式。· 字符被保留以保持兼容性,但其行为现在等同于普通空格。

  • 新增:Kotlin 2.0.10。
  • 新增:空格默认不换行。
  • 新增:新的 占位符,代表一个可安全换行的空格。
  • 新增:添加 KSTypeAlias.toClassName()。(#1956)
  • 新增:添加 KSType.toClassNameOrNull()。(#1956)
  • 修复:仅包含初始化块 (init block) 的枚举类现在也生成所需的冒号。(#1953)
  • 修复:在 KSAnnotation.toAnnotationSpec() 中保留类型别名 (typealiases)。(#1956)
  • 修复:在 KSType.toClassName() 中保留可空性 (nullability)。(#1956)

版本 1.18.1

感谢 @mitasov-ra 为此版本做出贡献。

2024-07-15

  • 修复:KT-18706 的解决方法:KotlinPoet 现在生成不带反引号的导入别名 (#1920)。
// before, doesn't compile due to KT-18706
import com.example.one.`$Foo` as `One$Foo`
import com.example.two.`$Foo` as `Two$Foo`

// now, compiles
import com.example.one.`$Foo` as One__Foo
import com.example.two.`$Foo` as Two__Foo

版本 1.18.0

感谢 @DanielGronau 为此版本做出贡献。

2024-07-05

  • 新增:Kotlin 2.0.0。
  • 新增:KSP 2.0.0-1.0.22。
  • 新增:将 kotlinpoet-metadata 从预览版升级到稳定版。
  • 新增:将 kotlinpoet-metadata 迁移到稳定的 org.jetbrains.kotlin:kotlin-metadata-jvm artifact 进行 Metadata 解析。
  • 新增:使 KSAnnotation.toAnnotationSpec()KSClassDeclaration.toClassName() 中的枚举项引用更健壮。
  • 修复:在 KSTypeReference.toTypeName() 中不要将函数类型的类型别名展开为 LambdaTypeName
  • 修复:避免在 %L 翻译中四舍五入小的 double 和 float 值 (#1927)。
  • 修复:修复 KSP2 中的类型别名类型参数解析 (#1929)。

版本 1.17.0

感谢 @jisungbin, @hfhbd, @evant, @sgjesse, @sebek64 为此版本做出贡献。

2024-05-24

  • 变更:kotlinx-metadata 0.9.0。请注意 0.9.0 中 KotlinClassMetadata.read 已弃用,并由 readStrict 替换 (#1830)。
  • 注意:我们现在也提供 lenient 参数来映射到底层的 readStrict()readLenient() 调用 (#1766)。
  • 我们还从公共 API 中移除了一些 Class/TypeElement/MetadataKmClass 的 API,因为这些 API 现在使用 kotlinx-metadata 的新 API 很容易实现,这使我们能够更好地专注于此 artifact 的 API 表面积 (#1891)。
  • 新增:如果主构造函数跨越多行,则父类型列表会换行到每行一个 (#1866)。
  • 新增:为可以持有 PropertySpecFunSpec 及其构建器的构造提取 MemberSpecHolder 接口 (#1877)。
  • 新增:joinToCode 变体,它适用于任何类型,但需要一个转换 lambda 将每个元素转换为 CodeBlock (#1874)。
  • 新增:在 KSAnnotation.toAnnotationSpec() 中支持注解类型参数 (#1889)。
  • 修复:防止类中的函数与当前作用域中的函数调用发生名称冲突 (#1850)。
  • 修复:修复扩展函数导入 (#1814)。
  • 修复:在 FileSpec.scriptBuilder 上省略隐式修饰符 (#1813)。
  • 修复:修复 PropertySpec 中的尾随换行符 (#1827)。
  • 修复:KSAnnotation.toAnnotationSpec 将 varargs 直接写入,而不是将其转换为数组,以解决 Kotlin 中关于 OptIn 注解的问题 (#1833)。
  • 修复:不带包名的 MemberName 现在可以正确导入 (#1841)
  • 修复:如果主构造函数委托给其他构造函数,则抛出异常 (#1859)。
  • 修复:带有嵌套类的别名导入 (#1876)。
  • 修复:在 KSType.toClassName() 中检查错误类型 (#1890)。
  • 修复:支持为重载的 MemberName 生成单个导入 (#1909)。

版本 1.16.0

感谢 @drawers, @rickclephas 为此版本做出贡献。

2024-01-18

  • 新增:Kotlin 1.9.22。
  • 新增:KSP 1.9.22-1.0.16。
  • 新增:添加 NameAllocator API 以控制关键字预分配 (#1803)。
  • 修复:修复 KSTypeReference.toTypeName 中缺少 suspend 修饰符的问题 (#1793)。
  • 修复:遵守同包导入别名 (#1794)。
  • 修复:始终在类型头中包含参数文档 (#1800)。

版本 1.15.3

感谢 @gabrielittner 为此版本做出贡献。

2023-12-04

  • 修复:修复 KSTypeReference.toTypeName 中 lambda 的可空性 (#1756)。

版本 1.15.2

感谢 @evant 为此版本做出贡献。

2023-11-30

  • 新增:Kotlin 1.9.21。
  • 新增:KSP 1.9.21-1.0.15。
  • 新增:KSP:更精确地表示函数类型 (#1742)。

版本 1.15.1

2023-11-19

  • 修复:修复由 #1637 引入的回归问题,该问题导致如果类型的主构造函数没有文档,则在类型的 KDoc 中添加多余的换行符 (#1727)。

版本 1.15.0

2023-11-18

感谢 @drawers, @fejesjoco, @takahirom, @martinbonnin, @mcarleio 为此版本做出贡献。

在此版本中,:kotlinpoet 模块已转换为 Kotlin Multiplatform 模块 (#1654),尽管目前它仅支持 JVM 目标。重要提示:除非您使用 Gradle 构建,否则现在需要依赖 kotlinpoet-jvm artifact,而不是 kotlinpoet - 请参阅下载获取说明。

  • 新增:Kotlin 1.9.20。
  • 新增:KSP 1.9.20-1.0.14。
  • 新增:为可以持有 TypeSpec 及其构建器的构造提取 TypeSpecHolder 接口 (#1723)。
  • 新增:从 FileSpec 暴露相对路径 (#1720)。
  • 新增:从 FileSpec.writeTo() 返回生成的文件路径。(#1514)。
  • 新增:移除不稳定类型的默认兼容性 (#1662)。
  • 新增:弃用 TypeSpec.expectClassBuilder()TypeSpec.valueClassBuilder() (#1589)。
  • 新增:添加选项以将 KSAnnotation 转换为 AnnotationSpec 时省略默认值 (#1538)。
  • 新增:添加 FileSpec.builder 以方便使用 MemberName (#1585)。
  • 修复:为 DecimalFormatSymbols.minusSign 设置值以确保跨区域设置一致性 (#1658)。
  • 修复:修复 KDoc 中到增量 KSP 的链接 (#1638)。
  • 修复:发出主构造函数 KDoc (#1637)。
  • 变更:kotlinx-metadata 0.7.0。这对 :kotlinpoet-metadata 模块的用户来说是一个破坏性变更,因为大多数 Flags-API 扩展已被移除,转而使用现在可用的一方版本。

版本 1.14.2

2023-05-30

  • 修复:修复 Annotatable.Builder 中二进制兼容性覆盖中又一个缺失的 API (#1581)。

版本 1.14.1

2023-05-29

  • 修复:恢复可注解和可文档化构建器的 ABI 稳定性 (#1580)。

版本 1.14.0

2023-05-29

感谢 @Omico, @drawers, @RBusarow 为此版本做出贡献。

  • 新增:Kotlin 1.8.21。
  • 新增:KSP 1.8.21-1.0.11。
  • 新增:在 Java 字节码中启用默认方法 (#1561)。
  • 新增:在 Renovate 中将 Kotlin 和 Renovate 更新分组在一起 (#1562)。
  • 新增:为可注解的构造及其构建器提取特性接口 (#1564)。
  • 新增:为可文档化的构造及其构建器提取特性接口 (#1571)。
  • 新增:文档记录 STAR 的用法 (#1572)。
  • 新增:添加接受 MemberNameFunSpec 构建器 (#1574)。
  • 修复:在重写函数或构造函数参数上省略 public 修饰符 (#1550)。
  • 修复:正确处理各种类型中的成员 (#1558)。
  • 修复:函数返回类型现在默认为 Unit,除非显式设置 (#1559)。

    之前,当 FunSpec 没有指定返回类型并生成表达式体时,不会发出返回类型。然而,从 1.14.0 开始,在这种情况下 KotlinPoet 不会将 Unit 添加为返回类型。为了纠正生成的输出,您需要指定 FunSpec 的实际返回类型。

    1.14.0 之前,如果省略,则不生成返回类型

    val funSpec = FunSpec.builder("foo")
      .addStatement("return 1")
      .build()
    
    public fun foo() = 1
    

    1.14.0 开始,如果未另行设置,返回类型默认为 Unit

    val funSpec = FunSpec.builder("foo")
      .addStatement("return 1")
      .build()
    
    public fun foo(): Unit = 1 // ❌
    

    要修复它,请显式定义返回类型

     val funSpec = FunSpec.builder("foo")
    +  .returns(INT)
       .addStatement("return 1")
       .build()
    
    public fun foo(): Int = 1 // ✅
    

    此外,作为此更改的一部分,FunSpec.returnType 已更改为不可空。这是一个源码和二进制兼容的更改,但如果您之前进行空检查,则升级后可能会出现新的警告。

  • 修复:在名称查找期间将嵌套类名称附加到别名 (#1568)。

  • 修复:允许带有上下文接收者且没有 getter 或 setter 的 PropertySpec (#1575)。

版本 1.13.2

2023-05-05

感谢 @Squiry 为此版本做出贡献。

  • 修复:修复 KSType.toTypeName 以便与别名类型一起工作 (#1534)。

版本 1.13.1

2023-04-28

感谢 @rickclephas 为此版本做出贡献。

  • 修复:在生成导入别名时,查看规范名称而不是仅查看包名 (#1519)。
  • 修复:忽略没有值的 KSP 注解参数 (#1523)。
  • 修复:修复 KSType.toTypeName() 中的参数处理 (#1529)。

版本 1.13.0

2023-04-06

感谢 @popematt, @bitPogo, @mars885, @sjudd, @Sironheart, @polarene, @DeoTimeTheGithubUser, @drawers 为此版本做出贡献。

  • 新增:Kotlin 1.8.0。
  • 新增:KSP 1.8.0-1.0.9。
  • 新增:支持 TypeSpecs 上的上下文接收者 + 提取 ContextReceivable API (#1269)。
  • 新增:优化 OriginatingElementsTagMap 实现 (#1270)。
  • 新增:为类型和成员自动生成导入别名 (#1355)。
  • 新增:在大十进制字面量中插入下划线 (#1384)。
  • 新增:新的工厂函数 FileSpec.builder(ClassName) (#1397)。
  • 修复:调用 KSTypeArgument.toTypeName() 处理递归类型界限中的通配符时修复 StackOverflowError (#1272)。
  • 修复:修复传递性别名 (#1306)。
  • 修复:修复 Aliases 作为 TypeArgument (#1321)。
  • 修复:不要在原始字符串中转义特殊字符 (#1331)。
  • 修复:修复 KSP 互操作输出 Char 类型的注解参数值 (#1338)。
  • 修复:修复 KSP 互操作处理原始数组 (#1340)。
  • 修复:如果 shouldEmitPublicModifier 返回 false,则避免发出 public 修饰符 (#1342)。
  • 修复:修复在可空/挂起 LambdaTypeName 上下文接收者渲染位置不正确的问题 (#1454)。
  • 修复:不要对 KClass.asClassName 使用 bestGuess (#1469)。
  • 修复:处理带有平台映射父类的假嵌套类型 (#1472)。
  • 修复:修复 TypeName 的 equals (#1477)。
  • 修复:使 ClassName 的 equals 与 compareTo 一致 (#1506)。

版本 1.12.0

2022-06-13

感谢 @WhosNickDoglio, @sullis, @DRSchlaubi, @martinbonnin, @seriouslyhypersonic, @ephemient, @dkilmer, @aksh1618, @zsqw123, @roihershberg 为此版本做出贡献。

  • 新增:Kotlin 1.7.0。
  • 新增:添加对上下文接收者的支持。
  • 新增:添加对外部属性 getter 的支持。
  • 新增:interop-ksp API 升级到稳定版。
  • 修复:发出类型时解析枚举常量。
  • 修复:使用 KSP 处理类型别名时,修复类型参数映射。
  • 修复:正确解包带有未使用类型参数的 KSTypeAlias
  • 修复:递归解包嵌套的 KSTypeAlias
  • 修复:添加对上下文接收者 @PropertySpec 的支持并修复注解问题。
  • 修复:将 headerimpl 视为关键字(KT-52315 的解决方法)。
  • 修复:对注解参数名称使用 %N 而不是 %L,以便处理关键字。
  • 修复:改进长 return 表达式的处理。

版本 1.11.0

2022-03-24

感谢 @liujingxing@BoD 为此版本做出贡献。

  • 新增:在 FileSpec 中支持 Kotlin 脚本。
val spec = FileSpec.scriptBuilder("Taco")
  .addStatement("println(%S)", "hello world!")
  .addKotlinDefaultImports()
  .build()

生成一个内容如下的 Taco.kts 文件

println("hello world!")
  • 新增:对多行参数和注解发出尾随逗号。
  • 新增:添加 KSAnnotation.toAnnotationSpec()
  • 新增:在 javapoet-interop 中添加 UnitCharSequence 转换。
  • 新增:在 FileSpec 中添加对默认导入的支持。
  • 这主要面向脚本支持,但也用于非脚本文件。
  • 新增:更新到 Kotlin 1.6.10。
  • 修复:如果您只向 ClassName 传递一个字符串,则编译失败。
  • 修复:如果 val 属性的 getter 是 inline 的,则内联该属性。
  • 修复:将 yield 添加到保留关键字列表。
  • 修复:在 ParameterSpec 中强制执行只允许的参数修饰符(即 crossinline, varargnoinline)。
  • 修复:修复类委托中的 CodeBlocktoString() 而不是参与代码写入的问题。
  • 修复:尝试将 KSP 错误类型(即如果 KSType.isError 为 true)转换为 TypeName 时出错。

版本 1.10.2

2021-10-22

感谢 @glureau@goooler 为此版本做出贡献。

  • 新增:将 AnnotationSpec.get() 切换为使用 arrayOf() 语法而不是 []
  • 修复:不要对长包名的别名导入进行换行。
  • 修复:不要在行注释中对类型名进行换行。
  • 修复:忽略 Java 的 @Deprecated 注解在注解的合成方法上。

版本 1.10.1

2021-09-21

感谢 @evant 为此版本做出贡献。

  • 修复:正确生成带有类型参数的 KSP 互操作类型别名。
  • 修复:为 KSP 互操作中的 fun KSTypeArgument.toTypeName 添加缺失的默认 TypeParameterResolver.EMPTY 参数。

版本 1.10.0

2021-09-20

感谢 @martinbonnin, @idanakav, @goooler, 和 @anandwana001 为此版本做出贡献。

  • 新增:添加新的 KSP 互操作 artifact。有关更多详细信息,请参阅文档
  • 新增:添加新的 JavaPoet 互操作 artifact。有关更多详细信息,请参阅文档
  • 新增:允许通过新的 copy() 重载复制带有新类型参数的 ParameterizedTypeName
  • kotlinx-metadata artifacts 已整合到一个 com.squareup:kotlinpoet-metadata Maven artifact 中。之前的 kotlinpoet-metadata-* 子 artifact 不再发布。
  • 新增:TypeNameAliasTag 已移至 KotlinPoet 的主 artifact 中,名称为 TypeAliasTag,以便与 KSP 互操作一起重用。
  • ImmutableKm* 类已被移除。它们被认为是对基础 kotlinx-metadata Km 类型的冗余抽象。所有对此类的使用都应替换为其非不可变的基础类型。
  • 修复:修复元数据解析中的自引用类型变量。
  • 修复:在 AnnotationSpec.get 中转换注解镜像时,使用 delicate API 而不是产生噪声日志的 API。
  • 修复:当无法读取元数据时,更新错误消息使其更具可操作性。
  • 修复:避免转义已转义的字符串。
  • 添加关于 kotlin-reflect 用法的文档。
  • 尽可能避免使用 kotlin-reflect 查找 Unit 类型。
  • 测试支持到 JDK 17。
  • 更新 Kotlin 到 1.5.31。

版本 1.9.0

2021-06-22

  • 新增:Kotlin 1.5.10。
  • 新增:之前弃用的与 Java 反射和 Mirror API 互操作的 API 已恢复弃用状态,并标记了 @DelicateKotlinPoetApi 注解。
  • 新增:CodeBlock.Builder.withIndent 助手函数。
  • 新增:允许在 ParameterSpec.BuilderPropertySpec.Builder 中设置初始化器和默认值后对其进行更改。
  • 新增:MemberName.isExtension 属性,它指示 KotlinPoet 始终导入该成员,即使在同一作用域存在冲突的声明。
  • 修复:转义仅包含下划线的成员名称。
  • 修复:如果通过 TypeSpec.primaryConstructor 设置了主构造函数,则始终发出空主构造函数。

版本 1.8.0

2021-03-29

  • 新增:Kotlin 1.4.31。
  • 新增:添加 KModifier.VALUE 以支持 value class 声明。
  • 新增:允许使用自定义 ClassLoaderReflectiveClassInspector
  • 新增:更新到 kotlinx-metadata 0.2.0。
  • 修复:确保 ImmutableKmProperty.toMutable() 复制 fieldSignature
  • 修复:防止导入的 MemberName 与当前作用域的成员发生名称冲突。
  • 修复:防止类型与同名父类型发生名称冲突。
  • 修复:不要为 expectexternal 函数生成空体。
  • 修复:不允许 expectexternal 类初始化父类型。
  • 修复:不允许在 external 类中调用委托构造函数。
  • 修复:允许内联/值类中存在非 public 的主构造函数。
  • 修复:允许内联/值类中存在初始化块。
  • 修复:省略接口中成员的冗余 abstract 修饰符

版本 1.7.2

2020-10-20

  • 新增:检测带有 return·throw· 前缀的表达式体。
  • 修复:省略自定义访问器上的可见性修饰符。

版本 1.7.1

2020-10-15

  • 修复:1.7.0 版本使用 JDK 11 发布,这在 Gradle 元数据中将 "org.gradle.jvm.version" 设置为 "11",导致在较早的 Java 版本上无法使用该库(参见 #999)。1.7.1 版本使用 JDK 8 发布,解决了此问题。

版本 1.7.0

2020-10-14

  • 新增:Kotlin 1.4.10。
  • 新增:生成的代码默认与显式 API 模式兼容。
  • 新增:除了硬关键字外,也转义软关键字和修饰符关键字。
  • 新增:改进枚举常量生成,以获得更清晰的差异。
  • 新增:不允许在不可变属性上设置 setter。
  • 新增:确保表达式体中有尾随换行符。
  • 新增:确保无参数自定义 setter 后有尾随换行符。
  • 修复:不要将带有自定义访问器的属性自动转换为主构造函数属性。
  • 修复:不允许带有主体的无参数 setter。
  • 修复:防止自动换行转义关键字内的空格。

版本 1.6.0

2020-05-28

  • 新增:弃用 Mirror API 集成。

Mirror API 集成,例如 TypeElement.asClassName()FunSpec.overriding(ExecutableElement),在此版本中已被弃用。这些 KotlinPoet API 最常用于注解处理器。由于 kapt 在桩 (stub)(即 Java 文件)上运行注解处理器,许多特定于 Kotlin 的信息在转换过程中丢失,KotlinPoet 无法通过 Mirror API 集成访问这些信息。例如:

  • 别名类型,例如 kotlin.String,被转换为它们的 JVM 表示形式,例如 java.lang.String
  • 类型可空性信息不可访问。
  • suspend 函数被视为带有额外 Continuation 参数的简单函数。

正确的解决方案是切换到 KotlinPoet-metadataKotlinPoet-metadata-specs API,这些 API 从 @Metadata 注解获取特定于 Kotlin 的信息并生成正确的 KotlinPoet Specs。我们未来可能会探索为弃用的 API 添加新的基于元数据的替代方案。

  • 新增:Kotlin 1.3.72。
  • 新增:改进 MemberName 以支持运算符重载。
  • 新增:在 AnnotationSpec 中支持泛型。
  • 新增:添加对函数式接口的支持。
  • 新增:使更多 FunSpec.Builder 成员公开以方便修改。
  • 修复:在嵌套声明中正确传播隐式类型和函数修饰符。
  • 修复:正确转义包含 $ 字符的类型名称。
  • 修复:不要两次发出 LambdaTypeName 注解。
  • 修复:在 TypeName.copy() 中保留标签。

版本 1.5.0

2020-01-09

KotlinPoet 现在以 JDK8 为目标,这意味着在安装了旧版本 JDK 的机器上执行包含 KotlinPoet 作为依赖项的构建将无法工作。这不会影响 KotlinPoet 生成的代码:只要不使用新版本中引入的任何特性,生成的代码仍然可以针对 JDK6 进行编译。

  • 新增:Kotlin 1.3.61。
  • 新增:在 KotlinPoet-metadata 中添加处理 FileFacades 的支持。
  • 新增:在注解类中添加对嵌套对象和伴生对象的支持。
  • 新增:改进不匹配的开放/关闭语句字符的错误消息。
  • 新增:可用时,使用注解镜像标记 AnnotationSpec
  • 新增:从元数据创建 TypeSpec 时包含枚举项上的注解。
  • 修复:修复类型的元数据解析。
  • 修复:允许文件名是 Kotlin 关键字。
  • 修复:正确转义带有反引号的类型别名。
  • 修复:允许创建名称可以用反引号转义的 TypeSpec
  • 修复:正确转义带有反引号的枚举常量名称。
  • 修复:发出 TypeSpec 时保持属性和初始化器的正确顺序。注意:此更改后,任何在初始化块之后声明的属性将不会添加到主构造函数中,而是将在 TypeSpec 主体中发出。
  • 修复:如果类型 KDoc 为空但存在参数 KDoc,则不发出开头的换行符。
  • 修复:确保 KotlinPoet-metadata 正确解析包名。

## 版本 1.4.4

2019-11-16

  • 修复:在 KotlinPoet-metadata 中支持具体化的内联类型。

版本 1.4.3

2019-10-30

  • 修复:在 KotlinPoet-metadata 中不要为抽象函数发出桩 (stub)。

版本 1.4.2

2019-10-28

  • 修复:在 KotlinPoet-metadata 中正确处理抽象元素。
  • 修复:在 KotlinPoet-metadata 中正确处理类型别名。
  • 修复:正确渲染 KDocs 末尾的 % 符号。

版本 1.4.1

2019-10-18

  • 新增:为 TypeAliasSpec 添加注解支持。
  • 新增:从 Kotlin Metadata 读取类型注解。
  • 新增:引入 ImmutableKmDeclarationContainer
  • 修复:使用完整包名对 auto-common 进行 shading。
  • 修复:支持从 Kotlin Metadata 读取自指类型变量(例如 Asset<A : Asset<A>>)。

版本 1.4.0

2019-09-24

  • 新增:此版本引入了新的 KotlinPoet-metadata API,它使得内省 Kotlin 类型并基于该数据构建 KotlinPoet Specs 变得容易。

类型内省的策略由 ClassInspector 驱动,它是一个用于查找给定类的 JVM 信息的基本接口。此接口可选地被 kotlinpoet-metadata-specs artifact 中的 toTypeSpec()/toFileSpec() API 使用,以提供元数据中不存在的类信息(如重写、JVM 修饰符等)。ReflectiveClassInspector(用于反射)和 ElementsClassInspector(用于注解处理中的 javax Elements API)中提供了两个包含电池 (batteries-included) 的实现。这些实现通过其各自的 kotlinpoet-classinspector-* artifact 提供。更多信息请参阅KotlinPoet-metadata-specs README

在本版本发布时,此 API 处于实验模式,需要通过 KotlinPoetMetadataPreview 注解选择启用。

  • 新增:Kotlin 1.3.50。
  • 新增:一个新的构造函数,简化 ParameterSpec 实例的创建。
  • 新增:新的 ClassName 构造函数。
  • 新增:TypeName 及其子类现在可以存储标签。
  • 新增:大多数 Specs 的 toBuilder() 方法添加可选参数。
  • 新增:接受 vararg 参数的 Spec 方法的 List 重载。
  • 新增:CodeBlock.Builder.clear() 助手方法。
  • 新增:FunSpec.Builder.clearBody() 助手方法。
  • 修复:正确转义枚举常量名称。
  • 修复:确保 KDoc 和函数体中有尾随换行符。
  • 修复:空界限的 TypeVariableName 现在将默认为 Any?
  • 修复:不要为主构造函数发出括号。
  • 修复:不再允许简单名称为空的 ClassName
  • 修复:如果名称包含无法用反引号转义的非法字符,则抛出异常。

版本 1.3.0

2019-05-30

  • 新增:不在主构造函数中内联注解。
  • 新增:发出主构造函数时强制换行。
  • 新增:支持将 MemberNames 用作 %N 的参数。
  • 新增:添加更多 ClassName 常量:ClassName.STRING, ClassName.LIST 等。
  • 新增:添加 ClassName.constructorReference() 和 MemberName.reference()。
  • 新增:使 %N 接受 MemberNames。
  • 新增:转义导入别名中的空格。
  • 新增:转义 ClassNames 中的空格。
  • 新增:转义 MemberNames 中的空格。
  • 新增:转义包含空格的导入。
  • 新增:转义包含空格的包名。
  • 新增:使用 2 个空格缩进。
  • 新增:注解值仅缩进一层。
  • 修复:仅将唯一的源元素传递给 Filer。
  • 修复:修复同一包中嵌套在类内部的 MemberNames 错误。

版本 1.2.0

2019-03-28

  • 新增:添加 writeTo(Filer) 和源元素 API。
  • 新增:使 *Spec 类型可标记。
  • 新增:使 FunSpec.Builder#addCode 接受 vararg Any?。
  • 修复:导入默认包中的成员。
  • 修复:在控制流创建方法中添加不换行空格。
  • 修复:注解数组类型中忽略了名为“value”的参数。

版本 1.1.0

2019-02-28

  • 新增:Kotlin 1.3.21。
  • 新增:支持使用 %MMemberName 类型引用成员。
  • 新增:添加扩展,用于从 ClassNameKClassClass 获取 MemberName
  • 新增:允许将 CodeBlock 作为参数传递给 %P
  • 新增:允许对象进行接口委托。
  • 修复:不在 toString() 中发出可见空白字符。
  • 修复:防止函数签名内部在奇怪的地方换行。
  • 修复:val 和属性名之间不换行。
  • 修复:允许将行前缀传递给 LineWrapper,以便在 KDoc 中实现正确的换行。
  • 修复:为没有标签的 TypeSpec Kdoc 添加换行。
  • 修复:为其余 Specs 添加换行。
  • 修复:修复属性 getter/setters 的 kdoc 格式问题。
  • 修复:不包装 FunSpec 中的单行注释。
  • 修复:添加不换行的包名。
  • 修复:通过预计算 TypeSpec 所有嵌套的简单名称,移除 CodeWriter.resolve() 中的 n^2 算法。
  • 修复:修复空枚举类别的边缘情况。
  • 修复:修复 KType.asTypeName() 中 Nullable 类型参数的处理问题。
  • 修复:修复 FileSpec 中长注释换行错误。
  • 修复:将主构造函数参数/属性的 KDoc 附加到元素上,而不是在类型头中发出。

版本 1.0.1

2019-01-02

  • 新增:允许不带常量的枚举。
  • 新增:改进 TypeSpec KDoc 的格式。
  • 新增:支持 TypeSpec 中的 @property 和 @param KDoc 标签。
  • 修复:对 %P 的参数使用预格式化字符串。

版本 1.0.0

2018-12-10

  • 新增:Kotlin 1.3.11。
  • 修复:防止导入语句中的换行。

版本 1.0.0-RC3

2018-11-28

  • 新增:Kotlin 1.3.10。
  • 新增:为字符串模板添加 %P 占位符。
  • 新增:添加对接收者 kdoc 的支持。
  • 新增:避免将 Unit 作为返回类型发出。
  • 新增:添加对空 setter 的支持。
  • 新增:添加对内联类的检查。
  • 新增:如果属性和变量名是关键字,则进行转义。
  • 新增:将 %>, %<, %[, %] 占位符替换为 , , «, »
  • 新增:将 %W 替换为空格,并添加 · 作为不换行空格。
  • 新增:将 TypeName 改为密封类。
  • 新增:文档改进。
  • 新增:将 TypeName 修饰符方法替换为 copy()
  • 新增:重命名 WildcardTypeName 的成员,使其与生产者/消费者泛型模型匹配。
  • 新增:将 TypeName.nullable 重命名为 TypeName.isNullable
  • 新增:将 LambdaTypeName.suspending 重命名为 LambdaTypeName.isSuspending
  • 新增:将 TypeVariableName.reified 重命名为 TypeVariableName.isReified
  • 修复:仅对具有 Any? 上界的类型发出星投影。
  • 修复:折叠具有转义名称的属性。

版本 1.0.0-RC2

2018-10-22

  • 新增:Kotlin 1.2.71。
  • 新增:README 改进。
  • 新增:允许在 beginControlFlow() 中使用左花括号和参数。
  • 新增:为 ParameterSpec 添加 KDoc,并将其折叠到父级 KDoc 中。
  • 新增:支持 PropertySpec 中的 TypeVariable
  • 新增:为 LambdaTypeName 中的注解类型添加括号。
  • 新增:改进内联属性的错误消息和文档。
  • 新增:允许密封类声明抽象属性。
  • 新增:添加 buildCodeBlock() 辅助函数。
  • 新增:允许将带有语句的 CodeBlock 用作属性初始化器和默认参数值。
  • 新增:将 NameAllocator.clone() 重命名为 NameAllocator.copy()
  • 新增:将 TypeName.asNonNullable() 重命名为 TypeName.asNonNull()
  • 新增:移除 PropertySpec.varBuilder() (改用 mutable())。
  • 新增:允许导入默认包中的顶级成员。
  • 新增:添加重载以将 KDoc 添加到返回类型。
  • 修复:创建 TypeName 时区分 IntArrayArray<Int>
  • 修复:在 plusParameter() 中使用 TypeName 代替 ClassName 作为参数类型。
  • 修复:从 KType 构建 TypeName 时保留类型参数的协变/逆变。
  • 修复:在将属性与主构造函数参数合并时,不验证修饰符。
  • 修复:在格式化字符串中转义 $ 字符。
  • 修复:FileSpec.Builder 空包和子文件夹修复。
  • 修复:在参数 KDoc 末尾添加新行。
  • 修复:在 toBuilder() 中添加参数 KDoc。

版本 1.0.0-RC1

2018-07-16

  • 新增:在导入和规范类名中转义关键字。
  • 新增:改进 external 支持。
  • 新增:KTypeKTypeParameter 的扩展。
  • 新增:添加 builder 方法以简化添加常见的 kotlin.jvm 注解。
  • 新增:枚举可以拥有伴生对象。
  • 新增:为 TypeSpec#toBuilder() 添加缺失的 primaryConstructor 和 companionObject。
  • 新增:使 Kind 中子类型检查的 val 为 public。
  • 新增:如果类/属性/函数/变量名包含空格、连字符或其他符号,则自动转义。
  • 新增:改进 ParameterizedTypeName API。
  • 新增:添加 WildcardTypeName.STAR 常量。
  • 新增:暴露可变的 builder 属性,并将其验证移至构建时。
  • 修复:参数列表使用常规缩进。
  • 修复:主构造函数中定义的属性上的内联注解。
  • 修复:使用 Any? 作为默认类型变量界限。
  • 修复:修复导入注解 TypeName 的问题。
  • 修复:如果任何主构造函数属性带有 KDoc,则将属性放在新行上。
  • 修复:在类型签名中正确发出 where 块。
  • 修复:避免主构造函数中的类型名冲突。
  • 修复:添加更多界限时,移除隐式的 TypeVariable 界限。
  • 修复:合并构造函数参数和属性中的注解和修饰符。
  • 修复:将委托构造函数参数与构造函数一起替换。

版本 0.7.0

2018-02-16

  • 新增:将缩进增加到 4 个空格。
  • 新增:将超接口委托为构造函数参数。
  • 新增:支持将 PropertySpec 作为 CodeBlock 字面量。
  • 新增:支持 TypeAliasSpec 的 KDoc。
  • 新增:允许在伴生对象中添加初始化块。
  • 新增:转义 ParameterSpec 中也是关键字的名称。
  • 新增:转义语句中的名称。
  • 新增:将 com.squareup.kotlinpoet 设置为自动模块名。
  • 新增:支持 suspending lambda 类型。
  • 新增:支持带命名的 LambdaTypeName 参数。
  • 新增:支持 dynamic 类型。
  • 新增:禁止通配符导入。
  • 新增:依赖 Kotlin 1.2.21。
  • 修复:正确处理匿名类上的超类/接口。
  • 修复:修复边界过滤到 Any?
  • 修复:包装长属性初始化器。
  • 修复:修复参数列表的格式和缩进。

版本 0.6.0

2017-11-03

  • 新增:支持 lambda 扩展。
  • 新增:支持导入中的重命名,例如 import bar.Bar as bBar
  • 新增:支持扩展和内联属性。
  • 新增:支持 reified 类型。
  • 新增:暴露 LambdaTypeName 内部的封闭类型。
  • 新增:依赖 Kotlin 1.1.51。
  • 新增:改进了注解的 API 和格式。
  • 新增:改进了多平台支持。
  • 修复:如果函数和包名是 Kotlin 关键字,则进行转义。
  • 修复:正确格式化 WildcardTypeName 的类声明。

版本 0.5.0

2017-09-13

  • 新增:将 addFun() 重命名为 addFunction()
  • 新增:将 KotlinFile 重命名为 FileSpec
  • 新增:将 KotlinFile.addFileAnnotation() 重命名为 addAnnotation()
  • 新增:将 KotlinFile.addFileComment() 重命名为 addComment()
  • 新增:支持跨平台代码,包括 HEADERIMPL 修饰符。
  • 新增:支持类型别名的类型变量。
  • 新增:支持构造函数委托。
  • 新增:支持带名称的伴生对象。
  • 新增:依赖 Kotlin 1.1.4-3。
  • 修复:当参数多于两个时,每行格式化一个参数。
  • 修复:当构造函数体为空时,不发出花括号。
  • 修复:当没有主构造函数时,不调用超类构造函数。
  • 修复:对函数强制执行正确的修饰符。

版本 0.4.0

2017-08-08

  • 新增:将 KotlinPoet 的扩展(如 asClassName())更改为顶级函数。
  • 新增:添加声明点协变/逆变支持。
  • 新增:改进单表达式体的处理。
  • 新增:支持文件注解。
  • 新增:支持从顶级文件导入。
  • 新增:接受超类构造函数参数。
  • 新增:支持使用 constructor 关键字的主构造函数。
  • 修复:不发出 setter 参数类型。
  • 修复:在 NameAllocator 中支持 Kotlin 关键字。
  • 修复:为主构造函数发出正确的默认参数。
  • 修复:将注解用作参数时,正确格式化注解。
  • 修复:发出可空类型时识别导入。
  • 修复:当超类具有无参数构造函数时,调用超类构造函数。
  • 修复:如果所有属性都在主构造函数中声明,则省略类花括号。
  • 修复:不发出空的类体。
  • 修复:发出声明多个泛型类型约束的正确语法。
  • 修复:支持对象、伴生对象和接口上的属性。
  • 修复:对 throws 使用 AnnotationSpec

版本 0.3.0

2017-06-11

  • 新增:对象和伴生对象。
  • 新增:TypeAliasSpec 用于创建类型别名。
  • 新增:LambdaTypeName 用于创建 lambda 类型。
  • 新增:将属性声明折叠到构造函数参数中。
  • 新增:用于创建类型名称的扩展和调用函数:Runnable::class.asClassName()
  • 新增:对表达式体的基本支持。
  • 新增:对自定义访问器的基本支持。
  • 新增:移除 Filer 写入和源元素概念。这些源自 javac 注解处理器。
  • 修复:生成有效的注解类。
  • 修复:对 varargs 使用 KModifier
  • 修复:对数组类型使用 ParameterizedTypeName
  • 修复:从 KClass 中提取 Kotlin 名称,而不是 Java 名称。
  • 修复:发出有效的类字面量:Double::class 而不是 Double.class
  • 修复:以预期的顺序发出修饰符。
  • 修复:为枚举类和重写成员发出正确的语法。

版本 0.2.0

2017-05-21

  • 新增:将 API 签名翻转为 (name, type) 而不是 (type, name)。
  • 新增:支持可空类型。
  • 新增:支持委托属性。
  • 新增:扩展函数。
  • 新增:支持顶级属性。
  • 修复:继承应使用 : 而不是 extendsimplements
  • 修复:使 initializerBlock 发出 init {}

版本 0.1.0

2017-05-16

  • 初次公开发布。