From 779a0373c755805a898fa0339f1ec0679dd6d528 Mon Sep 17 00:00:00 2001 From: Zalim Bashorov Date: Fri, 29 May 2015 00:26:06 +0300 Subject: [PATCH] JS backend: generate better code for secondary constructor calls -- don't generate undefined when it possible --- .../kotlin/utils/KotlinJavascriptMetadataUtils.kt | 2 +- .../js/translate/callTranslator/FunctionCallCases.kt | 2 +- .../kotlin/js/translate/declaration/ClassTranslator.kt | 2 +- .../org/jetbrains/kotlin/js/translate/utils/astUtils.kt | 8 +++++--- 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/compiler/util/src/org/jetbrains/kotlin/utils/KotlinJavascriptMetadataUtils.kt b/compiler/util/src/org/jetbrains/kotlin/utils/KotlinJavascriptMetadataUtils.kt index bc2bff3f245..f0d21f100e9 100644 --- a/compiler/util/src/org/jetbrains/kotlin/utils/KotlinJavascriptMetadataUtils.kt +++ b/compiler/util/src/org/jetbrains/kotlin/utils/KotlinJavascriptMetadataUtils.kt @@ -38,7 +38,7 @@ public object KotlinJavascriptMetadataUtils { * Matches string like .kotlin_module_metadata(, , ) */ private val METADATA_PATTERN = "(?m)\\w+\\.$KOTLIN_JAVASCRIPT_METHOD_NAME\\((\\d+),\\s*(['\"])([^'\"]*)\\2,\\s*(['\"])([^'\"]*)\\4\\)".toRegex() - private val ABI_VERSION = 2 + private val ABI_VERSION = 3 public fun replaceSuffix(filePath: String): String = filePath.substringBeforeLast(JS_EXT) + META_JS_SUFFIX diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/callTranslator/FunctionCallCases.kt b/js/js.translator/src/org/jetbrains/kotlin/js/translate/callTranslator/FunctionCallCases.kt index 130df76297a..63efd4a7e9a 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/callTranslator/FunctionCallCases.kt +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/callTranslator/FunctionCallCases.kt @@ -215,7 +215,7 @@ object ConstructorCallCase : FunctionCallCase { return JsNew(functionRef, argumentsInfo.translateArguments) } else { - return JsInvocation(functionRef, listOf(JsLiteral.UNDEFINED) + argumentsInfo.translateArguments) + return JsInvocation(functionRef, argumentsInfo.translateArguments) } } } diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/ClassTranslator.kt b/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/ClassTranslator.kt index bd95457ece9..da897eda15e 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/ClassTranslator.kt +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/ClassTranslator.kt @@ -311,7 +311,7 @@ public class ClassTranslator private constructor( val constructorInitializer = FunctionTranslator.newInstance(constructor, translationContext).translateAsMethod() val constructorFunction = constructorInitializer.getValueExpr() as JsFunction - constructorFunction.getParameters().add(0, JsParameter(thisName)) + constructorFunction.getParameters().add(JsParameter(thisName)) val referenceToClass = context.getQualifiedReference(classDescriptor) diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/astUtils.kt b/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/astUtils.kt index c4cdd53e577..05f6a5650fe 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/astUtils.kt +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/astUtils.kt @@ -64,15 +64,17 @@ fun JsExpression.toInvocationWith(thisExpr: JsExpression): JsExpression { is JsNew -> { qualifier = Namer.getFunctionCallRef(getConstructorExpression()) arguments = getArguments() + // `new A(a, b, c)` -> `A.call($this, a, b, c)` + return JsInvocation(qualifier, listOf(thisExpr) + arguments) } is JsInvocation -> { qualifier = getQualifier() - arguments = with(getArguments()) { subList(1, size()) } + arguments = getArguments() + // `A(a, b, c)` -> `A(a, b, c, $this)` + return JsInvocation(qualifier, arguments + thisExpr) } else -> throw IllegalStateException("Unexpected node type: " + javaClass) } - - return JsInvocation(qualifier, listOf(thisExpr) + arguments) } public var JsNameRef.qualifier: JsExpression?