From e0245a9dc7bc2b71d13ba617cc6c338ef9c4770e Mon Sep 17 00:00:00 2001 From: Zalim Bashorov Date: Wed, 17 Jan 2018 16:04:51 +0300 Subject: [PATCH] KJS: support default arguments for expected declarations --- .../utils/FunctionBodyTranslator.java | 33 +++++++++++++------ 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/FunctionBodyTranslator.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/FunctionBodyTranslator.java index c7ffc9e07e7..09859db8069 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/FunctionBodyTranslator.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/FunctionBodyTranslator.java @@ -82,37 +82,50 @@ public final class FunctionBodyTranslator extends AbstractTranslator { @NotNull FunctionDescriptor descriptor, @NotNull TranslationContext context ) { - List originalParameters = descriptor.getValueParameters(); - List valueParameters; - if (descriptor.isActual() && CollectionsKt.none(originalParameters, ValueParameterDescriptor::declaresDefaultValue)) { + List valueParameters = descriptor.getValueParameters(); + List valueParametersForDefaultValue; + if (descriptor.isActual() && CollectionsKt.none(valueParameters, ValueParameterDescriptor::declaresDefaultValue)) { FunctionDescriptor expected = CodegenUtil.findExpectedFunctionForActual(descriptor); if (expected != null) { - valueParameters = expected.getValueParameters(); + valueParametersForDefaultValue = expected.getValueParameters(); } else { PsiElement element = DescriptorToSourceUtils.descriptorToDeclaration(descriptor); assert element != null : "No element found for descriptor: " + descriptor; context.bindingTrace().report(Errors.EXPECTED_FUNCTION_SOURCE_WITH_DEFAULT_ARGUMENTS_NOT_FOUND.on(element)); - valueParameters = originalParameters; + valueParametersForDefaultValue = valueParameters; } } else { - valueParameters = originalParameters; + valueParametersForDefaultValue = valueParameters; } List result = new ArrayList<>(valueParameters.size()); - for (ValueParameterDescriptor valueParameter : valueParameters) { - if (!valueParameter.declaresDefaultValue()) continue; + for (int i = 0; i < valueParameters.size(); i++) { + ValueParameterDescriptor valueParameter = valueParameters.get(i); + ValueParameterDescriptor valueParameterForDefaultValue = valueParametersForDefaultValue.get(i); + + if (!valueParameterForDefaultValue.declaresDefaultValue()) continue; JsExpression jsNameRef = ReferenceTranslator.translateAsValueReference(valueParameter, context); - KtExpression defaultArgument = BindingUtils.getDefaultArgument(valueParameter); + + KtExpression defaultArgument = BindingUtils.getDefaultArgument(valueParameterForDefaultValue); JsBlock defaultArgBlock = new JsBlock(); JsExpression defaultValue = Translation.translateAsExpression(defaultArgument, context, defaultArgBlock); + + // parameterName = defaultValue PsiElement psi = KotlinSourceElementKt.getPsi(valueParameter.getSource()); JsStatement assignStatement = assignment(jsNameRef, defaultValue).source(psi).makeStmt(); + JsStatement thenStatement = JsAstUtils.mergeStatementInBlockIfNeeded(assignStatement, defaultArgBlock); + + // parameterName === undefined JsBinaryOperation checkArgIsUndefined = equality(jsNameRef, Namer.getUndefinedExpression()); - checkArgIsUndefined.source(KotlinSourceElementKt.getPsi(valueParameter.getSource())); + checkArgIsUndefined.source(psi); + + // if (parameterName === undefined) { + // parameterName = defaultValue + // } JsIf jsIf = JsAstUtils.newJsIf(checkArgIsUndefined, thenStatement); jsIf.setSource(checkArgIsUndefined.getSource()); result.add(jsIf);