diff --git a/analysis/low-level-api-fir/testdata/classId/classWithMembers.kt b/analysis/low-level-api-fir/testdata/classId/classWithMembers.kt new file mode 100644 index 00000000000..38451799295 --- /dev/null +++ b/analysis/low-level-api-fir/testdata/classId/classWithMembers.kt @@ -0,0 +1,24 @@ +package one + +/* ClassId: one/TopLevelObject */object TopLevelObject + +/* ClassId: one/A */class A constructor(a: Int) { + /* ClassId: one/A.B */class B { + /* ClassId: one/A.B.C */inner class C { + fun foo() { + /* ClassId: null */typealias F = C + + /* ClassId: null */class BBA + } + } + } + + fun boo() { + /* ClassId: null */class A + /* ClassId: null */typealias B = A + } + + /* ClassId: one/A.NestedTypeAlias */typealias NestedTypeAlias = B +} + +/* ClassId: one/TopLevelAlias */typealias TopLevelAlias diff --git a/analysis/low-level-api-fir/testdata/classId/localClassInsideFunctionLiteral.kt b/analysis/low-level-api-fir/testdata/classId/localClassInsideFunctionLiteral.kt new file mode 100644 index 00000000000..91b6bf25721 --- /dev/null +++ b/analysis/low-level-api-fir/testdata/classId/localClassInsideFunctionLiteral.kt @@ -0,0 +1,7 @@ +package one + +/* ClassId: one/ClassWithParameter */open class ClassWithParameter(i: () -> Unit) + +/* ClassId: one/TopLevelClass */class TopLevelClass : ClassWithParameter({ + /* ClassId: null */class LocalClass +}) diff --git a/analysis/low-level-api-fir/testdata/classId/localClassInsideLambdaCallInsideStringTemplate.kt b/analysis/low-level-api-fir/testdata/classId/localClassInsideLambdaCallInsideStringTemplate.kt new file mode 100644 index 00000000000..b51b855a571 --- /dev/null +++ b/analysis/low-level-api-fir/testdata/classId/localClassInsideLambdaCallInsideStringTemplate.kt @@ -0,0 +1,10 @@ +package one + +/* ClassId: one/ClassWithParameter */open class ClassWithParameter(s: String) + +/* ClassId: one/TopLevelClass */class TopLevelClass : ClassWithParameter("${ + { + /* ClassId: null */class F + F() + }() +}") diff --git a/analysis/low-level-api-fir/testdata/classId/localClassInsideSuperEntryCall.kt b/analysis/low-level-api-fir/testdata/classId/localClassInsideSuperEntryCall.kt new file mode 100644 index 00000000000..9288fcad8cc --- /dev/null +++ b/analysis/low-level-api-fir/testdata/classId/localClassInsideSuperEntryCall.kt @@ -0,0 +1,11 @@ +package one + +/* ClassId: one/Interface */interface Interface { + fun foo(param: String) +} + +/* ClassId: one/ClassWithParameter */open class ClassWithParameter(i: Interface) + +/* ClassId: one/TopLevelClass */class TopLevelClass : ClassWithParameter(/* ClassId: null */object : Interface { + /* ClassId: null */class NestedClassFromAnonymousObject +}) diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/AbstractClassIdTest.kt b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/AbstractClassIdTest.kt new file mode 100644 index 00000000000..08ab079e473 --- /dev/null +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/AbstractClassIdTest.kt @@ -0,0 +1,51 @@ +/* + * Copyright 2010-2023 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.analysis.low.level.api.fir + +import com.intellij.psi.PsiComment +import com.intellij.psi.PsiElement +import com.intellij.psi.PsiElementVisitor +import com.intellij.psi.impl.source.tree.LeafPsiElement +import org.jetbrains.kotlin.analysis.low.level.api.fir.element.builder.getNonLocalContainingOrThisDeclaration +import org.jetbrains.kotlin.analysis.low.level.api.fir.test.base.AbstractLowLevelApiSingleFileTest +import org.jetbrains.kotlin.analysis.low.level.api.fir.test.configurators.AnalysisApiFirSourceTestConfigurator +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfigurator +import org.jetbrains.kotlin.name.ClassId +import org.jetbrains.kotlin.psi.KtClassLikeDeclaration +import org.jetbrains.kotlin.psi.KtDeclaration +import org.jetbrains.kotlin.psi.KtFile +import org.jetbrains.kotlin.psi.psiUtil.forEachDescendantOfType +import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder +import org.jetbrains.kotlin.test.directives.ConfigurationDirectives +import org.jetbrains.kotlin.test.services.TestModuleStructure +import org.jetbrains.kotlin.test.services.TestServices +import org.jetbrains.kotlin.test.services.assertions + +abstract class AbstractClassIdTest : AbstractLowLevelApiSingleFileTest() { + override val configurator: AnalysisApiTestConfigurator = AnalysisApiFirSourceTestConfigurator(analyseInDependentSession = false) + + override fun doTestByFileStructure(ktFile: KtFile, moduleStructure: TestModuleStructure, testServices: TestServices) { + val text = buildString { + ktFile.accept(object : PsiElementVisitor() { + override fun visitElement(element: PsiElement) { + if (element is KtClassLikeDeclaration) { + append("/* ClassId: ${element.getClassId()} */") + } + + if (element is LeafPsiElement) { + append(element.text) + } + + element.acceptChildren(this) + } + + override fun visitComment(comment: PsiComment) {} + }) + } + + testServices.assertions.assertEqualsToTestDataFileSibling(text, ".kt") + } +} diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/ClassIdTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/ClassIdTestGenerated.java new file mode 100644 index 00000000000..d5f8d428a73 --- /dev/null +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/ClassIdTestGenerated.java @@ -0,0 +1,50 @@ +/* + * Copyright 2010-2023 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.analysis.low.level.api.fir; + +import com.intellij.testFramework.TestDataPath; +import org.jetbrains.kotlin.test.util.KtTestUtil; +import org.jetbrains.kotlin.test.TestMetadata; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +import java.io.File; +import java.util.regex.Pattern; + +/** This class is generated by {@link org.jetbrains.kotlin.generators.tests.analysis.api.GenerateAnalysisApiTestsKt}. DO NOT MODIFY MANUALLY */ +@SuppressWarnings("all") +@TestMetadata("analysis/low-level-api-fir/testdata/classId") +@TestDataPath("$PROJECT_ROOT") +public class ClassIdTestGenerated extends AbstractClassIdTest { + @Test + public void testAllFilesPresentInClassId() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/low-level-api-fir/testdata/classId"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("classWithMembers.kt") + public void testClassWithMembers() throws Exception { + runTest("analysis/low-level-api-fir/testdata/classId/classWithMembers.kt"); + } + + @Test + @TestMetadata("localClassInsideFunctionLiteral.kt") + public void testLocalClassInsideFunctionLiteral() throws Exception { + runTest("analysis/low-level-api-fir/testdata/classId/localClassInsideFunctionLiteral.kt"); + } + + @Test + @TestMetadata("localClassInsideLambdaCallInsideStringTemplate.kt") + public void testLocalClassInsideLambdaCallInsideStringTemplate() throws Exception { + runTest("analysis/low-level-api-fir/testdata/classId/localClassInsideLambdaCallInsideStringTemplate.kt"); + } + + @Test + @TestMetadata("localClassInsideSuperEntryCall.kt") + public void testLocalClassInsideSuperEntryCall() throws Exception { + runTest("analysis/low-level-api-fir/testdata/classId/localClassInsideSuperEntryCall.kt"); + } +} diff --git a/generators/analysis-api-generator/tests/org/jetbrains/kotlin/generators/tests/analysis/api/firLowLevel.kt b/generators/analysis-api-generator/tests/org/jetbrains/kotlin/generators/tests/analysis/api/firLowLevel.kt index 62be9df298e..119e02d1661 100644 --- a/generators/analysis-api-generator/tests/org/jetbrains/kotlin/generators/tests/analysis/api/firLowLevel.kt +++ b/generators/analysis-api-generator/tests/org/jetbrains/kotlin/generators/tests/analysis/api/firLowLevel.kt @@ -111,6 +111,10 @@ internal fun TestGroupSuite.generateFirLowLevelApiTests() { testClass { model("nonLocalDeclarationAnchors") } + + testClass { + model("classId") + } } testGroup(