[FIR-PLUGIN] Add test for supertype modification extension

This commit is contained in:
Dmitriy Novozhilov
2020-06-02 13:18:25 +03:00
parent dae2acca88
commit f2d0d8b422
6 changed files with 104 additions and 4 deletions
@@ -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() {}
}
}
@@ -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<FirTypeRef>
): List<FirResolvedTypeRef> {
return listOf(
buildResolvedTypeRef {
type = newSupertypeClassId.constructClassLikeType(emptyArray(), isNullable = false)
}
)
}
override val key: FirPluginKey
get() = AllOpenPluginKey
override val predicate: DeclarationPredicate = has("C".fqn())
}
@@ -6,14 +6,14 @@
package org.jetbrains.kotlin.fir.plugin package org.jetbrains.kotlin.fir.plugin
import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrar import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrar
import org.jetbrains.kotlin.fir.plugin.generators.AllOpenMemberGenerator import org.jetbrains.kotlin.fir.plugin.generators.*
import org.jetbrains.kotlin.fir.plugin.generators.AllOpenNestedClassGenerator
import org.jetbrains.kotlin.fir.plugin.generators.AllOpenRecursiveNestedClassGenerator
import org.jetbrains.kotlin.fir.plugin.generators.AllOpenTopLevelDeclarationsGenerator
class FirAllOpenComponentRegistrar : FirExtensionRegistrar() { class FirAllOpenComponentRegistrar : FirExtensionRegistrar() {
override fun ExtensionRegistrarContext.configurePlugin() { override fun ExtensionRegistrarContext.configurePlugin() {
+::AllOpenStatusTransformer +::AllOpenStatusTransformer
+::AllOpenSupertypeGenerator
// Declaration generators
+::AllOpenMemberGenerator +::AllOpenMemberGenerator
+::AllOpenNestedClassGenerator +::AllOpenNestedClassGenerator
+::AllOpenAdditionalCheckers +::AllOpenAdditionalCheckers
@@ -0,0 +1,10 @@
import org.jetbrains.kotlin.fir.plugin.C
@C
class A {
class MyNested : NestedClass()
fun test() {
MyNested().foo()
}
}
@@ -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<R|kotlin/Any|>()
}
public final class MyNested : R|org/jetbrains/kotlin/fir/plugin/LibraryClassWithNestedClass.NestedClass| {
public constructor(): R|A.MyNested| {
super<R|ERROR CLASS: Symbol not found, for `NestedClass`|>()
}
}
public final fun test(): R|kotlin/Unit| {
R|/A.MyNested.MyNested|().R|org/jetbrains/kotlin/fir/plugin/LibraryClassWithNestedClass.NestedClass.foo|()
}
}
@@ -101,4 +101,22 @@ public class FirAllOpenDiagnosticTestGenerated extends AbstractFirAllOpenDiagnos
runTest("plugins/fir/fir-plugin-prototype/testData/status/simpleAnnotation.kt"); 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");
}
}
} }