From 1642eaa48a804e8992510c1893318cf340e94e8e Mon Sep 17 00:00:00 2001 From: Dmitrii Gridin Date: Fri, 14 Jul 2023 13:29:49 +0200 Subject: [PATCH] [FIR] getValueClassUnderlyingParameters: fix TODO ^KT-53573 Obsolete --- .../declarations/constructorParameter.kt | 3 +++ .../declarations/constructorParameter.txt | 16 ++++++++++++++++ ...fContentRootGetOrBuildFirTestGenerated.java | 6 ++++++ .../fir/SourceGetOrBuildFirTestGenerated.java | 6 ++++++ .../fir/declarations/ValueClassesUtils.kt | 18 ++++++------------ 5 files changed, 37 insertions(+), 12 deletions(-) create mode 100644 analysis/low-level-api-fir/testdata/getOrBuildFir/declarations/constructorParameter.kt create mode 100644 analysis/low-level-api-fir/testdata/getOrBuildFir/declarations/constructorParameter.txt diff --git a/analysis/low-level-api-fir/testdata/getOrBuildFir/declarations/constructorParameter.kt b/analysis/low-level-api-fir/testdata/getOrBuildFir/declarations/constructorParameter.kt new file mode 100644 index 00000000000..06175f51cc3 --- /dev/null +++ b/analysis/low-level-api-fir/testdata/getOrBuildFir/declarations/constructorParameter.kt @@ -0,0 +1,3 @@ +// LOOK_UP_FOR_ELEMENT_OF_TYPE: org.jetbrains.kotlin.psi.KtParameter + +class X(resolveMe: Int = 5) \ No newline at end of file diff --git a/analysis/low-level-api-fir/testdata/getOrBuildFir/declarations/constructorParameter.txt b/analysis/low-level-api-fir/testdata/getOrBuildFir/declarations/constructorParameter.txt new file mode 100644 index 00000000000..2ee8d692c8a --- /dev/null +++ b/analysis/low-level-api-fir/testdata/getOrBuildFir/declarations/constructorParameter.txt @@ -0,0 +1,16 @@ +KT element: KtParameter +FIR element: FirValueParameterImpl +FIR source kind: KtRealSourceElementKind + +FIR element rendered: +[ResolvedTo(BODY_RESOLVE)] resolveMe: R|kotlin/Int| = Int(5) + +FIR FILE: +FILE: [ResolvedTo(IMPORTS)] constructorParameter.kt + [ResolvedTo(BODY_RESOLVE)] annotations container + public final [ResolvedTo(STATUS)] class X : R|kotlin/Any| { + public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=X] constructor([ResolvedTo(BODY_RESOLVE)] resolveMe: R|kotlin/Int| = Int(5)): R|X| { + super() + } + + } diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/OutOfContentRootGetOrBuildFirTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/OutOfContentRootGetOrBuildFirTestGenerated.java index f74b089e7f6..52285f5405c 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/OutOfContentRootGetOrBuildFirTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/OutOfContentRootGetOrBuildFirTestGenerated.java @@ -477,6 +477,12 @@ public class OutOfContentRootGetOrBuildFirTestGenerated extends AbstractOutOfCon KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/low-level-api-fir/testdata/getOrBuildFir/declarations"), Pattern.compile("^(.+)\\.kt$"), null, true); } + @Test + @TestMetadata("constructorParameter.kt") + public void testConstructorParameter() throws Exception { + runTest("analysis/low-level-api-fir/testdata/getOrBuildFir/declarations/constructorParameter.kt"); + } + @Test @TestMetadata("constructorProperty.kt") public void testConstructorProperty() throws Exception { diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/SourceGetOrBuildFirTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/SourceGetOrBuildFirTestGenerated.java index b8688df5f47..774eded9f2f 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/SourceGetOrBuildFirTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/SourceGetOrBuildFirTestGenerated.java @@ -477,6 +477,12 @@ public class SourceGetOrBuildFirTestGenerated extends AbstractSourceGetOrBuildFi KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/low-level-api-fir/testdata/getOrBuildFir/declarations"), Pattern.compile("^(.+)\\.kt$"), null, true); } + @Test + @TestMetadata("constructorParameter.kt") + public void testConstructorParameter() throws Exception { + runTest("analysis/low-level-api-fir/testdata/getOrBuildFir/declarations/constructorParameter.kt"); + } + @Test @TestMetadata("constructorProperty.kt") public void testConstructorProperty() throws Exception { diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/declarations/ValueClassesUtils.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/declarations/ValueClassesUtils.kt index 2deb75172da..74eaaf91787 100644 --- a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/declarations/ValueClassesUtils.kt +++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/declarations/ValueClassesUtils.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * 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. */ @@ -42,23 +42,19 @@ internal fun ConeKotlinType.unsubstitutedUnderlyingTypeForInlineClass(session: F fun computeValueClassRepresentation(klass: FirRegularClass, session: FirSession): ValueClassRepresentation? { val parameters = klass.getValueClassUnderlyingParameters(session)?.takeIf { it.isNotEmpty() } ?: return null - val fields = parameters.map { it.name to it.returnTypeRef.coneType as ConeSimpleKotlinType } + val fields = parameters.map { it.name to it.symbol.resolvedReturnType as ConeSimpleKotlinType } fields.singleOrNull()?.let { (name, type) -> if (isRecursiveSingleFieldValueClass(type, session, mutableSetOf(type))) { // escape stack overflow return InlineClassRepresentation(name, type) } } + return createValueClassRepresentation(session.typeContext, fields) } private fun FirRegularClass.getValueClassUnderlyingParameters(session: FirSession): List? { if (!isInline) return null - - val primaryConstructorIfAny = primaryConstructorIfAny(session) ?: return null - // FIXME: ATM we cannot lazy-resolve value parameters individually because of KT-53573 - primaryConstructorIfAny.lazyResolveToPhase(FirResolvePhase.TYPES) - - return primaryConstructorIfAny.fir.valueParameters + return primaryConstructorIfAny(session)?.fir?.valueParameters } private fun isRecursiveSingleFieldValueClass( @@ -74,11 +70,9 @@ private fun ConeSimpleKotlinType.valueClassRepresentationTypeMarkersList(session val symbol = this.toSymbol(session) as? FirRegularClassSymbol ?: return null if (!symbol.fir.isInline) return null symbol.fir.valueClassRepresentation?.let { return it.underlyingPropertyNamesToTypes } - symbol.lazyResolveToPhase(FirResolvePhase.TYPES) + val constructorSymbol = symbol.fir.primaryConstructorIfAny(session) ?: return null - return constructorSymbol.valueParameterSymbols - .onEach { it.lazyResolveToPhase(FirResolvePhase.TYPES) } - .map { it.name to it.resolvedReturnType as ConeSimpleKotlinType } + return constructorSymbol.valueParameterSymbols.map { it.name to it.resolvedReturnType as ConeSimpleKotlinType } } fun FirSimpleFunction.isTypedEqualsInValueClass(session: FirSession): Boolean =