diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirHelpers.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirHelpers.kt index f8b62d00539..987ef19ec1d 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirHelpers.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirHelpers.kt @@ -420,9 +420,6 @@ private fun lowerThanBound(context: ConeInferenceContext, argument: ConeKotlinTy fun FirMemberDeclaration.isInlineOnly(): Boolean = isInline && hasAnnotation(INLINE_ONLY_ANNOTATION_CLASS_ID) -val FirProperty.isDestructuringDeclaration - get() = name.asString() == "" - val FirExpression.isComponentCall get() = this is FirComponentCall diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirDestructuringDeclarationChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirDestructuringDeclarationChecker.kt index d0d469cd08a..82b130b8c30 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirDestructuringDeclarationChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirDestructuringDeclarationChecker.kt @@ -33,9 +33,6 @@ object FirDestructuringDeclarationChecker : FirPropertyChecker() { val source = declaration.source ?: return // val (...) = `destructuring_declaration` if (source.elementType == KtNodeTypes.DESTRUCTURING_DECLARATION) { - assert(declaration.name.isSpecial && declaration.name.asString() == "") { - "Unexpected name: ${declaration.name.asString()} for destructuring declaration" - } checkInitializer(source, declaration.initializer, reporter, context) return } diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirInitializerTypeMismatchChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirInitializerTypeMismatchChecker.kt index ccc3e9af40d..2d21e0217bf 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirInitializerTypeMismatchChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirInitializerTypeMismatchChecker.kt @@ -5,10 +5,10 @@ package org.jetbrains.kotlin.fir.analysis.checkers.declaration +import org.jetbrains.kotlin.KtNodeTypes import org.jetbrains.kotlin.fir.FirRealSourceElementKind import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext import org.jetbrains.kotlin.fir.analysis.checkers.isComponentCall -import org.jetbrains.kotlin.fir.analysis.checkers.isDestructuringDeclaration import org.jetbrains.kotlin.fir.analysis.checkers.isSubtypeForTypeMismatch import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.INITIALIZER_TYPE_MISMATCH @@ -21,7 +21,8 @@ import org.jetbrains.kotlin.name.StandardClassIds object FirInitializerTypeMismatchChecker : FirPropertyChecker() { override fun check(declaration: FirProperty, context: CheckerContext, reporter: DiagnosticReporter) { val initializer = declaration.initializer ?: return - if (declaration.isDestructuringDeclaration) return + val source = declaration.source ?: return + if (source.elementType == KtNodeTypes.DESTRUCTURING_DECLARATION) return if (initializer.isComponentCall) return if (declaration.returnTypeRef.source?.kind != FirRealSourceElementKind) return val propertyType = declaration.returnTypeRef.coneType @@ -40,7 +41,6 @@ object FirInitializerTypeMismatchChecker : FirPropertyChecker() { if (propertyType.isExtensionFunctionType || expressionType.isExtensionFunctionType) { return } - val source = declaration.source ?: return reporter.report(INITIALIZER_TYPE_MISMATCH.on(source, propertyType, expressionType), context) } } diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/extended/CanBeValChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/extended/CanBeValChecker.kt index 4edc9b8d3ec..a1fca131da8 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/extended/CanBeValChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/extended/CanBeValChecker.kt @@ -37,8 +37,9 @@ object CanBeValChecker : AbstractFirPropertyInitializationChecker() { graph.traverse(TraverseDirection.Forward, reporterVisitor) for (property in unprocessedProperties) { - if (property.fir.source is FirFakeSourceElement<*>) continue - if (property.isDestructuring) continue + val source = property.fir.source + if (source is FirFakeSourceElement<*>) continue + if (source?.elementType == KtNodeTypes.DESTRUCTURING_DECLARATION) continue propertiesCharacteristics[property] = EventOccurrencesRange.ZERO } @@ -48,7 +49,7 @@ object CanBeValChecker : AbstractFirPropertyInitializationChecker() { for ((symbol, value) in propertiesCharacteristics) { val source = symbol.fir.source - if (symbol.isDestructuring) { + if (source?.elementType == KtNodeTypes.DESTRUCTURING_DECLARATION) { lastDestructuringSource = source lastDestructuredVariables = symbol.getDestructuringChildrenCount() ?: continue destructuringCanBeVal = true @@ -109,9 +110,6 @@ object CanBeValChecker : AbstractFirPropertyInitializationChecker() { } } - private val FirPropertySymbol.isDestructuring - get() = callableId.callableName.asString() == "" - private val canBeValOccurrenceRanges = setOf( EventOccurrencesRange.EXACTLY_ONCE, EventOccurrencesRange.AT_MOST_ONCE, diff --git a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/ExpressionsConverter.kt b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/ExpressionsConverter.kt index a266522ceb4..9ac5557d8e6 100644 --- a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/ExpressionsConverter.kt +++ b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/ExpressionsConverter.kt @@ -151,7 +151,7 @@ class ExpressionsConverter( for (valueParameter in valueParameterList) { val multiDeclaration = valueParameter.destructuringDeclaration valueParameters += if (multiDeclaration != null) { - val name = Name.special("") + val name = DESTRUCTURING_NAME val multiParameter = buildValueParameter { source = valueParameter.firValueParameter.source session = baseSession @@ -975,7 +975,7 @@ class ExpressionsConverter( val multiDeclaration = parameter!!.destructuringDeclaration val firLoopParameter = generateTemporaryVariable( this@ExpressionsConverter.baseSession, null, - if (multiDeclaration != null) Name.special("") else parameter!!.firValueParameter.name, + if (multiDeclaration != null) DESTRUCTURING_NAME else parameter!!.firValueParameter.name, buildFunctionCall { calleeReference = buildSimpleNamedReference { name = Name.identifier("next") } explicitReceiver = generateResolvedAccessExpression(null, iteratorVal) 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 41bae7baf83..803e1444fed 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 @@ -1094,7 +1094,7 @@ open class RawFirBuilder( for (valueParameter in literal.valueParameters) { val multiDeclaration = valueParameter.destructuringDeclaration valueParameters += if (multiDeclaration != null) { - val name = Name.special("") + val name = DESTRUCTURING_NAME val multiParameter = buildValueParameter { source = valueParameter.toFirSourceElement() session = baseSession @@ -1750,7 +1750,7 @@ open class RawFirBuilder( val multiDeclaration = ktParameter.destructuringDeclaration val firLoopParameter = generateTemporaryVariable( session = baseSession, source = expression.loopParameter?.toFirSourceElement(), - name = if (multiDeclaration != null) Name.special("") else ktParameter.nameAsSafeName, + name = if (multiDeclaration != null) DESTRUCTURING_NAME else ktParameter.nameAsSafeName, initializer = buildFunctionCall { source = fakeSource calleeReference = buildSimpleNamedReference { diff --git a/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/BaseFirBuilder.kt b/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/BaseFirBuilder.kt index e3c0e18b150..9ccfa3269ce 100644 --- a/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/BaseFirBuilder.kt +++ b/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/BaseFirBuilder.kt @@ -147,11 +147,6 @@ abstract class BaseFirBuilder(val baseSession: FirSession, val context: Conte return result } - /**** Common utils ****/ - companion object { - val ANONYMOUS_OBJECT_NAME = Name.special("") - } - fun FirExpression.toReturn( baseSource: FirSourceElement? = source, labelName: String? = null, @@ -1206,4 +1201,11 @@ abstract class BaseFirBuilder(val baseSession: FirSession, val context: Conte context.forcedElementSourceKind = currentForced } } + + /**** Common utils ****/ + companion object { + val ANONYMOUS_OBJECT_NAME = Name.special("") + + val DESTRUCTURING_NAME = Name.special("") + } }