[FIR] Don't convert non-local functions without name as FirAnonymousFunction

This commit is contained in:
Dmitriy Novozhilov
2020-06-15 14:19:56 +03:00
parent 44f6a5adcd
commit 3a4f53682f
2 changed files with 8 additions and 5 deletions
@@ -49,6 +49,7 @@ import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.name.SpecialNames
import org.jetbrains.kotlin.utils.addToStdlib.runIf
class DeclarationsConverter(
session: FirSession,
@@ -1187,7 +1188,7 @@ class DeclarationsConverter(
val parentNode = functionDeclaration.getParent()
val isLocal = !(parentNode?.tokenType == KT_FILE || parentNode?.tokenType == CLASS_BODY)
val target: FirFunctionTarget
val functionBuilder = if (identifier == null) {
val functionBuilder = if (identifier == null && isLocal) {
target = FirFunctionTarget(labelName = functionDeclaration.getLabelName(), isLambda = false)
FirAnonymousFunctionBuilder().apply {
source = functionDeclaration.toFirSourceElement()
@@ -1197,7 +1198,8 @@ class DeclarationsConverter(
}
} else {
val functionName = identifier.nameAsSafeName()
target = FirFunctionTarget(labelName = functionName.identifier, isLambda = false)
val labelName = runIf(!functionName.isSpecial) { functionName.identifier }
target = FirFunctionTarget(labelName, isLambda = false)
FirSimpleFunctionBuilder().apply {
source = functionDeclaration.toFirSourceElement()
receiverTypeRef = receiverType
@@ -45,6 +45,7 @@ import org.jetbrains.kotlin.types.Variance
import org.jetbrains.kotlin.types.expressions.OperatorConventions
import org.jetbrains.kotlin.util.OperatorNameConventions
import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull
import org.jetbrains.kotlin.utils.addToStdlib.runIf
import kotlin.collections.contains
class RawFirBuilder(
@@ -824,8 +825,8 @@ class RawFirBuilder(
val receiverType = function.receiverTypeReference.convertSafe<FirTypeRef>()
val labelName: String?
val functionBuilder = if (function.name == null) {
val functionIsAnonymousFunction = function.name == null && !function.parent.let { it is KtFile || it is KtClassBody }
val functionBuilder = if (functionIsAnonymousFunction) {
FirAnonymousFunctionBuilder().apply {
receiverTypeRef = receiverType
symbol = FirAnonymousFunctionSymbol()
@@ -836,7 +837,7 @@ class RawFirBuilder(
FirSimpleFunctionBuilder().apply {
receiverTypeRef = receiverType
name = function.nameAsSafeName
labelName = name.identifier
labelName = runIf(!name.isSpecial) { name.identifier }
symbol = FirNamedFunctionSymbol(callableIdForName(function.nameAsSafeName, function.isLocal))
status = FirDeclarationStatusImpl(
if (function.isLocal) Visibilities.LOCAL else function.visibility,