diff --git a/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/types/Fe10IdeNormalAnalysisSourceModuleTypeByDeclarationReturnTypeTestGenerated.java b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/types/Fe10IdeNormalAnalysisSourceModuleTypeByDeclarationReturnTypeTestGenerated.java new file mode 100644 index 00000000000..f4a591ca3c0 --- /dev/null +++ b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/types/Fe10IdeNormalAnalysisSourceModuleTypeByDeclarationReturnTypeTestGenerated.java @@ -0,0 +1,66 @@ +/* + * 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.api.fe10.test.cases.generated.cases.types; + +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.types.AbstractTypeByDeclarationReturnTypeTest; +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/analysis-api/testData/types/byDeclarationReturnType") +@TestDataPath("$PROJECT_ROOT") +public class Fe10IdeNormalAnalysisSourceModuleTypeByDeclarationReturnTypeTestGenerated extends AbstractTypeByDeclarationReturnTypeTest { + @NotNull + @Override + public AnalysisApiTestConfigurator getConfigurator() { + return AnalysisApiFe10TestConfiguratorFactory.INSTANCE.createConfigurator( + new AnalysisApiTestConfiguratorFactoryData( + FrontendKind.Fe10, + TestModuleKind.Source, + AnalysisSessionMode.Normal, + AnalysisApiMode.Ide + ) + ); + } + + @Test + public void testAllFilesPresentInByDeclarationReturnType() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/types/byDeclarationReturnType"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("localClassType.kt") + public void testLocalClassType() throws Exception { + runTest("analysis/analysis-api/testData/types/byDeclarationReturnType/localClassType.kt"); + } + + @Test + @TestMetadata("localClassWithTypeArgumentsType.kt") + public void testLocalClassWithTypeArgumentsType() throws Exception { + runTest("analysis/analysis-api/testData/types/byDeclarationReturnType/localClassWithTypeArgumentsType.kt"); + } + + @Test + @TestMetadata("localNestedClassType.kt") + public void testLocalNestedClassType() throws Exception { + runTest("analysis/analysis-api/testData/types/byDeclarationReturnType/localNestedClassType.kt"); + } +} diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirNamedClassOrObjectSymbol.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirNamedClassOrObjectSymbol.kt index ea980687490..d3246a7ffdf 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirNamedClassOrObjectSymbol.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirNamedClassOrObjectSymbol.kt @@ -107,7 +107,7 @@ internal class KtFirNamedClassOrObjectSymbol( firSymbol.classKind.toKtClassKind(isCompanionObject = firSymbol.isCompanion) } - override val symbolKind: KtSymbolKind get() = withValidityAssertion { getSymbolKind(firResolveSession) } + override val symbolKind: KtSymbolKind get() = withValidityAssertion { getSymbolKind() } context(KtAnalysisSession) override fun createPointer(): KtSymbolPointer = withValidityAssertion { diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirSymbol.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirSymbol.kt index cc91b67328b..372d165a743 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirSymbol.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirSymbol.kt @@ -16,16 +16,20 @@ import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolKind import org.jetbrains.kotlin.analysis.low.level.api.fir.api.LLFirResolveSession import org.jetbrains.kotlin.analysis.low.level.api.fir.util.errorWithFirSpecificEntries import org.jetbrains.kotlin.analysis.low.level.api.fir.util.withFirEntry +import org.jetbrains.kotlin.analysis.utils.errors.buildErrorWithAttachment +import org.jetbrains.kotlin.fir.containingClassForLocalAttr +import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration +import org.jetbrains.kotlin.fir.declarations.FirDeclaration +import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin +import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticPropertyAccessor +import org.jetbrains.kotlin.fir.declarations.utils.isLocal import org.jetbrains.kotlin.fir.scopes.impl.importedFromObjectOrStaticData import org.jetbrains.kotlin.fir.scopes.impl.originalForWrappedIntegerOperator import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol -import org.jetbrains.kotlin.analysis.utils.errors.buildErrorWithAttachment -import org.jetbrains.kotlin.fir.declarations.* -import org.jetbrains.kotlin.fir.declarations.utils.isLocal -import org.jetbrains.kotlin.fir.resolve.getContainingDeclaration import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol +import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol internal interface KtFirSymbol> : KtSymbol, KtLifetimeOwner { val firSymbol: S @@ -100,14 +104,17 @@ internal tailrec fun FirDeclaration.ktSymbolOrigin(): KtSymbolOrigin = when (ori FirDeclarationOrigin.ScriptCustomization -> KtSymbolOrigin.PLUGIN } -internal fun KtClassLikeSymbol.getSymbolKind(firResolveSession: LLFirResolveSession): KtSymbolKind { +internal fun KtClassLikeSymbol.getSymbolKind(): KtSymbolKind { val firSymbol = firSymbol as FirClassLikeSymbol<*> - return when { + if (firSymbol.isLocal) { // TODO: hack should be dropped after KT-54390 - firSymbol.isLocal && (firSymbol.fir.getContainingDeclaration(firResolveSession.useSiteFirSession) as? FirClass)?.let { clazz -> - clazz.declarations.none { it === firSymbol.fir } - } == true -> KtSymbolKind.LOCAL - + when { + firSymbol is FirRegularClassSymbol && firSymbol.fir.containingClassForLocalAttr == null -> { + return KtSymbolKind.LOCAL + } + } + } + return when { firSymbol.classId.isNestedClass -> KtSymbolKind.CLASS_MEMBER firSymbol.isLocal -> KtSymbolKind.LOCAL else -> KtSymbolKind.TOP_LEVEL diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirTypeAliasSymbol.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirTypeAliasSymbol.kt index 14ec6014633..b694e8c01ef 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirTypeAliasSymbol.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirTypeAliasSymbol.kt @@ -57,7 +57,7 @@ internal class KtFirTypeAliasSymbol( KtFirAnnotationListForDeclaration.create(firSymbol, firResolveSession.useSiteFirSession, token) } - override val symbolKind: KtSymbolKind get() = withValidityAssertion { getSymbolKind(firResolveSession) } + override val symbolKind: KtSymbolKind get() = withValidityAssertion { getSymbolKind() } context(KtAnalysisSession) override fun createPointer(): KtSymbolPointer = withValidityAssertion { diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/types/qualifiers/UsualClassTypeQualifierBuilder.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/types/qualifiers/UsualClassTypeQualifierBuilder.kt index bd86dbf9e9f..82a37c69d59 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/types/qualifiers/UsualClassTypeQualifierBuilder.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/types/qualifiers/UsualClassTypeQualifierBuilder.kt @@ -9,12 +9,13 @@ import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder import org.jetbrains.kotlin.analysis.api.types.KtClassTypeQualifier import org.jetbrains.kotlin.analysis.low.level.api.fir.api.tryCollectDesignation import org.jetbrains.kotlin.analysis.low.level.api.fir.util.errorWithFirSpecificEntries +import org.jetbrains.kotlin.analysis.low.level.api.fir.util.withFirEntry +import org.jetbrains.kotlin.analysis.utils.errors.checkWithAttachmentBuilder import org.jetbrains.kotlin.fir.containingClassForLocal import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.utils.isInner import org.jetbrains.kotlin.fir.declarations.utils.isLocal import org.jetbrains.kotlin.fir.renderWithType -import org.jetbrains.kotlin.fir.resolve.getContainingClass import org.jetbrains.kotlin.fir.resolve.toFirRegularClass import org.jetbrains.kotlin.fir.resolve.toSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol @@ -47,7 +48,6 @@ internal object UsualClassTypeQualifierBuilder { val nonLocalDesignation = it.tryCollectDesignation() nonLocalDesignation?.toSequence(includeTarget = true)?.toList() ?: collectDesignationPathForLocal(it) - ?: emptyList() } @@ -90,26 +90,21 @@ internal object UsualClassTypeQualifierBuilder { designation.add(currentClass) containingClassLookUp = currentClass.containingClassForLocal() } - return designation + return designation.asReversed() } - private fun collectDesignationPathForLocal(declaration: FirDeclaration): List? { - @OptIn(LookupTagInternals::class) - val containingClass = when (declaration) { - is FirCallableDeclaration -> declaration.getContainingClass(declaration.moduleData.session) - is FirAnonymousObject -> return listOf(declaration) - is FirClassLikeDeclaration -> declaration.let { - if (!declaration.isLocal) return null - (it as? FirRegularClass)?.containingClassForLocal()?.toFirRegularClass(declaration.moduleData.session) - } - + private fun collectDesignationPathForLocal(declaration: FirClassLikeDeclaration): List { + checkWithAttachmentBuilder( + declaration.isLocal, + message = { "${declaration::class} is not local" } + ) { + withFirEntry("firDeclaration", declaration) + } + return when (declaration) { + is FirAnonymousObject -> listOf(declaration) + is FirRegularClass -> declaration.collectForLocal() + is FirTypeAlias -> listOf(declaration) // TODO: handle type aliases else -> error("Invalid declaration ${declaration.renderWithType()}") - } ?: return listOf(declaration) - - return if (containingClass.isLocal) { - containingClass.collectForLocal().reversed() - } else { - null } } } \ No newline at end of file diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/types/FirIdeNormalAnalysisSourceModuleTypeByDeclarationReturnTypeTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/types/FirIdeNormalAnalysisSourceModuleTypeByDeclarationReturnTypeTestGenerated.java new file mode 100644 index 00000000000..bfbc471aa77 --- /dev/null +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/types/FirIdeNormalAnalysisSourceModuleTypeByDeclarationReturnTypeTestGenerated.java @@ -0,0 +1,66 @@ +/* + * 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.api.fir.test.cases.generated.cases.types; + +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.types.AbstractTypeByDeclarationReturnTypeTest; +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/analysis-api/testData/types/byDeclarationReturnType") +@TestDataPath("$PROJECT_ROOT") +public class FirIdeNormalAnalysisSourceModuleTypeByDeclarationReturnTypeTestGenerated extends AbstractTypeByDeclarationReturnTypeTest { + @NotNull + @Override + public AnalysisApiTestConfigurator getConfigurator() { + return AnalysisApiFirTestConfiguratorFactory.INSTANCE.createConfigurator( + new AnalysisApiTestConfiguratorFactoryData( + FrontendKind.Fir, + TestModuleKind.Source, + AnalysisSessionMode.Normal, + AnalysisApiMode.Ide + ) + ); + } + + @Test + public void testAllFilesPresentInByDeclarationReturnType() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/types/byDeclarationReturnType"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("localClassType.kt") + public void testLocalClassType() throws Exception { + runTest("analysis/analysis-api/testData/types/byDeclarationReturnType/localClassType.kt"); + } + + @Test + @TestMetadata("localClassWithTypeArgumentsType.kt") + public void testLocalClassWithTypeArgumentsType() throws Exception { + runTest("analysis/analysis-api/testData/types/byDeclarationReturnType/localClassWithTypeArgumentsType.kt"); + } + + @Test + @TestMetadata("localNestedClassType.kt") + public void testLocalNestedClassType() throws Exception { + runTest("analysis/analysis-api/testData/types/byDeclarationReturnType/localNestedClassType.kt"); + } +} diff --git a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/types/FirStandaloneNormalAnalysisSourceModuleTypeByDeclarationReturnTypeTestGenerated.java b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/types/FirStandaloneNormalAnalysisSourceModuleTypeByDeclarationReturnTypeTestGenerated.java new file mode 100644 index 00000000000..e4516b9e620 --- /dev/null +++ b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/types/FirStandaloneNormalAnalysisSourceModuleTypeByDeclarationReturnTypeTestGenerated.java @@ -0,0 +1,66 @@ +/* + * 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.api.standalone.fir.test.cases.generated.cases.types; + +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.types.AbstractTypeByDeclarationReturnTypeTest; +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/analysis-api/testData/types/byDeclarationReturnType") +@TestDataPath("$PROJECT_ROOT") +public class FirStandaloneNormalAnalysisSourceModuleTypeByDeclarationReturnTypeTestGenerated extends AbstractTypeByDeclarationReturnTypeTest { + @NotNull + @Override + public AnalysisApiTestConfigurator getConfigurator() { + return AnalysisApiFirStandaloneModeTestConfiguratorFactory.INSTANCE.createConfigurator( + new AnalysisApiTestConfiguratorFactoryData( + FrontendKind.Fir, + TestModuleKind.Source, + AnalysisSessionMode.Normal, + AnalysisApiMode.Standalone + ) + ); + } + + @Test + public void testAllFilesPresentInByDeclarationReturnType() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/types/byDeclarationReturnType"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("localClassType.kt") + public void testLocalClassType() throws Exception { + runTest("analysis/analysis-api/testData/types/byDeclarationReturnType/localClassType.kt"); + } + + @Test + @TestMetadata("localClassWithTypeArgumentsType.kt") + public void testLocalClassWithTypeArgumentsType() throws Exception { + runTest("analysis/analysis-api/testData/types/byDeclarationReturnType/localClassWithTypeArgumentsType.kt"); + } + + @Test + @TestMetadata("localNestedClassType.kt") + public void testLocalNestedClassType() throws Exception { + runTest("analysis/analysis-api/testData/types/byDeclarationReturnType/localNestedClassType.kt"); + } +} diff --git a/analysis/analysis-api/testData/components/psiTypeProvider/psiType/forExpression/localClassWithUnresolvedSuperType.txt b/analysis/analysis-api/testData/components/psiTypeProvider/psiType/forExpression/localClassWithUnresolvedSuperType.txt index ee178d22a7d..f3f602f6f15 100644 --- a/analysis/analysis-api/testData/components/psiTypeProvider/psiType/forExpression/localClassWithUnresolvedSuperType.txt +++ b/analysis/analysis-api/testData/components/psiTypeProvider/psiType/forExpression/localClassWithUnresolvedSuperType.txt @@ -1,2 +1,2 @@ -KtType: Foo +KtType: Foo.Bar PsiType: PsiType:Bar diff --git a/analysis/analysis-api/testData/types/byDeclarationReturnType/localClassType.descriptors.txt b/analysis/analysis-api/testData/types/byDeclarationReturnType/localClassType.descriptors.txt new file mode 100644 index 00000000000..b0101714079 --- /dev/null +++ b/analysis/analysis-api/testData/types/byDeclarationReturnType/localClassType.descriptors.txt @@ -0,0 +1,11 @@ +annotationsList: [] +classId: B +classSymbol: KtNamedClassOrObjectSymbol(/B) +nullability: NON_NULLABLE +ownTypeArguments: [] +qualifiers: [ + qualifier: + name: B + symbol: KtNamedClassOrObjectSymbol(/B) + typeArguments: [] +] \ No newline at end of file diff --git a/analysis/analysis-api/testData/types/byDeclarationReturnType/localClassType.kt b/analysis/analysis-api/testData/types/byDeclarationReturnType/localClassType.kt new file mode 100644 index 00000000000..04bef38a361 --- /dev/null +++ b/analysis/analysis-api/testData/types/byDeclarationReturnType/localClassType.kt @@ -0,0 +1,7 @@ +class A { + fun aa() { + class B() + + fun ccc(): B + } +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/types/byDeclarationReturnType/localClassType.txt b/analysis/analysis-api/testData/types/byDeclarationReturnType/localClassType.txt new file mode 100644 index 00000000000..5922cf24391 --- /dev/null +++ b/analysis/analysis-api/testData/types/byDeclarationReturnType/localClassType.txt @@ -0,0 +1,11 @@ +annotationsList: [] +classId: A.B +classSymbol: KtNamedClassOrObjectSymbol(/B) +nullability: NON_NULLABLE +ownTypeArguments: [] +qualifiers: [ + qualifier: + name: B + symbol: KtNamedClassOrObjectSymbol(/B) + typeArguments: [] +] \ No newline at end of file diff --git a/analysis/analysis-api/testData/types/byDeclarationReturnType/localClassWithTypeArgumentsType.descriptors.txt b/analysis/analysis-api/testData/types/byDeclarationReturnType/localClassWithTypeArgumentsType.descriptors.txt new file mode 100644 index 00000000000..481ad49bf48 --- /dev/null +++ b/analysis/analysis-api/testData/types/byDeclarationReturnType/localClassWithTypeArgumentsType.descriptors.txt @@ -0,0 +1,35 @@ +annotationsList: [] +classId: B +classSymbol: KtNamedClassOrObjectSymbol(/B) +nullability: NON_NULLABLE +ownTypeArguments: [ + annotationsList: [] + classId: kotlin/Int + classSymbol: KtNamedClassOrObjectSymbol(kotlin/Int) + nullability: NON_NULLABLE + ownTypeArguments: [] + qualifiers: [ + qualifier: + name: Int + symbol: KtNamedClassOrObjectSymbol(kotlin/Int) + typeArguments: [] + ] +] +qualifiers: [ + qualifier: + name: B + symbol: KtNamedClassOrObjectSymbol(/B) + typeArguments: [ + annotationsList: [] + classId: kotlin/Int + classSymbol: KtNamedClassOrObjectSymbol(kotlin/Int) + nullability: NON_NULLABLE + ownTypeArguments: [] + qualifiers: [ + qualifier: + name: Int + symbol: KtNamedClassOrObjectSymbol(kotlin/Int) + typeArguments: [] + ] + ] +] \ No newline at end of file diff --git a/analysis/analysis-api/testData/types/byDeclarationReturnType/localClassWithTypeArgumentsType.kt b/analysis/analysis-api/testData/types/byDeclarationReturnType/localClassWithTypeArgumentsType.kt new file mode 100644 index 00000000000..f63d6cb19e1 --- /dev/null +++ b/analysis/analysis-api/testData/types/byDeclarationReturnType/localClassWithTypeArgumentsType.kt @@ -0,0 +1,7 @@ +class A { + fun aa() { + class B() + + fun ccc(): B + } +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/types/byDeclarationReturnType/localClassWithTypeArgumentsType.txt b/analysis/analysis-api/testData/types/byDeclarationReturnType/localClassWithTypeArgumentsType.txt new file mode 100644 index 00000000000..0df15dd9eef --- /dev/null +++ b/analysis/analysis-api/testData/types/byDeclarationReturnType/localClassWithTypeArgumentsType.txt @@ -0,0 +1,35 @@ +annotationsList: [] +classId: A.B +classSymbol: KtNamedClassOrObjectSymbol(/B) +nullability: NON_NULLABLE +ownTypeArguments: [ + annotationsList: [] + classId: kotlin/Int + classSymbol: KtNamedClassOrObjectSymbol(kotlin/Int) + nullability: NON_NULLABLE + ownTypeArguments: [] + qualifiers: [ + qualifier: + name: Int + symbol: KtNamedClassOrObjectSymbol(kotlin/Int) + typeArguments: [] + ] +] +qualifiers: [ + qualifier: + name: B + symbol: KtNamedClassOrObjectSymbol(/B) + typeArguments: [ + annotationsList: [] + classId: kotlin/Int + classSymbol: KtNamedClassOrObjectSymbol(kotlin/Int) + nullability: NON_NULLABLE + ownTypeArguments: [] + qualifiers: [ + qualifier: + name: Int + symbol: KtNamedClassOrObjectSymbol(kotlin/Int) + typeArguments: [] + ] + ] +] \ No newline at end of file diff --git a/analysis/analysis-api/testData/types/byDeclarationReturnType/localNestedClassType.descriptors.txt b/analysis/analysis-api/testData/types/byDeclarationReturnType/localNestedClassType.descriptors.txt new file mode 100644 index 00000000000..2b457b54dff --- /dev/null +++ b/analysis/analysis-api/testData/types/byDeclarationReturnType/localNestedClassType.descriptors.txt @@ -0,0 +1,15 @@ +annotationsList: [] +classId: C +classSymbol: KtNamedClassOrObjectSymbol(/C) +nullability: NON_NULLABLE +ownTypeArguments: [] +qualifiers: [ + qualifier: + name: B + symbol: KtNamedClassOrObjectSymbol(/B) + typeArguments: [] + qualifier: + name: C + symbol: KtNamedClassOrObjectSymbol(/C) + typeArguments: [] +] \ No newline at end of file diff --git a/analysis/analysis-api/testData/types/byDeclarationReturnType/localNestedClassType.kt b/analysis/analysis-api/testData/types/byDeclarationReturnType/localNestedClassType.kt new file mode 100644 index 00000000000..cdb1545b4ab --- /dev/null +++ b/analysis/analysis-api/testData/types/byDeclarationReturnType/localNestedClassType.kt @@ -0,0 +1,9 @@ +class A { + fun aa() { + class B { + class C + } + + fun ccc(): B.C + } +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/types/byDeclarationReturnType/localNestedClassType.txt b/analysis/analysis-api/testData/types/byDeclarationReturnType/localNestedClassType.txt new file mode 100644 index 00000000000..dfccd88ffda --- /dev/null +++ b/analysis/analysis-api/testData/types/byDeclarationReturnType/localNestedClassType.txt @@ -0,0 +1,15 @@ +annotationsList: [] +classId: A.B.C +classSymbol: KtNamedClassOrObjectSymbol(/C) +nullability: NON_NULLABLE +ownTypeArguments: [] +qualifiers: [ + qualifier: + name: B + symbol: KtNamedClassOrObjectSymbol(/B) + typeArguments: [] + qualifier: + name: C + symbol: KtNamedClassOrObjectSymbol(/C) + typeArguments: [] +] \ No newline at end of file diff --git a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt index 3c700d62f22..863d8385886 100644 --- a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt +++ b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt @@ -60,8 +60,10 @@ import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl import org.jetbrains.kotlin.fir.types.impl.FirQualifierPartImpl import org.jetbrains.kotlin.fir.types.impl.FirTypeArgumentListImpl import org.jetbrains.kotlin.lexer.KtModifierKeywordToken +import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.lexer.KtTokens.* import org.jetbrains.kotlin.name.* +import org.jetbrains.kotlin.psi.stubs.elements.KtStubElementTypes import org.jetbrains.kotlin.utils.addToStdlib.runIf import org.jetbrains.kotlin.utils.addToStdlib.runUnless @@ -648,7 +650,9 @@ class DeclarationsConverter( } } }.also { - it.initContainingClassForLocalAttr() + if (classNode.getParent()?.elementType == KtStubElementTypes.CLASS_BODY) { + it.initContainingClassForLocalAttr() + } fillDanglingConstraintsTo(firTypeParameters, typeConstraints, it) } } diff --git a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt index 272cf1f222c..fd81b57ee5f 100644 --- a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt +++ b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt @@ -1332,7 +1332,9 @@ open class RawFirBuilder( } } }.also { - it.initContainingClassForLocalAttr() + if (classOrObject.parent is KtClassBody) { + it.initContainingClassForLocalAttr() + } classOrObject.fillDanglingConstraintsTo(it) } } diff --git a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/danglingAnnotationsClassLevel.txt b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/danglingAnnotationsClassLevel.txt index 19f0346dcdc..71ab834c044 100644 --- a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/danglingAnnotationsClassLevel.txt +++ b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/danglingAnnotationsClassLevel.txt @@ -27,7 +27,7 @@ FILE: danglingAnnotationsClassLevel.kt } public? final? fun withLocal(): R|kotlin/Unit| { - local final? [ContainingClassKey=Outer] class Local : R|kotlin/Any| { + local final? class Local : R|kotlin/Any| { public? [ContainingClassKey=Local] constructor(): R|Outer.Local| { super() } diff --git a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/enums3.txt b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/enums3.txt index 6bc46321277..344f5543008 100644 --- a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/enums3.txt +++ b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/enums3.txt @@ -5,7 +5,7 @@ FILE: enums3.kt } init { - local final? [ContainingClassKey=C] enum class Planet : R|kotlin/Enum| { + local final? enum class Planet : R|kotlin/Enum| { private [ContainingClassKey=Planet] constructor([CorrespondingProperty=/m] m: Double, [CorrespondingProperty=/r] r: Double): R|C.Planet| { super|>() } diff --git a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/initBlockWithDeclarations.txt b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/initBlockWithDeclarations.txt index e76aec6936a..97df679a768 100644 --- a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/initBlockWithDeclarations.txt +++ b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/initBlockWithDeclarations.txt @@ -5,7 +5,7 @@ FILE: initBlockWithDeclarations.kt } init { - local final? [ContainingClassKey=X] class classInInit : R|kotlin/Any| { + local final? class classInInit : R|kotlin/Any| { public? [ContainingClassKey=classInInit] constructor(): R|X.classInInit| { super() } @@ -27,7 +27,7 @@ FILE: initBlockWithDeclarations.kt } init { - local final? [ContainingClassKey=] class classInInit : R|kotlin/Any| { + local final? class classInInit : R|kotlin/Any| { public? [ContainingClassKey=classInInit] constructor(): R|.classInInit| { super() } 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 99417340e3d..b9e8757305b 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 @@ -46,6 +46,7 @@ import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.symbols.AbstractSy import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.symbols.AbstractSymbolByPsiTest import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.symbols.AbstractSymbolByReferenceTest import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.types.AbstractAnalysisApiSubstitutorsTest +import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.types.AbstractTypeByDeclarationReturnTypeTest import org.jetbrains.kotlin.analysis.api.standalone.fir.test.cases.components.psiDeclarationProvider.AbstractPsiDeclarationProviderTest import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiMode import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisSessionMode @@ -141,6 +142,12 @@ private fun AnalysisApiTestGroup.generateAnalysisApiNonComponentsTests() { } } + group("types", filter = analysisSessionModeIs(AnalysisSessionMode.Normal)) { + test(AbstractTypeByDeclarationReturnTypeTest::class) { + model("byDeclarationReturnType") + } + } + group("annotations") { test(AbstractAnalysisApiAnnotationsOnTypesTest::class) { model("annotationsOnTypes")