[K/JS] Exclude componentN methods from JsExport
This commit is contained in:
@@ -135,6 +135,12 @@ private val validateIrAfterLowering = makeCustomJsModulePhase(
|
|||||||
description = "Validate IR after lowering"
|
description = "Validate IR after lowering"
|
||||||
).toModuleLowering()
|
).toModuleLowering()
|
||||||
|
|
||||||
|
private val preventExportOfSyntheticDeclarationsLowering = makeDeclarationTransformerPhase(
|
||||||
|
::ExcludeSyntheticDeclarationsFromExportLowering,
|
||||||
|
name = "ExcludeSyntheticDeclarationsFromExportLowering",
|
||||||
|
description = "Exclude synthetic declarations which we don't want to export such as `Enum.entries` or `DataClass::componentN`",
|
||||||
|
)
|
||||||
|
|
||||||
val scriptRemoveReceiverLowering = makeJsModulePhase(
|
val scriptRemoveReceiverLowering = makeJsModulePhase(
|
||||||
::ScriptRemoveReceiverLowering,
|
::ScriptRemoveReceiverLowering,
|
||||||
name = "ScriptRemoveReceiver",
|
name = "ScriptRemoveReceiver",
|
||||||
@@ -358,12 +364,6 @@ private val enumEntryCreateGetInstancesFunsLoweringPhase = makeDeclarationTransf
|
|||||||
prerequisite = setOf(enumClassConstructorLoweringPhase)
|
prerequisite = setOf(enumClassConstructorLoweringPhase)
|
||||||
)
|
)
|
||||||
|
|
||||||
private val enumClassPreventExportOfNonExportedMembersLowering = makeDeclarationTransformerPhase(
|
|
||||||
::EnumClassPreventExportOfNonExportedMembersLowering,
|
|
||||||
name = "EnumClassPreventExportOfNonExportedMembersLowering",
|
|
||||||
description = "Exclude non-exportable enum members such as `Enum.entries`",
|
|
||||||
)
|
|
||||||
|
|
||||||
private val enumSyntheticFunsLoweringPhase = makeDeclarationTransformerPhase(
|
private val enumSyntheticFunsLoweringPhase = makeDeclarationTransformerPhase(
|
||||||
{ EnumSyntheticFunctionsAndPropertiesLowering(it, supportRawFunctionReference = true) },
|
{ EnumSyntheticFunctionsAndPropertiesLowering(it, supportRawFunctionReference = true) },
|
||||||
name = "EnumSyntheticFunctionsAndPropertiesLowering",
|
name = "EnumSyntheticFunctionsAndPropertiesLowering",
|
||||||
@@ -372,7 +372,6 @@ private val enumSyntheticFunsLoweringPhase = makeDeclarationTransformerPhase(
|
|||||||
enumClassConstructorLoweringPhase,
|
enumClassConstructorLoweringPhase,
|
||||||
enumClassCreateInitializerLoweringPhase,
|
enumClassCreateInitializerLoweringPhase,
|
||||||
enumEntryCreateGetInstancesFunsLoweringPhase,
|
enumEntryCreateGetInstancesFunsLoweringPhase,
|
||||||
enumClassPreventExportOfNonExportedMembersLowering
|
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -847,6 +846,7 @@ private val jsSuspendArityStorePhase = makeDeclarationTransformerPhase(
|
|||||||
val loweringList = listOf<Lowering>(
|
val loweringList = listOf<Lowering>(
|
||||||
scriptRemoveReceiverLowering,
|
scriptRemoveReceiverLowering,
|
||||||
validateIrBeforeLowering,
|
validateIrBeforeLowering,
|
||||||
|
preventExportOfSyntheticDeclarationsLowering,
|
||||||
inventNamesForLocalClassesPhase,
|
inventNamesForLocalClassesPhase,
|
||||||
annotationInstantiationLowering,
|
annotationInstantiationLowering,
|
||||||
expectDeclarationsRemovingPhase,
|
expectDeclarationsRemovingPhase,
|
||||||
@@ -894,7 +894,6 @@ val loweringList = listOf<Lowering>(
|
|||||||
enumEntryInstancesBodyLoweringPhase,
|
enumEntryInstancesBodyLoweringPhase,
|
||||||
enumClassCreateInitializerLoweringPhase,
|
enumClassCreateInitializerLoweringPhase,
|
||||||
enumEntryCreateGetInstancesFunsLoweringPhase,
|
enumEntryCreateGetInstancesFunsLoweringPhase,
|
||||||
enumClassPreventExportOfNonExportedMembersLowering,
|
|
||||||
enumSyntheticFunsLoweringPhase,
|
enumSyntheticFunsLoweringPhase,
|
||||||
enumUsageLoweringPhase,
|
enumUsageLoweringPhase,
|
||||||
externalEnumUsageLoweringPhase,
|
externalEnumUsageLoweringPhase,
|
||||||
|
|||||||
+2
-26
@@ -21,6 +21,8 @@ import org.jetbrains.kotlin.ir.backend.js.JsIrBackendContext
|
|||||||
import org.jetbrains.kotlin.ir.backend.js.JsLoweredDeclarationOrigin
|
import org.jetbrains.kotlin.ir.backend.js.JsLoweredDeclarationOrigin
|
||||||
import org.jetbrains.kotlin.ir.backend.js.export.isExported
|
import org.jetbrains.kotlin.ir.backend.js.export.isExported
|
||||||
import org.jetbrains.kotlin.ir.backend.js.ir.JsIrBuilder
|
import org.jetbrains.kotlin.ir.backend.js.ir.JsIrBuilder
|
||||||
|
import org.jetbrains.kotlin.ir.backend.js.utils.isInstantiableEnum
|
||||||
|
import org.jetbrains.kotlin.ir.backend.js.utils.parentEnumClassOrNull
|
||||||
import org.jetbrains.kotlin.ir.builders.*
|
import org.jetbrains.kotlin.ir.builders.*
|
||||||
import org.jetbrains.kotlin.ir.builders.declarations.addField
|
import org.jetbrains.kotlin.ir.builders.declarations.addField
|
||||||
import org.jetbrains.kotlin.ir.builders.declarations.buildConstructor
|
import org.jetbrains.kotlin.ir.builders.declarations.buildConstructor
|
||||||
@@ -59,26 +61,6 @@ private fun createEntryAccessorName(enumName: String, enumEntry: IrEnumEntry) =
|
|||||||
|
|
||||||
private fun IrEnumEntry.getType(irClass: IrClass) = (correspondingClass ?: irClass).defaultType
|
private fun IrEnumEntry.getType(irClass: IrClass) = (correspondingClass ?: irClass).defaultType
|
||||||
|
|
||||||
class EnumClassPreventExportOfNonExportedMembersLowering(val context: JsIrBackendContext) : DeclarationTransformer {
|
|
||||||
override fun transformFlat(declaration: IrDeclaration): List<IrDeclaration>? {
|
|
||||||
if (declaration !is IrSimpleFunction || declaration.parentEnumClassOrNull?.isExported(context) != true) return null
|
|
||||||
|
|
||||||
val syntheticGetterBody = declaration.body as? IrSyntheticBody ?: return null
|
|
||||||
|
|
||||||
if (syntheticGetterBody.kind == IrSyntheticBodyKind.ENUM_ENTRIES) {
|
|
||||||
declaration.correspondingPropertySymbol?.owner?.let {
|
|
||||||
it.annotations += generateJsExportIgnoreCall()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun generateJsExportIgnoreCall(): IrConstructorCall {
|
|
||||||
return JsIrBuilder.buildConstructorCall(context.intrinsics.jsExportIgnoreAnnotationSymbol.owner.primaryConstructor!!.symbol)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Should be applied recursively
|
// Should be applied recursively
|
||||||
class EnumClassConstructorLowering(val context: JsCommonBackendContext) : DeclarationTransformer {
|
class EnumClassConstructorLowering(val context: JsCommonBackendContext) : DeclarationTransformer {
|
||||||
|
|
||||||
@@ -477,12 +459,6 @@ class EnumEntryCreateGetInstancesFunsLowering(val context: JsCommonBackendContex
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private val IrClass.isInstantiableEnum: Boolean
|
|
||||||
get() = isEnumClass && !isExpect && !isEffectivelyExternal()
|
|
||||||
|
|
||||||
private val IrDeclaration.parentEnumClassOrNull: IrClass?
|
|
||||||
get() = parents.filterIsInstance<IrClass>().firstOrNull { it.isInstantiableEnum }
|
|
||||||
|
|
||||||
private const val ENTRIES_FIELD_NAME = "\$ENTRIES"
|
private const val ENTRIES_FIELD_NAME = "\$ENTRIES"
|
||||||
|
|
||||||
class EnumSyntheticFunctionsAndPropertiesLowering(
|
class EnumSyntheticFunctionsAndPropertiesLowering(
|
||||||
|
|||||||
+68
@@ -0,0 +1,68 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.ir.backend.js.lower
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.backend.common.DeclarationTransformer
|
||||||
|
import org.jetbrains.kotlin.builtins.StandardNames
|
||||||
|
import org.jetbrains.kotlin.ir.backend.js.JsIrBackendContext
|
||||||
|
import org.jetbrains.kotlin.ir.backend.js.export.isExported
|
||||||
|
import org.jetbrains.kotlin.ir.backend.js.ir.JsIrBuilder
|
||||||
|
import org.jetbrains.kotlin.ir.backend.js.utils.parentEnumClassOrNull
|
||||||
|
import org.jetbrains.kotlin.ir.declarations.*
|
||||||
|
import org.jetbrains.kotlin.ir.expressions.IrConstructorCall
|
||||||
|
import org.jetbrains.kotlin.ir.expressions.IrSyntheticBody
|
||||||
|
import org.jetbrains.kotlin.ir.expressions.IrSyntheticBodyKind
|
||||||
|
import org.jetbrains.kotlin.ir.util.parentClassOrNull
|
||||||
|
import org.jetbrains.kotlin.ir.util.primaryConstructor
|
||||||
|
|
||||||
|
class ExcludeSyntheticDeclarationsFromExportLowering(val context: JsIrBackendContext) : DeclarationTransformer {
|
||||||
|
override fun transformFlat(declaration: IrDeclaration): List<IrDeclaration>? {
|
||||||
|
if (declaration.shouldBeExcludedFromExport()) {
|
||||||
|
if (declaration is IrSimpleFunction) {
|
||||||
|
declaration.correspondingPropertySymbol?.owner?.excludeFromJsExport()
|
||||||
|
}
|
||||||
|
|
||||||
|
declaration.excludeFromJsExport()
|
||||||
|
}
|
||||||
|
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun IrDeclaration.shouldBeExcludedFromExport(): Boolean {
|
||||||
|
return isExportedSyntheticEnumEntriesProperty() || isComponentMethodOfDataClass()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun IrDeclaration.isComponentMethodOfDataClass(): Boolean {
|
||||||
|
if (this !is IrSimpleFunction) return false
|
||||||
|
val original = getOriginalFunction()
|
||||||
|
val parent = original.parentClassOrNull ?: return false
|
||||||
|
return parent.isExported(context) &&
|
||||||
|
original.origin == IrDeclarationOrigin.GENERATED_DATA_CLASS_MEMBER &&
|
||||||
|
original.name.identifier.startsWith(StandardNames.DATA_CLASS_COMPONENT_PREFIX)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun IrDeclaration.isExportedSyntheticEnumEntriesProperty(): Boolean {
|
||||||
|
return this is IrSimpleFunction &&
|
||||||
|
parentEnumClassOrNull?.isExported(context) == true &&
|
||||||
|
(body as? IrSyntheticBody)?.kind == IrSyntheticBodyKind.ENUM_ENTRIES
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun IrDeclaration.excludeFromJsExport() {
|
||||||
|
annotations += generateJsExportIgnoreCall()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun generateJsExportIgnoreCall(): IrConstructorCall {
|
||||||
|
return JsIrBuilder.buildConstructorCall(context.intrinsics.jsExportIgnoreAnnotationSymbol.owner.primaryConstructor!!.symbol)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun IrSimpleFunction.getOriginalFunction(): IrSimpleFunction {
|
||||||
|
return if (overriddenSymbols.isEmpty()) {
|
||||||
|
this
|
||||||
|
} else {
|
||||||
|
overriddenSymbols.first().owner.getOriginalFunction()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -5,6 +5,7 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.ir.backend.js.utils
|
package org.jetbrains.kotlin.ir.backend.js.utils
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.backend.common.lower.parents
|
||||||
import org.jetbrains.kotlin.descriptors.isClass
|
import org.jetbrains.kotlin.descriptors.isClass
|
||||||
import org.jetbrains.kotlin.descriptors.isInterface
|
import org.jetbrains.kotlin.descriptors.isInterface
|
||||||
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
|
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
|
||||||
@@ -23,6 +24,8 @@ import org.jetbrains.kotlin.ir.types.IrType
|
|||||||
import org.jetbrains.kotlin.ir.util.defaultType
|
import org.jetbrains.kotlin.ir.util.defaultType
|
||||||
import org.jetbrains.kotlin.ir.util.isAnnotationClass
|
import org.jetbrains.kotlin.ir.util.isAnnotationClass
|
||||||
import org.jetbrains.kotlin.ir.util.parentAsClass
|
import org.jetbrains.kotlin.ir.util.parentAsClass
|
||||||
|
import org.jetbrains.kotlin.ir.util.isEffectivelyExternal
|
||||||
|
import org.jetbrains.kotlin.ir.util.isEnumClass
|
||||||
import org.jetbrains.kotlin.ir.util.parentClassOrNull
|
import org.jetbrains.kotlin.ir.util.parentClassOrNull
|
||||||
import org.jetbrains.kotlin.name.FqName
|
import org.jetbrains.kotlin.name.FqName
|
||||||
|
|
||||||
@@ -70,6 +73,11 @@ val IrFunctionAccessExpression.typeArguments: List<IrType?>
|
|||||||
|
|
||||||
val IrFunctionAccessExpression.valueArguments: List<IrExpression?>
|
val IrFunctionAccessExpression.valueArguments: List<IrExpression?>
|
||||||
get() = List(valueArgumentsCount) { getValueArgument(it) }
|
get() = List(valueArgumentsCount) { getValueArgument(it) }
|
||||||
|
val IrClass.isInstantiableEnum: Boolean
|
||||||
|
get() = isEnumClass && !isExpect && !isEffectivelyExternal()
|
||||||
|
|
||||||
|
val IrDeclaration.parentEnumClassOrNull: IrClass?
|
||||||
|
get() = parents.filterIsInstance<IrClass>().firstOrNull { it.isInstantiableEnum }
|
||||||
|
|
||||||
// TODO: the code is written to pass Repl tests, so we should understand. why in Repl tests we don't have backingField
|
// TODO: the code is written to pass Repl tests, so we should understand. why in Repl tests we don't have backingField
|
||||||
fun JsIrBackendContext.getVoid(): IrExpression =
|
fun JsIrBackendContext.getVoid(): IrExpression =
|
||||||
|
|||||||
@@ -20,8 +20,6 @@ external interface JsResult {
|
|||||||
val copy01: String
|
val copy01: String
|
||||||
val copy10: String
|
val copy10: String
|
||||||
val copy11: String
|
val copy11: String
|
||||||
val component1: Int
|
|
||||||
val component2: Int
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@JsModule("./dataClass.mjs")
|
@JsModule("./dataClass.mjs")
|
||||||
@@ -41,12 +39,6 @@ fun box(): String {
|
|||||||
if (res.copy11 != "[13::11]") {
|
if (res.copy11 != "[13::11]") {
|
||||||
return "Fail4: ${res.copy11}"
|
return "Fail4: ${res.copy11}"
|
||||||
}
|
}
|
||||||
if (res.component1 != 3) {
|
|
||||||
return "Fail5: ${res.component1}"
|
|
||||||
}
|
|
||||||
if (res.component2 != 7) {
|
|
||||||
return "Fail6: ${res.component2}"
|
|
||||||
}
|
|
||||||
|
|
||||||
return "OK"
|
return "OK"
|
||||||
}
|
}
|
||||||
@@ -8,7 +8,5 @@ export default function() {
|
|||||||
"copy01": p.copy(undefined, 11).toString(),
|
"copy01": p.copy(undefined, 11).toString(),
|
||||||
"copy10": p.copy(15).toString(),
|
"copy10": p.copy(15).toString(),
|
||||||
"copy11": p.copy(13, 11).toString(),
|
"copy11": p.copy(13, 11).toString(),
|
||||||
"component1": p.component1(),
|
|
||||||
"component2": p.component2()
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -9,8 +9,6 @@ module.exports = function() {
|
|||||||
"copy01": p.copy(undefined, 11).toString(),
|
"copy01": p.copy(undefined, 11).toString(),
|
||||||
"copy10": p.copy(15).toString(),
|
"copy10": p.copy(15).toString(),
|
||||||
"copy11": p.copy(13, 11).toString(),
|
"copy11": p.copy(13, 11).toString(),
|
||||||
"component1": p.component1(),
|
|
||||||
"component2": p.component2()
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -19,8 +19,6 @@ external interface JsResult {
|
|||||||
val copy01: String
|
val copy01: String
|
||||||
val copy10: String
|
val copy10: String
|
||||||
val copy11: String
|
val copy11: String
|
||||||
val component1: Int
|
|
||||||
val component2: Int
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@JsModule("lib")
|
@JsModule("lib")
|
||||||
@@ -40,15 +38,6 @@ fun box(): String {
|
|||||||
if (res.copy11 != "[13::11]") {
|
if (res.copy11 != "[13::11]") {
|
||||||
return "Fail4: ${res.copy11}"
|
return "Fail4: ${res.copy11}"
|
||||||
}
|
}
|
||||||
if (res.component1 != 3) {
|
|
||||||
return "Fail5: ${res.component1}"
|
|
||||||
}
|
|
||||||
if (res.component2 != 7) {
|
|
||||||
return "Fail6: ${res.component2}"
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
return "OK"
|
return "OK"
|
||||||
}
|
}
|
||||||
Vendored
+14
-3
@@ -4,7 +4,6 @@ declare namespace JS_TESTS {
|
|||||||
class TestDataClass {
|
class TestDataClass {
|
||||||
constructor(name: string);
|
constructor(name: string);
|
||||||
get name(): string;
|
get name(): string;
|
||||||
component1(): string;
|
|
||||||
copy(name?: string): foo.TestDataClass;
|
copy(name?: string): foo.TestDataClass;
|
||||||
toString(): string;
|
toString(): string;
|
||||||
hashCode(): number;
|
hashCode(): number;
|
||||||
@@ -20,12 +19,24 @@ declare namespace JS_TESTS {
|
|||||||
constructor(a: string, b?: Nullable<number>);
|
constructor(a: string, b?: Nullable<number>);
|
||||||
get a(): string;
|
get a(): string;
|
||||||
get b(): Nullable<number>;
|
get b(): Nullable<number>;
|
||||||
component1(): string;
|
|
||||||
component2(): Nullable<number>;
|
|
||||||
copy(a?: string, b?: Nullable<number>): foo.KT39423;
|
copy(a?: string, b?: Nullable<number>): foo.KT39423;
|
||||||
toString(): string;
|
toString(): string;
|
||||||
hashCode(): number;
|
hashCode(): number;
|
||||||
equals(other: Nullable<any>): boolean;
|
equals(other: Nullable<any>): boolean;
|
||||||
}
|
}
|
||||||
|
abstract class WithComponent1 {
|
||||||
|
constructor();
|
||||||
|
abstract component1(): string;
|
||||||
|
}
|
||||||
|
class Test2 extends foo.WithComponent1 {
|
||||||
|
constructor(value1: string, value2: string);
|
||||||
|
get value1(): string;
|
||||||
|
get value2(): string;
|
||||||
|
component1(): string;
|
||||||
|
copy(value1?: string, value2?: string): foo.Test2;
|
||||||
|
toString(): string;
|
||||||
|
hashCode(): number;
|
||||||
|
equals(other: Nullable<any>): boolean;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+9
-1
@@ -24,4 +24,12 @@ data class TestDataClass(val name: String) {
|
|||||||
data class KT39423(
|
data class KT39423(
|
||||||
val a: String,
|
val a: String,
|
||||||
val b: Int? = null
|
val b: Int? = null
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
abstract class WithComponent1 {
|
||||||
|
abstract fun component1(): String
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
data class Test2(val value1: String, val value2: String): WithComponent1()
|
||||||
|
|||||||
Vendored
+8
-3
@@ -1,6 +1,7 @@
|
|||||||
"use strict";
|
"use strict";
|
||||||
var TestDataClass = JS_TESTS.foo.TestDataClass;
|
var TestDataClass = JS_TESTS.foo.TestDataClass;
|
||||||
var KT39423 = JS_TESTS.foo.KT39423;
|
var KT39423 = JS_TESTS.foo.KT39423;
|
||||||
|
var Test2 = JS_TESTS.foo.Test2;
|
||||||
function assert(condition) {
|
function assert(condition) {
|
||||||
if (!condition) {
|
if (!condition) {
|
||||||
throw "Assertion failed";
|
throw "Assertion failed";
|
||||||
@@ -8,7 +9,6 @@ function assert(condition) {
|
|||||||
}
|
}
|
||||||
function box() {
|
function box() {
|
||||||
assert(new TestDataClass("Test").name === "Test");
|
assert(new TestDataClass("Test").name === "Test");
|
||||||
assert(new TestDataClass("Test").component1() === "Test");
|
|
||||||
assert(new TestDataClass("Test").copy("NewTest").name === "NewTest");
|
assert(new TestDataClass("Test").copy("NewTest").name === "NewTest");
|
||||||
assert(new TestDataClass("Test").toString() === "TestDataClass(name=Test)");
|
assert(new TestDataClass("Test").toString() === "TestDataClass(name=Test)");
|
||||||
assert(new TestDataClass("Test").hashCode() === new TestDataClass("Test").hashCode());
|
assert(new TestDataClass("Test").hashCode() === new TestDataClass("Test").hashCode());
|
||||||
@@ -22,8 +22,6 @@ function box() {
|
|||||||
assert(new KT39423("Test", null).b === null);
|
assert(new KT39423("Test", null).b === null);
|
||||||
assert(new KT39423("Test", 42).a === "Test");
|
assert(new KT39423("Test", 42).a === "Test");
|
||||||
assert(new KT39423("Test", 42).b === 42);
|
assert(new KT39423("Test", 42).b === 42);
|
||||||
assert(new KT39423("Test", 42).component1() === "Test");
|
|
||||||
assert(new KT39423("Test", 42).component2() === 42);
|
|
||||||
assert(new KT39423("Test", 42).copy("NewTest").a === "NewTest");
|
assert(new KT39423("Test", 42).copy("NewTest").a === "NewTest");
|
||||||
assert(new KT39423("Test", 42).copy("NewTest").b === 42);
|
assert(new KT39423("Test", 42).copy("NewTest").b === 42);
|
||||||
assert(new KT39423("Test", 42).copy("Test", null).a === "Test");
|
assert(new KT39423("Test", 42).copy("Test", null).a === "Test");
|
||||||
@@ -31,5 +29,12 @@ function box() {
|
|||||||
assert(new KT39423("Test").toString() === "KT39423(a=Test, b=null)");
|
assert(new KT39423("Test").toString() === "KT39423(a=Test, b=null)");
|
||||||
assert(new KT39423("Test", null).toString() === "KT39423(a=Test, b=null)");
|
assert(new KT39423("Test", null).toString() === "KT39423(a=Test, b=null)");
|
||||||
assert(new KT39423("Test", 42).toString() === "KT39423(a=Test, b=42)");
|
assert(new KT39423("Test", 42).toString() === "KT39423(a=Test, b=42)");
|
||||||
|
assert(new Test2("1", "2").value1 === "1");
|
||||||
|
assert(new Test2("1", "2").value2 === "2");
|
||||||
|
assert(new Test2("1", "2").copy("3").value1 === "3");
|
||||||
|
assert(new Test2("1", "2").copy("3").value2 === "2");
|
||||||
|
assert(new Test2("1", "2").copy(undefined, "3").value1 === "1");
|
||||||
|
assert(new Test2("1", "2").copy(undefined, "3").value2 === "3");
|
||||||
|
assert(new Test2("1", "2").component1() === "1");
|
||||||
return "OK";
|
return "OK";
|
||||||
}
|
}
|
||||||
|
|||||||
Vendored
+11
-4
@@ -1,5 +1,6 @@
|
|||||||
import TestDataClass = JS_TESTS.foo.TestDataClass;
|
import TestDataClass = JS_TESTS.foo.TestDataClass;
|
||||||
import KT39423 = JS_TESTS.foo.KT39423;
|
import KT39423 = JS_TESTS.foo.KT39423;
|
||||||
|
import Test2 = JS_TESTS.foo.Test2;
|
||||||
|
|
||||||
function assert(condition: boolean) {
|
function assert(condition: boolean) {
|
||||||
if (!condition) {
|
if (!condition) {
|
||||||
@@ -9,7 +10,6 @@ function assert(condition: boolean) {
|
|||||||
|
|
||||||
function box(): string {
|
function box(): string {
|
||||||
assert(new TestDataClass("Test").name === "Test");
|
assert(new TestDataClass("Test").name === "Test");
|
||||||
assert(new TestDataClass("Test").component1() === "Test");
|
|
||||||
assert(new TestDataClass("Test").copy("NewTest").name === "NewTest");
|
assert(new TestDataClass("Test").copy("NewTest").name === "NewTest");
|
||||||
assert(new TestDataClass("Test").toString() === "TestDataClass(name=Test)");
|
assert(new TestDataClass("Test").toString() === "TestDataClass(name=Test)");
|
||||||
|
|
||||||
@@ -29,9 +29,6 @@ function box(): string {
|
|||||||
assert(new KT39423("Test", 42).a === "Test")
|
assert(new KT39423("Test", 42).a === "Test")
|
||||||
assert(new KT39423("Test", 42).b === 42)
|
assert(new KT39423("Test", 42).b === 42)
|
||||||
|
|
||||||
assert(new KT39423("Test", 42).component1() === "Test")
|
|
||||||
assert(new KT39423("Test", 42).component2() === 42)
|
|
||||||
|
|
||||||
assert(new KT39423("Test", 42).copy("NewTest").a === "NewTest")
|
assert(new KT39423("Test", 42).copy("NewTest").a === "NewTest")
|
||||||
assert(new KT39423("Test", 42).copy("NewTest").b === 42)
|
assert(new KT39423("Test", 42).copy("NewTest").b === 42)
|
||||||
assert(new KT39423("Test", 42).copy("Test", null).a === "Test")
|
assert(new KT39423("Test", 42).copy("Test", null).a === "Test")
|
||||||
@@ -41,5 +38,15 @@ function box(): string {
|
|||||||
assert(new KT39423("Test", null).toString() === "KT39423(a=Test, b=null)")
|
assert(new KT39423("Test", null).toString() === "KT39423(a=Test, b=null)")
|
||||||
assert(new KT39423("Test", 42).toString() === "KT39423(a=Test, b=42)")
|
assert(new KT39423("Test", 42).toString() === "KT39423(a=Test, b=42)")
|
||||||
|
|
||||||
|
assert(new Test2("1", "2").value1 === "1")
|
||||||
|
assert(new Test2("1", "2").value2 === "2")
|
||||||
|
|
||||||
|
assert(new Test2("1", "2").copy("3").value1 === "3")
|
||||||
|
assert(new Test2("1", "2").copy("3").value2 === "2")
|
||||||
|
assert(new Test2("1", "2").copy(undefined, "3").value1 === "1")
|
||||||
|
assert(new Test2("1", "2").copy(undefined, "3").value2 === "3")
|
||||||
|
|
||||||
|
assert(new Test2("1", "2").component1() === "1")
|
||||||
|
|
||||||
return "OK";
|
return "OK";
|
||||||
}
|
}
|
||||||
+14
-3
@@ -4,7 +4,6 @@ declare namespace JS_TESTS {
|
|||||||
class TestDataClass {
|
class TestDataClass {
|
||||||
constructor(name: string);
|
constructor(name: string);
|
||||||
get name(): string;
|
get name(): string;
|
||||||
component1(): string;
|
|
||||||
copy(name?: string): foo.TestDataClass;
|
copy(name?: string): foo.TestDataClass;
|
||||||
toString(): string;
|
toString(): string;
|
||||||
hashCode(): number;
|
hashCode(): number;
|
||||||
@@ -20,12 +19,24 @@ declare namespace JS_TESTS {
|
|||||||
constructor(a: string, b?: Nullable<number>);
|
constructor(a: string, b?: Nullable<number>);
|
||||||
get a(): string;
|
get a(): string;
|
||||||
get b(): Nullable<number>;
|
get b(): Nullable<number>;
|
||||||
component1(): string;
|
|
||||||
component2(): Nullable<number>;
|
|
||||||
copy(a?: string, b?: Nullable<number>): foo.KT39423;
|
copy(a?: string, b?: Nullable<number>): foo.KT39423;
|
||||||
toString(): string;
|
toString(): string;
|
||||||
hashCode(): number;
|
hashCode(): number;
|
||||||
equals(other: Nullable<any>): boolean;
|
equals(other: Nullable<any>): boolean;
|
||||||
}
|
}
|
||||||
|
abstract class WithComponent1 {
|
||||||
|
constructor();
|
||||||
|
abstract component1(): string;
|
||||||
|
}
|
||||||
|
class Test2 extends foo.WithComponent1 {
|
||||||
|
constructor(value1: string, value2: string);
|
||||||
|
get value1(): string;
|
||||||
|
get value2(): string;
|
||||||
|
component1(): string;
|
||||||
|
copy(value1?: string, value2?: string): foo.Test2;
|
||||||
|
toString(): string;
|
||||||
|
hashCode(): number;
|
||||||
|
equals(other: Nullable<any>): boolean;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -20,4 +20,12 @@ data class TestDataClass(val name: String) {
|
|||||||
data class KT39423(
|
data class KT39423(
|
||||||
val a: String,
|
val a: String,
|
||||||
val b: Int? = null
|
val b: Int? = null
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@JsExport
|
||||||
|
abstract class WithComponent1 {
|
||||||
|
abstract fun component1(): String
|
||||||
|
}
|
||||||
|
|
||||||
|
@JsExport
|
||||||
|
data class Test2(val value1: String, val value2: String): WithComponent1()
|
||||||
|
|||||||
+8
-3
@@ -1,6 +1,7 @@
|
|||||||
"use strict";
|
"use strict";
|
||||||
var TestDataClass = JS_TESTS.foo.TestDataClass;
|
var TestDataClass = JS_TESTS.foo.TestDataClass;
|
||||||
var KT39423 = JS_TESTS.foo.KT39423;
|
var KT39423 = JS_TESTS.foo.KT39423;
|
||||||
|
var Test2 = JS_TESTS.foo.Test2;
|
||||||
function assert(condition) {
|
function assert(condition) {
|
||||||
if (!condition) {
|
if (!condition) {
|
||||||
throw "Assertion failed";
|
throw "Assertion failed";
|
||||||
@@ -8,7 +9,6 @@ function assert(condition) {
|
|||||||
}
|
}
|
||||||
function box() {
|
function box() {
|
||||||
assert(new TestDataClass("Test").name === "Test");
|
assert(new TestDataClass("Test").name === "Test");
|
||||||
assert(new TestDataClass("Test").component1() === "Test");
|
|
||||||
assert(new TestDataClass("Test").copy("NewTest").name === "NewTest");
|
assert(new TestDataClass("Test").copy("NewTest").name === "NewTest");
|
||||||
assert(new TestDataClass("Test").toString() === "TestDataClass(name=Test)");
|
assert(new TestDataClass("Test").toString() === "TestDataClass(name=Test)");
|
||||||
assert(new TestDataClass("Test").hashCode() === new TestDataClass("Test").hashCode());
|
assert(new TestDataClass("Test").hashCode() === new TestDataClass("Test").hashCode());
|
||||||
@@ -22,8 +22,6 @@ function box() {
|
|||||||
assert(new KT39423("Test", null).b === null);
|
assert(new KT39423("Test", null).b === null);
|
||||||
assert(new KT39423("Test", 42).a === "Test");
|
assert(new KT39423("Test", 42).a === "Test");
|
||||||
assert(new KT39423("Test", 42).b === 42);
|
assert(new KT39423("Test", 42).b === 42);
|
||||||
assert(new KT39423("Test", 42).component1() === "Test");
|
|
||||||
assert(new KT39423("Test", 42).component2() === 42);
|
|
||||||
assert(new KT39423("Test", 42).copy("NewTest").a === "NewTest");
|
assert(new KT39423("Test", 42).copy("NewTest").a === "NewTest");
|
||||||
assert(new KT39423("Test", 42).copy("NewTest").b === 42);
|
assert(new KT39423("Test", 42).copy("NewTest").b === 42);
|
||||||
assert(new KT39423("Test", 42).copy("Test", null).a === "Test");
|
assert(new KT39423("Test", 42).copy("Test", null).a === "Test");
|
||||||
@@ -31,5 +29,12 @@ function box() {
|
|||||||
assert(new KT39423("Test").toString() === "KT39423(a=Test, b=null)");
|
assert(new KT39423("Test").toString() === "KT39423(a=Test, b=null)");
|
||||||
assert(new KT39423("Test", null).toString() === "KT39423(a=Test, b=null)");
|
assert(new KT39423("Test", null).toString() === "KT39423(a=Test, b=null)");
|
||||||
assert(new KT39423("Test", 42).toString() === "KT39423(a=Test, b=42)");
|
assert(new KT39423("Test", 42).toString() === "KT39423(a=Test, b=42)");
|
||||||
|
assert(new Test2("1", "2").value1 === "1");
|
||||||
|
assert(new Test2("1", "2").value2 === "2");
|
||||||
|
assert(new Test2("1", "2").copy("3").value1 === "3");
|
||||||
|
assert(new Test2("1", "2").copy("3").value2 === "2");
|
||||||
|
assert(new Test2("1", "2").copy(undefined, "3").value1 === "1");
|
||||||
|
assert(new Test2("1", "2").copy(undefined, "3").value2 === "3");
|
||||||
|
assert(new Test2("1", "2").component1() === "1");
|
||||||
return "OK";
|
return "OK";
|
||||||
}
|
}
|
||||||
|
|||||||
+11
-4
@@ -1,5 +1,6 @@
|
|||||||
import TestDataClass = JS_TESTS.foo.TestDataClass;
|
import TestDataClass = JS_TESTS.foo.TestDataClass;
|
||||||
import KT39423 = JS_TESTS.foo.KT39423;
|
import KT39423 = JS_TESTS.foo.KT39423;
|
||||||
|
import Test2 = JS_TESTS.foo.Test2;
|
||||||
|
|
||||||
function assert(condition: boolean) {
|
function assert(condition: boolean) {
|
||||||
if (!condition) {
|
if (!condition) {
|
||||||
@@ -9,7 +10,6 @@ function assert(condition: boolean) {
|
|||||||
|
|
||||||
function box(): string {
|
function box(): string {
|
||||||
assert(new TestDataClass("Test").name === "Test");
|
assert(new TestDataClass("Test").name === "Test");
|
||||||
assert(new TestDataClass("Test").component1() === "Test");
|
|
||||||
assert(new TestDataClass("Test").copy("NewTest").name === "NewTest");
|
assert(new TestDataClass("Test").copy("NewTest").name === "NewTest");
|
||||||
assert(new TestDataClass("Test").toString() === "TestDataClass(name=Test)");
|
assert(new TestDataClass("Test").toString() === "TestDataClass(name=Test)");
|
||||||
|
|
||||||
@@ -29,9 +29,6 @@ function box(): string {
|
|||||||
assert(new KT39423("Test", 42).a === "Test")
|
assert(new KT39423("Test", 42).a === "Test")
|
||||||
assert(new KT39423("Test", 42).b === 42)
|
assert(new KT39423("Test", 42).b === 42)
|
||||||
|
|
||||||
assert(new KT39423("Test", 42).component1() === "Test")
|
|
||||||
assert(new KT39423("Test", 42).component2() === 42)
|
|
||||||
|
|
||||||
assert(new KT39423("Test", 42).copy("NewTest").a === "NewTest")
|
assert(new KT39423("Test", 42).copy("NewTest").a === "NewTest")
|
||||||
assert(new KT39423("Test", 42).copy("NewTest").b === 42)
|
assert(new KT39423("Test", 42).copy("NewTest").b === 42)
|
||||||
assert(new KT39423("Test", 42).copy("Test", null).a === "Test")
|
assert(new KT39423("Test", 42).copy("Test", null).a === "Test")
|
||||||
@@ -41,5 +38,15 @@ function box(): string {
|
|||||||
assert(new KT39423("Test", null).toString() === "KT39423(a=Test, b=null)")
|
assert(new KT39423("Test", null).toString() === "KT39423(a=Test, b=null)")
|
||||||
assert(new KT39423("Test", 42).toString() === "KT39423(a=Test, b=42)")
|
assert(new KT39423("Test", 42).toString() === "KT39423(a=Test, b=42)")
|
||||||
|
|
||||||
|
assert(new Test2("1", "2").value1 === "1")
|
||||||
|
assert(new Test2("1", "2").value2 === "2")
|
||||||
|
|
||||||
|
assert(new Test2("1", "2").copy("3").value1 === "3")
|
||||||
|
assert(new Test2("1", "2").copy("3").value2 === "2")
|
||||||
|
assert(new Test2("1", "2").copy(undefined, "3").value1 === "1")
|
||||||
|
assert(new Test2("1", "2").copy(undefined, "3").value2 === "3")
|
||||||
|
|
||||||
|
assert(new Test2("1", "2").component1() === "1")
|
||||||
|
|
||||||
return "OK";
|
return "OK";
|
||||||
}
|
}
|
||||||
-3
@@ -4,7 +4,6 @@ declare namespace JS_TESTS {
|
|||||||
class C1 {
|
class C1 {
|
||||||
constructor(value: string);
|
constructor(value: string);
|
||||||
get value(): string;
|
get value(): string;
|
||||||
component1(): string;
|
|
||||||
copy(value?: string): foo.bar.baz.C1;
|
copy(value?: string): foo.bar.baz.C1;
|
||||||
toString(): string;
|
toString(): string;
|
||||||
hashCode(): number;
|
hashCode(): number;
|
||||||
@@ -16,7 +15,6 @@ declare namespace JS_TESTS {
|
|||||||
class C2 {
|
class C2 {
|
||||||
constructor(value: string);
|
constructor(value: string);
|
||||||
get value(): string;
|
get value(): string;
|
||||||
component1(): string;
|
|
||||||
copy(value?: string): a.b.C2;
|
copy(value?: string): a.b.C2;
|
||||||
toString(): string;
|
toString(): string;
|
||||||
hashCode(): number;
|
hashCode(): number;
|
||||||
@@ -27,7 +25,6 @@ declare namespace JS_TESTS {
|
|||||||
class C3 {
|
class C3 {
|
||||||
constructor(value: string);
|
constructor(value: string);
|
||||||
get value(): string;
|
get value(): string;
|
||||||
component1(): string;
|
|
||||||
copy(value?: string): C3;
|
copy(value?: string): C3;
|
||||||
toString(): string;
|
toString(): string;
|
||||||
hashCode(): number;
|
hashCode(): number;
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ declare namespace JS_TESTS {
|
|||||||
class C1 {
|
class C1 {
|
||||||
constructor(value: string);
|
constructor(value: string);
|
||||||
get value(): string;
|
get value(): string;
|
||||||
component1(): string;
|
|
||||||
copy(value?: string): foo.bar.baz.C1;
|
copy(value?: string): foo.bar.baz.C1;
|
||||||
toString(): string;
|
toString(): string;
|
||||||
hashCode(): number;
|
hashCode(): number;
|
||||||
@@ -16,7 +15,6 @@ declare namespace JS_TESTS {
|
|||||||
class C2 {
|
class C2 {
|
||||||
constructor(value: string);
|
constructor(value: string);
|
||||||
get value(): string;
|
get value(): string;
|
||||||
component1(): string;
|
|
||||||
copy(value?: string): a.b.C2;
|
copy(value?: string): a.b.C2;
|
||||||
toString(): string;
|
toString(): string;
|
||||||
hashCode(): number;
|
hashCode(): number;
|
||||||
@@ -27,7 +25,6 @@ declare namespace JS_TESTS {
|
|||||||
class C3 {
|
class C3 {
|
||||||
constructor(value: string);
|
constructor(value: string);
|
||||||
get value(): string;
|
get value(): string;
|
||||||
component1(): string;
|
|
||||||
copy(value?: string): C3;
|
copy(value?: string): C3;
|
||||||
toString(): string;
|
toString(): string;
|
||||||
hashCode(): number;
|
hashCode(): number;
|
||||||
|
|||||||
Reference in New Issue
Block a user