| # KSP2 API Changes |
| |
| While KSP2 is binary compatible with processors written for KSP1, there are some changes in the return values. The |
| differences are listed below: |
| |
| ##### Resolve implicit type from function call: val error = mutableMapOf<String, NonExistType>() |
| * KSP1: The whole type will be an error type due to failed type resolution. |
| * KSP2: It will successfully resolve the container type, and for the non-existent type in the type argument, it will |
| correctly report errors on the specific type argument. |
| |
| ##### Unbounded type parameter |
| * KSP1: No bounds |
| * KSP2: An upper bound of `Any?` is always inserted for consistency |
| |
| ##### Resolving references to type aliases in function types and annotations |
| * KSP1: Expanded to the underlying, non-alias type |
| * KSP2: Not expanded, like uses in other places |
| |
| ##### Fully qualified names |
| * KSP1: Constructors have FQN if the constructor is from source, but not if the constructor is from a library. |
| * KSP2: Constructors do not have FQN |
| |
| ##### Type arguments of inner types |
| * KSP1: Inner types has arguments from outer types |
| * KSP2: Inner types has no arguments from outer types |
| |
| ##### Type arguments of star projections |
| * KSP1: Star projections have type arguments that are expanded to the effective variances according to the declaration |
| sites. |
| * KSP2: No expansion. Star projections have nulls in their type arguments. |
| |
| ##### Variance of Java Array |
| * KSP1: Java Array has a invariant upper bound |
| * KSP2: Java Array has a covariant upper bound |
| |
| ##### Type of Enum Entries |
| * KSP1: Each enum entry has itsown type |
| * KSP2: All enum entries share the same type with the enclosing enum class |
| |
| ##### Evaluation of Enum Entries in Annotation Arguments |
| * KSP1: An annotation argument that is an enum entry is evaluated as a `KSType` of the corresponding enum entry |
| * KSP2: An annotation argument that is an enum entry is evaluated directly as the corresponding `KSClassDeclaration` |
| of the enum entry |
| |
| ##### Multi-override scenario |
| For example |
| ``` |
| interface GrandBaseInterface1 { |
| fun foo(): Unit |
| } |
| |
| interface GrandBaseInterface2 { |
| fun foo(): Unit |
| } |
| |
| interface BaseInterface1 : GrandBaseInterface1 { |
| } |
| |
| interface BaseInterface2 : GrandBaseInterface2 { |
| } |
| |
| class OverrideOrder1 : BaseInterface1, GrandBaseInterface2 { |
| override fun foo() = TODO() |
| } |
| class OverrideOrder2 : BaseInterface2, GrandBaseInterface1 { |
| override fun foo() = TODO() |
| } |
| ``` |
| |
| * KSP1: Find overridden symbols in BFS order, first super type found on direct super type list that contains overridden |
| symbol is returned. For the example, KSP will say `OverrideOrder1.foo()` overrides `GrandBaseInterface2.foo()` |
| and `OverrideOrder2.foo()` overrides `GrandBaseInterface1.foo()`. |
| * KSP2: DFS order, first super type found overridden symbols (with recursive super type look up) in direct super type |
| list is returned. For the example, KSP will say `OverrideOrder1.foo()` overrides `GrandBaseInterface1.foo()` |
| and `OverrideOrder2.foo()` overrides `GrandBaseInterface2.foo()`. |
| |
| ##### Java modifier |
| * KSP1: Transient/volatile fields are final by default |
| * KSP2: Transient/volatile fields are open by default |
| |
| ##### Type annotations |
| * KSP1: Type annotations on a type argument is only reflected on the type argument symbol |
| * KSP2: Type annotations on a type argument now present in the resolved type as well |
| |
| ##### vararg parameters |
| * KSP1: Considered as an `Array` type |
| * KSP2: Not considered as an `Array` type |
| |
| ##### Synthesized members of Enums |
| * KSP1: `values` and `valueOf` are missing if the enum is defined in Kotlin sources |
| * KSP2: `values` and `valueOf` are always present |
| |
| ##### Synthesized members of data classes |
| * KSP1: `componentN` and `copy` are missing if the data class is defined in Kotlin sources |
| * KSP2: `componentN` and `copy` are always present |
| |
| ##### Super type of Enum classes |
| * KSP1: The super type of Enum classes is `Any` |
| * KSP2: The super type of Enum classes is `Enum` |