From cb2dbca0c39b455e7f8760d99955a744d922ba21 Mon Sep 17 00:00:00 2001 From: Victor Petukhov Date: Tue, 5 Jul 2022 14:46:50 +0200 Subject: [PATCH] [FE 1.0] Support loading rxjava3 nullability annotations on bounded wildcards ^KT-53041 Fixed --- .../FirBlackBoxCodegenTestGenerated.java | 26 ++++++++++++++++ .../foreignAnnotationsTests/tests/kt53041.kt | 27 ++++++++++++++++ .../codegen/BlackBoxCodegenTestGenerated.java | 26 ++++++++++++++++ .../IrBlackBoxCodegenTestGenerated.java | 26 ++++++++++++++++ .../LightAnalysisModeTestGenerated.java | 31 +++++++++++++++++++ .../java/JavaNullabilityAnnotationSettings.kt | 10 +++++- .../load/java/lazy/types/JavaTypeResolver.kt | 11 +++++-- .../org/jetbrains/kotlin/load/java/utils.kt | 10 ++++++ .../js/test/JsCodegenBoxTestGenerated.java | 26 ++++++++++++++++ .../test/ir/IrJsCodegenBoxTestGenerated.java | 26 ++++++++++++++++ .../IrCodegenBoxWasmTestGenerated.java | 31 +++++++++++++++++++ .../NativeCodegenBoxTestGenerated.java | 30 ++++++++++++++++++ 12 files changed, 277 insertions(+), 3 deletions(-) create mode 100644 compiler/testData/codegen/box/javaInterop/foreignAnnotationsTests/tests/kt53041.kt diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java index ad9638c99aa..f77b2e2165a 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java @@ -27847,6 +27847,32 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/javaInterop/unresolvedJavaClassInDifferentFile.kt"); } + @Nested + @TestMetadata("compiler/testData/codegen/box/javaInterop/foreignAnnotationsTests") + @TestDataPath("$PROJECT_ROOT") + public class ForeignAnnotationsTests { + @Test + public void testAllFilesPresentInForeignAnnotationsTests() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/javaInterop/foreignAnnotationsTests"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JVM_IR, true); + } + + @Nested + @TestMetadata("compiler/testData/codegen/box/javaInterop/foreignAnnotationsTests/tests") + @TestDataPath("$PROJECT_ROOT") + public class Tests { + @Test + public void testAllFilesPresentInTests() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/javaInterop/foreignAnnotationsTests/tests"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JVM_IR, true); + } + + @Test + @TestMetadata("kt53041.kt") + public void testKt53041() throws Exception { + runTest("compiler/testData/codegen/box/javaInterop/foreignAnnotationsTests/tests/kt53041.kt"); + } + } + } + @Nested @TestMetadata("compiler/testData/codegen/box/javaInterop/generics") @TestDataPath("$PROJECT_ROOT") diff --git a/compiler/testData/codegen/box/javaInterop/foreignAnnotationsTests/tests/kt53041.kt b/compiler/testData/codegen/box/javaInterop/foreignAnnotationsTests/tests/kt53041.kt new file mode 100644 index 00000000000..9fcb9225c22 --- /dev/null +++ b/compiler/testData/codegen/box/javaInterop/foreignAnnotationsTests/tests/kt53041.kt @@ -0,0 +1,27 @@ +// FIR_IDENTICAL +// JVM_TARGET: 1.8 +// NULLABILITY_ANNOTATIONS: @io.reactivex.rxjava3.annotations:strict +// IGNORE_LIGHT_ANALYSIS + +// FILE: MyBiConsumer.java +import io.reactivex.rxjava3.annotations.NonNull; + +@FunctionalInterface +public interface MyBiConsumer<@NonNull T> { + void accept(T t); +} + +// FILE: MyMaybe.java +import io.reactivex.rxjava3.annotations.Nullable; + +public class MyMaybe { + public static void doOnEvent(MyBiConsumer<@Nullable ? super Throwable> onEvent) { + onEvent.accept(null); + } +} + +// FILE: main.kt +fun box(): String { + MyMaybe.doOnEvent { _ -> } + return "OK" +} diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java index 81910298a35..53d078ed79b 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java @@ -27283,6 +27283,32 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/javaInterop/unresolvedJavaClassInDifferentFile.kt"); } + @Nested + @TestMetadata("compiler/testData/codegen/box/javaInterop/foreignAnnotationsTests") + @TestDataPath("$PROJECT_ROOT") + public class ForeignAnnotationsTests { + @Test + public void testAllFilesPresentInForeignAnnotationsTests() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/javaInterop/foreignAnnotationsTests"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JVM, true); + } + + @Nested + @TestMetadata("compiler/testData/codegen/box/javaInterop/foreignAnnotationsTests/tests") + @TestDataPath("$PROJECT_ROOT") + public class Tests { + @Test + public void testAllFilesPresentInTests() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/javaInterop/foreignAnnotationsTests/tests"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JVM, true); + } + + @Test + @TestMetadata("kt53041.kt") + public void testKt53041() throws Exception { + runTest("compiler/testData/codegen/box/javaInterop/foreignAnnotationsTests/tests/kt53041.kt"); + } + } + } + @Nested @TestMetadata("compiler/testData/codegen/box/javaInterop/generics") @TestDataPath("$PROJECT_ROOT") diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java index c000ec4e10c..b5c9a1d68be 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java @@ -27847,6 +27847,32 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/javaInterop/unresolvedJavaClassInDifferentFile.kt"); } + @Nested + @TestMetadata("compiler/testData/codegen/box/javaInterop/foreignAnnotationsTests") + @TestDataPath("$PROJECT_ROOT") + public class ForeignAnnotationsTests { + @Test + public void testAllFilesPresentInForeignAnnotationsTests() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/javaInterop/foreignAnnotationsTests"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JVM_IR, true); + } + + @Nested + @TestMetadata("compiler/testData/codegen/box/javaInterop/foreignAnnotationsTests/tests") + @TestDataPath("$PROJECT_ROOT") + public class Tests { + @Test + public void testAllFilesPresentInTests() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/javaInterop/foreignAnnotationsTests/tests"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JVM_IR, true); + } + + @Test + @TestMetadata("kt53041.kt") + public void testKt53041() throws Exception { + runTest("compiler/testData/codegen/box/javaInterop/foreignAnnotationsTests/tests/kt53041.kt"); + } + } + } + @Nested @TestMetadata("compiler/testData/codegen/box/javaInterop/generics") @TestDataPath("$PROJECT_ROOT") diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index c2a434b0e61..54c7c9796ee 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -23032,6 +23032,37 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/javaInterop/unresolvedJavaClassInDifferentFile.kt"); } + @TestMetadata("compiler/testData/codegen/box/javaInterop/foreignAnnotationsTests") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class ForeignAnnotationsTests extends AbstractLightAnalysisModeTest { + private void runTest(String testDataFilePath) throws Exception { + KotlinTestUtils.runTest(this::doTest, TargetBackend.JVM, testDataFilePath); + } + + public void testAllFilesPresentInForeignAnnotationsTests() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/javaInterop/foreignAnnotationsTests"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JVM, true); + } + + @TestMetadata("compiler/testData/codegen/box/javaInterop/foreignAnnotationsTests/tests") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class Tests extends AbstractLightAnalysisModeTest { + private void runTest(String testDataFilePath) throws Exception { + KotlinTestUtils.runTest(this::doTest, TargetBackend.JVM, testDataFilePath); + } + + public void testAllFilesPresentInTests() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/javaInterop/foreignAnnotationsTests/tests"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JVM, true); + } + + @TestMetadata("kt53041.kt") + public void testKt53041() throws Exception { + runTest("compiler/testData/codegen/box/javaInterop/foreignAnnotationsTests/tests/kt53041.kt"); + } + } + } + @TestMetadata("compiler/testData/codegen/box/javaInterop/generics") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) diff --git a/core/compiler.common.jvm/src/org/jetbrains/kotlin/load/java/JavaNullabilityAnnotationSettings.kt b/core/compiler.common.jvm/src/org/jetbrains/kotlin/load/java/JavaNullabilityAnnotationSettings.kt index 50f88c81f27..6de79bb4c04 100644 --- a/core/compiler.common.jvm/src/org/jetbrains/kotlin/load/java/JavaNullabilityAnnotationSettings.kt +++ b/core/compiler.common.jvm/src/org/jetbrains/kotlin/load/java/JavaNullabilityAnnotationSettings.kt @@ -10,8 +10,16 @@ import org.jetbrains.kotlin.name.findValueForMostSpecificFqname import org.jetbrains.kotlin.storage.LockBasedStorageManager val JSPECIFY_ANNOTATIONS_PACKAGE = FqName("org.jspecify.nullness") +val RXJAVA3_ANNOTATIONS_PACKAGE = FqName("io.reactivex.rxjava3.annotations") val CHECKER_FRAMEWORK_COMPATQUAL_ANNOTATIONS_PACKAGE = FqName("org.checkerframework.checker.nullness.compatqual") +private val RXJAVA3_ANNOTATIONS_PACKAGE_NAME = RXJAVA3_ANNOTATIONS_PACKAGE.asString() + +val RXJAVA3_ANNOTATIONS = arrayOf( + FqName("$RXJAVA3_ANNOTATIONS_PACKAGE_NAME.Nullable"), + FqName("$RXJAVA3_ANNOTATIONS_PACKAGE_NAME.NonNull") +) + val NULLABILITY_ANNOTATION_SETTINGS: NullabilityAnnotationStates = NullabilityAnnotationStatesImpl( mapOf( FqName("org.jetbrains.annotations") to JavaNullabilityAnnotationsStatus.DEFAULT, @@ -39,7 +47,7 @@ val NULLABILITY_ANNOTATION_SETTINGS: NullabilityAnnotationStates RXJAVA3_ANNOTATIONS.any { annotation.fqName == it } } +} diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/JsCodegenBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/JsCodegenBoxTestGenerated.java index 65b68e8821d..cf4b71d8f02 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/JsCodegenBoxTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/JsCodegenBoxTestGenerated.java @@ -21123,6 +21123,32 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/javaInterop"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JS, true); } + @Nested + @TestMetadata("compiler/testData/codegen/box/javaInterop/foreignAnnotationsTests") + @TestDataPath("$PROJECT_ROOT") + public class ForeignAnnotationsTests { + @Test + public void testAllFilesPresentInForeignAnnotationsTests() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/javaInterop/foreignAnnotationsTests"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JS, true); + } + + @Nested + @TestMetadata("compiler/testData/codegen/box/javaInterop/foreignAnnotationsTests/tests") + @TestDataPath("$PROJECT_ROOT") + public class Tests { + @Test + public void testAllFilesPresentInTests() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/javaInterop/foreignAnnotationsTests/tests"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JS, true); + } + + @Test + @TestMetadata("kt53041.kt") + public void testKt53041() throws Exception { + runTest("compiler/testData/codegen/box/javaInterop/foreignAnnotationsTests/tests/kt53041.kt"); + } + } + } + @Nested @TestMetadata("compiler/testData/codegen/box/javaInterop/generics") @TestDataPath("$PROJECT_ROOT") diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsCodegenBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsCodegenBoxTestGenerated.java index 82fc239524f..8da8f6fa43e 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsCodegenBoxTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsCodegenBoxTestGenerated.java @@ -21087,6 +21087,32 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/javaInterop"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JS_IR, true); } + @Nested + @TestMetadata("compiler/testData/codegen/box/javaInterop/foreignAnnotationsTests") + @TestDataPath("$PROJECT_ROOT") + public class ForeignAnnotationsTests { + @Test + public void testAllFilesPresentInForeignAnnotationsTests() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/javaInterop/foreignAnnotationsTests"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JS_IR, true); + } + + @Nested + @TestMetadata("compiler/testData/codegen/box/javaInterop/foreignAnnotationsTests/tests") + @TestDataPath("$PROJECT_ROOT") + public class Tests { + @Test + public void testAllFilesPresentInTests() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/javaInterop/foreignAnnotationsTests/tests"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JS_IR, true); + } + + @Test + @TestMetadata("kt53041.kt") + public void testKt53041() throws Exception { + runTest("compiler/testData/codegen/box/javaInterop/foreignAnnotationsTests/tests/kt53041.kt"); + } + } + } + @Nested @TestMetadata("compiler/testData/codegen/box/javaInterop/generics") @TestDataPath("$PROJECT_ROOT") diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/testOld/wasm/semantics/IrCodegenBoxWasmTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/testOld/wasm/semantics/IrCodegenBoxWasmTestGenerated.java index 5161090cb79..42657aa8b98 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/testOld/wasm/semantics/IrCodegenBoxWasmTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/testOld/wasm/semantics/IrCodegenBoxWasmTestGenerated.java @@ -18710,6 +18710,37 @@ public class IrCodegenBoxWasmTestGenerated extends AbstractIrCodegenBoxWasmTest KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/javaInterop"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.WASM, true); } + @TestMetadata("compiler/testData/codegen/box/javaInterop/foreignAnnotationsTests") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class ForeignAnnotationsTests extends AbstractIrCodegenBoxWasmTest { + private void runTest(String testDataFilePath) throws Exception { + KotlinTestUtils.runTest0(this::doTest, TargetBackend.WASM, testDataFilePath); + } + + public void testAllFilesPresentInForeignAnnotationsTests() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/javaInterop/foreignAnnotationsTests"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.WASM, true); + } + + @TestMetadata("compiler/testData/codegen/box/javaInterop/foreignAnnotationsTests/tests") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class Tests extends AbstractIrCodegenBoxWasmTest { + private void runTest(String testDataFilePath) throws Exception { + KotlinTestUtils.runTest0(this::doTest, TargetBackend.WASM, testDataFilePath); + } + + public void testAllFilesPresentInTests() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/javaInterop/foreignAnnotationsTests/tests"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.WASM, true); + } + + @TestMetadata("kt53041.kt") + public void testKt53041() throws Exception { + runTest("compiler/testData/codegen/box/javaInterop/foreignAnnotationsTests/tests/kt53041.kt"); + } + } + } + @TestMetadata("compiler/testData/codegen/box/javaInterop/generics") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) diff --git a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeCodegenBoxTestGenerated.java b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeCodegenBoxTestGenerated.java index bd86415a3e0..c1d22454f17 100644 --- a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeCodegenBoxTestGenerated.java +++ b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeCodegenBoxTestGenerated.java @@ -23768,6 +23768,36 @@ public class NativeCodegenBoxTestGenerated extends AbstractNativeCodegenBoxTest KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/javaInterop"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.NATIVE, true); } + @Nested + @TestMetadata("compiler/testData/codegen/box/javaInterop/foreignAnnotationsTests") + @TestDataPath("$PROJECT_ROOT") + @Tag("codegen") + @UseExtTestCaseGroupProvider() + public class ForeignAnnotationsTests { + @Test + public void testAllFilesPresentInForeignAnnotationsTests() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/javaInterop/foreignAnnotationsTests"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.NATIVE, true); + } + + @Nested + @TestMetadata("compiler/testData/codegen/box/javaInterop/foreignAnnotationsTests/tests") + @TestDataPath("$PROJECT_ROOT") + @Tag("codegen") + @UseExtTestCaseGroupProvider() + public class Tests { + @Test + public void testAllFilesPresentInTests() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/javaInterop/foreignAnnotationsTests/tests"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.NATIVE, true); + } + + @Test + @TestMetadata("kt53041.kt") + public void testKt53041() throws Exception { + runTest("compiler/testData/codegen/box/javaInterop/foreignAnnotationsTests/tests/kt53041.kt"); + } + } + } + @Nested @TestMetadata("compiler/testData/codegen/box/javaInterop/generics") @TestDataPath("$PROJECT_ROOT")