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) fun FirMemberDeclaration.isInlineOnly(): Boolean = isInline && hasAnnotation(INLINE_ONLY_ANNOTATION_CLASS_ID)
val FirProperty.isDestructuringDeclaration
get() = name.asString() == "<destruct>"
val FirExpression.isComponentCall val FirExpression.isComponentCall
get() = this is FirComponentCall get() = this is FirComponentCall
@@ -33,9 +33,6 @@ object FirDestructuringDeclarationChecker : FirPropertyChecker() {
val source = declaration.source ?: return val source = declaration.source ?: return
// val (...) = `destructuring_declaration` // val (...) = `destructuring_declaration`
if (source.elementType == KtNodeTypes.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) checkInitializer(source, declaration.initializer, reporter, context)
return return
} }
@@ -5,10 +5,10 @@
package org.jetbrains.kotlin.fir.analysis.checkers.declaration package org.jetbrains.kotlin.fir.analysis.checkers.declaration
import org.jetbrains.kotlin.KtNodeTypes
import org.jetbrains.kotlin.fir.FirRealSourceElementKind import org.jetbrains.kotlin.fir.FirRealSourceElementKind
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
import org.jetbrains.kotlin.fir.analysis.checkers.isComponentCall 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.checkers.isSubtypeForTypeMismatch
import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.INITIALIZER_TYPE_MISMATCH import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.INITIALIZER_TYPE_MISMATCH
@@ -21,7 +21,8 @@ import org.jetbrains.kotlin.name.StandardClassIds
object FirInitializerTypeMismatchChecker : FirPropertyChecker() { object FirInitializerTypeMismatchChecker : FirPropertyChecker() {
override fun check(declaration: FirProperty, context: CheckerContext, reporter: DiagnosticReporter) { override fun check(declaration: FirProperty, context: CheckerContext, reporter: DiagnosticReporter) {
val initializer = declaration.initializer ?: return 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 (initializer.isComponentCall) return
if (declaration.returnTypeRef.source?.kind != FirRealSourceElementKind) return if (declaration.returnTypeRef.source?.kind != FirRealSourceElementKind) return
val propertyType = declaration.returnTypeRef.coneType val propertyType = declaration.returnTypeRef.coneType
@@ -40,7 +41,6 @@ object FirInitializerTypeMismatchChecker : FirPropertyChecker() {
if (propertyType.isExtensionFunctionType || expressionType.isExtensionFunctionType) { if (propertyType.isExtensionFunctionType || expressionType.isExtensionFunctionType) {
return return
} }
val source = declaration.source ?: return
reporter.report(INITIALIZER_TYPE_MISMATCH.on(source, propertyType, expressionType), context) reporter.report(INITIALIZER_TYPE_MISMATCH.on(source, propertyType, expressionType), context)
} }
} }
@@ -37,8 +37,9 @@ object CanBeValChecker : AbstractFirPropertyInitializationChecker() {
graph.traverse(TraverseDirection.Forward, reporterVisitor) graph.traverse(TraverseDirection.Forward, reporterVisitor)
for (property in unprocessedProperties) { for (property in unprocessedProperties) {
if (property.fir.source is FirFakeSourceElement<*>) continue val source = property.fir.source
if (property.isDestructuring) continue if (source is FirFakeSourceElement<*>) continue
if (source?.elementType == KtNodeTypes.DESTRUCTURING_DECLARATION) continue
propertiesCharacteristics[property] = EventOccurrencesRange.ZERO propertiesCharacteristics[property] = EventOccurrencesRange.ZERO
} }
@@ -48,7 +49,7 @@ object CanBeValChecker : AbstractFirPropertyInitializationChecker() {
for ((symbol, value) in propertiesCharacteristics) { for ((symbol, value) in propertiesCharacteristics) {
val source = symbol.fir.source val source = symbol.fir.source
if (symbol.isDestructuring) { if (source?.elementType == KtNodeTypes.DESTRUCTURING_DECLARATION) {
lastDestructuringSource = source lastDestructuringSource = source
lastDestructuredVariables = symbol.getDestructuringChildrenCount() ?: continue lastDestructuredVariables = symbol.getDestructuringChildrenCount() ?: continue
destructuringCanBeVal = true destructuringCanBeVal = true
@@ -109,9 +110,6 @@ object CanBeValChecker : AbstractFirPropertyInitializationChecker() {
} }
} }
private val FirPropertySymbol.isDestructuring
get() = callableId.callableName.asString() == "<destruct>"
private val canBeValOccurrenceRanges = setOf( private val canBeValOccurrenceRanges = setOf(
EventOccurrencesRange.EXACTLY_ONCE, EventOccurrencesRange.EXACTLY_ONCE,
EventOccurrencesRange.AT_MOST_ONCE, EventOccurrencesRange.AT_MOST_ONCE,
@@ -151,7 +151,7 @@ class ExpressionsConverter(
for (valueParameter in valueParameterList) { for (valueParameter in valueParameterList) {
val multiDeclaration = valueParameter.destructuringDeclaration val multiDeclaration = valueParameter.destructuringDeclaration
valueParameters += if (multiDeclaration != null) { valueParameters += if (multiDeclaration != null) {
val name = Name.special("<destruct>") val name = DESTRUCTURING_NAME
val multiParameter = buildValueParameter { val multiParameter = buildValueParameter {
source = valueParameter.firValueParameter.source source = valueParameter.firValueParameter.source
session = baseSession session = baseSession
@@ -975,7 +975,7 @@ class ExpressionsConverter(
val multiDeclaration = parameter!!.destructuringDeclaration val multiDeclaration = parameter!!.destructuringDeclaration
val firLoopParameter = generateTemporaryVariable( val firLoopParameter = generateTemporaryVariable(
this@ExpressionsConverter.baseSession, null, this@ExpressionsConverter.baseSession, null,
if (multiDeclaration != null) Name.special("<destruct>") else parameter!!.firValueParameter.name, if (multiDeclaration != null) DESTRUCTURING_NAME else parameter!!.firValueParameter.name,
buildFunctionCall { buildFunctionCall {
calleeReference = buildSimpleNamedReference { name = Name.identifier("next") } calleeReference = buildSimpleNamedReference { name = Name.identifier("next") }
explicitReceiver = generateResolvedAccessExpression(null, iteratorVal) explicitReceiver = generateResolvedAccessExpression(null, iteratorVal)
@@ -1094,7 +1094,7 @@ open class RawFirBuilder(
for (valueParameter in literal.valueParameters) { for (valueParameter in literal.valueParameters) {
val multiDeclaration = valueParameter.destructuringDeclaration val multiDeclaration = valueParameter.destructuringDeclaration
valueParameters += if (multiDeclaration != null) { valueParameters += if (multiDeclaration != null) {
val name = Name.special("<destruct>") val name = DESTRUCTURING_NAME
val multiParameter = buildValueParameter { val multiParameter = buildValueParameter {
source = valueParameter.toFirSourceElement() source = valueParameter.toFirSourceElement()
session = baseSession session = baseSession
@@ -1750,7 +1750,7 @@ open class RawFirBuilder(
val multiDeclaration = ktParameter.destructuringDeclaration val multiDeclaration = ktParameter.destructuringDeclaration
val firLoopParameter = generateTemporaryVariable( val firLoopParameter = generateTemporaryVariable(
session = baseSession, source = expression.loopParameter?.toFirSourceElement(), 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 { initializer = buildFunctionCall {
source = fakeSource source = fakeSource
calleeReference = buildSimpleNamedReference { calleeReference = buildSimpleNamedReference {
@@ -147,11 +147,6 @@ abstract class BaseFirBuilder<T>(val baseSession: FirSession, val context: Conte
return result return result
} }
/**** Common utils ****/
companion object {
val ANONYMOUS_OBJECT_NAME = Name.special("<anonymous>")
}
fun FirExpression.toReturn( fun FirExpression.toReturn(
baseSource: FirSourceElement? = source, baseSource: FirSourceElement? = source,
labelName: String? = null, labelName: String? = null,
@@ -1206,4 +1201,11 @@ abstract class BaseFirBuilder<T>(val baseSession: FirSession, val context: Conte
context.forcedElementSourceKind = currentForced context.forcedElementSourceKind = currentForced
} }
} }
/**** Common utils ****/
companion object {
val ANONYMOUS_OBJECT_NAME = Name.special("<anonymous>")
val DESTRUCTURING_NAME = Name.special("<destruct>")
}
} }