diff --git a/analysis/low-level-api-fir/testdata/classId/classWithMembers.kts b/analysis/low-level-api-fir/testdata/classId/classWithMembers.kts new file mode 100644 index 00000000000..2729a60fc24 --- /dev/null +++ b/analysis/low-level-api-fir/testdata/classId/classWithMembers.kts @@ -0,0 +1,26 @@ +/* ClassId: /TopLevelObject */object TopLevelObject + +/* ClassId: /A */class A constructor(a: Int) { + /* ClassId: /A.B */class B { + /* ClassId: /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: /A.NestedTypeAlias */typealias NestedTypeAlias = B +} + +/* ClassId: /TopLevelAlias */typealias TopLevelAlias + +foo { + /* ClassId: null */class E +} diff --git a/analysis/low-level-api-fir/testdata/classId/classWithMembersWithPackage.kts b/analysis/low-level-api-fir/testdata/classId/classWithMembersWithPackage.kts new file mode 100644 index 00000000000..a0b802e7a60 --- /dev/null +++ b/analysis/low-level-api-fir/testdata/classId/classWithMembersWithPackage.kts @@ -0,0 +1,28 @@ +package one.two + +/* ClassId: one/two/TopLevelObject */object TopLevelObject + +/* ClassId: one/two/A */class A constructor(a: Int) { + /* ClassId: one/two/A.B */class B { + /* ClassId: one/two/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/two/A.NestedTypeAlias */typealias NestedTypeAlias = B +} + +/* ClassId: one/two/TopLevelAlias */typealias TopLevelAlias + +foo { + /* ClassId: null */class E +} 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 index 08ab079e473..7335ac722aa 100644 --- 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 @@ -9,24 +9,18 @@ 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.AnalysisApiFirScriptTestConfigurator 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() { @@ -46,6 +40,14 @@ abstract class AbstractClassIdTest : AbstractLowLevelApiSingleFileTest() { }) } - testServices.assertions.assertEqualsToTestDataFileSibling(text, ".kt") + testServices.assertions.assertEqualsToTestDataFileSibling(text, ktFile.name.substringAfterLast('.')) } } + +abstract class AbstractSourceClassIdTest : AbstractClassIdTest() { + override val configurator: AnalysisApiTestConfigurator = AnalysisApiFirSourceTestConfigurator(analyseInDependentSession = false) +} + +abstract class AbstractScriptClassIdTest : AbstractClassIdTest() { + override val configurator: AnalysisApiTestConfigurator get() = AnalysisApiFirScriptTestConfigurator +} \ No newline at end of file diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/ScriptClassIdTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/ScriptClassIdTestGenerated.java new file mode 100644 index 00000000000..940ef7753e5 --- /dev/null +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/ScriptClassIdTestGenerated.java @@ -0,0 +1,38 @@ +/* + * 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 ScriptClassIdTestGenerated extends AbstractScriptClassIdTest { + @Test + public void testAllFilesPresentInClassId() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/low-level-api-fir/testdata/classId"), Pattern.compile("^(.+)\\.(kts)$"), null, true); + } + + @Test + @TestMetadata("classWithMembers.kts") + public void testClassWithMembers() throws Exception { + runTest("analysis/low-level-api-fir/testdata/classId/classWithMembers.kts"); + } + + @Test + @TestMetadata("classWithMembersWithPackage.kts") + public void testClassWithMembersWithPackage() throws Exception { + runTest("analysis/low-level-api-fir/testdata/classId/classWithMembersWithPackage.kts"); + } +} 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/SourceClassIdTestGenerated.java similarity index 93% rename from analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/ClassIdTestGenerated.java rename to analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/SourceClassIdTestGenerated.java index d5f8d428a73..e87fd9a3104 100644 --- 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/SourceClassIdTestGenerated.java @@ -18,10 +18,10 @@ import java.util.regex.Pattern; @SuppressWarnings("all") @TestMetadata("analysis/low-level-api-fir/testdata/classId") @TestDataPath("$PROJECT_ROOT") -public class ClassIdTestGenerated extends AbstractClassIdTest { +public class SourceClassIdTestGenerated extends AbstractSourceClassIdTest { @Test public void testAllFilesPresentInClassId() throws Exception { - KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/low-level-api-fir/testdata/classId"), Pattern.compile("^(.+)\\.kt$"), null, true); + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/low-level-api-fir/testdata/classId"), Pattern.compile("^(.+)\\.(kt)$"), null, true); } @Test 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 a696b219747..d3fe4943e5f 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 @@ -127,8 +127,12 @@ internal fun TestGroupSuite.generateFirLowLevelApiTests() { model("nonLocalDeclarationAnchors") } - testClass { - model("classId") + testClass { + model("classId", pattern = TestGeneratorUtil.KT) + } + + testClass { + model("classId", pattern = TestGeneratorUtil.KTS) } testClass { diff --git a/generators/test-generator/tests/org/jetbrains/kotlin/generators/util/TestGeneratorUtil.kt b/generators/test-generator/tests/org/jetbrains/kotlin/generators/util/TestGeneratorUtil.kt index ea7e93100a5..8c2a166d12b 100644 --- a/generators/test-generator/tests/org/jetbrains/kotlin/generators/util/TestGeneratorUtil.kt +++ b/generators/test-generator/tests/org/jetbrains/kotlin/generators/util/TestGeneratorUtil.kt @@ -11,6 +11,7 @@ import java.lang.StringBuilder object TestGeneratorUtil { @Language("RegExp") const val KT_OR_KTS = """^(.+)\.(kt|kts)$""" @Language("RegExp") const val KT = """^(.+)\.(kt)$""" + @Language("RegExp") const val KTS = """^(.+)\.(kts)$""" @Language("RegExp") const val KT_OR_KTS_WITHOUT_DOTS_IN_NAME = """^([^.]+)\.(kt|kts)$""" @Language("RegExp") const val KT_WITHOUT_DOTS_IN_NAME = """^([^.]+)\.kt$"""