From cb1c3f87f07c6dbce79d3c03c8e4b291226dd280 Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Mon, 1 Jun 2020 15:06:18 +0300 Subject: [PATCH] FIR: Prepare tree structure for safe-call refactoring ^KT-38444 In Progress --- .../expressions/FirCheckedSafeCallSubject.kt | 29 ++++++++ .../fir/expressions/FirSafeCallExpression.kt | 37 ++++++++++ .../FirCheckedSafeCallSubjectBuilder.kt | 50 ++++++++++++++ .../builder/FirSafeCallExpressionBuilder.kt | 56 ++++++++++++++++ .../impl/FirCheckedSafeCallSubjectImpl.kt | 45 +++++++++++++ .../impl/FirSafeCallExpressionImpl.kt | 67 +++++++++++++++++++ .../kotlin/fir/visitors/FirTransformer.kt | 18 +++++ .../kotlin/fir/visitors/FirVisitor.kt | 6 ++ .../kotlin/fir/visitors/FirVisitorVoid.kt | 18 +++++ .../fir/FirSafeCallCheckedSubjectReference.kt | 14 ++++ .../FirSafeCallOriginalReceiverReference.kt | 14 ++++ .../fir/tree/generator/BuilderConfigurator.kt | 6 +- .../fir/tree/generator/FirTreeBuilder.kt | 2 + .../generator/ImplementationConfigurator.kt | 2 + .../fir/tree/generator/NodeConfigurator.kt | 12 ++++ .../kotlin/fir/tree/generator/Types.kt | 9 ++- 16 files changed, 381 insertions(+), 4 deletions(-) create mode 100644 compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/FirCheckedSafeCallSubject.kt create mode 100644 compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/FirSafeCallExpression.kt create mode 100644 compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/builder/FirCheckedSafeCallSubjectBuilder.kt create mode 100644 compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/builder/FirSafeCallExpressionBuilder.kt create mode 100644 compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirCheckedSafeCallSubjectImpl.kt create mode 100644 compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirSafeCallExpressionImpl.kt create mode 100644 compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirSafeCallCheckedSubjectReference.kt create mode 100644 compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirSafeCallOriginalReceiverReference.kt diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/FirCheckedSafeCallSubject.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/FirCheckedSafeCallSubject.kt new file mode 100644 index 00000000000..4734cbdbbb6 --- /dev/null +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/FirCheckedSafeCallSubject.kt @@ -0,0 +1,29 @@ +/* + * Copyright 2010-2020 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. + */ + +package org.jetbrains.kotlin.fir.expressions + +import org.jetbrains.kotlin.fir.FirSafeCallOriginalReceiverReference +import org.jetbrains.kotlin.fir.FirSourceElement +import org.jetbrains.kotlin.fir.types.FirTypeRef +import org.jetbrains.kotlin.fir.visitors.* + +/* + * This file was generated automatically + * DO NOT MODIFY IT MANUALLY + */ + +abstract class FirCheckedSafeCallSubject : FirExpression() { + abstract override val source: FirSourceElement? + abstract override val typeRef: FirTypeRef + abstract override val annotations: List + abstract val originalReceiverReference: FirSafeCallOriginalReceiverReference + + override fun accept(visitor: FirVisitor, data: D): R = visitor.visitCheckedSafeCallSubject(this, data) + + abstract override fun replaceTypeRef(newTypeRef: FirTypeRef) + + abstract override fun transformAnnotations(transformer: FirTransformer, data: D): FirCheckedSafeCallSubject +} diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/FirSafeCallExpression.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/FirSafeCallExpression.kt new file mode 100644 index 00000000000..365ad07b8f3 --- /dev/null +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/FirSafeCallExpression.kt @@ -0,0 +1,37 @@ +/* + * Copyright 2010-2020 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. + */ + +package org.jetbrains.kotlin.fir.expressions + +import org.jetbrains.kotlin.fir.FirSafeCallCheckedSubjectReference +import org.jetbrains.kotlin.fir.FirSourceElement +import org.jetbrains.kotlin.fir.types.FirTypeRef +import org.jetbrains.kotlin.fir.visitors.* + +/* + * This file was generated automatically + * DO NOT MODIFY IT MANUALLY + */ + +abstract class FirSafeCallExpression : FirExpression() { + abstract override val source: FirSourceElement? + abstract override val typeRef: FirTypeRef + abstract override val annotations: List + abstract val receiver: FirExpression + abstract val checkedSubject: FirSafeCallCheckedSubjectReference + abstract val regularQualifiedAccess: FirQualifiedAccess + + override fun accept(visitor: FirVisitor, data: D): R = visitor.visitSafeCallExpression(this, data) + + abstract override fun replaceTypeRef(newTypeRef: FirTypeRef) + + abstract fun replaceRegularQualifiedAccess(newRegularQualifiedAccess: FirQualifiedAccess) + + abstract override fun transformAnnotations(transformer: FirTransformer, data: D): FirSafeCallExpression + + abstract fun transformReceiver(transformer: FirTransformer, data: D): FirSafeCallExpression + + abstract fun transformRegularQualifiedAccess(transformer: FirTransformer, data: D): FirSafeCallExpression +} diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/builder/FirCheckedSafeCallSubjectBuilder.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/builder/FirCheckedSafeCallSubjectBuilder.kt new file mode 100644 index 00000000000..5c84324486a --- /dev/null +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/builder/FirCheckedSafeCallSubjectBuilder.kt @@ -0,0 +1,50 @@ +/* + * Copyright 2010-2020 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. + */ + +package org.jetbrains.kotlin.fir.expressions.builder + +import kotlin.contracts.* +import org.jetbrains.kotlin.fir.FirSafeCallOriginalReceiverReference +import org.jetbrains.kotlin.fir.FirSourceElement +import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder +import org.jetbrains.kotlin.fir.builder.FirBuilderDsl +import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall +import org.jetbrains.kotlin.fir.expressions.FirCheckedSafeCallSubject +import org.jetbrains.kotlin.fir.expressions.builder.FirExpressionBuilder +import org.jetbrains.kotlin.fir.expressions.impl.FirCheckedSafeCallSubjectImpl +import org.jetbrains.kotlin.fir.types.FirTypeRef +import org.jetbrains.kotlin.fir.types.impl.FirImplicitTypeRefImpl +import org.jetbrains.kotlin.fir.visitors.* + +/* + * This file was generated automatically + * DO NOT MODIFY IT MANUALLY + */ + +@FirBuilderDsl +class FirCheckedSafeCallSubjectBuilder : FirAnnotationContainerBuilder, FirExpressionBuilder { + override var source: FirSourceElement? = null + override var typeRef: FirTypeRef = FirImplicitTypeRefImpl(null) + override val annotations: MutableList = mutableListOf() + lateinit var originalReceiverReference: FirSafeCallOriginalReceiverReference + + override fun build(): FirCheckedSafeCallSubject { + return FirCheckedSafeCallSubjectImpl( + source, + typeRef, + annotations, + originalReceiverReference, + ) + } + +} + +@OptIn(ExperimentalContracts::class) +inline fun buildCheckedSafeCallSubject(init: FirCheckedSafeCallSubjectBuilder.() -> Unit): FirCheckedSafeCallSubject { + contract { + callsInPlace(init, kotlin.contracts.InvocationKind.EXACTLY_ONCE) + } + return FirCheckedSafeCallSubjectBuilder().apply(init).build() +} diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/builder/FirSafeCallExpressionBuilder.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/builder/FirSafeCallExpressionBuilder.kt new file mode 100644 index 00000000000..d884de8aee8 --- /dev/null +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/builder/FirSafeCallExpressionBuilder.kt @@ -0,0 +1,56 @@ +/* + * Copyright 2010-2020 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. + */ + +package org.jetbrains.kotlin.fir.expressions.builder + +import kotlin.contracts.* +import org.jetbrains.kotlin.fir.FirSafeCallCheckedSubjectReference +import org.jetbrains.kotlin.fir.FirSourceElement +import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder +import org.jetbrains.kotlin.fir.builder.FirBuilderDsl +import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall +import org.jetbrains.kotlin.fir.expressions.FirExpression +import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccess +import org.jetbrains.kotlin.fir.expressions.FirSafeCallExpression +import org.jetbrains.kotlin.fir.expressions.builder.FirExpressionBuilder +import org.jetbrains.kotlin.fir.expressions.impl.FirSafeCallExpressionImpl +import org.jetbrains.kotlin.fir.types.FirTypeRef +import org.jetbrains.kotlin.fir.types.impl.FirImplicitTypeRefImpl +import org.jetbrains.kotlin.fir.visitors.* + +/* + * This file was generated automatically + * DO NOT MODIFY IT MANUALLY + */ + +@FirBuilderDsl +class FirSafeCallExpressionBuilder : FirAnnotationContainerBuilder, FirExpressionBuilder { + override var source: FirSourceElement? = null + override var typeRef: FirTypeRef = FirImplicitTypeRefImpl(null) + override val annotations: MutableList = mutableListOf() + lateinit var receiver: FirExpression + lateinit var checkedSubject: FirSafeCallCheckedSubjectReference + lateinit var regularQualifiedAccess: FirQualifiedAccess + + override fun build(): FirSafeCallExpression { + return FirSafeCallExpressionImpl( + source, + typeRef, + annotations, + receiver, + checkedSubject, + regularQualifiedAccess, + ) + } + +} + +@OptIn(ExperimentalContracts::class) +inline fun buildSafeCallExpression(init: FirSafeCallExpressionBuilder.() -> Unit): FirSafeCallExpression { + contract { + callsInPlace(init, kotlin.contracts.InvocationKind.EXACTLY_ONCE) + } + return FirSafeCallExpressionBuilder().apply(init).build() +} diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirCheckedSafeCallSubjectImpl.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirCheckedSafeCallSubjectImpl.kt new file mode 100644 index 00000000000..110f449993a --- /dev/null +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirCheckedSafeCallSubjectImpl.kt @@ -0,0 +1,45 @@ +/* + * Copyright 2010-2020 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. + */ + +package org.jetbrains.kotlin.fir.expressions.impl + +import org.jetbrains.kotlin.fir.FirSafeCallOriginalReceiverReference +import org.jetbrains.kotlin.fir.FirSourceElement +import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall +import org.jetbrains.kotlin.fir.expressions.FirCheckedSafeCallSubject +import org.jetbrains.kotlin.fir.types.FirTypeRef +import org.jetbrains.kotlin.fir.visitors.* + +/* + * This file was generated automatically + * DO NOT MODIFY IT MANUALLY + */ + +internal class FirCheckedSafeCallSubjectImpl( + override val source: FirSourceElement?, + override var typeRef: FirTypeRef, + override val annotations: MutableList, + override val originalReceiverReference: FirSafeCallOriginalReceiverReference, +) : FirCheckedSafeCallSubject() { + override fun acceptChildren(visitor: FirVisitor, data: D) { + typeRef.accept(visitor, data) + annotations.forEach { it.accept(visitor, data) } + } + + override fun transformChildren(transformer: FirTransformer, data: D): FirCheckedSafeCallSubjectImpl { + typeRef = typeRef.transformSingle(transformer, data) + transformAnnotations(transformer, data) + return this + } + + override fun transformAnnotations(transformer: FirTransformer, data: D): FirCheckedSafeCallSubjectImpl { + annotations.transformInplace(transformer, data) + return this + } + + override fun replaceTypeRef(newTypeRef: FirTypeRef) { + typeRef = newTypeRef + } +} diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirSafeCallExpressionImpl.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirSafeCallExpressionImpl.kt new file mode 100644 index 00000000000..a5008414005 --- /dev/null +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirSafeCallExpressionImpl.kt @@ -0,0 +1,67 @@ +/* + * Copyright 2010-2020 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. + */ + +package org.jetbrains.kotlin.fir.expressions.impl + +import org.jetbrains.kotlin.fir.FirSafeCallCheckedSubjectReference +import org.jetbrains.kotlin.fir.FirSourceElement +import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall +import org.jetbrains.kotlin.fir.expressions.FirExpression +import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccess +import org.jetbrains.kotlin.fir.expressions.FirSafeCallExpression +import org.jetbrains.kotlin.fir.types.FirTypeRef +import org.jetbrains.kotlin.fir.visitors.* + +/* + * This file was generated automatically + * DO NOT MODIFY IT MANUALLY + */ + +internal class FirSafeCallExpressionImpl( + override val source: FirSourceElement?, + override var typeRef: FirTypeRef, + override val annotations: MutableList, + override var receiver: FirExpression, + override val checkedSubject: FirSafeCallCheckedSubjectReference, + override var regularQualifiedAccess: FirQualifiedAccess, +) : FirSafeCallExpression() { + override fun acceptChildren(visitor: FirVisitor, data: D) { + typeRef.accept(visitor, data) + annotations.forEach { it.accept(visitor, data) } + receiver.accept(visitor, data) + regularQualifiedAccess.accept(visitor, data) + } + + override fun transformChildren(transformer: FirTransformer, data: D): FirSafeCallExpressionImpl { + typeRef = typeRef.transformSingle(transformer, data) + transformAnnotations(transformer, data) + transformReceiver(transformer, data) + transformRegularQualifiedAccess(transformer, data) + return this + } + + override fun transformAnnotations(transformer: FirTransformer, data: D): FirSafeCallExpressionImpl { + annotations.transformInplace(transformer, data) + return this + } + + override fun transformReceiver(transformer: FirTransformer, data: D): FirSafeCallExpressionImpl { + receiver = receiver.transformSingle(transformer, data) + return this + } + + override fun transformRegularQualifiedAccess(transformer: FirTransformer, data: D): FirSafeCallExpressionImpl { + regularQualifiedAccess = regularQualifiedAccess.transformSingle(transformer, data) + return this + } + + override fun replaceTypeRef(newTypeRef: FirTypeRef) { + typeRef = newTypeRef + } + + override fun replaceRegularQualifiedAccess(newRegularQualifiedAccess: FirQualifiedAccess) { + regularQualifiedAccess = newRegularQualifiedAccess + } +} diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirTransformer.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirTransformer.kt index ab32c301264..edfdc645123 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirTransformer.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirTransformer.kt @@ -87,6 +87,8 @@ import org.jetbrains.kotlin.fir.expressions.FirComponentCall import org.jetbrains.kotlin.fir.expressions.FirCallableReferenceAccess import org.jetbrains.kotlin.fir.expressions.FirThisReceiverExpression import org.jetbrains.kotlin.fir.expressions.FirExpressionWithSmartcast +import org.jetbrains.kotlin.fir.expressions.FirSafeCallExpression +import org.jetbrains.kotlin.fir.expressions.FirCheckedSafeCallSubject import org.jetbrains.kotlin.fir.expressions.FirGetClassCall import org.jetbrains.kotlin.fir.expressions.FirWrappedExpression import org.jetbrains.kotlin.fir.expressions.FirWrappedArgumentExpression @@ -459,6 +461,14 @@ abstract class FirTransformer : FirVisitor { + return transformElement(safeCallExpression, data) + } + + open fun transformCheckedSafeCallSubject(checkedSafeCallSubject: FirCheckedSafeCallSubject, data: D): CompositeTransformResult { + return transformElement(checkedSafeCallSubject, data) + } + open fun transformGetClassCall(getClassCall: FirGetClassCall, data: D): CompositeTransformResult { return transformElement(getClassCall, data) } @@ -935,6 +945,14 @@ abstract class FirTransformer : FirVisitor { + return transformSafeCallExpression(safeCallExpression, data) + } + + final override fun visitCheckedSafeCallSubject(checkedSafeCallSubject: FirCheckedSafeCallSubject, data: D): CompositeTransformResult { + return transformCheckedSafeCallSubject(checkedSafeCallSubject, data) + } + final override fun visitGetClassCall(getClassCall: FirGetClassCall, data: D): CompositeTransformResult { return transformGetClassCall(getClassCall, data) } diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitor.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitor.kt index ba5ae7dd440..4e0e0be8e68 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitor.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitor.kt @@ -87,6 +87,8 @@ import org.jetbrains.kotlin.fir.expressions.FirComponentCall import org.jetbrains.kotlin.fir.expressions.FirCallableReferenceAccess import org.jetbrains.kotlin.fir.expressions.FirThisReceiverExpression import org.jetbrains.kotlin.fir.expressions.FirExpressionWithSmartcast +import org.jetbrains.kotlin.fir.expressions.FirSafeCallExpression +import org.jetbrains.kotlin.fir.expressions.FirCheckedSafeCallSubject import org.jetbrains.kotlin.fir.expressions.FirGetClassCall import org.jetbrains.kotlin.fir.expressions.FirWrappedExpression import org.jetbrains.kotlin.fir.expressions.FirWrappedArgumentExpression @@ -295,6 +297,10 @@ abstract class FirVisitor { open fun visitExpressionWithSmartcast(expressionWithSmartcast: FirExpressionWithSmartcast, data: D): R = visitElement(expressionWithSmartcast, data) + open fun visitSafeCallExpression(safeCallExpression: FirSafeCallExpression, data: D): R = visitElement(safeCallExpression, data) + + open fun visitCheckedSafeCallSubject(checkedSafeCallSubject: FirCheckedSafeCallSubject, data: D): R = visitElement(checkedSafeCallSubject, data) + open fun visitGetClassCall(getClassCall: FirGetClassCall, data: D): R = visitElement(getClassCall, data) open fun visitWrappedExpression(wrappedExpression: FirWrappedExpression, data: D): R = visitElement(wrappedExpression, data) diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitorVoid.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitorVoid.kt index 28c09d845b0..82ad688fef2 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitorVoid.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitorVoid.kt @@ -87,6 +87,8 @@ import org.jetbrains.kotlin.fir.expressions.FirComponentCall import org.jetbrains.kotlin.fir.expressions.FirCallableReferenceAccess import org.jetbrains.kotlin.fir.expressions.FirThisReceiverExpression import org.jetbrains.kotlin.fir.expressions.FirExpressionWithSmartcast +import org.jetbrains.kotlin.fir.expressions.FirSafeCallExpression +import org.jetbrains.kotlin.fir.expressions.FirCheckedSafeCallSubject import org.jetbrains.kotlin.fir.expressions.FirGetClassCall import org.jetbrains.kotlin.fir.expressions.FirWrappedExpression import org.jetbrains.kotlin.fir.expressions.FirWrappedArgumentExpression @@ -457,6 +459,14 @@ abstract class FirVisitorVoid : FirVisitor() { visitElement(expressionWithSmartcast) } + open fun visitSafeCallExpression(safeCallExpression: FirSafeCallExpression) { + visitElement(safeCallExpression) + } + + open fun visitCheckedSafeCallSubject(checkedSafeCallSubject: FirCheckedSafeCallSubject) { + visitElement(checkedSafeCallSubject) + } + open fun visitGetClassCall(getClassCall: FirGetClassCall) { visitElement(getClassCall) } @@ -933,6 +943,14 @@ abstract class FirVisitorVoid : FirVisitor() { visitExpressionWithSmartcast(expressionWithSmartcast) } + final override fun visitSafeCallExpression(safeCallExpression: FirSafeCallExpression, data: Nothing?) { + visitSafeCallExpression(safeCallExpression) + } + + final override fun visitCheckedSafeCallSubject(checkedSafeCallSubject: FirCheckedSafeCallSubject, data: Nothing?) { + visitCheckedSafeCallSubject(checkedSafeCallSubject) + } + final override fun visitGetClassCall(getClassCall: FirGetClassCall, data: Nothing?) { visitGetClassCall(getClassCall) } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirSafeCallCheckedSubjectReference.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirSafeCallCheckedSubjectReference.kt new file mode 100644 index 00000000000..e9e6930730c --- /dev/null +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirSafeCallCheckedSubjectReference.kt @@ -0,0 +1,14 @@ +/* + * Copyright 2010-2020 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. + */ + +package org.jetbrains.kotlin.fir + +import org.jetbrains.kotlin.fir.expressions.FirCheckedSafeCallSubject + +class FirSafeCallCheckedSubjectReference(var value: FirCheckedSafeCallSubject) { + fun bind(subject: FirCheckedSafeCallSubject) { + this.value = subject + } +} diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirSafeCallOriginalReceiverReference.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirSafeCallOriginalReceiverReference.kt new file mode 100644 index 00000000000..83afa4dc15a --- /dev/null +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirSafeCallOriginalReceiverReference.kt @@ -0,0 +1,14 @@ +/* + * Copyright 2010-2020 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. + */ + +package org.jetbrains.kotlin.fir + +import org.jetbrains.kotlin.fir.expressions.FirExpression + +class FirSafeCallOriginalReceiverReference(var value: FirExpression) { + fun bind(realReceiver: FirExpression) { + this.value = realReceiver + } +} diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/BuilderConfigurator.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/BuilderConfigurator.kt index c44ef62da3e..c1e07062130 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/BuilderConfigurator.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/BuilderConfigurator.kt @@ -280,7 +280,9 @@ object BuilderConfigurator : AbstractBuilderConfigurator(FirTree resolvedQualifier, resolvedReifiedParameterReference, expression to "FirExpressionStub", - varargArgumentsExpression + varargArgumentsExpression, + checkedSafeCallSubject, + safeCallExpression ) elementsWithDefaultTypeRef.forEach { val (element, name) = when (it) { @@ -375,4 +377,4 @@ object BuilderConfigurator : AbstractBuilderConfigurator(FirTree } } -} \ No newline at end of file +} diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/FirTreeBuilder.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/FirTreeBuilder.kt index f26ec10863a..f6c9b93755a 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/FirTreeBuilder.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/FirTreeBuilder.kt @@ -102,6 +102,8 @@ object FirTreeBuilder : AbstractFirTreeBuilder() { val callableReferenceAccess = element("CallableReferenceAccess", Expression, qualifiedAccessExpression) val thisReceiverExpression = element("ThisReceiverExpression", Expression, qualifiedAccessExpression) val expressionWithSmartcast = element("ExpressionWithSmartcast", Expression, qualifiedAccessExpression) + val safeCallExpression = element("SafeCallExpression", Expression, expression) + val checkedSafeCallSubject = element("CheckedSafeCallSubject", Expression, expression) val getClassCall = element("GetClassCall", Expression, expression, call) val wrappedExpression = element("WrappedExpression", Expression, expression) val wrappedArgumentExpression = element("WrappedArgumentExpression", Expression, wrappedExpression) diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt index 9c7b17ea513..05a03e0d06b 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt @@ -481,6 +481,8 @@ object ImplementationConfigurator : AbstractFirTreeImplementationConfigurator() "FirResolvedReifiedParameterReferenceImpl", "FirExpressionStub", "FirVarargArgumentsExpressionImpl", + "FirSafeCallExpressionImpl", + "FirCheckedSafeCallSubjectImpl", ) configureFieldInAllImplementations( field = "typeRef", diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt index 4bfac39e566..07b195ba87c 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt @@ -439,6 +439,18 @@ object NodeConfigurator : AbstractFieldConfigurator(FirTreeBuild +field("originalType", typeRef) } + safeCallExpression.configure { + +field("receiver", expression).withTransform() + // Special node that might be used as a reference to receiver of a safe call after null check + +field("checkedSubject", safeCallCheckedSubjectReferenceType) + // One that uses checkedReceiver as a receiver + +field("regularQualifiedAccess", qualifiedAccess, withReplace = true).withTransform() + } + + checkedSafeCallSubject.configure { + +field("originalReceiverReference", safeCallReceiverReferenceType) + } + callableReferenceAccess.configure { +field("calleeReference", namedReference, withReplace = true).withTransform() } diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/Types.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/Types.kt index c908b97d596..60aa07aa57f 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/Types.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/Types.kt @@ -6,7 +6,10 @@ package org.jetbrains.kotlin.fir.tree.generator import org.jetbrains.kotlin.contracts.description.InvocationKind -import org.jetbrains.kotlin.descriptors.* +import org.jetbrains.kotlin.descriptors.ClassKind +import org.jetbrains.kotlin.descriptors.Modality +import org.jetbrains.kotlin.descriptors.Visibilities +import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget import org.jetbrains.kotlin.fir.tree.generator.context.generatedType import org.jetbrains.kotlin.fir.tree.generator.context.type @@ -35,6 +38,8 @@ val annotationUseSiteTargetType = type(AnnotationUseSiteTarget::class) val operationKindType = type("fir.expressions", "LogicOperationKind") val coneKotlinTypeType = type(ConeKotlinType::class) val whenSubjectType = type("fir", "FirWhenSubject") +val safeCallReceiverReferenceType = type("fir", "FirSafeCallOriginalReceiverReference") +val safeCallCheckedSubjectReferenceType = type("fir", "FirSafeCallCheckedSubjectReference") val firSessionType = type("fir", "FirSession") val emptyCfgReferenceType = generatedType("references.impl", "FirEmptyControlFlowGraphReference") val noReceiverExpressionType = generatedType("expressions.impl", "FirNoReceiverExpression") @@ -71,4 +76,4 @@ val coneStubDiagnosticType = generatedType("diagnostics", "ConeStubDiagnostic") val dslBuilderAnnotationType = generatedType("builder", "FirBuilderDsl") val firImplementationDetailType = generatedType("FirImplementationDetail") val declarationOriginType = generatedType("declarations", "FirDeclarationOrigin") -val declarationAttributesType = generatedType("declarations", "FirDeclarationAttributes") \ No newline at end of file +val declarationAttributesType = generatedType("declarations", "FirDeclarationAttributes")