FIR: minimize explicit use of <destruct> name
This commit is contained in:
@@ -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
|
||||||
|
|
||||||
|
|||||||
-3
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-3
@@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-6
@@ -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,
|
||||||
|
|||||||
+2
-2
@@ -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 {
|
||||||
|
|||||||
+7
-5
@@ -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>")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user