[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
@@ -25,6 +25,9 @@ import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.remapArguments
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.resultType
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.writeResultType
import org.jetbrains.kotlin.fir.scopes.impl.FirIntegerOperatorCall
import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirConstructorSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.fir.types.builder.buildErrorTypeRef
import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef
@@ -173,7 +176,21 @@ class FirCallCompletionResultsWriterTransformer(
} else {
subCandidate.handleVarargs()
subCandidate.argumentMapping?.let {
result.replaceArgumentList(buildResolvedArgumentList(it))
val newArgumentList = buildResolvedArgumentList(it)
val symbol = subCandidate.symbol
val functionIsInline =
(symbol as? FirNamedFunctionSymbol)?.fir?.isInline == true || symbol.isArrayConstructorWithLambda
for ((argument, parameter) in newArgumentList.mapping) {
val lambda = argument.unwrapArgument() as? FirAnonymousFunction ?: continue
val inlineStatus = when {
parameter.isCrossinline && functionIsInline -> InlineStatus.CrossInline
parameter.isNoinline -> InlineStatus.NoInline
functionIsInline -> InlineStatus.Inline
else -> InlineStatus.NoInline
}
lambda.replaceInlineStatus(inlineStatus)
}
result.replaceArgumentList(newArgumentList)
}
}
result
@@ -199,6 +216,13 @@ class FirCallCompletionResultsWriterTransformer(
return result.compose()
}
private val AbstractFirBasedSymbol<*>.isArrayConstructorWithLambda: Boolean
get() {
val constructor = (this as? FirConstructorSymbol)?.fir ?: return false
if (constructor.valueParameters.size != 2) return false
return constructor.returnTypeRef.coneType.isArrayOrPrimitiveArray
}
override fun transformAnnotationCall(
annotationCall: FirAnnotationCall,
data: ExpectedArgumentType?
@@ -7,6 +7,9 @@ package org.jetbrains.kotlin.fir.types
import org.jetbrains.kotlin.fir.symbols.StandardClassIds
val ConeKotlinType.isArrayOrPrimitiveArray: Boolean
get() = arrayElementType() != null
fun ConeKotlinType.createOutArrayType(nullable: Boolean = false): ConeKotlinType {
return ConeKotlinTypeProjectionOut(this).createArrayType(nullable)
}