diff --git a/compiler/java8-tests/tests/org/jetbrains/kotlin/checkers/ForeignJava8AnnotationsTestGenerated.java b/compiler/java8-tests/tests/org/jetbrains/kotlin/checkers/ForeignJava8AnnotationsTestGenerated.java index 3348e7edc36..2d1ffa9ef5b 100644 --- a/compiler/java8-tests/tests/org/jetbrains/kotlin/checkers/ForeignJava8AnnotationsTestGenerated.java +++ b/compiler/java8-tests/tests/org/jetbrains/kotlin/checkers/ForeignJava8AnnotationsTestGenerated.java @@ -46,4 +46,43 @@ public class ForeignJava8AnnotationsTestGenerated extends AbstractForeignJava8An String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotationsJava8/tests/eclipse.kt"); doTest(fileName); } + + @TestMetadata("compiler/testData/foreignAnnotationsJava8/tests/typeEnhancement") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class TypeEnhancement extends AbstractForeignJava8AnnotationsTest { + public void testAllFilesPresentInTypeEnhancement() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/foreignAnnotationsJava8/tests/typeEnhancement"), Pattern.compile("^(.+)\\.kt$"), true); + } + + @TestMetadata("annotatedTypeArguments.kt") + public void testAnnotatedTypeArguments() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotationsJava8/tests/typeEnhancement/annotatedTypeArguments.kt"); + doTest(fileName); + } + + @TestMetadata("methodWithTypeParameter.kt") + public void testMethodWithTypeParameter() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotationsJava8/tests/typeEnhancement/methodWithTypeParameter.kt"); + doTest(fileName); + } + + @TestMetadata("returnTypeDifferentConstructor.kt") + public void testReturnTypeDifferentConstructor() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotationsJava8/tests/typeEnhancement/returnTypeDifferentConstructor.kt"); + doTest(fileName); + } + + @TestMetadata("returnTypeOverrideInKotlin.kt") + public void testReturnTypeOverrideInKotlin() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotationsJava8/tests/typeEnhancement/returnTypeOverrideInKotlin.kt"); + doTest(fileName); + } + + @TestMetadata("simple.kt") + public void testSimple() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/foreignAnnotationsJava8/tests/typeEnhancement/simple.kt"); + doTest(fileName); + } + } } diff --git a/compiler/testData/diagnostics/tests/platformTypes/typeEnhancement/annotatedTypeArguments.kt b/compiler/testData/foreignAnnotationsJava8/tests/typeEnhancement/annotatedTypeArguments.kt similarity index 79% rename from compiler/testData/diagnostics/tests/platformTypes/typeEnhancement/annotatedTypeArguments.kt rename to compiler/testData/foreignAnnotationsJava8/tests/typeEnhancement/annotatedTypeArguments.kt index b2a46d6ba21..ea859aa2d71 100644 --- a/compiler/testData/diagnostics/tests/platformTypes/typeEnhancement/annotatedTypeArguments.kt +++ b/compiler/testData/foreignAnnotationsJava8/tests/typeEnhancement/annotatedTypeArguments.kt @@ -1,6 +1,6 @@ // FILE: AnnotatedTypeArguments.java -import org.jetbrains.annotations.*; +import org.checkerframework.checker.nullness.qual.*; interface P {} interface L {} @@ -16,7 +16,7 @@ class AnnotatedTypeArguments { // some complicated type tree // return type and argument's type differ only by nullability of outermost type @Nullable - L, @NotNull S>> foo(@NotNull L, @NotNull S>> x) {return null;} + L, @NonNull S>> foo(@NonNull L, @NonNull S>> x) {return null;} } class C extends B { @@ -26,13 +26,13 @@ class AnnotatedTypeArguments { class D1 extends C { // signature should be the same as in A, but annotated String-type should be platform - L, S>> foo(L, S>> x) {return null;} + L, S>> foo(L, S>> x) {return null;} } class D2 extends C { // return type refined to not-nullable // argument type here same as in A except outermost type (it becomes flexible because of conflict) - @NotNull + @NonNull L, S>> foo(@Nullable L, S>> x) {return null;} } } diff --git a/compiler/testData/diagnostics/tests/platformTypes/typeEnhancement/annotatedTypeArguments.txt b/compiler/testData/foreignAnnotationsJava8/tests/typeEnhancement/annotatedTypeArguments.txt similarity index 84% rename from compiler/testData/diagnostics/tests/platformTypes/typeEnhancement/annotatedTypeArguments.txt rename to compiler/testData/foreignAnnotationsJava8/tests/typeEnhancement/annotatedTypeArguments.txt index 3dde237402b..13c9cefc27e 100644 --- a/compiler/testData/diagnostics/tests/platformTypes/typeEnhancement/annotatedTypeArguments.txt +++ b/compiler/testData/foreignAnnotationsJava8/tests/typeEnhancement/annotatedTypeArguments.txt @@ -17,7 +17,7 @@ public/*package*/ open class AnnotatedTypeArguments { public/*package*/ open inner class B : AnnotatedTypeArguments.A { public/*package*/ constructor B() public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean - @org.jetbrains.annotations.Nullable() public/*package*/ open override /*1*/ fun foo(/*0*/ @org.jetbrains.annotations.NotNull() x: L, S<*>>!>): L, S<*>>!>? + @org.checkerframework.checker.nullness.qual.Nullable() public/*package*/ open override /*1*/ fun foo(/*0*/ @org.checkerframework.checker.nullness.qual.NonNull() x: L, S<*>>!>): L, S<*>>!>? public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String } @@ -41,7 +41,7 @@ public/*package*/ open class AnnotatedTypeArguments { public/*package*/ open inner class D2 : AnnotatedTypeArguments.C { public/*package*/ constructor D2() public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean - @org.jetbrains.annotations.NotNull() public/*package*/ open override /*1*/ fun foo(/*0*/ @org.jetbrains.annotations.Nullable() x: L, S<*>>!>!): L, S<*>>!> + @org.checkerframework.checker.nullness.qual.NonNull() public/*package*/ open override /*1*/ fun foo(/*0*/ @org.checkerframework.checker.nullness.qual.Nullable() x: L, S<*>>!>!): L, S<*>>!> public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String } diff --git a/compiler/testData/diagnostics/tests/platformTypes/typeEnhancement/methodWithTypeParameter.kt b/compiler/testData/foreignAnnotationsJava8/tests/typeEnhancement/methodWithTypeParameter.kt similarity index 83% rename from compiler/testData/diagnostics/tests/platformTypes/typeEnhancement/methodWithTypeParameter.kt rename to compiler/testData/foreignAnnotationsJava8/tests/typeEnhancement/methodWithTypeParameter.kt index b676019d8fb..a66a3ec7991 100644 --- a/compiler/testData/diagnostics/tests/platformTypes/typeEnhancement/methodWithTypeParameter.kt +++ b/compiler/testData/foreignAnnotationsJava8/tests/typeEnhancement/methodWithTypeParameter.kt @@ -1,6 +1,6 @@ // FILE: Outer.java -import org.jetbrains.annotations.*; +import org.checkerframework.checker.nullness.qual.*; interface X {} interface Y {} @@ -15,7 +15,7 @@ class Outer { class B extends A { // OK, non-platform types @Override - @NotNull T2 foo(@Nullable T1 x) { return null; } + @NonNull T2 foo(@Nullable T1 x) { return null; } // Parameter type is fully non-flexible (OK) // Return type is `X?`. @@ -23,7 +23,7 @@ class Outer { // so type enhancing happens only for outermost type. // TODO: We should properly compare equality with specific local equality axioms (as when calculating overriden descriptors) @Override - @Nullable X<@Nullable R> bar(@NotNull Y<@NotNull R> x) { return null; } + @Nullable X<@Nullable R> bar(@NonNull Y<@NonNull R> x) { return null; } } class C extends B { @@ -41,11 +41,11 @@ class Outer { // Return type is not-nullable, covariantly overridden, OK // Parameter type is flexible, because of conflict with supertype, OK @Override - @NotNull + @NonNull W foo(@Nullable U x) { return null; } @Override - @NotNull X<@NotNull F> bar(@Nullable Y<@Nullable F> x) { return null; } + @NonNull X<@NonNull F> bar(@Nullable Y<@Nullable F> x) { return null; } } } diff --git a/compiler/testData/diagnostics/tests/platformTypes/typeEnhancement/methodWithTypeParameter.txt b/compiler/testData/foreignAnnotationsJava8/tests/typeEnhancement/methodWithTypeParameter.txt similarity index 82% rename from compiler/testData/diagnostics/tests/platformTypes/typeEnhancement/methodWithTypeParameter.txt rename to compiler/testData/foreignAnnotationsJava8/tests/typeEnhancement/methodWithTypeParameter.txt index 9c7b576d8d9..7ea0a6ced12 100644 --- a/compiler/testData/diagnostics/tests/platformTypes/typeEnhancement/methodWithTypeParameter.txt +++ b/compiler/testData/foreignAnnotationsJava8/tests/typeEnhancement/methodWithTypeParameter.txt @@ -17,9 +17,9 @@ public/*package*/ open class Outer { public/*package*/ open inner class B : Outer.A { public/*package*/ constructor B() - @java.lang.Override() public/*package*/ open override /*1*/ fun bar(/*0*/ @org.jetbrains.annotations.NotNull() x: Y): X? + @java.lang.Override() public/*package*/ open override /*1*/ fun bar(/*0*/ @org.checkerframework.checker.nullness.qual.NonNull() x: Y): X? public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean - @java.lang.Override() public/*package*/ open override /*1*/ fun foo(/*0*/ @org.jetbrains.annotations.Nullable() x: T1?): T2 + @java.lang.Override() public/*package*/ open override /*1*/ fun foo(/*0*/ @org.checkerframework.checker.nullness.qual.Nullable() x: T1?): T2 public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String } @@ -35,9 +35,9 @@ public/*package*/ open class Outer { public/*package*/ open inner class D : Outer.C { public/*package*/ constructor D() - @java.lang.Override() public/*package*/ open override /*1*/ fun bar(/*0*/ @org.jetbrains.annotations.Nullable() x: Y!): X + @java.lang.Override() public/*package*/ open override /*1*/ fun bar(/*0*/ @org.checkerframework.checker.nullness.qual.Nullable() x: Y!): X public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean - @java.lang.Override() @org.jetbrains.annotations.NotNull() public/*package*/ open override /*1*/ fun foo(/*0*/ @org.jetbrains.annotations.Nullable() x: U?): W + @java.lang.Override() @org.checkerframework.checker.nullness.qual.NonNull() public/*package*/ open override /*1*/ fun foo(/*0*/ @org.checkerframework.checker.nullness.qual.Nullable() x: U?): W public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String } diff --git a/compiler/testData/diagnostics/tests/platformTypes/typeEnhancement/returnTypeDifferentConstructor.kt b/compiler/testData/foreignAnnotationsJava8/tests/typeEnhancement/returnTypeDifferentConstructor.kt similarity index 63% rename from compiler/testData/diagnostics/tests/platformTypes/typeEnhancement/returnTypeDifferentConstructor.kt rename to compiler/testData/foreignAnnotationsJava8/tests/typeEnhancement/returnTypeDifferentConstructor.kt index c96a266a34f..c49b106d15b 100644 --- a/compiler/testData/diagnostics/tests/platformTypes/typeEnhancement/returnTypeDifferentConstructor.kt +++ b/compiler/testData/foreignAnnotationsJava8/tests/typeEnhancement/returnTypeDifferentConstructor.kt @@ -1,13 +1,13 @@ // FILE: Outer.java -import org.jetbrains.annotations.*; +import org.checkerframework.checker.nullness.qual.*; interface Base {} interface Derived extends Base {} class Outer { class A { - @Nullable Base<@NotNull String> foo() { return null; } + @Nullable Base<@NonNull String> foo() { return null; } } class B extends A { @@ -17,7 +17,7 @@ class Outer { class C extends A { @Override - @NotNull Base foo() {} + @NonNull Base foo() {} } class D extends A { @@ -27,11 +27,11 @@ class Outer { class E extends A { @Override - @NotNull Derived foo() {} + @NonNull Derived foo() {} } class F extends A { @Override - @NotNull Derived<@NotNull String> foo() {} + @NonNull Derived<@NonNull String> foo() {} } } diff --git a/compiler/testData/diagnostics/tests/platformTypes/typeEnhancement/returnTypeDifferentConstructor.txt b/compiler/testData/foreignAnnotationsJava8/tests/typeEnhancement/returnTypeDifferentConstructor.txt similarity index 82% rename from compiler/testData/diagnostics/tests/platformTypes/typeEnhancement/returnTypeDifferentConstructor.txt rename to compiler/testData/foreignAnnotationsJava8/tests/typeEnhancement/returnTypeDifferentConstructor.txt index 8e3502dd9c0..d76f55a97ee 100644 --- a/compiler/testData/diagnostics/tests/platformTypes/typeEnhancement/returnTypeDifferentConstructor.txt +++ b/compiler/testData/foreignAnnotationsJava8/tests/typeEnhancement/returnTypeDifferentConstructor.txt @@ -9,7 +9,7 @@ public/*package*/ open class Outer { public/*package*/ open inner class A { public/*package*/ constructor A() public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean - @org.jetbrains.annotations.Nullable() public/*package*/ open fun foo(): Base? + @org.checkerframework.checker.nullness.qual.Nullable() public/*package*/ open fun foo(): Base? public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String } @@ -25,7 +25,7 @@ public/*package*/ open class Outer { public/*package*/ open inner class C : Outer.A { public/*package*/ constructor C() public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean - @java.lang.Override() @org.jetbrains.annotations.NotNull() public/*package*/ open override /*1*/ fun foo(): Base + @java.lang.Override() @org.checkerframework.checker.nullness.qual.NonNull() public/*package*/ open override /*1*/ fun foo(): Base public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String } @@ -41,7 +41,7 @@ public/*package*/ open class Outer { public/*package*/ open inner class E : Outer.A { public/*package*/ constructor E() public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean - @java.lang.Override() @org.jetbrains.annotations.NotNull() public/*package*/ open override /*1*/ fun foo(): Derived + @java.lang.Override() @org.checkerframework.checker.nullness.qual.NonNull() public/*package*/ open override /*1*/ fun foo(): Derived public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String } @@ -49,7 +49,7 @@ public/*package*/ open class Outer { public/*package*/ open inner class F : Outer.A { public/*package*/ constructor F() public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean - @java.lang.Override() @org.jetbrains.annotations.NotNull() public/*package*/ open override /*1*/ fun foo(): Derived + @java.lang.Override() @org.checkerframework.checker.nullness.qual.NonNull() public/*package*/ open override /*1*/ fun foo(): Derived public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String } diff --git a/compiler/testData/diagnostics/tests/platformTypes/typeEnhancement/returnTypeOverrideInKotlin.kt b/compiler/testData/foreignAnnotationsJava8/tests/typeEnhancement/returnTypeOverrideInKotlin.kt similarity index 82% rename from compiler/testData/diagnostics/tests/platformTypes/typeEnhancement/returnTypeOverrideInKotlin.kt rename to compiler/testData/foreignAnnotationsJava8/tests/typeEnhancement/returnTypeOverrideInKotlin.kt index a010f31db7c..03b8d921217 100644 --- a/compiler/testData/diagnostics/tests/platformTypes/typeEnhancement/returnTypeOverrideInKotlin.kt +++ b/compiler/testData/foreignAnnotationsJava8/tests/typeEnhancement/returnTypeOverrideInKotlin.kt @@ -1,9 +1,9 @@ // FILE: A.java -import org.jetbrains.annotations.*; +import org.checkerframework.checker.nullness.qual.* public class A { - @Nullable Base<@NotNull String> foo() { return null; } + @Nullable Base<@NonNull String> foo() { return null; } } // FILE: a.kt diff --git a/compiler/testData/diagnostics/tests/platformTypes/typeEnhancement/returnTypeOverrideInKotlin.txt b/compiler/testData/foreignAnnotationsJava8/tests/typeEnhancement/returnTypeOverrideInKotlin.txt similarity index 95% rename from compiler/testData/diagnostics/tests/platformTypes/typeEnhancement/returnTypeOverrideInKotlin.txt rename to compiler/testData/foreignAnnotationsJava8/tests/typeEnhancement/returnTypeOverrideInKotlin.txt index 63c9b7c8be6..8cde7cb109a 100644 --- a/compiler/testData/diagnostics/tests/platformTypes/typeEnhancement/returnTypeOverrideInKotlin.txt +++ b/compiler/testData/foreignAnnotationsJava8/tests/typeEnhancement/returnTypeOverrideInKotlin.txt @@ -6,7 +6,7 @@ public fun bar2(): Derived public open class A { public constructor A() public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean - @org.jetbrains.annotations.Nullable() public/*package*/ open fun foo(): Base? + @org.checkerframework.checker.nullness.qual.Nullable() public/*package*/ open fun foo(): Base? public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String } diff --git a/compiler/testData/foreignAnnotationsJava8/tests/typeEnhancement/simple.kt b/compiler/testData/foreignAnnotationsJava8/tests/typeEnhancement/simple.kt new file mode 100644 index 00000000000..46bded8f1d4 --- /dev/null +++ b/compiler/testData/foreignAnnotationsJava8/tests/typeEnhancement/simple.kt @@ -0,0 +1,8 @@ +// FILE: A.java + +import org.checkerframework.checker.nullness.qual.*; +import java.util.*; + +class A { + List<@NonNull String> foo() {} +} diff --git a/compiler/testData/foreignAnnotationsJava8/tests/typeEnhancement/simple.txt b/compiler/testData/foreignAnnotationsJava8/tests/typeEnhancement/simple.txt new file mode 100644 index 00000000000..339e6b9a0c3 --- /dev/null +++ b/compiler/testData/foreignAnnotationsJava8/tests/typeEnhancement/simple.txt @@ -0,0 +1,9 @@ +package + +public/*package*/ open class A { + public/*package*/ constructor A() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public/*package*/ open fun foo(): kotlin.collections.(Mutable)List! + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/AbstractForeignAnnotationsTest.kt b/compiler/tests/org/jetbrains/kotlin/checkers/AbstractForeignAnnotationsTest.kt index 46050fb6890..ebfc2919f69 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/AbstractForeignAnnotationsTest.kt +++ b/compiler/tests/org/jetbrains/kotlin/checkers/AbstractForeignAnnotationsTest.kt @@ -19,7 +19,7 @@ package org.jetbrains.kotlin.checkers import org.jetbrains.kotlin.test.MockLibraryUtil import java.io.File -abstract class AbstractForeignAnnotationsTest : AbstractDiagnosticsTest() { +abstract class AbstractForeignAnnotationsTest : AbstractDiagnosticsWithFullJdkTest() { override fun getExtraClasspath(): List { return listOf(MockLibraryUtil.compileLibraryToJar( annotationsPath, diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java index 4add9c1fcfb..48ecfb1eeb5 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java @@ -13028,36 +13028,12 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest { KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/diagnostics/tests/platformTypes/typeEnhancement"), Pattern.compile("^(.+)\\.kt$"), true); } - @TestMetadata("annotatedTypeArguments.kt") - public void testAnnotatedTypeArguments() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/platformTypes/typeEnhancement/annotatedTypeArguments.kt"); - doTest(fileName); - } - - @TestMetadata("methodWithTypeParameter.kt") - public void testMethodWithTypeParameter() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/platformTypes/typeEnhancement/methodWithTypeParameter.kt"); - doTest(fileName); - } - @TestMetadata("overriddenExtensions.kt") public void testOverriddenExtensions() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/platformTypes/typeEnhancement/overriddenExtensions.kt"); doTest(fileName); } - @TestMetadata("returnTypeDifferentConstructor.kt") - public void testReturnTypeDifferentConstructor() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/platformTypes/typeEnhancement/returnTypeDifferentConstructor.kt"); - doTest(fileName); - } - - @TestMetadata("returnTypeOverrideInKotlin.kt") - public void testReturnTypeOverrideInKotlin() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/platformTypes/typeEnhancement/returnTypeOverrideInKotlin.kt"); - doTest(fileName); - } - @TestMetadata("saveAnnotationAfterSubstitution.kt") public void testSaveAnnotationAfterSubstitution() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/platformTypes/typeEnhancement/saveAnnotationAfterSubstitution.kt");