[JS IR BE] Implement primitive companion object
This commit is contained in:
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.backend.common.descriptors.KnownPackageFragmentDescr
|
|||||||
import org.jetbrains.kotlin.backend.common.ir.Ir
|
import org.jetbrains.kotlin.backend.common.ir.Ir
|
||||||
import org.jetbrains.kotlin.backend.common.ir.Symbols
|
import org.jetbrains.kotlin.backend.common.ir.Symbols
|
||||||
import org.jetbrains.kotlin.backend.js.JsDescriptorsFactory
|
import org.jetbrains.kotlin.backend.js.JsDescriptorsFactory
|
||||||
|
import org.jetbrains.kotlin.builtins.PrimitiveType
|
||||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
|
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
|
||||||
@@ -107,6 +108,18 @@ class JsIrBackendContext(
|
|||||||
(0..22).map { symbolTable.referenceClass(reflectionTypes.getKFunction(it)) }
|
(0..22).map { symbolTable.referenceClass(reflectionTypes.getKFunction(it)) }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val primitiveCompanionObjects = PrimitiveType.NUMBER_TYPES
|
||||||
|
.filter { it.name != "LONG" && it.name != "CHAR" } // skip due to they have own explicit companions
|
||||||
|
.map {
|
||||||
|
it.typeName to symbolTable.lazyWrapper.referenceClass(
|
||||||
|
getClass(
|
||||||
|
internalPackageName
|
||||||
|
.child(Name.identifier("internal"))
|
||||||
|
.child(Name.identifier("${it.typeName.identifier}CompanionObject"))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}.toMap()
|
||||||
|
|
||||||
val suspendFunctions = (0..22).map { symbolTable.referenceClass(builtIns.getSuspendFunction(it)) }
|
val suspendFunctions = (0..22).map { symbolTable.referenceClass(builtIns.getSuspendFunction(it)) }
|
||||||
|
|
||||||
val dynamicType = IrDynamicTypeImpl(createDynamicType(builtIns), emptyList(), Variance.INVARIANT)
|
val dynamicType = IrDynamicTypeImpl(createDynamicType(builtIns), emptyList(), Variance.INVARIANT)
|
||||||
|
|||||||
@@ -116,6 +116,7 @@ private fun JsIrBackendContext.lower(moduleFragment: IrModuleFragment) {
|
|||||||
moduleFragment.files.forEach(clble.getClosureBuilder())
|
moduleFragment.files.forEach(clble.getClosureBuilder())
|
||||||
moduleFragment.files.forEach(clble.getReferenceReplacer())
|
moduleFragment.files.forEach(clble.getReferenceReplacer())
|
||||||
moduleFragment.files.forEach(ClassReferenceLowering(this)::lower)
|
moduleFragment.files.forEach(ClassReferenceLowering(this)::lower)
|
||||||
|
moduleFragment.files.forEach(PrimitiveCompanionLowering(this)::lower)
|
||||||
moduleFragment.files.forEach(IntrinsicifyCallsLowering(this)::lower)
|
moduleFragment.files.forEach(IntrinsicifyCallsLowering(this)::lower)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+35
@@ -0,0 +1,35 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2018 JetBrains s.r.o. 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.FileLoweringPass
|
||||||
|
import org.jetbrains.kotlin.ir.backend.js.JsIrBackendContext
|
||||||
|
import org.jetbrains.kotlin.ir.declarations.IrClass
|
||||||
|
import org.jetbrains.kotlin.ir.declarations.IrFile
|
||||||
|
import org.jetbrains.kotlin.ir.expressions.IrExpression
|
||||||
|
import org.jetbrains.kotlin.ir.expressions.IrGetObjectValue
|
||||||
|
import org.jetbrains.kotlin.ir.expressions.impl.IrGetObjectValueImpl
|
||||||
|
import org.jetbrains.kotlin.ir.types.isPrimitiveType
|
||||||
|
import org.jetbrains.kotlin.ir.util.defaultType
|
||||||
|
import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
|
||||||
|
import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
|
||||||
|
|
||||||
|
class PrimitiveCompanionLowering(val context: JsIrBackendContext) : FileLoweringPass {
|
||||||
|
override fun lower(irFile: IrFile) {
|
||||||
|
irFile.transformChildrenVoid(object : IrElementTransformerVoid() {
|
||||||
|
override fun visitGetObjectValue(expression: IrGetObjectValue): IrExpression {
|
||||||
|
val symbol = expression.symbol
|
||||||
|
if (!symbol.isBound) return expression
|
||||||
|
val declaration = symbol.owner
|
||||||
|
if (!declaration.isCompanion) return expression
|
||||||
|
val parent = declaration.parent as IrClass
|
||||||
|
if (!parent.defaultType.isPrimitiveType()) return expression
|
||||||
|
val actualCompanion = context.primitiveCompanionObjects[parent.name] ?: return expression
|
||||||
|
return expression.run { IrGetObjectValueImpl(startOffset, endOffset, actualCompanion.owner.defaultType, actualCompanion) }
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -24,6 +24,8 @@ private val runtimeSources = listOfKtFilesFrom(
|
|||||||
"libraries/stdlib/js/src/kotlin/reflect",
|
"libraries/stdlib/js/src/kotlin/reflect",
|
||||||
"libraries/stdlib/js/src/kotlin/annotationsJVM.kt",
|
"libraries/stdlib/js/src/kotlin/annotationsJVM.kt",
|
||||||
|
|
||||||
|
"libraries/stdlib/js/runtime/primitiveCompanionObjects.kt",
|
||||||
|
|
||||||
"libraries/stdlib/src/kotlin/internal",
|
"libraries/stdlib/src/kotlin/internal",
|
||||||
"libraries/stdlib/src/kotlin/util/Standard.kt",
|
"libraries/stdlib/src/kotlin/util/Standard.kt",
|
||||||
"core/builtins/native/kotlin/Annotation.kt",
|
"core/builtins/native/kotlin/Annotation.kt",
|
||||||
|
|||||||
Reference in New Issue
Block a user