diff --git a/plugins/fir/fir-plugin-prototype/plugin-annotations/src/org/jetbrains/kotlin/fir/plugin/LibraryClassWithNestedClass.kt b/plugins/fir/fir-plugin-prototype/plugin-annotations/src/org/jetbrains/kotlin/fir/plugin/LibraryClassWithNestedClass.kt new file mode 100644 index 00000000000..770926efc4d --- /dev/null +++ b/plugins/fir/fir-plugin-prototype/plugin-annotations/src/org/jetbrains/kotlin/fir/plugin/LibraryClassWithNestedClass.kt @@ -0,0 +1,12 @@ +/* + * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.fir.plugin + +abstract class LibraryClassWithNestedClass { + open class NestedClass { + fun foo() {} + } +} \ No newline at end of file diff --git a/plugins/fir/fir-plugin-prototype/src/org/jetbrains/kotlin/fir/plugin/AllOpenSupertypeGenerator.kt b/plugins/fir/fir-plugin-prototype/src/org/jetbrains/kotlin/fir/plugin/AllOpenSupertypeGenerator.kt new file mode 100644 index 00000000000..779cbfc17d1 --- /dev/null +++ b/plugins/fir/fir-plugin-prototype/src/org/jetbrains/kotlin/fir/plugin/AllOpenSupertypeGenerator.kt @@ -0,0 +1,42 @@ +/* + * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.fir.plugin + +import org.jetbrains.kotlin.fir.FirSession +import org.jetbrains.kotlin.fir.declarations.FirClassLikeDeclaration +import org.jetbrains.kotlin.fir.declarations.FirPluginKey +import org.jetbrains.kotlin.fir.extensions.FirSupertypeGenerationExtension +import org.jetbrains.kotlin.fir.extensions.predicate.DeclarationPredicate +import org.jetbrains.kotlin.fir.extensions.predicate.has +import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef +import org.jetbrains.kotlin.fir.types.FirTypeRef +import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef +import org.jetbrains.kotlin.fir.types.constructClassLikeType +import org.jetbrains.kotlin.name.ClassId +import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.name.Name + +class AllOpenSupertypeGenerator(session: FirSession) : FirSupertypeGenerationExtension(session) { + companion object { + private val newSupertypeClassId = ClassId(FqName("org.jetbrains.kotlin.fir.plugin"), Name.identifier("LibraryClassWithNestedClass")) + } + + override fun computeAdditionalSupertypes( + classLikeDeclaration: FirClassLikeDeclaration<*>, + resolvedSupertypes: List + ): List { + return listOf( + buildResolvedTypeRef { + type = newSupertypeClassId.constructClassLikeType(emptyArray(), isNullable = false) + } + ) + } + + override val key: FirPluginKey + get() = AllOpenPluginKey + + override val predicate: DeclarationPredicate = has("C".fqn()) +} \ No newline at end of file diff --git a/plugins/fir/fir-plugin-prototype/src/org/jetbrains/kotlin/fir/plugin/FirAllOpenComponentRegistrar.kt b/plugins/fir/fir-plugin-prototype/src/org/jetbrains/kotlin/fir/plugin/FirAllOpenComponentRegistrar.kt index 5c776f5affd..df552c39070 100644 --- a/plugins/fir/fir-plugin-prototype/src/org/jetbrains/kotlin/fir/plugin/FirAllOpenComponentRegistrar.kt +++ b/plugins/fir/fir-plugin-prototype/src/org/jetbrains/kotlin/fir/plugin/FirAllOpenComponentRegistrar.kt @@ -6,14 +6,14 @@ package org.jetbrains.kotlin.fir.plugin import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrar -import org.jetbrains.kotlin.fir.plugin.generators.AllOpenMemberGenerator -import org.jetbrains.kotlin.fir.plugin.generators.AllOpenNestedClassGenerator -import org.jetbrains.kotlin.fir.plugin.generators.AllOpenRecursiveNestedClassGenerator -import org.jetbrains.kotlin.fir.plugin.generators.AllOpenTopLevelDeclarationsGenerator +import org.jetbrains.kotlin.fir.plugin.generators.* class FirAllOpenComponentRegistrar : FirExtensionRegistrar() { override fun ExtensionRegistrarContext.configurePlugin() { +::AllOpenStatusTransformer + +::AllOpenSupertypeGenerator + + // Declaration generators +::AllOpenMemberGenerator +::AllOpenNestedClassGenerator +::AllOpenAdditionalCheckers diff --git a/plugins/fir/fir-plugin-prototype/testData/supertypes/simple.kt b/plugins/fir/fir-plugin-prototype/testData/supertypes/simple.kt new file mode 100644 index 00000000000..ecc4a2e34a5 --- /dev/null +++ b/plugins/fir/fir-plugin-prototype/testData/supertypes/simple.kt @@ -0,0 +1,10 @@ +import org.jetbrains.kotlin.fir.plugin.C + +@C +class A { + class MyNested : NestedClass() + + fun test() { + MyNested().foo() + } +} \ No newline at end of file diff --git a/plugins/fir/fir-plugin-prototype/testData/supertypes/simple.txt b/plugins/fir/fir-plugin-prototype/testData/supertypes/simple.txt new file mode 100644 index 00000000000..abcd7654284 --- /dev/null +++ b/plugins/fir/fir-plugin-prototype/testData/supertypes/simple.txt @@ -0,0 +1,18 @@ +FILE: simple.kt + @R|org/jetbrains/kotlin/fir/plugin/C|() public final class A : R|kotlin/Any| { + public constructor(): R|A| { + super() + } + + public final class MyNested : R|org/jetbrains/kotlin/fir/plugin/LibraryClassWithNestedClass.NestedClass| { + public constructor(): R|A.MyNested| { + super() + } + + } + + public final fun test(): R|kotlin/Unit| { + R|/A.MyNested.MyNested|().R|org/jetbrains/kotlin/fir/plugin/LibraryClassWithNestedClass.NestedClass.foo|() + } + + } diff --git a/plugins/fir/fir-plugin-prototype/tests/org/jetbrains/kotlin/fir/plugin/FirAllOpenDiagnosticTestGenerated.java b/plugins/fir/fir-plugin-prototype/tests/org/jetbrains/kotlin/fir/plugin/FirAllOpenDiagnosticTestGenerated.java index e2852caa92f..bbcc55dbc00 100644 --- a/plugins/fir/fir-plugin-prototype/tests/org/jetbrains/kotlin/fir/plugin/FirAllOpenDiagnosticTestGenerated.java +++ b/plugins/fir/fir-plugin-prototype/tests/org/jetbrains/kotlin/fir/plugin/FirAllOpenDiagnosticTestGenerated.java @@ -101,4 +101,22 @@ public class FirAllOpenDiagnosticTestGenerated extends AbstractFirAllOpenDiagnos runTest("plugins/fir/fir-plugin-prototype/testData/status/simpleAnnotation.kt"); } } + + @TestMetadata("plugins/fir/fir-plugin-prototype/testData/supertypes") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class Supertypes extends AbstractFirAllOpenDiagnosticTest { + private void runTest(String testDataFilePath) throws Exception { + KotlinTestUtils.runTest(this::doTest, this, testDataFilePath); + } + + public void testAllFilesPresentInSupertypes() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("plugins/fir/fir-plugin-prototype/testData/supertypes"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @TestMetadata("simple.kt") + public void testSimple() throws Exception { + runTest("plugins/fir/fir-plugin-prototype/testData/supertypes/simple.kt"); + } + } }