[JS IR BE] Fix codegen for external companion objects

This commit is contained in:
Svyatoslav Kuzmich
2019-02-11 17:03:10 +03:00
parent c4ffe36a21
commit e09a6f0007
7 changed files with 12 additions and 8 deletions
@@ -13,6 +13,7 @@ import org.jetbrains.kotlin.ir.backend.js.utils.getJsQualifier
import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.declarations.impl.IrExternalPackageFragmentImpl import org.jetbrains.kotlin.ir.declarations.impl.IrExternalPackageFragmentImpl
import org.jetbrains.kotlin.ir.symbols.IrExternalPackageFragmentSymbol import org.jetbrains.kotlin.ir.symbols.IrExternalPackageFragmentSymbol
import org.jetbrains.kotlin.ir.util.isClass
import org.jetbrains.kotlin.ir.util.isEffectivelyExternal import org.jetbrains.kotlin.ir.util.isEffectivelyExternal
import org.jetbrains.kotlin.ir.util.transformFlat import org.jetbrains.kotlin.ir.util.transformFlat
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
@@ -66,7 +67,7 @@ fun moveBodilessDeclarationsToSeparatePlace(context: JsIrBackendContext, module:
externalClasses.flatMap { collectExternalClasses(it, true) } externalClasses.flatMap { collectExternalClasses(it, true) }
return if (includeCurrentLevel) return if (includeCurrentLevel)
externalClasses + nestedExternalClasses externalClasses.filter { it.isClass } + nestedExternalClasses
else else
nestedExternalClasses nestedExternalClasses
} }
@@ -57,7 +57,7 @@ class DynamicCallsTransformer(private val context: JsIrBackendContext) : CallsTr
val symbol = call.symbol val symbol = call.symbol
val function = call.symbol.owner val function = call.symbol.owner
if (function.isDynamic() || function.isEffectivelyExternal()) { if (function.isDynamic()) {
when (call.origin) { when (call.origin) {
GET_PROPERTY -> { GET_PROPERTY -> {
val fieldSymbol = context.symbolTable.lazyWrapper.referenceField( val fieldSymbol = context.symbolTable.lazyWrapper.referenceField(
@@ -140,7 +140,7 @@ class IrElementToJsExpressionTransformer : BaseIrElementToJsNodeTransformer<JsEx
if (function is IrSimpleFunction) { if (function is IrSimpleFunction) {
val property = function.correspondingProperty val property = function.correspondingProperty
if (property != null && property.isEffectivelyExternal()) { if (property != null && property.isEffectivelyExternal()) {
val nameRef = JsNameRef(property.name.identifier, jsDispatchReceiver) val nameRef = JsNameRef(context.getNameForDeclaration(property), jsDispatchReceiver)
return when (function) { return when (function) {
property.getter -> nameRef property.getter -> nameRef
property.setter -> jsAssignment(nameRef, arguments.single()) property.setter -> jsAssignment(nameRef, arguments.single())
@@ -45,7 +45,8 @@ class JsGenerationContext {
fun getNameForDeclaration(declaration: IrDeclaration): JsName = when (declaration) { fun getNameForDeclaration(declaration: IrDeclaration): JsName = when (declaration) {
is IrSymbolOwner -> getNameForSymbol(declaration.symbol) is IrSymbolOwner -> getNameForSymbol(declaration.symbol)
is IrProperty -> currentScope.declareName(declaration.name.identifier) // Properties don't have symbols. Handling them separately:
is IrProperty -> currentScope.declareName(declaration.getJsName() ?: declaration.name.identifier)
else -> error("Unsupported") else -> error("Unsupported")
} }
@@ -117,8 +117,12 @@ class SimpleNameGenerator : NameGenerator {
if (declaration is IrConstructor) return@getOrPut getNameForDeclaration(declaration.parentAsClass, context) if (declaration is IrConstructor) return@getOrPut getNameForDeclaration(declaration.parentAsClass, context)
if (declaration is IrClass && declaration.parent is IrClass) { if (declaration is IrClass && declaration.parent is IrClass) {
val parentName = getNameForDeclaration(declaration.parentAsClass, context).ident val parentName = getNameForDeclaration(declaration.parentAsClass, context)
return@getOrPut context.currentScope.declareFreshName(parentName + "$" + descriptorName.identifier) if (declaration.isCompanion) {
// External companions are class references
return@getOrPut parentName
}
return@getOrPut context.currentScope.declareFreshName(parentName.ident + "$" + descriptorName.identifier)
} }
return@getOrPut context.staticContext.rootScope.declareName(descriptorName.identifier) return@getOrPut context.staticContext.rootScope.declareName(descriptorName.identifier)
} }
@@ -1,4 +1,3 @@
// IGNORE_BACKEND: JS_IR
// EXPECTED_REACHABLE_NODES: 1281 // EXPECTED_REACHABLE_NODES: 1281
// FILE: main.kt // FILE: main.kt
-1
View File
@@ -1,4 +1,3 @@
// IGNORE_BACKEND: JS_IR
// EXPECTED_REACHABLE_NODES: 1283 // EXPECTED_REACHABLE_NODES: 1283
package foo package foo