JS: report inline suspend functions to IC

* Also inline suspend lambda'a
* Also use correct JsName's in exported suspend inline fun's
* Also use less unused imports
This commit is contained in:
Anton Bannykh
2018-11-01 20:23:45 +03:00
parent 82268cd95d
commit 59009430e5
13 changed files with 81 additions and 8 deletions
@@ -18,7 +18,6 @@ package org.jetbrains.kotlin.js.translate.callTranslator
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.builtins.isFunctionTypeOrSubtype
import org.jetbrains.kotlin.builtins.isSuspendFunctionType
import org.jetbrains.kotlin.builtins.isSuspendFunctionTypeOrSubtype
import org.jetbrains.kotlin.descriptors.CallableDescriptor
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
@@ -32,8 +31,6 @@ import org.jetbrains.kotlin.js.translate.reference.CallExpressionTranslator
import org.jetbrains.kotlin.js.translate.utils.*
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.psi.Call.CallType
import org.jetbrains.kotlin.psi.KtExpression
import org.jetbrains.kotlin.psi.KtWhenConditionInRange
import org.jetbrains.kotlin.resolve.calls.callResolverUtil.isInvokeCallOnVariable
import org.jetbrains.kotlin.resolve.calls.callUtil.isSafeCall
import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall
@@ -26,6 +26,7 @@ import org.jetbrains.kotlin.js.backend.ast.JsName
import org.jetbrains.kotlin.js.backend.ast.metadata.coroutineMetadata
import org.jetbrains.kotlin.js.backend.ast.metadata.isInlineableCoroutineBody
import org.jetbrains.kotlin.js.descriptorUtils.shouldBeExported
import org.jetbrains.kotlin.js.translate.callTranslator.CallTranslator
import org.jetbrains.kotlin.js.translate.context.TranslationContext
import org.jetbrains.kotlin.js.translate.expression.InlineMetadata
import org.jetbrains.kotlin.js.translate.expression.translateAndAliasParameters
@@ -100,17 +101,20 @@ abstract class AbstractDeclarationVisitor : TranslatorVisitor<Unit>() {
else {
null
}
addFunction(descriptor, functionAndContext?.first, expression)
if (descriptor.isSuspend && descriptor.isInline && descriptor.shouldBeExported(context.config) && functionAndContext != null) {
val exportFunction = functionAndContext.first as JsFunction
exportFunction.fillCoroutineMetadata(context, descriptor, exportFunction.coroutineMetadata!!.hasController)
addFunction(descriptor, exportFunction, expression)
val innerContext = functionAndContext.second
val inlineFunction = functionAndContext.first.deepCopy() as JsFunction
inlineFunction.name = null
inlineFunction.coroutineMetadata = null
inlineFunction.isInlineableCoroutineBody = true
val metadata = InlineMetadata.compose(inlineFunction, descriptor, innerContext)
val functionWithMetadata = metadata.functionWithMetadata(context, descriptor.source.getPsi())
context.addDeclarationStatement(functionWithMetadata.makeStmt())
context.addDeclarationStatement(innerContext.wrapWithInlineMetadata(context, inlineFunction, descriptor).makeStmt())
} else {
addFunction(descriptor, functionAndContext?.first, expression)
}
}