From 4e06ff26d4d490befcbe6777d56d3af2721225f6 Mon Sep 17 00:00:00 2001 From: Artem Kobzar Date: Fri, 13 May 2022 10:46:32 +0000 Subject: [PATCH] fix(KT-39423): add support of optional parameters to constructor + fix bug with optional parameters inside functions. --- .../js/lower/ExportedDefaultParameterStub.kt | 15 ++++++++++++--- .../constructors/constructors.d.ts | 2 +- .../declarations/declarations.d.ts | 13 ++++++++++++- .../declarations/declarations.kt | 12 +++++++++--- .../declarations/declarations__main.js | 2 +- .../declarations/declarations__main.ts | 2 +- 6 files changed, 36 insertions(+), 10 deletions(-) diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/ExportedDefaultParameterStub.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/ExportedDefaultParameterStub.kt index 3621318af4c..83e0f10c8f8 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/ExportedDefaultParameterStub.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/ExportedDefaultParameterStub.kt @@ -66,7 +66,6 @@ class ExportedDefaultParameterStub(val context: JsIrBackendContext) : Declaratio variables[valueParameter] = it } } - } if (variables.isNotEmpty()) { @@ -79,7 +78,13 @@ class ExportedDefaultParameterStub(val context: JsIrBackendContext) : Declaratio } - return this + return also { + valueParameters.forEach { + if (it.defaultValue != null) { + it.origin = JsLoweredDeclarationOrigin.JS_SHADOWED_DEFAULT_PARAMETER + } + } + } } override fun transformFlat(declaration: IrDeclaration): List? { @@ -113,8 +118,12 @@ class ExportedDefaultParameterStub(val context: JsIrBackendContext) : Declaratio exportedDefaultStubFun.copyParameterDeclarationsFrom(declaration) exportedDefaultStubFun.returnType = declaration.returnType.remapTypeParameters(declaration, exportedDefaultStubFun) exportedDefaultStubFun.valueParameters.forEach { + if (it.defaultValue != null) { + it.origin = JsLoweredDeclarationOrigin.JS_SHADOWED_DEFAULT_PARAMETER + } + it.defaultValue = null - it.origin = JsLoweredDeclarationOrigin.JS_SHADOWED_DEFAULT_PARAMETER + } declaration.origin = JsLoweredDeclarationOrigin.JS_SHADOWED_EXPORT diff --git a/js/js.translator/testData/typescript-export/constructors/constructors.d.ts b/js/js.translator/testData/typescript-export/constructors/constructors.d.ts index f40276ddb53..d459669f2b3 100644 --- a/js/js.translator/testData/typescript-export/constructors/constructors.d.ts +++ b/js/js.translator/testData/typescript-export/constructors/constructors.d.ts @@ -33,7 +33,7 @@ declare namespace JS_TESTS { static delegateToCreateFromInts(y: number, z: number): DerivedClassWithSecondaryCtor; } class KotlinGreeter { - constructor(greeting: string); + constructor(greeting?: string); get greeting(): string; } } diff --git a/js/js.translator/testData/typescript-export/declarations/declarations.d.ts b/js/js.translator/testData/typescript-export/declarations/declarations.d.ts index 7b9b1612994..0036bcc66ec 100644 --- a/js/js.translator/testData/typescript-export/declarations/declarations.d.ts +++ b/js/js.translator/testData/typescript-export/declarations/declarations.d.ts @@ -13,7 +13,7 @@ declare namespace JS_TESTS { function varargWithOtherParameters(x: string, y: Array, z: string): number; function varargWithComplexType(x: Array<(p0: Array) => Array>): number; function sumNullable(x: Nullable, y: Nullable): number; - function defaultParameters(x?: number, y?: string): string; + function defaultParameters(a: string, x?: number, y?: string): string; function generic1(x: T): T; function generic2(x: Nullable): boolean; function genericWithConstraint(x: T): T; @@ -187,5 +187,16 @@ declare namespace JS_TESTS { get value(): number; } } + class KT39423 { + constructor(a: string, b?: Nullable); + get a(): string; + get b(): Nullable; + component1(): string; + component2(): Nullable; + copy(a?: string, b?: Nullable): foo.KT39423; + toString(): string; + hashCode(): number; + equals(other: Nullable): boolean; + } } } diff --git a/js/js.translator/testData/typescript-export/declarations/declarations.kt b/js/js.translator/testData/typescript-export/declarations/declarations.kt index ff8b8f21c61..c106b43358b 100644 --- a/js/js.translator/testData/typescript-export/declarations/declarations.kt +++ b/js/js.translator/testData/typescript-export/declarations/declarations.kt @@ -35,8 +35,8 @@ fun sumNullable(x: Int?, y: Int?): Int = (x ?: 0) + (y ?: 0) @JsExport -fun defaultParameters(x: Int = 10, y: String = "OK"): String = - x.toString() + y +fun defaultParameters(a: String, x: Int = 10, y: String = "OK"): String = + a + x.toString() + y @JsExport fun generic1(x: T): T = x @@ -250,4 +250,10 @@ class __JsNameTest private constructor() { @JsName("NestedJsName") class __NestJsNameTest(@JsName("value") val __value: Int) -} \ No newline at end of file +} + +@JsExport +data class KT39423( + val a: String, + val b: Int? = null +) \ No newline at end of file diff --git a/js/js.translator/testData/typescript-export/declarations/declarations__main.js b/js/js.translator/testData/typescript-export/declarations/declarations__main.js index aa17238e03e..ee3a4f205be 100644 --- a/js/js.translator/testData/typescript-export/declarations/declarations__main.js +++ b/js/js.translator/testData/typescript-export/declarations/declarations__main.js @@ -51,7 +51,7 @@ function box() { assert(sumNullable(10, null) === 10); assert(sumNullable(undefined, 20) === 20); assert(sumNullable(1, 2) === 3); - assert(defaultParameters(20, "OK") === "20OK"); + assert(defaultParameters("", 20, "OK") === "20OK"); assert(generic1("FOO") === "FOO"); assert(generic1({ x: 10 }).x === 10); assert(generic2(null) === true); diff --git a/js/js.translator/testData/typescript-export/declarations/declarations__main.ts b/js/js.translator/testData/typescript-export/declarations/declarations__main.ts index ba23d890a51..ee6a3282464 100644 --- a/js/js.translator/testData/typescript-export/declarations/declarations__main.ts +++ b/js/js.translator/testData/typescript-export/declarations/declarations__main.ts @@ -54,7 +54,7 @@ function box(): string { assert(sumNullable(10, null) === 10); assert(sumNullable(undefined, 20) === 20); assert(sumNullable(1, 2) === 3); - assert(defaultParameters(20, "OK") === "20OK"); + assert(defaultParameters("", 20, "OK") === "20OK"); assert(generic1("FOO") === "FOO"); assert(generic1({x: 10}).x === 10); assert(generic2(null) === true);