[JS IR] A type argument of the jsClass intrinsic must be a class (IrClass)
This commit is contained in:
+11
-6
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2010-2018 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
* Copyright 2010-2020 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.
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -17,9 +17,11 @@ import org.jetbrains.kotlin.ir.expressions.IrFunctionReference
|
|||||||
import org.jetbrains.kotlin.ir.symbols.IrClassifierSymbol
|
import org.jetbrains.kotlin.ir.symbols.IrClassifierSymbol
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
|
import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrSymbol
|
import org.jetbrains.kotlin.ir.symbols.IrSymbol
|
||||||
|
import org.jetbrains.kotlin.ir.types.classOrNull
|
||||||
import org.jetbrains.kotlin.ir.types.classifierOrFail
|
import org.jetbrains.kotlin.ir.types.classifierOrFail
|
||||||
import org.jetbrains.kotlin.ir.util.getInlineClassBackingField
|
import org.jetbrains.kotlin.ir.util.getInlineClassBackingField
|
||||||
import org.jetbrains.kotlin.ir.util.isEffectivelyExternal
|
import org.jetbrains.kotlin.ir.util.isEffectivelyExternal
|
||||||
|
import org.jetbrains.kotlin.ir.util.render
|
||||||
import org.jetbrains.kotlin.js.backend.ast.*
|
import org.jetbrains.kotlin.js.backend.ast.*
|
||||||
|
|
||||||
typealias IrCallTransformer = (IrCall, context: JsGenerationContext) -> JsExpression
|
typealias IrCallTransformer = (IrCall, context: JsGenerationContext) -> JsExpression
|
||||||
@@ -89,15 +91,18 @@ class JsIntrinsicTransformers(backendContext: JsIrBackendContext) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
add(intrinsics.jsClass) { call, context ->
|
add(intrinsics.jsClass) { call, context ->
|
||||||
val classifier: IrClassifierSymbol = call.getTypeArgument(0)!!.classifierOrFail
|
val typeArgument = call.getTypeArgument(0)
|
||||||
val owner = classifier.owner
|
val classSymbol = typeArgument?.classOrNull
|
||||||
|
?: error("Type argument of jsClass must be statically known class, but " + typeArgument?.render())
|
||||||
|
|
||||||
|
val klass = classSymbol.owner
|
||||||
|
|
||||||
when {
|
when {
|
||||||
owner is IrClass && owner.isEffectivelyExternal() ->
|
klass.isEffectivelyExternal() ->
|
||||||
context.getRefForExternalClass(owner)
|
context.getRefForExternalClass(klass)
|
||||||
|
|
||||||
else ->
|
else ->
|
||||||
context.getNameForStaticDeclaration(owner as IrDeclarationWithName).makeRef()
|
context.getNameForStaticDeclaration(klass as IrDeclarationWithName).makeRef()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user