17
17
package com.kanyun.kace.compiler.utils
18
18
19
19
import org.jetbrains.kotlin.backend.jvm.ir.erasedUpperBound
20
+ import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
20
21
import org.jetbrains.kotlin.descriptors.Modality
22
+ import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
21
23
import org.jetbrains.kotlin.ir.builders.declarations.addFunction
22
24
import org.jetbrains.kotlin.ir.declarations.IrClass
25
+ import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
23
26
import org.jetbrains.kotlin.ir.declarations.IrFunction
24
27
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
25
28
import org.jetbrains.kotlin.ir.expressions.IrExpression
26
29
import org.jetbrains.kotlin.ir.expressions.impl.IrGetValueImpl
27
30
import org.jetbrains.kotlin.ir.types.IrType
28
31
import org.jetbrains.kotlin.ir.types.classOrNull
29
32
import org.jetbrains.kotlin.ir.util.allOverridden
33
+ import org.jetbrains.kotlin.ir.util.copyTo
30
34
import org.jetbrains.kotlin.ir.util.fqNameWhenAvailable
31
35
import org.jetbrains.kotlin.ir.util.functions
36
+ import org.jetbrains.kotlin.ir.util.parentAsClass
32
37
import org.jetbrains.kotlin.ir.util.parentClassOrNull
33
38
import org.jetbrains.kotlin.name.FqName
39
+ import org.jetbrains.kotlin.name.Name
34
40
35
41
fun IrClass.isSubclassOfFqName (fqName : String ): Boolean =
36
42
fqNameWhenAvailable?.asString() == fqName || superTypes.any {
@@ -42,9 +48,21 @@ fun IrClass.isSubclassOfFqName(fqName: String): Boolean =
42
48
fun IrClass.addOverride (
43
49
baseFqName : FqName ,
44
50
name : String ,
45
- returnType : IrType ,
46
51
modality : Modality = Modality .FINAL ,
47
- ): IrSimpleFunction = addFunction(name, returnType, modality).apply {
52
+ ): IrSimpleFunction = addFunction {
53
+ this .name = Name .identifier(name)
54
+ this .modality = modality
55
+ this .startOffset = UNDEFINED_OFFSET
56
+ this .endOffset = UNDEFINED_OFFSET
57
+ this .visibility = DescriptorVisibilities .PUBLIC
58
+ this .isFakeOverride = false
59
+ this .isSuspend = false
60
+ this .isInline = false
61
+ this .origin = IrDeclarationOrigin .DEFINED
62
+ }.apply {
63
+ val thisReceiver = parentAsClass.thisReceiver!!
64
+ dispatchReceiverParameter = thisReceiver.copyTo(this , type = thisReceiver.type)
65
+
48
66
overriddenSymbols = superTypes.mapNotNull { superType ->
49
67
superType.classOrNull?.owner?.takeIf { superClass ->
50
68
superClass.isSubclassOfFqName(
0 commit comments