diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsLoweringPhases.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsLoweringPhases.kt index 9179d56c299..7829c5a9a78 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsLoweringPhases.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsLoweringPhases.kt @@ -135,6 +135,12 @@ private val validateIrAfterLowering = makeCustomJsModulePhase( description = "Validate IR after lowering" ).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( ::ScriptRemoveReceiverLowering, name = "ScriptRemoveReceiver", @@ -358,12 +364,6 @@ private val enumEntryCreateGetInstancesFunsLoweringPhase = makeDeclarationTransf prerequisite = setOf(enumClassConstructorLoweringPhase) ) -private val enumClassPreventExportOfNonExportedMembersLowering = makeDeclarationTransformerPhase( - ::EnumClassPreventExportOfNonExportedMembersLowering, - name = "EnumClassPreventExportOfNonExportedMembersLowering", - description = "Exclude non-exportable enum members such as `Enum.entries`", -) - private val enumSyntheticFunsLoweringPhase = makeDeclarationTransformerPhase( { EnumSyntheticFunctionsAndPropertiesLowering(it, supportRawFunctionReference = true) }, name = "EnumSyntheticFunctionsAndPropertiesLowering", @@ -372,7 +372,6 @@ private val enumSyntheticFunsLoweringPhase = makeDeclarationTransformerPhase( enumClassConstructorLoweringPhase, enumClassCreateInitializerLoweringPhase, enumEntryCreateGetInstancesFunsLoweringPhase, - enumClassPreventExportOfNonExportedMembersLowering ) ) @@ -847,6 +846,7 @@ private val jsSuspendArityStorePhase = makeDeclarationTransformerPhase( val loweringList = listOf( scriptRemoveReceiverLowering, validateIrBeforeLowering, + preventExportOfSyntheticDeclarationsLowering, inventNamesForLocalClassesPhase, annotationInstantiationLowering, expectDeclarationsRemovingPhase, @@ -894,7 +894,6 @@ val loweringList = listOf( enumEntryInstancesBodyLoweringPhase, enumClassCreateInitializerLoweringPhase, enumEntryCreateGetInstancesFunsLoweringPhase, - enumClassPreventExportOfNonExportedMembersLowering, enumSyntheticFunsLoweringPhase, enumUsageLoweringPhase, externalEnumUsageLoweringPhase, diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/EnumClassLowering.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/EnumClassLowering.kt index abe0007a85a..0bbefd4d393 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/EnumClassLowering.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/EnumClassLowering.kt @@ -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.export.isExported 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.declarations.addField 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 -class EnumClassPreventExportOfNonExportedMembersLowering(val context: JsIrBackendContext) : DeclarationTransformer { - override fun transformFlat(declaration: IrDeclaration): List? { - 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 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().firstOrNull { it.isInstantiableEnum } - private const val ENTRIES_FIELD_NAME = "\$ENTRIES" class EnumSyntheticFunctionsAndPropertiesLowering( diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/ExcludeSyntheticDeclarationsFromExportLowering.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/ExcludeSyntheticDeclarationsFromExportLowering.kt new file mode 100644 index 00000000000..5f0b9822e79 --- /dev/null +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/ExcludeSyntheticDeclarationsFromExportLowering.kt @@ -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? { + 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() + } + } +} \ No newline at end of file diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/IrJsUtils.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/IrJsUtils.kt index a80dbd121bb..6ca710d7db7 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/IrJsUtils.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/IrJsUtils.kt @@ -5,6 +5,7 @@ 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.isInterface 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.isAnnotationClass 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.name.FqName @@ -70,6 +73,11 @@ val IrFunctionAccessExpression.typeArguments: List val IrFunctionAccessExpression.valueArguments: List get() = List(valueArgumentsCount) { getValueArgument(it) } +val IrClass.isInstantiableEnum: Boolean + get() = isEnumClass && !isExpect && !isEffectivelyExternal() + +val IrDeclaration.parentEnumClassOrNull: IrClass? + get() = parents.filterIsInstance().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 fun JsIrBackendContext.getVoid(): IrExpression = diff --git a/js/js.translator/testData/box/esModules/jsExport/dataClass.kt b/js/js.translator/testData/box/esModules/jsExport/dataClass.kt index 058eb562f02..c1edbc31a76 100644 --- a/js/js.translator/testData/box/esModules/jsExport/dataClass.kt +++ b/js/js.translator/testData/box/esModules/jsExport/dataClass.kt @@ -20,8 +20,6 @@ external interface JsResult { val copy01: String val copy10: String val copy11: String - val component1: Int - val component2: Int } @JsModule("./dataClass.mjs") @@ -41,12 +39,6 @@ fun box(): String { if (res.copy11 != "[13::11]") { return "Fail4: ${res.copy11}" } - if (res.component1 != 3) { - return "Fail5: ${res.component1}" - } - if (res.component2 != 7) { - return "Fail6: ${res.component2}" - } return "OK" } \ No newline at end of file diff --git a/js/js.translator/testData/box/esModules/jsExport/dataClass.mjs b/js/js.translator/testData/box/esModules/jsExport/dataClass.mjs index 8e946a16f95..042d6d5c327 100644 --- a/js/js.translator/testData/box/esModules/jsExport/dataClass.mjs +++ b/js/js.translator/testData/box/esModules/jsExport/dataClass.mjs @@ -8,7 +8,5 @@ export default function() { "copy01": p.copy(undefined, 11).toString(), "copy10": p.copy(15).toString(), "copy11": p.copy(13, 11).toString(), - "component1": p.component1(), - "component2": p.component2() }; }; diff --git a/js/js.translator/testData/box/jsExport/dataClass.js b/js/js.translator/testData/box/jsExport/dataClass.js index 25be9e23ca4..53493114431 100644 --- a/js/js.translator/testData/box/jsExport/dataClass.js +++ b/js/js.translator/testData/box/jsExport/dataClass.js @@ -9,8 +9,6 @@ module.exports = function() { "copy01": p.copy(undefined, 11).toString(), "copy10": p.copy(15).toString(), "copy11": p.copy(13, 11).toString(), - "component1": p.component1(), - "component2": p.component2() }; }; diff --git a/js/js.translator/testData/box/jsExport/dataClass.kt b/js/js.translator/testData/box/jsExport/dataClass.kt index 5bf50664002..b4f1ead247b 100644 --- a/js/js.translator/testData/box/jsExport/dataClass.kt +++ b/js/js.translator/testData/box/jsExport/dataClass.kt @@ -19,8 +19,6 @@ external interface JsResult { val copy01: String val copy10: String val copy11: String - val component1: Int - val component2: Int } @JsModule("lib") @@ -40,15 +38,6 @@ fun box(): String { if (res.copy11 != "[13::11]") { return "Fail4: ${res.copy11}" } - if (res.component1 != 3) { - return "Fail5: ${res.component1}" - } - if (res.component2 != 7) { - return "Fail6: ${res.component2}" - } - - - return "OK" } \ No newline at end of file diff --git a/js/js.translator/testData/typescript-export/data-classes-in-exported-file/data-classes.d.ts b/js/js.translator/testData/typescript-export/data-classes-in-exported-file/data-classes.d.ts index dcfc9199c47..1d3ca6f6f42 100644 --- a/js/js.translator/testData/typescript-export/data-classes-in-exported-file/data-classes.d.ts +++ b/js/js.translator/testData/typescript-export/data-classes-in-exported-file/data-classes.d.ts @@ -4,7 +4,6 @@ declare namespace JS_TESTS { class TestDataClass { constructor(name: string); get name(): string; - component1(): string; copy(name?: string): foo.TestDataClass; toString(): string; hashCode(): number; @@ -20,12 +19,24 @@ declare namespace JS_TESTS { 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; } + 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): boolean; + } } } \ No newline at end of file diff --git a/js/js.translator/testData/typescript-export/data-classes-in-exported-file/data-classes.kt b/js/js.translator/testData/typescript-export/data-classes-in-exported-file/data-classes.kt index ea64d325e9f..693a85ab181 100644 --- a/js/js.translator/testData/typescript-export/data-classes-in-exported-file/data-classes.kt +++ b/js/js.translator/testData/typescript-export/data-classes-in-exported-file/data-classes.kt @@ -24,4 +24,12 @@ data class TestDataClass(val name: String) { data class KT39423( val a: String, val b: Int? = null -) \ No newline at end of file +) + + +abstract class WithComponent1 { + abstract fun component1(): String +} + + +data class Test2(val value1: String, val value2: String): WithComponent1() diff --git a/js/js.translator/testData/typescript-export/data-classes-in-exported-file/data-classes__main.js b/js/js.translator/testData/typescript-export/data-classes-in-exported-file/data-classes__main.js index 898f484c364..9536573589c 100644 --- a/js/js.translator/testData/typescript-export/data-classes-in-exported-file/data-classes__main.js +++ b/js/js.translator/testData/typescript-export/data-classes-in-exported-file/data-classes__main.js @@ -1,6 +1,7 @@ "use strict"; var TestDataClass = JS_TESTS.foo.TestDataClass; var KT39423 = JS_TESTS.foo.KT39423; +var Test2 = JS_TESTS.foo.Test2; function assert(condition) { if (!condition) { throw "Assertion failed"; @@ -8,7 +9,6 @@ function assert(condition) { } function box() { assert(new TestDataClass("Test").name === "Test"); - assert(new TestDataClass("Test").component1() === "Test"); assert(new TestDataClass("Test").copy("NewTest").name === "NewTest"); assert(new TestDataClass("Test").toString() === "TestDataClass(name=Test)"); 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", 42).a === "Test"); 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").b === 42); 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", null).toString() === "KT39423(a=Test, b=null)"); 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"; } diff --git a/js/js.translator/testData/typescript-export/data-classes-in-exported-file/data-classes__main.ts b/js/js.translator/testData/typescript-export/data-classes-in-exported-file/data-classes__main.ts index 4a831cc15ee..f97a86efa9c 100644 --- a/js/js.translator/testData/typescript-export/data-classes-in-exported-file/data-classes__main.ts +++ b/js/js.translator/testData/typescript-export/data-classes-in-exported-file/data-classes__main.ts @@ -1,5 +1,6 @@ import TestDataClass = JS_TESTS.foo.TestDataClass; import KT39423 = JS_TESTS.foo.KT39423; +import Test2 = JS_TESTS.foo.Test2; function assert(condition: boolean) { if (!condition) { @@ -9,7 +10,6 @@ function assert(condition: boolean) { function box(): string { assert(new TestDataClass("Test").name === "Test"); - assert(new TestDataClass("Test").component1() === "Test"); assert(new TestDataClass("Test").copy("NewTest").name === "NewTest"); 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).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").b === 42) 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", 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"; } \ No newline at end of file diff --git a/js/js.translator/testData/typescript-export/data-classes/data-classes.d.ts b/js/js.translator/testData/typescript-export/data-classes/data-classes.d.ts index dcfc9199c47..1d3ca6f6f42 100644 --- a/js/js.translator/testData/typescript-export/data-classes/data-classes.d.ts +++ b/js/js.translator/testData/typescript-export/data-classes/data-classes.d.ts @@ -4,7 +4,6 @@ declare namespace JS_TESTS { class TestDataClass { constructor(name: string); get name(): string; - component1(): string; copy(name?: string): foo.TestDataClass; toString(): string; hashCode(): number; @@ -20,12 +19,24 @@ declare namespace JS_TESTS { 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; } + 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): boolean; + } } } \ No newline at end of file diff --git a/js/js.translator/testData/typescript-export/data-classes/data-classes.kt b/js/js.translator/testData/typescript-export/data-classes/data-classes.kt index 4541626f30f..a01bf6307c2 100644 --- a/js/js.translator/testData/typescript-export/data-classes/data-classes.kt +++ b/js/js.translator/testData/typescript-export/data-classes/data-classes.kt @@ -20,4 +20,12 @@ data class TestDataClass(val name: String) { data class KT39423( val a: String, val b: Int? = null -) \ No newline at end of file +) + +@JsExport +abstract class WithComponent1 { + abstract fun component1(): String +} + +@JsExport +data class Test2(val value1: String, val value2: String): WithComponent1() diff --git a/js/js.translator/testData/typescript-export/data-classes/data-classes__main.js b/js/js.translator/testData/typescript-export/data-classes/data-classes__main.js index 898f484c364..9536573589c 100644 --- a/js/js.translator/testData/typescript-export/data-classes/data-classes__main.js +++ b/js/js.translator/testData/typescript-export/data-classes/data-classes__main.js @@ -1,6 +1,7 @@ "use strict"; var TestDataClass = JS_TESTS.foo.TestDataClass; var KT39423 = JS_TESTS.foo.KT39423; +var Test2 = JS_TESTS.foo.Test2; function assert(condition) { if (!condition) { throw "Assertion failed"; @@ -8,7 +9,6 @@ function assert(condition) { } function box() { assert(new TestDataClass("Test").name === "Test"); - assert(new TestDataClass("Test").component1() === "Test"); assert(new TestDataClass("Test").copy("NewTest").name === "NewTest"); assert(new TestDataClass("Test").toString() === "TestDataClass(name=Test)"); 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", 42).a === "Test"); 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").b === 42); 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", null).toString() === "KT39423(a=Test, b=null)"); 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"; } diff --git a/js/js.translator/testData/typescript-export/data-classes/data-classes__main.ts b/js/js.translator/testData/typescript-export/data-classes/data-classes__main.ts index 4a831cc15ee..f97a86efa9c 100644 --- a/js/js.translator/testData/typescript-export/data-classes/data-classes__main.ts +++ b/js/js.translator/testData/typescript-export/data-classes/data-classes__main.ts @@ -1,5 +1,6 @@ import TestDataClass = JS_TESTS.foo.TestDataClass; import KT39423 = JS_TESTS.foo.KT39423; +import Test2 = JS_TESTS.foo.Test2; function assert(condition: boolean) { if (!condition) { @@ -9,7 +10,6 @@ function assert(condition: boolean) { function box(): string { assert(new TestDataClass("Test").name === "Test"); - assert(new TestDataClass("Test").component1() === "Test"); assert(new TestDataClass("Test").copy("NewTest").name === "NewTest"); 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).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").b === 42) 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", 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"; } \ No newline at end of file diff --git a/js/js.translator/testData/typescript-export/namespaces-in-exported-file/namespaces.d.ts b/js/js.translator/testData/typescript-export/namespaces-in-exported-file/namespaces.d.ts index 8c5483b0bf1..b7ae6b1bbf7 100644 --- a/js/js.translator/testData/typescript-export/namespaces-in-exported-file/namespaces.d.ts +++ b/js/js.translator/testData/typescript-export/namespaces-in-exported-file/namespaces.d.ts @@ -4,7 +4,6 @@ declare namespace JS_TESTS { class C1 { constructor(value: string); get value(): string; - component1(): string; copy(value?: string): foo.bar.baz.C1; toString(): string; hashCode(): number; @@ -16,7 +15,6 @@ declare namespace JS_TESTS { class C2 { constructor(value: string); get value(): string; - component1(): string; copy(value?: string): a.b.C2; toString(): string; hashCode(): number; @@ -27,7 +25,6 @@ declare namespace JS_TESTS { class C3 { constructor(value: string); get value(): string; - component1(): string; copy(value?: string): C3; toString(): string; hashCode(): number; diff --git a/js/js.translator/testData/typescript-export/namespaces/namespaces.d.ts b/js/js.translator/testData/typescript-export/namespaces/namespaces.d.ts index 8c5483b0bf1..b7ae6b1bbf7 100644 --- a/js/js.translator/testData/typescript-export/namespaces/namespaces.d.ts +++ b/js/js.translator/testData/typescript-export/namespaces/namespaces.d.ts @@ -4,7 +4,6 @@ declare namespace JS_TESTS { class C1 { constructor(value: string); get value(): string; - component1(): string; copy(value?: string): foo.bar.baz.C1; toString(): string; hashCode(): number; @@ -16,7 +15,6 @@ declare namespace JS_TESTS { class C2 { constructor(value: string); get value(): string; - component1(): string; copy(value?: string): a.b.C2; toString(): string; hashCode(): number; @@ -27,7 +25,6 @@ declare namespace JS_TESTS { class C3 { constructor(value: string); get value(): string; - component1(): string; copy(value?: string): C3; toString(): string; hashCode(): number;