diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/KtFe10AnalysisSession.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/KtFe10AnalysisSession.kt index 8dc76346d9c..0a889c09898 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/KtFe10AnalysisSession.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/KtFe10AnalysisSession.kt @@ -9,9 +9,9 @@ import org.jetbrains.kotlin.analysis.api.KtAnalysisSession import org.jetbrains.kotlin.analysis.api.components.* import org.jetbrains.kotlin.analysis.api.descriptors.components.* import org.jetbrains.kotlin.analysis.api.impl.base.components.KtAnalysisScopeProviderImpl -import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolProvider import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion +import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolProvider import org.jetbrains.kotlin.analysis.project.structure.KtModule import org.jetbrains.kotlin.analysis.project.structure.getKtModule import org.jetbrains.kotlin.psi.KtElement @@ -58,6 +58,7 @@ class KtFe10AnalysisSession( override val referenceResolveProviderImpl: KtReferenceResolveProvider = KtFe10ReferenceResolveProvider(this) override val substitutionProviderImpl: KtSignatureSubsitutor = KtFe10SignatureSubsitutor(this) override val scopeSubstitutionImpl: KtScopeSubstitution = KtFe10ScopeSubstitution(this) + override val substitutorFactoryImpl: KtSubstitutorFactory = KtFe10SubstitutorFactory(this) override fun createContextDependentCopy(originalKtFile: KtFile, elementToReanalyze: KtElement): KtAnalysisSession = withValidityAssertion { diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10SymbolDeclarationRendererProvider.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10SymbolDeclarationRendererProvider.kt index 50469cb0543..df48b5aaa3f 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10SymbolDeclarationRendererProvider.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10SymbolDeclarationRendererProvider.kt @@ -16,6 +16,7 @@ import org.jetbrains.kotlin.analysis.api.descriptors.types.base.KtFe10Type import org.jetbrains.kotlin.analysis.api.descriptors.utils.KtFe10TypeRenderer import org.jetbrains.kotlin.analysis.api.symbols.KtDeclarationSymbol import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken +import org.jetbrains.kotlin.analysis.api.signatures.KtCallableSignature import org.jetbrains.kotlin.analysis.api.types.KtType import org.jetbrains.kotlin.analysis.utils.printer.prettyPrint @@ -35,6 +36,10 @@ internal class KtFe10SymbolDeclarationRendererProvider( return "" } + override fun render(signature: KtCallableSignature<*>, options: KtDeclarationRendererOptions): String { + TODO("Not yet implemented") + } + override fun render(type: KtType, options: KtTypeRendererOptions): String { require(type is KtFe10Type) return prettyPrint { KtFe10TypeRenderer(options).render(type.type, this) } diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFirSubstitutorFactory.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFirSubstitutorFactory.kt new file mode 100644 index 00000000000..c4c791d8190 --- /dev/null +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFirSubstitutorFactory.kt @@ -0,0 +1,22 @@ +/* + * Copyright 2010-2022 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.descriptors.components + +import org.jetbrains.kotlin.analysis.api.components.KtSubstitutorBuilder +import org.jetbrains.kotlin.analysis.api.components.KtSubstitutorFactory +import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession +import org.jetbrains.kotlin.analysis.api.descriptors.components.base.Fe10KtAnalysisSessionComponent +import org.jetbrains.kotlin.analysis.api.types.KtSubstitutor + +internal class KtFe10SubstitutorFactory( + override val analysisSession: KtFe10AnalysisSession +) : KtSubstitutorFactory(), Fe10KtAnalysisSessionComponent { + + override fun buildSubstitutor(builder: KtSubstitutorBuilder): KtSubstitutor { + if (builder.mappings.isEmpty()) return KtSubstitutor.Empty(token) + TODO() + } +} \ No newline at end of file diff --git a/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/signatureSubstitution/Fe10IdeNormalAnalysisSourceModuleAnalysisApiSignatureSubstitutionTestGenerated.java b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/signatureSubstitution/Fe10IdeNormalAnalysisSourceModuleAnalysisApiSignatureSubstitutionTestGenerated.java new file mode 100644 index 00000000000..95f6faa2f05 --- /dev/null +++ b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/signatureSubstitution/Fe10IdeNormalAnalysisSourceModuleAnalysisApiSignatureSubstitutionTestGenerated.java @@ -0,0 +1,60 @@ +/* + * 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.fe10.test.cases.generated.cases.components.signatureSubstitution; + +import com.intellij.testFramework.TestDataPath; +import org.jetbrains.kotlin.test.util.KtTestUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.kotlin.analysis.api.fe10.test.configurator.AnalysisApiFe10TestConfiguratorFactory; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfiguratorFactoryData; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfigurator; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.TestModuleKind; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.FrontendKind; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisSessionMode; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiMode; +import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.components.signatureSubstitution.AbstractAnalysisApiSignatureSubstitutionTest; +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/signatureSubstitution/signatureSubstitution") +@TestDataPath("$PROJECT_ROOT") +public class Fe10IdeNormalAnalysisSourceModuleAnalysisApiSignatureSubstitutionTestGenerated extends AbstractAnalysisApiSignatureSubstitutionTest { + @NotNull + @Override + public AnalysisApiTestConfigurator getConfigurator() { + return AnalysisApiFe10TestConfiguratorFactory.INSTANCE.createConfigurator( + new AnalysisApiTestConfiguratorFactoryData( + FrontendKind.Fe10, + TestModuleKind.Source, + AnalysisSessionMode.Normal, + AnalysisApiMode.Ide + ) + ); + } + + @Test + public void testAllFilesPresentInSignatureSubstitution() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/signatureSubstitution/signatureSubstitution"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("function.kt") + public void testFunction() throws Exception { + runTest("analysis/analysis-api/testData/components/signatureSubstitution/signatureSubstitution/function.kt"); + } + + @Test + @TestMetadata("property.kt") + public void testProperty() throws Exception { + runTest("analysis/analysis-api/testData/components/signatureSubstitution/signatureSubstitution/property.kt"); + } +} diff --git a/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/signatureSubstitution/Fe10IdeNormalAnalysisSourceModuleAnalysisApiSymbolAsSignatureTestGenerated.java b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/signatureSubstitution/Fe10IdeNormalAnalysisSourceModuleAnalysisApiSymbolAsSignatureTestGenerated.java new file mode 100644 index 00000000000..9b067b93c0e --- /dev/null +++ b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/signatureSubstitution/Fe10IdeNormalAnalysisSourceModuleAnalysisApiSymbolAsSignatureTestGenerated.java @@ -0,0 +1,78 @@ +/* + * 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.fe10.test.cases.generated.cases.components.signatureSubstitution; + +import com.intellij.testFramework.TestDataPath; +import org.jetbrains.kotlin.test.util.KtTestUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.kotlin.analysis.api.fe10.test.configurator.AnalysisApiFe10TestConfiguratorFactory; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfiguratorFactoryData; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfigurator; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.TestModuleKind; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.FrontendKind; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisSessionMode; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiMode; +import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.components.signatureSubstitution.AbstractAnalysisApiSymbolAsSignatureTest; +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/signatureSubstitution/symbolAsSignature") +@TestDataPath("$PROJECT_ROOT") +public class Fe10IdeNormalAnalysisSourceModuleAnalysisApiSymbolAsSignatureTestGenerated extends AbstractAnalysisApiSymbolAsSignatureTest { + @NotNull + @Override + public AnalysisApiTestConfigurator getConfigurator() { + return AnalysisApiFe10TestConfiguratorFactory.INSTANCE.createConfigurator( + new AnalysisApiTestConfiguratorFactoryData( + FrontendKind.Fe10, + TestModuleKind.Source, + AnalysisSessionMode.Normal, + AnalysisApiMode.Ide + ) + ); + } + + @Test + public void testAllFilesPresentInSymbolAsSignature() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/signatureSubstitution/symbolAsSignature"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("function.kt") + public void testFunction() throws Exception { + runTest("analysis/analysis-api/testData/components/signatureSubstitution/symbolAsSignature/function.kt"); + } + + @Test + @TestMetadata("propertyGetter.kt") + public void testPropertyGetter() throws Exception { + runTest("analysis/analysis-api/testData/components/signatureSubstitution/symbolAsSignature/propertyGetter.kt"); + } + + @Test + @TestMetadata("propertyNoAccessors.kt") + public void testPropertyNoAccessors() throws Exception { + runTest("analysis/analysis-api/testData/components/signatureSubstitution/symbolAsSignature/propertyNoAccessors.kt"); + } + + @Test + @TestMetadata("propertySetter.kt") + public void testPropertySetter() throws Exception { + runTest("analysis/analysis-api/testData/components/signatureSubstitution/symbolAsSignature/propertySetter.kt"); + } + + @Test + @TestMetadata("propertyWithAccessors.kt") + public void testPropertyWithAccessors() throws Exception { + runTest("analysis/analysis-api/testData/components/signatureSubstitution/symbolAsSignature/propertyWithAccessors.kt"); + } +} diff --git a/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/signatureSubstitution/Fe10IdeNormalAnalysisSourceModuleAnalysisApiSymbolSubstitutionTestGenerated.java b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/signatureSubstitution/Fe10IdeNormalAnalysisSourceModuleAnalysisApiSymbolSubstitutionTestGenerated.java new file mode 100644 index 00000000000..647d0fe041e --- /dev/null +++ b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/signatureSubstitution/Fe10IdeNormalAnalysisSourceModuleAnalysisApiSymbolSubstitutionTestGenerated.java @@ -0,0 +1,60 @@ +/* + * 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.fe10.test.cases.generated.cases.components.signatureSubstitution; + +import com.intellij.testFramework.TestDataPath; +import org.jetbrains.kotlin.test.util.KtTestUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.kotlin.analysis.api.fe10.test.configurator.AnalysisApiFe10TestConfiguratorFactory; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfiguratorFactoryData; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfigurator; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.TestModuleKind; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.FrontendKind; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisSessionMode; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiMode; +import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.components.signatureSubstitution.AbstractAnalysisApiSymbolSubstitutionTest; +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/signatureSubstitution/symbolSubstitution") +@TestDataPath("$PROJECT_ROOT") +public class Fe10IdeNormalAnalysisSourceModuleAnalysisApiSymbolSubstitutionTestGenerated extends AbstractAnalysisApiSymbolSubstitutionTest { + @NotNull + @Override + public AnalysisApiTestConfigurator getConfigurator() { + return AnalysisApiFe10TestConfiguratorFactory.INSTANCE.createConfigurator( + new AnalysisApiTestConfiguratorFactoryData( + FrontendKind.Fe10, + TestModuleKind.Source, + AnalysisSessionMode.Normal, + AnalysisApiMode.Ide + ) + ); + } + + @Test + public void testAllFilesPresentInSymbolSubstitution() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/signatureSubstitution/symbolSubstitution"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("function.kt") + public void testFunction() throws Exception { + runTest("analysis/analysis-api/testData/components/signatureSubstitution/symbolSubstitution/function.kt"); + } + + @Test + @TestMetadata("property.kt") + public void testProperty() throws Exception { + runTest("analysis/analysis-api/testData/components/signatureSubstitution/symbolSubstitution/property.kt"); + } +} diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSymbolDeclarationRendererProvider.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSymbolDeclarationRendererProvider.kt index 3b150fa0530..8d97300cec3 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSymbolDeclarationRendererProvider.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSymbolDeclarationRendererProvider.kt @@ -29,6 +29,23 @@ internal class KtFirSymbolDeclarationRendererProvider( return ConeTypeIdeRenderer(analysisSession.firResolveSession.useSiteFirSession, options).renderType(type.coneType) } + override fun render(signature: KtCallableSignature<*>, options: KtDeclarationRendererOptions): String = prettyPrint { + signature.receiverType?.let { + append(render(it, options.typeRendererOptions)) + append('.') + } + signature.symbol.callableIdIfNonLocal?.callableName?.asString()?.let { append(it) } + if (signature is KtFunctionLikeSignature<*>) { + printCollection(signature.valueParameters, ", ", "(", ")") { parameter -> + append(parameter.name.asString()) + append(": ") + append(render(parameter.returnType, options.typeRendererOptions)) + } + } + append(": ") + append(render(signature.returnType, options.typeRendererOptions)) + } + override fun renderDeclaration(symbol: KtDeclarationSymbol, options: KtDeclarationRendererOptions): String { require(symbol is KtFirSymbol<*>) symbol.firSymbol.ensureResolved(FirResolvePhase.BODY_RESOLVE) diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/signatureSubstitution/FirIdeNormalAnalysisSourceModuleAnalysisApiSignatureSubstitutionTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/signatureSubstitution/FirIdeNormalAnalysisSourceModuleAnalysisApiSignatureSubstitutionTestGenerated.java new file mode 100644 index 00000000000..45b307ca45f --- /dev/null +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/signatureSubstitution/FirIdeNormalAnalysisSourceModuleAnalysisApiSignatureSubstitutionTestGenerated.java @@ -0,0 +1,60 @@ +/* + * 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.test.cases.generated.cases.components.signatureSubstitution; + +import com.intellij.testFramework.TestDataPath; +import org.jetbrains.kotlin.test.util.KtTestUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.kotlin.analysis.api.fir.test.configurators.AnalysisApiFirTestConfiguratorFactory; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfiguratorFactoryData; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfigurator; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.TestModuleKind; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.FrontendKind; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisSessionMode; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiMode; +import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.components.signatureSubstitution.AbstractAnalysisApiSignatureSubstitutionTest; +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/signatureSubstitution/signatureSubstitution") +@TestDataPath("$PROJECT_ROOT") +public class FirIdeNormalAnalysisSourceModuleAnalysisApiSignatureSubstitutionTestGenerated extends AbstractAnalysisApiSignatureSubstitutionTest { + @NotNull + @Override + public AnalysisApiTestConfigurator getConfigurator() { + return AnalysisApiFirTestConfiguratorFactory.INSTANCE.createConfigurator( + new AnalysisApiTestConfiguratorFactoryData( + FrontendKind.Fir, + TestModuleKind.Source, + AnalysisSessionMode.Normal, + AnalysisApiMode.Ide + ) + ); + } + + @Test + public void testAllFilesPresentInSignatureSubstitution() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/signatureSubstitution/signatureSubstitution"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("function.kt") + public void testFunction() throws Exception { + runTest("analysis/analysis-api/testData/components/signatureSubstitution/signatureSubstitution/function.kt"); + } + + @Test + @TestMetadata("property.kt") + public void testProperty() throws Exception { + runTest("analysis/analysis-api/testData/components/signatureSubstitution/signatureSubstitution/property.kt"); + } +} diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/signatureSubstitution/FirIdeNormalAnalysisSourceModuleAnalysisApiSymbolAsSignatureTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/signatureSubstitution/FirIdeNormalAnalysisSourceModuleAnalysisApiSymbolAsSignatureTestGenerated.java new file mode 100644 index 00000000000..6d61adfce1a --- /dev/null +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/signatureSubstitution/FirIdeNormalAnalysisSourceModuleAnalysisApiSymbolAsSignatureTestGenerated.java @@ -0,0 +1,78 @@ +/* + * 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.test.cases.generated.cases.components.signatureSubstitution; + +import com.intellij.testFramework.TestDataPath; +import org.jetbrains.kotlin.test.util.KtTestUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.kotlin.analysis.api.fir.test.configurators.AnalysisApiFirTestConfiguratorFactory; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfiguratorFactoryData; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfigurator; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.TestModuleKind; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.FrontendKind; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisSessionMode; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiMode; +import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.components.signatureSubstitution.AbstractAnalysisApiSymbolAsSignatureTest; +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/signatureSubstitution/symbolAsSignature") +@TestDataPath("$PROJECT_ROOT") +public class FirIdeNormalAnalysisSourceModuleAnalysisApiSymbolAsSignatureTestGenerated extends AbstractAnalysisApiSymbolAsSignatureTest { + @NotNull + @Override + public AnalysisApiTestConfigurator getConfigurator() { + return AnalysisApiFirTestConfiguratorFactory.INSTANCE.createConfigurator( + new AnalysisApiTestConfiguratorFactoryData( + FrontendKind.Fir, + TestModuleKind.Source, + AnalysisSessionMode.Normal, + AnalysisApiMode.Ide + ) + ); + } + + @Test + public void testAllFilesPresentInSymbolAsSignature() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/signatureSubstitution/symbolAsSignature"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("function.kt") + public void testFunction() throws Exception { + runTest("analysis/analysis-api/testData/components/signatureSubstitution/symbolAsSignature/function.kt"); + } + + @Test + @TestMetadata("propertyGetter.kt") + public void testPropertyGetter() throws Exception { + runTest("analysis/analysis-api/testData/components/signatureSubstitution/symbolAsSignature/propertyGetter.kt"); + } + + @Test + @TestMetadata("propertyNoAccessors.kt") + public void testPropertyNoAccessors() throws Exception { + runTest("analysis/analysis-api/testData/components/signatureSubstitution/symbolAsSignature/propertyNoAccessors.kt"); + } + + @Test + @TestMetadata("propertySetter.kt") + public void testPropertySetter() throws Exception { + runTest("analysis/analysis-api/testData/components/signatureSubstitution/symbolAsSignature/propertySetter.kt"); + } + + @Test + @TestMetadata("propertyWithAccessors.kt") + public void testPropertyWithAccessors() throws Exception { + runTest("analysis/analysis-api/testData/components/signatureSubstitution/symbolAsSignature/propertyWithAccessors.kt"); + } +} diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/signatureSubstitution/FirIdeNormalAnalysisSourceModuleAnalysisApiSymbolSubstitutionTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/signatureSubstitution/FirIdeNormalAnalysisSourceModuleAnalysisApiSymbolSubstitutionTestGenerated.java new file mode 100644 index 00000000000..18d42f09a7f --- /dev/null +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/signatureSubstitution/FirIdeNormalAnalysisSourceModuleAnalysisApiSymbolSubstitutionTestGenerated.java @@ -0,0 +1,60 @@ +/* + * 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.test.cases.generated.cases.components.signatureSubstitution; + +import com.intellij.testFramework.TestDataPath; +import org.jetbrains.kotlin.test.util.KtTestUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.kotlin.analysis.api.fir.test.configurators.AnalysisApiFirTestConfiguratorFactory; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfiguratorFactoryData; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfigurator; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.TestModuleKind; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.FrontendKind; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisSessionMode; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiMode; +import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.components.signatureSubstitution.AbstractAnalysisApiSymbolSubstitutionTest; +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/signatureSubstitution/symbolSubstitution") +@TestDataPath("$PROJECT_ROOT") +public class FirIdeNormalAnalysisSourceModuleAnalysisApiSymbolSubstitutionTestGenerated extends AbstractAnalysisApiSymbolSubstitutionTest { + @NotNull + @Override + public AnalysisApiTestConfigurator getConfigurator() { + return AnalysisApiFirTestConfiguratorFactory.INSTANCE.createConfigurator( + new AnalysisApiTestConfiguratorFactoryData( + FrontendKind.Fir, + TestModuleKind.Source, + AnalysisSessionMode.Normal, + AnalysisApiMode.Ide + ) + ); + } + + @Test + public void testAllFilesPresentInSymbolSubstitution() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/signatureSubstitution/symbolSubstitution"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("function.kt") + public void testFunction() throws Exception { + runTest("analysis/analysis-api/testData/components/signatureSubstitution/symbolSubstitution/function.kt"); + } + + @Test + @TestMetadata("property.kt") + public void testProperty() throws Exception { + runTest("analysis/analysis-api/testData/components/signatureSubstitution/symbolSubstitution/property.kt"); + } +} diff --git a/analysis/analysis-api-impl-base/build.gradle.kts b/analysis/analysis-api-impl-base/build.gradle.kts index 1385d9d2574..de6646ea013 100644 --- a/analysis/analysis-api-impl-base/build.gradle.kts +++ b/analysis/analysis-api-impl-base/build.gradle.kts @@ -33,4 +33,8 @@ sourceSets { "test" { projectDefault() } } +tasks.withType().configureEach { + kotlinOptions.freeCompilerArgs += "-Xcontext-receivers" +} + testsJar() diff --git a/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/components/signatureSubstitution/AbstractAnalysisApiSignatureSubstitutionTest.kt b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/components/signatureSubstitution/AbstractAnalysisApiSignatureSubstitutionTest.kt new file mode 100644 index 00000000000..ddf361f3ade --- /dev/null +++ b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/components/signatureSubstitution/AbstractAnalysisApiSignatureSubstitutionTest.kt @@ -0,0 +1,49 @@ +/* + * Copyright 2010-2022 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.impl.base.test.cases.components.signatureSubstitution + +import org.jetbrains.kotlin.analysis.api.symbols.KtCallableSymbol +import org.jetbrains.kotlin.analysis.api.symbols.getSymbolOfType +import org.jetbrains.kotlin.analysis.test.framework.base.AbstractAnalysisApiSingleFileTest +import org.jetbrains.kotlin.analysis.test.framework.services.SubstitutionParser +import org.jetbrains.kotlin.analysis.test.framework.services.expressionMarkerProvider +import org.jetbrains.kotlin.analysis.utils.printer.prettyPrint +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 AbstractAnalysisApiSignatureSubstitutionTest : AbstractAnalysisApiSingleFileTest() { + override fun doTestByFileStructure(ktFile: KtFile, module: TestModule, testServices: TestServices) { + val declaration = testServices.expressionMarkerProvider.getElementOfTypAtCaret(ktFile) + val actual = analyseForTest(declaration) { + val symbol = declaration.getSymbolOfType() + + val substitutor = with(SubstitutionParser) { parseSubstitutors(module, ktFile) }.single() + + val signatureBeforeSubstitution = symbol.asSignature() + val signatureAfterSubstitution = signatureBeforeSubstitution.substitute(substitutor) + prettyPrint { + appendLine("KtDeclaration: ${declaration::class.simpleName}") + + appendLine("Symbol:") + appendLine(symbol.render()) + + appendLine() + + appendLine("Signature before substitution:") + appendLine(signatureBeforeSubstitution.render()) + + appendLine() + + appendLine("Signature after substitution:") + appendLine(signatureAfterSubstitution.render()) + } + } + testServices.assertions.assertEqualsToTestDataFileSibling(actual) + } +} diff --git a/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/components/signatureSubstitution/AbstractAnalysisApiSymbolAsSignatureTest.kt b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/components/signatureSubstitution/AbstractAnalysisApiSymbolAsSignatureTest.kt new file mode 100644 index 00000000000..c7093bd7fbc --- /dev/null +++ b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/components/signatureSubstitution/AbstractAnalysisApiSymbolAsSignatureTest.kt @@ -0,0 +1,41 @@ +/* + * Copyright 2010-2022 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.impl.base.test.cases.components.signatureSubstitution + +import org.jetbrains.kotlin.analysis.api.symbols.KtCallableSymbol +import org.jetbrains.kotlin.analysis.api.symbols.getSymbolOfType +import org.jetbrains.kotlin.analysis.test.framework.base.AbstractAnalysisApiSingleFileTest +import org.jetbrains.kotlin.analysis.test.framework.services.expressionMarkerProvider +import org.jetbrains.kotlin.analysis.utils.printer.prettyPrint +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 AbstractAnalysisApiSymbolAsSignatureTest : AbstractAnalysisApiSingleFileTest() { + override fun doTestByFileStructure(ktFile: KtFile, module: TestModule, testServices: TestServices) { + val declaration = testServices.expressionMarkerProvider.getElementOfTypAtCaret(ktFile) + val actual = analyseForTest(declaration) { + val symbol = declaration.getSymbolOfType() + val signature = symbol.asSignature() + val renderedSymbol = symbol.render() + val renderedSignature = signature.render() + prettyPrint { + appendLine("KtDeclaration: ${declaration::class.simpleName}") + + appendLine("Symbol:") + appendLine(renderedSymbol) + + appendLine() + + appendLine("Signature:") + appendLine(renderedSignature) + } + } + testServices.assertions.assertEqualsToTestDataFileSibling(actual) + } +} diff --git a/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/components/signatureSubstitution/AbstractAnalysisApiSymbolSubstitutionTest.kt b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/components/signatureSubstitution/AbstractAnalysisApiSymbolSubstitutionTest.kt new file mode 100644 index 00000000000..fb1928b1ea6 --- /dev/null +++ b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/components/signatureSubstitution/AbstractAnalysisApiSymbolSubstitutionTest.kt @@ -0,0 +1,45 @@ +/* + * Copyright 2010-2022 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.impl.base.test.cases.components.signatureSubstitution + +import org.jetbrains.kotlin.analysis.api.symbols.KtCallableSymbol +import org.jetbrains.kotlin.analysis.api.symbols.getSymbolOfType +import org.jetbrains.kotlin.analysis.test.framework.base.AbstractAnalysisApiSingleFileTest +import org.jetbrains.kotlin.analysis.test.framework.services.SubstitutionParser +import org.jetbrains.kotlin.analysis.test.framework.services.expressionMarkerProvider +import org.jetbrains.kotlin.analysis.utils.printer.prettyPrint +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 AbstractAnalysisApiSymbolSubstitutionTest : AbstractAnalysisApiSingleFileTest() { + override fun doTestByFileStructure(ktFile: KtFile, module: TestModule, testServices: TestServices) { + val declaration = testServices.expressionMarkerProvider.getElementOfTypAtCaret(ktFile) + val actual = analyseForTest(declaration) { + val symbol = declaration.getSymbolOfType() + + val substitutor = with(SubstitutionParser) { parseSubstitutors(module, ktFile) }.single() + + val signature = symbol.substitute(substitutor) + val renderedSymbol = symbol.render() + val renderedSignature = signature.render() + prettyPrint { + appendLine("KtDeclaration: ${declaration::class.simpleName}") + + appendLine("Symbol:") + appendLine(renderedSymbol) + + appendLine() + + appendLine("Signature:") + appendLine(renderedSignature) + } + } + testServices.assertions.assertEqualsToTestDataFileSibling(actual) + } +} diff --git a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/signatureSubstitution/FirStandaloneNormalAnalysisSourceModuleAnalysisApiSignatureSubstitutionTestGenerated.java b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/signatureSubstitution/FirStandaloneNormalAnalysisSourceModuleAnalysisApiSignatureSubstitutionTestGenerated.java new file mode 100644 index 00000000000..f2d71b6da5d --- /dev/null +++ b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/signatureSubstitution/FirStandaloneNormalAnalysisSourceModuleAnalysisApiSignatureSubstitutionTestGenerated.java @@ -0,0 +1,60 @@ +/* + * 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.standalone.fir.test.cases.generated.cases.components.signatureSubstitution; + +import com.intellij.testFramework.TestDataPath; +import org.jetbrains.kotlin.test.util.KtTestUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.kotlin.analysis.api.standalone.fir.test.AnalysisApiFirStandaloneModeTestConfiguratorFactory; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfiguratorFactoryData; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfigurator; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.TestModuleKind; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.FrontendKind; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisSessionMode; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiMode; +import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.components.signatureSubstitution.AbstractAnalysisApiSignatureSubstitutionTest; +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/signatureSubstitution/signatureSubstitution") +@TestDataPath("$PROJECT_ROOT") +public class FirStandaloneNormalAnalysisSourceModuleAnalysisApiSignatureSubstitutionTestGenerated extends AbstractAnalysisApiSignatureSubstitutionTest { + @NotNull + @Override + public AnalysisApiTestConfigurator getConfigurator() { + return AnalysisApiFirStandaloneModeTestConfiguratorFactory.INSTANCE.createConfigurator( + new AnalysisApiTestConfiguratorFactoryData( + FrontendKind.Fir, + TestModuleKind.Source, + AnalysisSessionMode.Normal, + AnalysisApiMode.Standalone + ) + ); + } + + @Test + public void testAllFilesPresentInSignatureSubstitution() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/signatureSubstitution/signatureSubstitution"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("function.kt") + public void testFunction() throws Exception { + runTest("analysis/analysis-api/testData/components/signatureSubstitution/signatureSubstitution/function.kt"); + } + + @Test + @TestMetadata("property.kt") + public void testProperty() throws Exception { + runTest("analysis/analysis-api/testData/components/signatureSubstitution/signatureSubstitution/property.kt"); + } +} diff --git a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/signatureSubstitution/FirStandaloneNormalAnalysisSourceModuleAnalysisApiSymbolAsSignatureTestGenerated.java b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/signatureSubstitution/FirStandaloneNormalAnalysisSourceModuleAnalysisApiSymbolAsSignatureTestGenerated.java new file mode 100644 index 00000000000..92769f04c42 --- /dev/null +++ b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/signatureSubstitution/FirStandaloneNormalAnalysisSourceModuleAnalysisApiSymbolAsSignatureTestGenerated.java @@ -0,0 +1,78 @@ +/* + * 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.standalone.fir.test.cases.generated.cases.components.signatureSubstitution; + +import com.intellij.testFramework.TestDataPath; +import org.jetbrains.kotlin.test.util.KtTestUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.kotlin.analysis.api.standalone.fir.test.AnalysisApiFirStandaloneModeTestConfiguratorFactory; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfiguratorFactoryData; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfigurator; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.TestModuleKind; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.FrontendKind; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisSessionMode; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiMode; +import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.components.signatureSubstitution.AbstractAnalysisApiSymbolAsSignatureTest; +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/signatureSubstitution/symbolAsSignature") +@TestDataPath("$PROJECT_ROOT") +public class FirStandaloneNormalAnalysisSourceModuleAnalysisApiSymbolAsSignatureTestGenerated extends AbstractAnalysisApiSymbolAsSignatureTest { + @NotNull + @Override + public AnalysisApiTestConfigurator getConfigurator() { + return AnalysisApiFirStandaloneModeTestConfiguratorFactory.INSTANCE.createConfigurator( + new AnalysisApiTestConfiguratorFactoryData( + FrontendKind.Fir, + TestModuleKind.Source, + AnalysisSessionMode.Normal, + AnalysisApiMode.Standalone + ) + ); + } + + @Test + public void testAllFilesPresentInSymbolAsSignature() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/signatureSubstitution/symbolAsSignature"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("function.kt") + public void testFunction() throws Exception { + runTest("analysis/analysis-api/testData/components/signatureSubstitution/symbolAsSignature/function.kt"); + } + + @Test + @TestMetadata("propertyGetter.kt") + public void testPropertyGetter() throws Exception { + runTest("analysis/analysis-api/testData/components/signatureSubstitution/symbolAsSignature/propertyGetter.kt"); + } + + @Test + @TestMetadata("propertyNoAccessors.kt") + public void testPropertyNoAccessors() throws Exception { + runTest("analysis/analysis-api/testData/components/signatureSubstitution/symbolAsSignature/propertyNoAccessors.kt"); + } + + @Test + @TestMetadata("propertySetter.kt") + public void testPropertySetter() throws Exception { + runTest("analysis/analysis-api/testData/components/signatureSubstitution/symbolAsSignature/propertySetter.kt"); + } + + @Test + @TestMetadata("propertyWithAccessors.kt") + public void testPropertyWithAccessors() throws Exception { + runTest("analysis/analysis-api/testData/components/signatureSubstitution/symbolAsSignature/propertyWithAccessors.kt"); + } +} diff --git a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/signatureSubstitution/FirStandaloneNormalAnalysisSourceModuleAnalysisApiSymbolSubstitutionTestGenerated.java b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/signatureSubstitution/FirStandaloneNormalAnalysisSourceModuleAnalysisApiSymbolSubstitutionTestGenerated.java new file mode 100644 index 00000000000..507b9573a71 --- /dev/null +++ b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/signatureSubstitution/FirStandaloneNormalAnalysisSourceModuleAnalysisApiSymbolSubstitutionTestGenerated.java @@ -0,0 +1,60 @@ +/* + * 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.standalone.fir.test.cases.generated.cases.components.signatureSubstitution; + +import com.intellij.testFramework.TestDataPath; +import org.jetbrains.kotlin.test.util.KtTestUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.kotlin.analysis.api.standalone.fir.test.AnalysisApiFirStandaloneModeTestConfiguratorFactory; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfiguratorFactoryData; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfigurator; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.TestModuleKind; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.FrontendKind; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisSessionMode; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiMode; +import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.components.signatureSubstitution.AbstractAnalysisApiSymbolSubstitutionTest; +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/signatureSubstitution/symbolSubstitution") +@TestDataPath("$PROJECT_ROOT") +public class FirStandaloneNormalAnalysisSourceModuleAnalysisApiSymbolSubstitutionTestGenerated extends AbstractAnalysisApiSymbolSubstitutionTest { + @NotNull + @Override + public AnalysisApiTestConfigurator getConfigurator() { + return AnalysisApiFirStandaloneModeTestConfiguratorFactory.INSTANCE.createConfigurator( + new AnalysisApiTestConfiguratorFactoryData( + FrontendKind.Fir, + TestModuleKind.Source, + AnalysisSessionMode.Normal, + AnalysisApiMode.Standalone + ) + ); + } + + @Test + public void testAllFilesPresentInSymbolSubstitution() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/signatureSubstitution/symbolSubstitution"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("function.kt") + public void testFunction() throws Exception { + runTest("analysis/analysis-api/testData/components/signatureSubstitution/symbolSubstitution/function.kt"); + } + + @Test + @TestMetadata("property.kt") + public void testProperty() throws Exception { + runTest("analysis/analysis-api/testData/components/signatureSubstitution/symbolSubstitution/property.kt"); + } +} diff --git a/analysis/analysis-api/build.gradle.kts b/analysis/analysis-api/build.gradle.kts index eb64aac507a..6b82841070f 100644 --- a/analysis/analysis-api/build.gradle.kts +++ b/analysis/analysis-api/build.gradle.kts @@ -33,6 +33,10 @@ sourceSets { "test" { projectDefault() } } +tasks.withType().configureEach { + kotlinOptions.freeCompilerArgs += "-Xcontext-receivers" +} + testsJar() projectTest { diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtSymbolDeclarationRendererProvider.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtSymbolDeclarationRendererProvider.kt index e4c2e1ed362..22708cdba2d 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtSymbolDeclarationRendererProvider.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtSymbolDeclarationRendererProvider.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.analysis.api.components import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion +import org.jetbrains.kotlin.analysis.api.signatures.KtCallableSignature import org.jetbrains.kotlin.analysis.api.symbols.KtDeclarationSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol import org.jetbrains.kotlin.analysis.api.types.KtType @@ -127,6 +128,9 @@ public enum class RendererModifier(public val includeByDefault: Boolean) { public abstract class KtSymbolDeclarationRendererProvider : KtAnalysisSessionComponent() { public abstract fun renderDeclaration(symbol: KtDeclarationSymbol, options: KtDeclarationRendererOptions): String + + public abstract fun render(signature: KtCallableSignature<*>, options: KtDeclarationRendererOptions): String + public abstract fun render(type: KtType, options: KtTypeRendererOptions): String } @@ -140,6 +144,9 @@ public interface KtSymbolDeclarationRendererMixIn : KtAnalysisSessionMixIn { public fun KtDeclarationSymbol.render(options: KtDeclarationRendererOptions = KtDeclarationRendererOptions.DEFAULT): String = withValidityAssertion { analysisSession.symbolDeclarationRendererProvider.renderDeclaration(this, options) } + public fun KtCallableSignature<*>.render(options: KtDeclarationRendererOptions = KtDeclarationRendererOptions.DEFAULT): String = + withValidityAssertion { analysisSession.symbolDeclarationRendererProvider.render(this, options) } + /** * Render kotlin type into the representable Kotlin type string */ diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/KtSymbolProvider.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/KtSymbolProvider.kt index 83cdf251637..7405df72342 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/KtSymbolProvider.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/KtSymbolProvider.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.analysis.api.symbols +import org.jetbrains.kotlin.analysis.api.KtAnalysisSession import org.jetbrains.kotlin.analysis.api.components.KtAnalysisSessionComponent import org.jetbrains.kotlin.analysis.api.components.KtAnalysisSessionMixIn import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion @@ -136,3 +137,14 @@ public interface KtSymbolProviderMixIn : KtAnalysisSessionMixIn { public val ROOT_PACKAGE_SYMBOL: KtPackageSymbol get() = withValidityAssertion { analysisSession.symbolProvider.ROOT_PACKAGE_SYMBOL } } + +context(KtAnalysisSession) +public inline fun KtDeclaration.getSymbolOfType(): S = + withValidityAssertion { getSymbol() } as S + +context(KtAnalysisSession) +public inline fun KtDeclaration.getSymbolOfTypeSafe(): S? = + withValidityAssertion { getSymbol() } as? S + + + diff --git a/analysis/analysis-api/testData/components/signatureSubstitution/signatureSubstitution/function.kt b/analysis/analysis-api/testData/components/signatureSubstitution/signatureSubstitution/function.kt new file mode 100644 index 00000000000..0c97d691abe --- /dev/null +++ b/analysis/analysis-api/testData/components/signatureSubstitution/signatureSubstitution/function.kt @@ -0,0 +1,3 @@ +// SUBSTITUTOR: T->kotlin.collections.List;S->kotlin.Long + +fun foo(x: List, y: Map>, k: String): T \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/signatureSubstitution/signatureSubstitution/function.txt b/analysis/analysis-api/testData/components/signatureSubstitution/signatureSubstitution/function.txt new file mode 100644 index 00000000000..41b389af451 --- /dev/null +++ b/analysis/analysis-api/testData/components/signatureSubstitution/signatureSubstitution/function.txt @@ -0,0 +1,9 @@ +KtDeclaration: KtNamedFunction +Symbol: +fun foo(x: kotlin.collections.List, y: kotlin.collections.Map>, k: kotlin.String): T + +Signature before substitution: +foo(x: kotlin.collections.List, y: kotlin.collections.Map>, k: kotlin.String): T + +Signature after substitution: +foo(x: kotlin.collections.List>, y: kotlin.collections.Map, kotlin.collections.List>, k: kotlin.String): kotlin.collections.List diff --git a/analysis/analysis-api/testData/components/signatureSubstitution/signatureSubstitution/property.kt b/analysis/analysis-api/testData/components/signatureSubstitution/signatureSubstitution/property.kt new file mode 100644 index 00000000000..683119b8034 --- /dev/null +++ b/analysis/analysis-api/testData/components/signatureSubstitution/signatureSubstitution/property.kt @@ -0,0 +1,3 @@ +// SUBSTITUTOR: T->kotlin.collections.List;S->kotlin.Long + +val Map.value: List \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/signatureSubstitution/signatureSubstitution/property.txt b/analysis/analysis-api/testData/components/signatureSubstitution/signatureSubstitution/property.txt new file mode 100644 index 00000000000..c07809a7e7e --- /dev/null +++ b/analysis/analysis-api/testData/components/signatureSubstitution/signatureSubstitution/property.txt @@ -0,0 +1,9 @@ +KtDeclaration: KtProperty +Symbol: +val kotlin.collections.Map.value: kotlin.collections.List + +Signature before substitution: +kotlin.collections.Map.value: kotlin.collections.List + +Signature after substitution: +kotlin.collections.Map, kotlin.Long>.value: kotlin.collections.List diff --git a/analysis/analysis-api/testData/components/signatureSubstitution/symbolAsSignature/function.kt b/analysis/analysis-api/testData/components/signatureSubstitution/symbolAsSignature/function.kt new file mode 100644 index 00000000000..b52cc0b675e --- /dev/null +++ b/analysis/analysis-api/testData/components/signatureSubstitution/symbolAsSignature/function.kt @@ -0,0 +1 @@ +fun foo(x: List, y: Map, k: String): Int \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/signatureSubstitution/symbolAsSignature/function.txt b/analysis/analysis-api/testData/components/signatureSubstitution/symbolAsSignature/function.txt new file mode 100644 index 00000000000..64323136613 --- /dev/null +++ b/analysis/analysis-api/testData/components/signatureSubstitution/symbolAsSignature/function.txt @@ -0,0 +1,6 @@ +KtDeclaration: KtNamedFunction +Symbol: +fun foo(x: kotlin.collections.List, y: kotlin.collections.Map, k: kotlin.String): kotlin.Int + +Signature: +foo(x: kotlin.collections.List, y: kotlin.collections.Map, k: kotlin.String): kotlin.Int diff --git a/analysis/analysis-api/testData/components/signatureSubstitution/symbolAsSignature/propertyGetter.kt b/analysis/analysis-api/testData/components/signatureSubstitution/symbolAsSignature/propertyGetter.kt new file mode 100644 index 00000000000..ce2acaec4f8 --- /dev/null +++ b/analysis/analysis-api/testData/components/signatureSubstitution/symbolAsSignature/propertyGetter.kt @@ -0,0 +1,3 @@ +var foo: Int + get() = 10 + set(value){} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/signatureSubstitution/symbolAsSignature/propertyGetter.txt b/analysis/analysis-api/testData/components/signatureSubstitution/symbolAsSignature/propertyGetter.txt new file mode 100644 index 00000000000..b460dbcc910 --- /dev/null +++ b/analysis/analysis-api/testData/components/signatureSubstitution/symbolAsSignature/propertyGetter.txt @@ -0,0 +1,6 @@ +KtDeclaration: KtPropertyAccessor +Symbol: +get() + +Signature: +(): kotlin.Int diff --git a/analysis/analysis-api/testData/components/signatureSubstitution/symbolAsSignature/propertyNoAccessors.kt b/analysis/analysis-api/testData/components/signatureSubstitution/symbolAsSignature/propertyNoAccessors.kt new file mode 100644 index 00000000000..092ad74f6a1 --- /dev/null +++ b/analysis/analysis-api/testData/components/signatureSubstitution/symbolAsSignature/propertyNoAccessors.kt @@ -0,0 +1 @@ +val foo: Int = 10 \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/signatureSubstitution/symbolAsSignature/propertyNoAccessors.txt b/analysis/analysis-api/testData/components/signatureSubstitution/symbolAsSignature/propertyNoAccessors.txt new file mode 100644 index 00000000000..452e92ee95d --- /dev/null +++ b/analysis/analysis-api/testData/components/signatureSubstitution/symbolAsSignature/propertyNoAccessors.txt @@ -0,0 +1,6 @@ +KtDeclaration: KtProperty +Symbol: +val foo: kotlin.Int + +Signature: +foo: kotlin.Int diff --git a/analysis/analysis-api/testData/components/signatureSubstitution/symbolAsSignature/propertySetter.kt b/analysis/analysis-api/testData/components/signatureSubstitution/symbolAsSignature/propertySetter.kt new file mode 100644 index 00000000000..09d487dafd1 --- /dev/null +++ b/analysis/analysis-api/testData/components/signatureSubstitution/symbolAsSignature/propertySetter.kt @@ -0,0 +1,3 @@ +var foo: Int + get() = 10 + set(value){} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/signatureSubstitution/symbolAsSignature/propertySetter.txt b/analysis/analysis-api/testData/components/signatureSubstitution/symbolAsSignature/propertySetter.txt new file mode 100644 index 00000000000..307f63e0b12 --- /dev/null +++ b/analysis/analysis-api/testData/components/signatureSubstitution/symbolAsSignature/propertySetter.txt @@ -0,0 +1,6 @@ +KtDeclaration: KtPropertyAccessor +Symbol: +set(value: kotlin.Int) + +Signature: +(value: kotlin.Int): kotlin.Unit diff --git a/analysis/analysis-api/testData/components/signatureSubstitution/symbolAsSignature/propertyWithAccessors.kt b/analysis/analysis-api/testData/components/signatureSubstitution/symbolAsSignature/propertyWithAccessors.kt new file mode 100644 index 00000000000..06dfdf99a03 --- /dev/null +++ b/analysis/analysis-api/testData/components/signatureSubstitution/symbolAsSignature/propertyWithAccessors.kt @@ -0,0 +1,3 @@ +var foo: Int + get() = 10 + set(value){} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/signatureSubstitution/symbolAsSignature/propertyWithAccessors.txt b/analysis/analysis-api/testData/components/signatureSubstitution/symbolAsSignature/propertyWithAccessors.txt new file mode 100644 index 00000000000..d1c08419e5c --- /dev/null +++ b/analysis/analysis-api/testData/components/signatureSubstitution/symbolAsSignature/propertyWithAccessors.txt @@ -0,0 +1,6 @@ +KtDeclaration: KtProperty +Symbol: +var foo: kotlin.Int + +Signature: +foo: kotlin.Int diff --git a/analysis/analysis-api/testData/components/signatureSubstitution/symbolSubstitution/function.kt b/analysis/analysis-api/testData/components/signatureSubstitution/symbolSubstitution/function.kt new file mode 100644 index 00000000000..0c97d691abe --- /dev/null +++ b/analysis/analysis-api/testData/components/signatureSubstitution/symbolSubstitution/function.kt @@ -0,0 +1,3 @@ +// SUBSTITUTOR: T->kotlin.collections.List;S->kotlin.Long + +fun foo(x: List, y: Map>, k: String): T \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/signatureSubstitution/symbolSubstitution/function.txt b/analysis/analysis-api/testData/components/signatureSubstitution/symbolSubstitution/function.txt new file mode 100644 index 00000000000..50b22a3b702 --- /dev/null +++ b/analysis/analysis-api/testData/components/signatureSubstitution/symbolSubstitution/function.txt @@ -0,0 +1,6 @@ +KtDeclaration: KtNamedFunction +Symbol: +fun foo(x: kotlin.collections.List, y: kotlin.collections.Map>, k: kotlin.String): T + +Signature: +foo(x: kotlin.collections.List>, y: kotlin.collections.Map, kotlin.collections.List>, k: kotlin.String): kotlin.collections.List diff --git a/analysis/analysis-api/testData/components/signatureSubstitution/symbolSubstitution/property.kt b/analysis/analysis-api/testData/components/signatureSubstitution/symbolSubstitution/property.kt new file mode 100644 index 00000000000..683119b8034 --- /dev/null +++ b/analysis/analysis-api/testData/components/signatureSubstitution/symbolSubstitution/property.kt @@ -0,0 +1,3 @@ +// SUBSTITUTOR: T->kotlin.collections.List;S->kotlin.Long + +val Map.value: List \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/signatureSubstitution/symbolSubstitution/property.txt b/analysis/analysis-api/testData/components/signatureSubstitution/symbolSubstitution/property.txt new file mode 100644 index 00000000000..4463ab10828 --- /dev/null +++ b/analysis/analysis-api/testData/components/signatureSubstitution/symbolSubstitution/property.txt @@ -0,0 +1,6 @@ +KtDeclaration: KtProperty +Symbol: +val kotlin.collections.Map.value: kotlin.collections.List + +Signature: +kotlin.collections.Map, kotlin.Long>.value: kotlin.collections.List diff --git a/analysis/analysis-test-framework/tests/org/jetbrains/kotlin/analysis/test/framework/base/AbstractAnalysisApiBasedTest.kt b/analysis/analysis-test-framework/tests/org/jetbrains/kotlin/analysis/test/framework/base/AbstractAnalysisApiBasedTest.kt index 7270b4cfa0b..5025e012159 100644 --- a/analysis/analysis-test-framework/tests/org/jetbrains/kotlin/analysis/test/framework/base/AbstractAnalysisApiBasedTest.kt +++ b/analysis/analysis-test-framework/tests/org/jetbrains/kotlin/analysis/test/framework/base/AbstractAnalysisApiBasedTest.kt @@ -17,6 +17,7 @@ import org.jetbrains.kotlin.analysis.test.framework.TestWithDisposable import org.jetbrains.kotlin.analysis.test.framework.project.structure.ktModuleProvider import org.jetbrains.kotlin.analysis.test.framework.services.ExpressionMarkerProvider import org.jetbrains.kotlin.analysis.test.framework.services.ExpressionMarkersSourceFilePreprocessor +import org.jetbrains.kotlin.analysis.test.framework.services.SubstitutionParser import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfigurator import org.jetbrains.kotlin.analysis.test.framework.utils.SkipTestException import org.jetbrains.kotlin.platform.jvm.JvmPlatforms @@ -103,6 +104,7 @@ abstract class AbstractAnalysisApiBasedTest : TestWithDisposable() { useDirectives(*AbstractKotlinCompilerTest.defaultDirectiveContainers.toTypedArray()) useDirectives(JvmEnvironmentConfigurationDirectives) + useDirectives(SubstitutionParser.Directives) useSourcePreprocessor(::ExpressionMarkersSourceFilePreprocessor) useAdditionalService { ExpressionMarkerProvider() } diff --git a/analysis/analysis-test-framework/tests/org/jetbrains/kotlin/analysis/test/framework/services/SubstitutionParser.kt b/analysis/analysis-test-framework/tests/org/jetbrains/kotlin/analysis/test/framework/services/SubstitutionParser.kt new file mode 100644 index 00000000000..64fb9d5c8b9 --- /dev/null +++ b/analysis/analysis-test-framework/tests/org/jetbrains/kotlin/analysis/test/framework/services/SubstitutionParser.kt @@ -0,0 +1,49 @@ +/* + * 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.test.framework.services + +import org.jetbrains.kotlin.analysis.api.KtAnalysisSession +import org.jetbrains.kotlin.analysis.api.components.buildSubstitutor +import org.jetbrains.kotlin.analysis.api.types.KtSubstitutor +import org.jetbrains.kotlin.psi.KtFile +import org.jetbrains.kotlin.psi.KtTypeParameter +import org.jetbrains.kotlin.psi.psiUtil.collectDescendantsOfType +import org.jetbrains.kotlin.test.directives.model.SimpleDirectivesContainer +import org.jetbrains.kotlin.test.model.TestModule + +object SubstitutionParser { + fun KtAnalysisSession.parseSubstitutors(module: TestModule, file: KtFile): List { + val directives = module.directives[Directives.SUBSTITUTOR] + if (directives.isEmpty()) return emptyList() + val allTypeParameterSymbols = file + .collectDescendantsOfType() + .map { it.getTypeParameterSymbol() } + .groupBy { it.name.asString() } + .mapValues { it.value.single() } + + return directives.map { subsitutor -> + buildSubstitutor { + subsitutor.forEach { (typeParameterName, typeString) -> + val typeParameterSymbol = allTypeParameterSymbols.getValue(typeParameterName) + val type = with(TypeParser) { parseTypeFromString(typeString, file, allTypeParameterSymbols) } + substitution(typeParameterSymbol, type) + } + } + } + } + + object Directives : SimpleDirectivesContainer() { + val SUBSTITUTOR by valueDirective("") { stringValue -> + stringValue.trim().split(";").map { it.trim() }.map { substitution -> + val asList = substitution.split("->").map { it.trim() } + check(asList.size == 2) { + "Substitution should look like `x -> y` but was `$substitution`" + } + asList[0] to asList[1] + } + } + } +} \ No newline at end of file diff --git a/analysis/analysis-test-framework/tests/org/jetbrains/kotlin/analysis/test/framework/services/TypeParser.kt b/analysis/analysis-test-framework/tests/org/jetbrains/kotlin/analysis/test/framework/services/TypeParser.kt new file mode 100644 index 00000000000..ac7b30f7ffb --- /dev/null +++ b/analysis/analysis-test-framework/tests/org/jetbrains/kotlin/analysis/test/framework/services/TypeParser.kt @@ -0,0 +1,50 @@ +/* + * 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.test.framework.services + +import org.jetbrains.kotlin.analysis.api.KtAnalysisSession +import org.jetbrains.kotlin.analysis.api.components.buildClassType +import org.jetbrains.kotlin.analysis.api.components.buildTypeParameterType +import org.jetbrains.kotlin.analysis.api.symbols.KtTypeParameterSymbol +import org.jetbrains.kotlin.analysis.api.types.KtType +import org.jetbrains.kotlin.name.ClassId +import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.psi.* + +object TypeParser { + fun KtAnalysisSession.parseTypeFromString( + stringType: String, + ktFile: KtFile, + typeParameterByName: Map + ): KtType { + val type = KtPsiFactory(ktFile).createType(stringType) + return convertType(type.typeElement ?: incorrectType(type), typeParameterByName) + } + + private fun KtAnalysisSession.convertType(type: KtTypeElement, typeParameterByName: Map): KtType = + when (type) { + is KtUserType -> { + val qualifier = fullQualifier(type) + if (qualifier in typeParameterByName) { + buildTypeParameterType(typeParameterByName.getValue(qualifier)) + } else { + buildClassType(ClassId.topLevel(FqName(qualifier))) { + type.typeArguments.forEach { argument -> + argument(convertType(argument.typeReference?.typeElement ?: incorrectType(type), typeParameterByName)) + } + } + } + } + else -> TODO(type::class.java.name) + } + + private fun fullQualifier(type: KtUserType) = + type.children.takeWhile { it !is KtTypeArgumentList }.joinToString(separator = ".") { it.text } + + private fun incorrectType(type: KtElement): Nothing { + error("Invalid type `${type.text}`") + } +} \ No newline at end of file diff --git a/generators/analysis-api-generator/tests/org/jetbrains/kotlin/generators/tests/analysis/api/analysisApi.kt b/generators/analysis-api-generator/tests/org/jetbrains/kotlin/generators/tests/analysis/api/analysisApi.kt index 9561702a765..d61e50e1289 100644 --- a/generators/analysis-api-generator/tests/org/jetbrains/kotlin/generators/tests/analysis/api/analysisApi.kt +++ b/generators/analysis-api-generator/tests/org/jetbrains/kotlin/generators/tests/analysis/api/analysisApi.kt @@ -22,6 +22,9 @@ import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.components.express import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.components.expressionTypeProvider.AbstractDeclarationReturnTypeTest import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.components.expressionTypeProvider.AbstractExpectedExpressionTypeTest import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.components.expressionTypeProvider.AbstractHLExpressionTypeTest +import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.components.signatureSubstitution.AbstractAnalysisApiSignatureSubstitutionTest +import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.components.signatureSubstitution.AbstractAnalysisApiSymbolAsSignatureTest +import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.components.signatureSubstitution.AbstractAnalysisApiSymbolSubstitutionTest import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.components.smartCastProvider.AbstractHLSmartCastInfoTest import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.components.symbolDeclarationOverridesProvider.AbstractIsSubclassOfTest import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.components.symbolDeclarationOverridesProvider.AbstractOverriddenDeclarationProviderTest @@ -251,4 +254,20 @@ private fun AnalysisApiTestGroup.generateAnalysisApiComponentsTests() { } } } + + component("signatureSubstitution") { + group(filter = analysisSessionModeIs(AnalysisSessionMode.Normal)) { + test(AbstractAnalysisApiSymbolAsSignatureTest::class) { + model("symbolAsSignature") + } + + test(AbstractAnalysisApiSymbolSubstitutionTest::class) { + model("symbolSubstitution") + } + + test(AbstractAnalysisApiSignatureSubstitutionTest::class) { + model("signatureSubstitution") + } + } + } }