[FIR] Save inline status of lambda after resolution

This commit is contained in:
Dmitriy Novozhilov
2021-03-31 14:58:59 +03:00
committed by TeamCityServer
parent a4b9e2502c
commit 5ebd24eac5
183 changed files with 496 additions and 437 deletions
@@ -38,6 +38,7 @@ abstract class FirAnonymousFunction : FirFunction<FirAnonymousFunction>, FirExpr
abstract override val symbol: FirAnonymousFunctionSymbol
abstract val label: FirLabel?
abstract val invocationKind: EventOccurrencesRange?
abstract val inlineStatus: InlineStatus
abstract val isLambda: Boolean
abstract override val typeParameters: List<FirTypeParameter>
@@ -59,6 +60,8 @@ abstract class FirAnonymousFunction : FirFunction<FirAnonymousFunction>, FirExpr
abstract fun replaceInvocationKind(newInvocationKind: EventOccurrencesRange?)
abstract fun replaceInlineStatus(newInlineStatus: InlineStatus)
abstract override fun <D> transformAnnotations(transformer: FirTransformer<D>, data: D): FirAnonymousFunction
abstract override fun <D> transformReturnTypeRef(transformer: FirTransformer<D>, data: D): FirAnonymousFunction
@@ -18,6 +18,7 @@ import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.declarations.FirTypeParameter
import org.jetbrains.kotlin.fir.declarations.FirValueParameter
import org.jetbrains.kotlin.fir.declarations.InlineStatus
import org.jetbrains.kotlin.fir.declarations.builder.FirFunctionBuilder
import org.jetbrains.kotlin.fir.declarations.impl.FirAnonymousFunctionImpl
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
@@ -50,6 +51,7 @@ class FirAnonymousFunctionBuilder : FirFunctionBuilder, FirAnnotationContainerBu
lateinit var symbol: FirAnonymousFunctionSymbol
var label: FirLabel? = null
var invocationKind: EventOccurrencesRange? = null
var inlineStatus: InlineStatus = InlineStatus.Unknown
var isLambda: Boolean by kotlin.properties.Delegates.notNull<Boolean>()
val typeParameters: MutableList<FirTypeParameter> = mutableListOf()
@@ -69,6 +71,7 @@ class FirAnonymousFunctionBuilder : FirFunctionBuilder, FirAnnotationContainerBu
symbol,
label,
invocationKind,
inlineStatus,
isLambda,
typeParameters,
)
@@ -15,6 +15,7 @@ import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.declarations.FirTypeParameter
import org.jetbrains.kotlin.fir.declarations.FirValueParameter
import org.jetbrains.kotlin.fir.declarations.InlineStatus
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.fir.expressions.FirBlock
import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference
@@ -42,6 +43,7 @@ internal class FirAnonymousFunctionImpl(
override val symbol: FirAnonymousFunctionSymbol,
override var label: FirLabel?,
override var invocationKind: EventOccurrencesRange?,
override var inlineStatus: InlineStatus,
override val isLambda: Boolean,
override val typeParameters: MutableList<FirTypeParameter>,
) : FirAnonymousFunction() {
@@ -138,4 +140,8 @@ internal class FirAnonymousFunctionImpl(
override fun replaceInvocationKind(newInvocationKind: EventOccurrencesRange?) {
invocationKind = newInvocationKind
}
override fun replaceInlineStatus(newInlineStatus: InlineStatus) {
inlineStatus = newInlineStatus
}
}
@@ -577,9 +577,11 @@ class FirRenderer(builder: StringBuilder, private val mode: RenderMode = RenderM
anonymousFunction.valueParameters.renderParameters()
print(": ")
anonymousFunction.returnTypeRef.accept(this)
print(" <inline=${anonymousFunction.inlineStatus}")
if (anonymousFunction.invocationKind != null) {
print(" <kind=${anonymousFunction.invocationKind}> ")
print(", kind=${anonymousFunction.invocationKind}")
}
print("> ")
if (mode.renderLambdaBodies) {
anonymousFunction.body?.renderBody()
}
@@ -0,0 +1,13 @@
/*
* Copyright 2010-2021 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.declarations
enum class InlineStatus(val returnAllowed: Boolean) {
Inline(returnAllowed = true), // lambda will be inlined
NoInline(returnAllowed = false), // lambda won't be inlined (is part of not inline function call or marked with `noinline` modifier)
CrossInline(returnAllowed = false), // lambda will be inlined but marked with `crossinline` modifier
Unknown(returnAllowed = false), // inlinability of lambda is unknown
}
@@ -24,7 +24,7 @@ fun buildBinaryArgumentList(left: FirExpression, right: FirExpression): FirArgum
fun buildArraySetArgumentList(rValue: FirExpression, indexes: List<FirExpression>): FirArgumentList =
FirArraySetArgumentList(rValue, indexes)
fun buildResolvedArgumentList(mapping: LinkedHashMap<FirExpression, FirValueParameter>): FirArgumentList =
fun buildResolvedArgumentList(mapping: LinkedHashMap<FirExpression, FirValueParameter>): FirResolvedArgumentList =
FirResolvedArgumentList(mapping)
fun buildPartiallyResolvedArgumentList(
@@ -208,6 +208,7 @@ object BuilderConfigurator : AbstractBuilderConfigurator<FirTreeBuilder>(FirTree
builder(anonymousFunction) {
parents += functionBuilder
defaultNull("invocationKind", "label", "body", "controlFlowGraphReference")
default("inlineStatus", "InlineStatus.Unknown")
}
builder(propertyAccessor) {
@@ -282,6 +282,9 @@ object NodeConfigurator : AbstractFieldConfigurator<FirTreeBuilder>(FirTreeBuild
+field("invocationKind", eventOccurrencesRangeType, nullable = true, withReplace = true).apply {
isMutable = true
}
+field("inlineStatus", inlineStatusType, withReplace = true).apply {
isMutable = true
}
+booleanField("isLambda")
+typeParameters
}
@@ -26,6 +26,7 @@ val constKindType = type("types", "ConstantValueKind")
val operationType = type("fir.expressions", "FirOperation")
val classKindType = type(ClassKind::class)
val eventOccurrencesRangeType = type(EventOccurrencesRange::class)
val inlineStatusType = type("fir.declarations", "InlineStatus")
val varianceType = type(Variance::class)
val nameType = type(Name::class)
val visibilityType = type(Visibility::class)
@@ -87,4 +88,4 @@ val annotationResolveStatusType = generatedType("expressions", "FirAnnotationRes
val exhaustivenessStatusType = generatedType("expressions", "ExhaustivenessStatus")
val callableReferenceMappedArgumentsType = type("fir.resolve.calls", "CallableReferenceMappedArguments")
val callableReferenceMappedArgumentsType = type("fir.resolve.calls", "CallableReferenceMappedArguments")