Implement inlining of Array constructor in JS BE
See KT-15456
This commit is contained in:
@@ -28,7 +28,6 @@ import org.jetbrains.kotlin.js.inline.util.IdentitySet
|
||||
import org.jetbrains.kotlin.js.inline.util.isCallInvocation
|
||||
import org.jetbrains.kotlin.js.parser.parseFunction
|
||||
import org.jetbrains.kotlin.js.translate.context.Namer
|
||||
import org.jetbrains.kotlin.js.translate.reference.CallExpressionTranslator
|
||||
import org.jetbrains.kotlin.js.translate.utils.JsDescriptorUtils.getModuleName
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.isExtension
|
||||
import org.jetbrains.kotlin.resolve.inline.InlineStrategy
|
||||
@@ -143,7 +142,7 @@ class FunctionReader(private val config: JsConfig, private val currentModuleName
|
||||
|
||||
private fun readFunctionFromSource(descriptor: CallableDescriptor, info: ModuleInfo): JsFunction? {
|
||||
val source = info.fileContent
|
||||
val tag = Namer.getFunctionTag(descriptor)
|
||||
val tag = Namer.getFunctionTag(descriptor, config)
|
||||
val index = source.indexOf(tag)
|
||||
if (index < 0) return null
|
||||
|
||||
@@ -174,8 +173,6 @@ private fun JsFunction.markInlineArguments(descriptor: CallableDescriptor) {
|
||||
val offset = if (descriptor.isExtension) 1 else 0
|
||||
|
||||
for ((i, param) in params.withIndex()) {
|
||||
if (!CallExpressionTranslator.shouldBeInlined(descriptor)) continue
|
||||
|
||||
val type = param.type
|
||||
if (!type.isFunctionTypeOrSubtype) continue
|
||||
|
||||
|
||||
@@ -47,6 +47,7 @@ import static org.jetbrains.kotlin.js.translate.utils.JsAstUtils.flattenStatemen
|
||||
|
||||
public class JsInliner extends JsVisitorWithContextImpl {
|
||||
|
||||
private final JsConfig config;
|
||||
private final Map<JsName, JsFunction> functions;
|
||||
private final Map<String, JsFunction> accessors;
|
||||
private final Stack<JsInliningContext> inliningContexts = new Stack<>();
|
||||
@@ -76,7 +77,7 @@ public class JsInliner extends JsVisitorWithContextImpl {
|
||||
accessorInvocationTransformer.accept(fragment.getInitializerBlock());
|
||||
}
|
||||
FunctionReader functionReader = new FunctionReader(config, currentModuleName, fragments);
|
||||
JsInliner inliner = new JsInliner(functions, accessors, functionReader, trace);
|
||||
JsInliner inliner = new JsInliner(config, functions, accessors, functionReader, trace);
|
||||
for (JsProgramFragment fragment : fragmentsToProcess) {
|
||||
inliner.inliningContexts.push(inliner.new JsInliningContext());
|
||||
inliner.accept(fragment.getDeclarationBlock());
|
||||
@@ -92,11 +93,13 @@ public class JsInliner extends JsVisitorWithContextImpl {
|
||||
}
|
||||
|
||||
private JsInliner(
|
||||
@NotNull JsConfig config,
|
||||
@NotNull Map<JsName, JsFunction> functions,
|
||||
@NotNull Map<String, JsFunction> accessors,
|
||||
@NotNull FunctionReader functionReader,
|
||||
@NotNull DiagnosticSink trace
|
||||
) {
|
||||
this.config = config;
|
||||
this.functions = functions;
|
||||
this.accessors = accessors;
|
||||
this.functionReader = functionReader;
|
||||
@@ -285,7 +288,7 @@ public class JsInliner extends JsVisitorWithContextImpl {
|
||||
private final FunctionContext functionContext;
|
||||
|
||||
JsInliningContext() {
|
||||
functionContext = new FunctionContext(functionReader) {
|
||||
functionContext = new FunctionContext(functionReader, config) {
|
||||
@Nullable
|
||||
@Override
|
||||
protected JsFunction lookUpStaticFunction(@Nullable JsName functionName) {
|
||||
|
||||
@@ -19,11 +19,12 @@ package org.jetbrains.kotlin.js.inline.context
|
||||
import org.jetbrains.kotlin.js.backend.ast.*
|
||||
import org.jetbrains.kotlin.js.backend.ast.metadata.isCallableReference
|
||||
import org.jetbrains.kotlin.js.backend.ast.metadata.descriptor
|
||||
import org.jetbrains.kotlin.js.config.JsConfig
|
||||
import org.jetbrains.kotlin.js.inline.FunctionReader
|
||||
import org.jetbrains.kotlin.js.inline.util.*
|
||||
import org.jetbrains.kotlin.js.translate.context.Namer
|
||||
|
||||
abstract class FunctionContext(private val functionReader: FunctionReader) {
|
||||
abstract class FunctionContext(private val functionReader: FunctionReader, private val config: JsConfig) {
|
||||
protected abstract fun lookUpStaticFunction(functionName: JsName?): JsFunction?
|
||||
|
||||
protected abstract fun lookUpStaticFunctionByTag(functionTag: String): JsFunction?
|
||||
@@ -70,7 +71,7 @@ abstract class FunctionContext(private val functionReader: FunctionReader) {
|
||||
val descriptor = call.descriptor
|
||||
if (descriptor != null) {
|
||||
if (descriptor in functionReader) return functionReader[descriptor]
|
||||
lookUpStaticFunctionByTag(Namer.getFunctionTag(descriptor))?.let { return it }
|
||||
lookUpStaticFunctionByTag(Namer.getFunctionTag(descriptor, config))?.let { return it }
|
||||
}
|
||||
|
||||
/** remove ending `()` */
|
||||
|
||||
Reference in New Issue
Block a user