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 variables[valueParameter] = it
} }
} }
} }
if (variables.isNotEmpty()) { 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>? { override fun transformFlat(declaration: IrDeclaration): List<IrDeclaration>? {
@@ -113,8 +118,12 @@ class ExportedDefaultParameterStub(val context: JsIrBackendContext) : Declaratio
exportedDefaultStubFun.copyParameterDeclarationsFrom(declaration) exportedDefaultStubFun.copyParameterDeclarationsFrom(declaration)
exportedDefaultStubFun.returnType = declaration.returnType.remapTypeParameters(declaration, exportedDefaultStubFun) exportedDefaultStubFun.returnType = declaration.returnType.remapTypeParameters(declaration, exportedDefaultStubFun)
exportedDefaultStubFun.valueParameters.forEach { exportedDefaultStubFun.valueParameters.forEach {
if (it.defaultValue != null) {
it.origin = JsLoweredDeclarationOrigin.JS_SHADOWED_DEFAULT_PARAMETER
}
it.defaultValue = null it.defaultValue = null
it.origin = JsLoweredDeclarationOrigin.JS_SHADOWED_DEFAULT_PARAMETER
} }
declaration.origin = JsLoweredDeclarationOrigin.JS_SHADOWED_EXPORT declaration.origin = JsLoweredDeclarationOrigin.JS_SHADOWED_EXPORT
@@ -33,7 +33,7 @@ declare namespace JS_TESTS {
static delegateToCreateFromInts(y: number, z: number): DerivedClassWithSecondaryCtor; static delegateToCreateFromInts(y: number, z: number): DerivedClassWithSecondaryCtor;
} }
class KotlinGreeter { class KotlinGreeter {
constructor(greeting: string); constructor(greeting?: string);
get greeting(): string; get greeting(): string;
} }
} }
@@ -13,7 +13,7 @@ declare namespace JS_TESTS {
function varargWithOtherParameters(x: string, y: Array<string>, z: string): number; function varargWithOtherParameters(x: string, y: Array<string>, z: string): number;
function varargWithComplexType(x: Array<(p0: Array<Int32Array>) => Array<Int32Array>>): number; function varargWithComplexType(x: Array<(p0: Array<Int32Array>) => Array<Int32Array>>): number;
function sumNullable(x: Nullable<number>, y: Nullable<number>): 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 generic1<T>(x: T): T;
function generic2<T>(x: Nullable<T>): boolean; function generic2<T>(x: Nullable<T>): boolean;
function genericWithConstraint<T extends string>(x: T): T; function genericWithConstraint<T extends string>(x: T): T;
@@ -187,5 +187,16 @@ declare namespace JS_TESTS {
get value(): number; 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) (x ?: 0) + (y ?: 0)
@JsExport @JsExport
fun defaultParameters(x: Int = 10, y: String = "OK"): String = fun defaultParameters(a: String, x: Int = 10, y: String = "OK"): String =
x.toString() + y a + x.toString() + y
@JsExport @JsExport
fun <T> generic1(x: T): T = x fun <T> generic1(x: T): T = x
@@ -251,3 +251,9 @@ class __JsNameTest private constructor() {
@JsName("NestedJsName") @JsName("NestedJsName")
class __NestJsNameTest(@JsName("value") val __value: Int) 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(10, null) === 10);
assert(sumNullable(undefined, 20) === 20); assert(sumNullable(undefined, 20) === 20);
assert(sumNullable(1, 2) === 3); assert(sumNullable(1, 2) === 3);
assert(defaultParameters(20, "OK") === "20OK"); assert(defaultParameters("", 20, "OK") === "20OK");
assert(generic1("FOO") === "FOO"); assert(generic1("FOO") === "FOO");
assert(generic1({ x: 10 }).x === 10); assert(generic1({ x: 10 }).x === 10);
assert(generic2(null) === true); assert(generic2(null) === true);
@@ -54,7 +54,7 @@ function box(): string {
assert(sumNullable(10, null) === 10); assert(sumNullable(10, null) === 10);
assert(sumNullable(undefined, 20) === 20); assert(sumNullable(undefined, 20) === 20);
assert(sumNullable(1, 2) === 3); assert(sumNullable(1, 2) === 3);
assert(defaultParameters(20, "OK") === "20OK"); assert(defaultParameters("", 20, "OK") === "20OK");
assert(generic1<string>("FOO") === "FOO"); assert(generic1<string>("FOO") === "FOO");
assert(generic1({x: 10}).x === 10); assert(generic1({x: 10}).x === 10);
assert(generic2(null) === true); assert(generic2(null) === true);