fix(KT-39423): add support of optional parameters to constructor + fix bug with optional parameters inside functions.

This commit is contained in:
Artem Kobzar
2022-05-13 10:46:32 +00:00
committed by Space
parent 0c24d0ec9f
commit 4e06ff26d4
6 changed files with 36 additions and 10 deletions
@@ -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<IrDeclaration>? {
@@ -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
@@ -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;
}
}
@@ -13,7 +13,7 @@ declare namespace JS_TESTS {
function varargWithOtherParameters(x: string, y: Array<string>, z: string): number;
function varargWithComplexType(x: Array<(p0: Array<Int32Array>) => Array<Int32Array>>): number;
function sumNullable(x: Nullable<number>, y: Nullable<number>): number;
function defaultParameters(x?: number, y?: string): string;
function defaultParameters(a: string, x?: number, y?: string): string;
function generic1<T>(x: T): T;
function generic2<T>(x: Nullable<T>): boolean;
function genericWithConstraint<T extends string>(x: T): T;
@@ -187,5 +187,16 @@ declare namespace JS_TESTS {
get value(): number;
}
}
class KT39423 {
constructor(a: string, b?: Nullable<number>);
get a(): string;
get b(): Nullable<number>;
component1(): string;
component2(): Nullable<number>;
copy(a?: string, b?: Nullable<number>): foo.KT39423;
toString(): string;
hashCode(): number;
equals(other: Nullable<any>): boolean;
}
}
}
@@ -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 <T> generic1(x: T): T = x
@@ -250,4 +250,10 @@ class __JsNameTest private constructor() {
@JsName("NestedJsName")
class __NestJsNameTest(@JsName("value") val __value: Int)
}
}
@JsExport
data class KT39423(
val a: String,
val b: Int? = null
)
@@ -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);
@@ -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<string>("FOO") === "FOO");
assert(generic1({x: 10}).x === 10);
assert(generic2(null) === true);