|
1 | 1 | package com.github.codeql |
2 | 2 |
|
| 3 | +import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext |
| 4 | +import org.jetbrains.kotlin.ir.declarations.IrClass |
3 | 5 | import org.jetbrains.kotlin.ir.types.IdSignatureValues |
| 6 | +import org.jetbrains.kotlin.ir.util.IdSignature |
| 7 | +import org.jetbrains.kotlin.name.FqName |
4 | 8 |
|
5 | 9 | data class PrimitiveTypeInfo( |
6 | 10 | val primitiveName: String?, |
7 | 11 | val otherIsPrimitive: Boolean, |
8 | | - val javaPackageName: String, val javaClassName: String, |
| 12 | + val javaClass: IrClass, |
9 | 13 | val kotlinPackageName: String, val kotlinClassName: String |
10 | 14 | ) |
11 | 15 |
|
12 | | -val primitiveTypeMapping = mapOf( |
13 | | - IdSignatureValues._byte to PrimitiveTypeInfo("byte", true, "java.lang", "Byte", "kotlin", "Byte"), |
14 | | - IdSignatureValues._short to PrimitiveTypeInfo("short", true, "java.lang", "Short", "kotlin", "Short"), |
15 | | - IdSignatureValues._int to PrimitiveTypeInfo("int", true, "java.lang", "Integer", "kotlin", "Int"), |
16 | | - IdSignatureValues._long to PrimitiveTypeInfo("long", true, "java.lang", "Long", "kotlin", "Long"), |
| 16 | +private fun findClass(fqName: String, fallback: IrClass, logger: Logger, pluginContext: IrPluginContext): IrClass { |
| 17 | + val symbol = pluginContext.referenceClass(FqName(fqName)) |
| 18 | + if(symbol == null) { |
| 19 | + logger.warn("Can't find $fqName") |
| 20 | + // Do the best we can |
| 21 | + return fallback |
| 22 | + } else { |
| 23 | + return symbol.owner |
| 24 | + } |
| 25 | +} |
17 | 26 |
|
18 | | - IdSignatureValues.uByte to PrimitiveTypeInfo("byte", true, "kotlin", "UByte", "kotlin", "UByte"), |
19 | | - IdSignatureValues.uShort to PrimitiveTypeInfo("short", true, "kotlin", "UShort", "kotlin", "UShort"), |
20 | | - IdSignatureValues.uInt to PrimitiveTypeInfo("int", true, "kotlin", "UInt", "kotlin", "UInt"), |
21 | | - IdSignatureValues.uLong to PrimitiveTypeInfo("long", true, "kotlin", "ULong", "kotlin", "ULong"), |
| 27 | +fun makePrimitiveTypeMapping(logger: Logger, pluginContext: IrPluginContext): Map<IdSignature.PublicSignature, PrimitiveTypeInfo> { |
| 28 | + val kotlinByte = pluginContext.irBuiltIns.byteClass.owner |
| 29 | + val javaLangByte = findClass("java.lang.Byte", kotlinByte, logger, pluginContext) |
| 30 | + val kotlinShort = pluginContext.irBuiltIns.shortClass.owner |
| 31 | + val javaLangShort = findClass("java.lang.Short", kotlinShort, logger, pluginContext) |
| 32 | + val kotlinInt = pluginContext.irBuiltIns.intClass.owner |
| 33 | + val javaLangInteger = findClass("java.lang.Integer", kotlinInt, logger, pluginContext) |
| 34 | + val kotlinLong = pluginContext.irBuiltIns.longClass.owner |
| 35 | + val javaLangLong = findClass("java.lang.Long", kotlinLong, logger, pluginContext) |
22 | 36 |
|
23 | | - IdSignatureValues._double to PrimitiveTypeInfo("double", true, "java.lang", "Double", "kotlin", "Double"), |
24 | | - IdSignatureValues._float to PrimitiveTypeInfo("float", true, "java.lang", "Float", "kotlin", "Float"), |
| 37 | + val kotlinUByte = findClass("kotlin.UByte", kotlinByte, logger, pluginContext) |
| 38 | + val kotlinUShort = findClass("kotlin.UShort", kotlinShort, logger, pluginContext) |
| 39 | + val kotlinUInt = findClass("kotlin.UInt", kotlinInt, logger, pluginContext) |
| 40 | + val kotlinULong = findClass("kotlin.ULong", kotlinLong, logger, pluginContext) |
25 | 41 |
|
26 | | - IdSignatureValues._boolean to PrimitiveTypeInfo("boolean", true, "java.lang", "Boolean", "kotlin", "Boolean"), |
| 42 | + val kotlinDouble = pluginContext.irBuiltIns.doubleClass.owner |
| 43 | + val javaLangDouble = findClass("java.lang.Double", kotlinDouble, logger, pluginContext) |
| 44 | + val kotlinFloat = pluginContext.irBuiltIns.floatClass.owner |
| 45 | + val javaLangFloat = findClass("java.lang.Float", kotlinFloat, logger, pluginContext) |
27 | 46 |
|
28 | | - IdSignatureValues._char to PrimitiveTypeInfo("char", true, "java.lang", "Character", "kotlin", "Char"), |
| 47 | + val kotlinBoolean = pluginContext.irBuiltIns.booleanClass.owner |
| 48 | + val javaLangBoolean = findClass("java.lang.Boolean", kotlinBoolean, logger, pluginContext) |
29 | 49 |
|
30 | | - IdSignatureValues.unit to PrimitiveTypeInfo("void", false, "kotlin", "Unit", "kotlin", "Unit"), |
31 | | - IdSignatureValues.nothing to PrimitiveTypeInfo(null, true, "java.lang", "Void", "kotlin", "Nothing"), |
32 | | -) |
| 50 | + val kotlinChar = pluginContext.irBuiltIns.charClass.owner |
| 51 | + val javaLangCharacter = findClass("java.lang.Character", kotlinChar, logger, pluginContext) |
| 52 | + |
| 53 | + val kotlinUnit = pluginContext.irBuiltIns.unitClass.owner |
| 54 | + |
| 55 | + val kotlinNothing = pluginContext.irBuiltIns.nothingClass.owner |
| 56 | + val javaLangVoid = findClass("java.lang.Void", kotlinNothing, logger, pluginContext) |
| 57 | + |
| 58 | + return mapOf( |
| 59 | + IdSignatureValues._byte to PrimitiveTypeInfo("byte", true, javaLangByte, "kotlin", "Byte"), |
| 60 | + IdSignatureValues._short to PrimitiveTypeInfo("short", true, javaLangShort, "kotlin", "Short"), |
| 61 | + IdSignatureValues._int to PrimitiveTypeInfo("int", true, javaLangInteger, "kotlin", "Int"), |
| 62 | + IdSignatureValues._long to PrimitiveTypeInfo("long", true, javaLangLong, "kotlin", "Long"), |
| 63 | + |
| 64 | + IdSignatureValues.uByte to PrimitiveTypeInfo("byte", true, kotlinUByte, "kotlin", "UByte"), |
| 65 | + IdSignatureValues.uShort to PrimitiveTypeInfo("short", true, kotlinUShort, "kotlin", "UShort"), |
| 66 | + IdSignatureValues.uInt to PrimitiveTypeInfo("int", true, kotlinUInt, "kotlin", "UInt"), |
| 67 | + IdSignatureValues.uLong to PrimitiveTypeInfo("long", true, kotlinULong, "kotlin", "ULong"), |
| 68 | + |
| 69 | + IdSignatureValues._double to PrimitiveTypeInfo("double", true, javaLangDouble, "kotlin", "Double"), |
| 70 | + IdSignatureValues._float to PrimitiveTypeInfo("float", true, javaLangFloat, "kotlin", "Float"), |
| 71 | + |
| 72 | + IdSignatureValues._boolean to PrimitiveTypeInfo("boolean", true, javaLangBoolean, "kotlin", "Boolean"), |
| 73 | + |
| 74 | + IdSignatureValues._char to PrimitiveTypeInfo("char", true, javaLangCharacter, "kotlin", "Char"), |
| 75 | + |
| 76 | + IdSignatureValues.unit to PrimitiveTypeInfo("void", false, kotlinUnit, "kotlin", "Unit"), |
| 77 | + IdSignatureValues.nothing to PrimitiveTypeInfo(null, true, javaLangVoid, "kotlin", "Nothing"), |
| 78 | + ) |
| 79 | +} |
0 commit comments