diff --git a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/AbstractPsiTypeProviderTest.kt b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/AbstractPsiTypeProviderTest.kt new file mode 100644 index 00000000000..edf911eee97 --- /dev/null +++ b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/AbstractPsiTypeProviderTest.kt @@ -0,0 +1,34 @@ +/* + * Copyright 2010-2021 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.api.fir.components + +import org.jetbrains.kotlin.analysis.api.analyse +import org.jetbrains.kotlin.analysis.api.fir.test.framework.AbstractHLApiSingleModuleTest +import org.jetbrains.kotlin.analysis.low.level.api.fir.test.base.expressionMarkerProvider +import org.jetbrains.kotlin.psi.KtDeclaration +import org.jetbrains.kotlin.psi.KtFile +import org.jetbrains.kotlin.test.model.TestModule +import org.jetbrains.kotlin.test.services.TestServices +import org.jetbrains.kotlin.test.services.assertions + +abstract class AbstractPsiTypeProviderTest : AbstractHLApiSingleModuleTest() { + + override fun doTestByFileStructure(ktFiles: List, module: TestModule, testServices: TestServices) { + val mainKtFile = ktFiles.singleOrNull() ?: ktFiles.first { it.name == "main.kt" } + val declaration = testServices.expressionMarkerProvider.getElementOfTypAtCaret(mainKtFile) + val actual = buildString { + executeOnPooledThreadInReadAction { + analyse(declaration) { + val ktType = declaration.getReturnKtType() + appendLine("KtType: ${ktType.render()}") + appendLine("PsiType: ${ktType.asPsiType(declaration)}") + } + } + } + testServices.assertions.assertEqualsToFile(testDataFileSibling(".txt"), actual) + } + +} diff --git a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/PsiTypeProviderTestGenerated.java b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/PsiTypeProviderTestGenerated.java new file mode 100644 index 00000000000..32b752421c5 --- /dev/null +++ b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/PsiTypeProviderTestGenerated.java @@ -0,0 +1,68 @@ +/* + * Copyright 2010-2021 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.api.fir.components; + +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 GenerateNewCompilerTests.kt}. DO NOT MODIFY MANUALLY */ +@SuppressWarnings("all") +@TestMetadata("analysis/analysis-api/testData/components/psiTypeProvider") +@TestDataPath("$PROJECT_ROOT") +public class PsiTypeProviderTestGenerated extends AbstractPsiTypeProviderTest { + @Test + public void testAllFilesPresentInPsiTypeProvider() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/psiTypeProvider"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("anonymousObject_exposedAsReturnValue.kt") + public void testAnonymousObject_exposedAsReturnValue() throws Exception { + runTest("analysis/analysis-api/testData/components/psiTypeProvider/anonymousObject_exposedAsReturnValue.kt"); + } + + @Test + @TestMetadata("localClass_exposedAsReturnValue.kt") + public void testLocalClass_exposedAsReturnValue() throws Exception { + runTest("analysis/analysis-api/testData/components/psiTypeProvider/localClass_exposedAsReturnValue.kt"); + } + + @Test + @TestMetadata("localClass_exposedAsReturnValue_privateFunction.kt") + public void testLocalClass_exposedAsReturnValue_privateFunction() throws Exception { + runTest("analysis/analysis-api/testData/components/psiTypeProvider/localClass_exposedAsReturnValue_privateFunction.kt"); + } + + @Test + @TestMetadata("localClass_localFunctionInSameScope.kt") + public void testLocalClass_localFunctionInSameScope() throws Exception { + runTest("analysis/analysis-api/testData/components/psiTypeProvider/localClass_localFunctionInSameScope.kt"); + } + + @Test + @TestMetadata("localClass_localPropertyInSameScope.kt") + public void testLocalClass_localPropertyInSameScope() throws Exception { + runTest("analysis/analysis-api/testData/components/psiTypeProvider/localClass_localPropertyInSameScope.kt"); + } + + @Test + @TestMetadata("localClass_localPropertyInSampeScope_functionalType.kt") + public void testLocalClass_localPropertyInSampeScope_functionalType() throws Exception { + runTest("analysis/analysis-api/testData/components/psiTypeProvider/localClass_localPropertyInSampeScope_functionalType.kt"); + } + + @Test + @TestMetadata("localClass_memberFunction.kt") + public void testLocalClass_memberFunction() throws Exception { + runTest("analysis/analysis-api/testData/components/psiTypeProvider/localClass_memberFunction.kt"); + } +} diff --git a/analysis/analysis-api/testData/components/psiTypeProvider/anonymousObject_exposedAsReturnValue.kt b/analysis/analysis-api/testData/components/psiTypeProvider/anonymousObject_exposedAsReturnValue.kt new file mode 100644 index 00000000000..01ddda58b1d --- /dev/null +++ b/analysis/analysis-api/testData/components/psiTypeProvider/anonymousObject_exposedAsReturnValue.kt @@ -0,0 +1,3 @@ +fun foo() = object : Runnable { + override fun run() {} +} diff --git a/analysis/analysis-api/testData/components/psiTypeProvider/anonymousObject_exposedAsReturnValue.txt b/analysis/analysis-api/testData/components/psiTypeProvider/anonymousObject_exposedAsReturnValue.txt new file mode 100644 index 00000000000..0c81ab3bca7 --- /dev/null +++ b/analysis/analysis-api/testData/components/psiTypeProvider/anonymousObject_exposedAsReturnValue.txt @@ -0,0 +1,2 @@ +KtType: java.lang.Runnable +PsiType: PsiType:Runnable diff --git a/analysis/analysis-api/testData/components/psiTypeProvider/localClass_exposedAsReturnValue.kt b/analysis/analysis-api/testData/components/psiTypeProvider/localClass_exposedAsReturnValue.kt new file mode 100644 index 00000000000..52dbdc4ca49 --- /dev/null +++ b/analysis/analysis-api/testData/components/psiTypeProvider/localClass_exposedAsReturnValue.kt @@ -0,0 +1,6 @@ +fun foo(): Runnable { + class Local : Runnable { + override fun run() {} + } + return Local() +} diff --git a/analysis/analysis-api/testData/components/psiTypeProvider/localClass_exposedAsReturnValue.txt b/analysis/analysis-api/testData/components/psiTypeProvider/localClass_exposedAsReturnValue.txt new file mode 100644 index 00000000000..0c81ab3bca7 --- /dev/null +++ b/analysis/analysis-api/testData/components/psiTypeProvider/localClass_exposedAsReturnValue.txt @@ -0,0 +1,2 @@ +KtType: java.lang.Runnable +PsiType: PsiType:Runnable diff --git a/analysis/analysis-api/testData/components/psiTypeProvider/localClass_exposedAsReturnValue_privateFunction.kt b/analysis/analysis-api/testData/components/psiTypeProvider/localClass_exposedAsReturnValue_privateFunction.kt new file mode 100644 index 00000000000..af1d319a766 --- /dev/null +++ b/analysis/analysis-api/testData/components/psiTypeProvider/localClass_exposedAsReturnValue_privateFunction.kt @@ -0,0 +1,8 @@ +private fun foo() = run { + class Local { + fun bar(): Local { + return this + } + } + val p = Local().bar() +} diff --git a/analysis/analysis-api/testData/components/psiTypeProvider/localClass_exposedAsReturnValue_privateFunction.txt b/analysis/analysis-api/testData/components/psiTypeProvider/localClass_exposedAsReturnValue_privateFunction.txt new file mode 100644 index 00000000000..f52a9f37b60 --- /dev/null +++ b/analysis/analysis-api/testData/components/psiTypeProvider/localClass_exposedAsReturnValue_privateFunction.txt @@ -0,0 +1,2 @@ +KtType: kotlin.Unit +PsiType: PsiType:Unit diff --git a/analysis/analysis-api/testData/components/psiTypeProvider/localClass_localFunctionInSameScope.kt b/analysis/analysis-api/testData/components/psiTypeProvider/localClass_localFunctionInSameScope.kt new file mode 100644 index 00000000000..656b2af08ec --- /dev/null +++ b/analysis/analysis-api/testData/components/psiTypeProvider/localClass_localFunctionInSameScope.kt @@ -0,0 +1,5 @@ +fun foo() { + class Local { + } + fun bar() = Local() +} diff --git a/analysis/analysis-api/testData/components/psiTypeProvider/localClass_localFunctionInSameScope.txt b/analysis/analysis-api/testData/components/psiTypeProvider/localClass_localFunctionInSameScope.txt new file mode 100644 index 00000000000..931753ae243 --- /dev/null +++ b/analysis/analysis-api/testData/components/psiTypeProvider/localClass_localFunctionInSameScope.txt @@ -0,0 +1,2 @@ +KtType: Local +PsiType: PsiType:Object diff --git a/analysis/analysis-api/testData/components/psiTypeProvider/localClass_localPropertyInSameScope.kt b/analysis/analysis-api/testData/components/psiTypeProvider/localClass_localPropertyInSameScope.kt new file mode 100644 index 00000000000..8eb06a2d83e --- /dev/null +++ b/analysis/analysis-api/testData/components/psiTypeProvider/localClass_localPropertyInSameScope.kt @@ -0,0 +1,8 @@ +fun foo() = run { + class Local { + fun bar(): Local { + return this + } + } + val p = Local().bar() +} diff --git a/analysis/analysis-api/testData/components/psiTypeProvider/localClass_localPropertyInSameScope.txt b/analysis/analysis-api/testData/components/psiTypeProvider/localClass_localPropertyInSameScope.txt new file mode 100644 index 00000000000..931753ae243 --- /dev/null +++ b/analysis/analysis-api/testData/components/psiTypeProvider/localClass_localPropertyInSameScope.txt @@ -0,0 +1,2 @@ +KtType: Local +PsiType: PsiType:Object diff --git a/analysis/analysis-api/testData/components/psiTypeProvider/localClass_localPropertyInSampeScope_functionalType.kt b/analysis/analysis-api/testData/components/psiTypeProvider/localClass_localPropertyInSampeScope_functionalType.kt new file mode 100644 index 00000000000..9fbca97ba30 --- /dev/null +++ b/analysis/analysis-api/testData/components/psiTypeProvider/localClass_localPropertyInSampeScope_functionalType.kt @@ -0,0 +1,7 @@ +fun foo() { + class Local { + } + val a = fun (): Local { + return Local() + } +} diff --git a/analysis/analysis-api/testData/components/psiTypeProvider/localClass_localPropertyInSampeScope_functionalType.txt b/analysis/analysis-api/testData/components/psiTypeProvider/localClass_localPropertyInSampeScope_functionalType.txt new file mode 100644 index 00000000000..5ea0abe1e41 --- /dev/null +++ b/analysis/analysis-api/testData/components/psiTypeProvider/localClass_localPropertyInSampeScope_functionalType.txt @@ -0,0 +1,2 @@ +KtType: () -> Local +PsiType: PsiType:Function0 diff --git a/analysis/analysis-api/testData/components/psiTypeProvider/localClass_memberFunction.kt b/analysis/analysis-api/testData/components/psiTypeProvider/localClass_memberFunction.kt new file mode 100644 index 00000000000..7b6bdce3497 --- /dev/null +++ b/analysis/analysis-api/testData/components/psiTypeProvider/localClass_memberFunction.kt @@ -0,0 +1,8 @@ +fun foo() { + class Local { + fun bar(): Local { + return this + } + } + val a = Local().bar() +} diff --git a/analysis/analysis-api/testData/components/psiTypeProvider/localClass_memberFunction.txt b/analysis/analysis-api/testData/components/psiTypeProvider/localClass_memberFunction.txt new file mode 100644 index 00000000000..931753ae243 --- /dev/null +++ b/analysis/analysis-api/testData/components/psiTypeProvider/localClass_memberFunction.txt @@ -0,0 +1,2 @@ +KtType: Local +PsiType: PsiType:Object diff --git a/generators/analysis-api-generator/tests/org/jetbrains/kotlin/generators/tests/analysis/api/GenerateAnalysisApiTests.kt b/generators/analysis-api-generator/tests/org/jetbrains/kotlin/generators/tests/analysis/api/GenerateAnalysisApiTests.kt index ae3e1cb4c7f..3e9b9696b74 100644 --- a/generators/analysis-api-generator/tests/org/jetbrains/kotlin/generators/tests/analysis/api/GenerateAnalysisApiTests.kt +++ b/generators/analysis-api-generator/tests/org/jetbrains/kotlin/generators/tests/analysis/api/GenerateAnalysisApiTests.kt @@ -99,6 +99,10 @@ fun main(args: Array) { testClass { model("components/getSuperTypes") } + + testClass { + model("components/psiTypeProvider") + } } testGroup("analysis/analysis-api-fe10/tests", "analysis/analysis-api/testData") {