From 5e5712afbb543b4e8221b63463f277658ceee9e2 Mon Sep 17 00:00:00 2001 From: Svyatoslav Kuzmich Date: Wed, 7 Oct 2020 08:38:27 +0300 Subject: [PATCH] [JS IR] Make JsExport not fail on companion objects (KT-37829) --- .../ir/backend/js/export/ExportModelGenerator.kt | 7 +++++-- .../kotlin/ir/backend/js/lower/ObjectLowering.kt | 6 ++---- .../typescript-export/declarations/declarations.d.ts | 6 ++++++ .../typescript-export/declarations/declarations.kt | 10 +++++++++- 4 files changed, 22 insertions(+), 7 deletions(-) diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/export/ExportModelGenerator.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/export/ExportModelGenerator.kt index 69c0b9bb9bb..1bb08d7037c 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/export/ExportModelGenerator.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/export/ExportModelGenerator.kt @@ -171,8 +171,11 @@ class ExportModelGenerator(val context: JsIrBackendContext) { } is IrField -> { - assert(candidate.correspondingPropertySymbol != null) { - "Properties without fields are not supported ${candidate.fqNameWhenAvailable}" + assert( + candidate.origin == IrDeclarationOrigin.FIELD_FOR_OBJECT_INSTANCE + || candidate.correspondingPropertySymbol != null + ) { + "Unexpected field without property ${candidate.fqNameWhenAvailable}" } } diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/ObjectLowering.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/ObjectLowering.kt index 778b71d466c..8627aac6678 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/ObjectLowering.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/ObjectLowering.kt @@ -19,10 +19,7 @@ import org.jetbrains.kotlin.ir.backend.js.ir.JsIrBuilder import org.jetbrains.kotlin.ir.builders.* import org.jetbrains.kotlin.ir.builders.declarations.buildField import org.jetbrains.kotlin.ir.builders.declarations.buildFun -import org.jetbrains.kotlin.ir.declarations.IrClass -import org.jetbrains.kotlin.ir.declarations.IrConstructor -import org.jetbrains.kotlin.ir.declarations.IrDeclaration -import org.jetbrains.kotlin.ir.declarations.IrVariable +import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.types.makeNullable import org.jetbrains.kotlin.ir.util.* @@ -47,6 +44,7 @@ class ObjectDeclarationLowering( name = Name.identifier(declaration.name.asString() + "_instance") type = declaration.defaultType.makeNullable() isStatic = true + origin = IrDeclarationOrigin.FIELD_FOR_OBJECT_INSTANCE }.apply { parent = declaration.parent initializer = null // Initialized with 'undefined' 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 0d6dd8172ae..b651642ea2c 100644 --- a/js/js.translator/testData/typescript-export/declarations/declarations.d.ts +++ b/js/js.translator/testData/typescript-export/declarations/declarations.d.ts @@ -49,5 +49,11 @@ declare namespace JS_TESTS { foo(): number; }; function takesO(o: typeof foo.O): number; + class KT_37829 { + constructor(); + readonly Companion: { + readonly x: number; + }; + } } } diff --git a/js/js.translator/testData/typescript-export/declarations/declarations.kt b/js/js.translator/testData/typescript-export/declarations/declarations.kt index 67955083651..6a46ee46f5e 100644 --- a/js/js.translator/testData/typescript-export/declarations/declarations.kt +++ b/js/js.translator/testData/typescript-export/declarations/declarations.kt @@ -93,4 +93,12 @@ object O { } fun takesO(o: O): Int = - O.x + O.foo() \ No newline at end of file + O.x + O.foo() + +// Test that JsExport with companion object compiles without error. +// Usage is not supported yet. +class KT_37829 { + companion object { + val x = 10 + } +} \ No newline at end of file