FIR: minimize explicit use of <destruct> name

This commit is contained in:
Mikhail Glukhikh
2021-04-13 14:20:20 +03:00
parent 78fc87ffb1
commit b8af3d79d4
7 changed files with 18 additions and 24 deletions
@@ -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() == "<destruct>"
val FirExpression.isComponentCall
get() = this is FirComponentCall
@@ -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() == "<destruct>") {
"Unexpected name: ${declaration.name.asString()} for destructuring declaration"
}
checkInitializer(source, declaration.initializer, reporter, context)
return
}
@@ -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)
}
}
@@ -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() == "<destruct>"
private val canBeValOccurrenceRanges = setOf(
EventOccurrencesRange.EXACTLY_ONCE,
EventOccurrencesRange.AT_MOST_ONCE,
@@ -151,7 +151,7 @@ class ExpressionsConverter(
for (valueParameter in valueParameterList) {
val multiDeclaration = valueParameter.destructuringDeclaration
valueParameters += if (multiDeclaration != null) {
val name = Name.special("<destruct>")
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("<destruct>") else parameter!!.firValueParameter.name,
if (multiDeclaration != null) DESTRUCTURING_NAME else parameter!!.firValueParameter.name,
buildFunctionCall {
calleeReference = buildSimpleNamedReference { name = Name.identifier("next") }
explicitReceiver = generateResolvedAccessExpression(null, iteratorVal)
@@ -1094,7 +1094,7 @@ open class RawFirBuilder(
for (valueParameter in literal.valueParameters) {
val multiDeclaration = valueParameter.destructuringDeclaration
valueParameters += if (multiDeclaration != null) {
val name = Name.special("<destruct>")
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("<destruct>") else ktParameter.nameAsSafeName,
name = if (multiDeclaration != null) DESTRUCTURING_NAME else ktParameter.nameAsSafeName,
initializer = buildFunctionCall {
source = fakeSource
calleeReference = buildSimpleNamedReference {
@@ -147,11 +147,6 @@ abstract class BaseFirBuilder<T>(val baseSession: FirSession, val context: Conte
return result
}
/**** Common utils ****/
companion object {
val ANONYMOUS_OBJECT_NAME = Name.special("<anonymous>")
}
fun FirExpression.toReturn(
baseSource: FirSourceElement? = source,
labelName: String? = null,
@@ -1206,4 +1201,11 @@ abstract class BaseFirBuilder<T>(val baseSession: FirSession, val context: Conte
context.forcedElementSourceKind = currentForced
}
}
/**** Common utils ****/
companion object {
val ANONYMOUS_OBJECT_NAME = Name.special("<anonymous>")
val DESTRUCTURING_NAME = Name.special("<destruct>")
}
}