Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit e5e694f

Browse files
smowtonigfoo
authored andcommitted
Adjust Kotlin type correspondence tables when extracting a substituted type
1 parent 12ce2d5 commit e5e694f

1 file changed

Lines changed: 19 additions & 19 deletions

File tree

java/kotlin-extractor/src/main/kotlin/KotlinExtractorExtension.kt

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,6 @@ import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
1414
import org.jetbrains.kotlin.ir.symbols.IrClassifierSymbol
1515
import org.jetbrains.kotlin.ir.symbols.IrConstructorSymbol
1616
import org.jetbrains.kotlin.ir.types.*
17-
import org.jetbrains.kotlin.ir.util.packageFqName
18-
import org.jetbrains.kotlin.ir.util.render
1917
import org.jetbrains.kotlin.name.FqName
2018
import java.io.File
2119
import java.io.FileOutputStream
@@ -29,8 +27,7 @@ import com.intellij.openapi.vfs.StandardFileSystems
2927
import com.semmle.extractor.java.OdasaOutput
3028
import com.semmle.extractor.java.OdasaOutput.TrapFileManager
3129
import com.semmle.util.files.FileUtil
32-
import org.jetbrains.kotlin.ir.util.fqNameWhenAvailable
33-
import org.jetbrains.kotlin.ir.util.kotlinFqName
30+
import org.jetbrains.kotlin.ir.util.*
3431
import kotlin.system.exitProcess
3532

3633
class KotlinExtractorExtension(private val invocationTrapFile: String, private val checkTrapIdentical: Boolean) : IrGenerationExtension {
@@ -299,6 +296,7 @@ open class KotlinFileExtractor(
299296
}
300297
}
301298

299+
data class UseClassInstanceResult(val classLabel: Label<out DbClassorinterface>, val javaClass: IrClass)
302300
data class TypeResult<LabelType>(val id: Label<LabelType>, val signature: String)
303301
data class TypeResults(val javaResult: TypeResult<out DbType>, val kotlinResult: TypeResult<out DbKt_type>)
304302

@@ -427,24 +425,24 @@ class X {
427425
val classifier: IrClassifierSymbol = s.classifier
428426
val cls: IrClass = classifier.owner as IrClass
429427

430-
val classId = useClassInstance(cls, s.arguments)
431-
val javaPackage = cls.packageFqName?.asString()
432-
val javaName = cls.name.asString()
433-
val qualClassName = if (javaPackage == null) javaName else "$javaPackage.$javaName"
434-
val javaSignature = qualClassName // TODO: Is this right?
435-
val javaResult = TypeResult(classId, javaSignature)
428+
val classInstanceResult = useClassInstance(cls, s.arguments)
429+
val javaClassId = classInstanceResult.classLabel
430+
val kotlinQualClassName = cls.fqNameForIrSerialization.asString()
431+
val javaQualClassName = classInstanceResult.javaClass.fqNameForIrSerialization.asString()
432+
val javaSignature = javaQualClassName // TODO: Is this right?
433+
val javaResult = TypeResult(javaClassId, javaSignature)
436434
val kotlinResult = if (s.hasQuestionMark) {
437-
val kotlinSignature = "$javaSignature?" // TODO: Is this right?
438-
val kotlinLabel = "@\"kt_type;nullable;$qualClassName\""
435+
val kotlinSignature = "$kotlinQualClassName?" // TODO: Is this right?
436+
val kotlinLabel = "@\"kt_type;nullable;$kotlinQualClassName\""
439437
val kotlinId: Label<DbKt_nullable_type> = tw.getLabelFor(kotlinLabel, {
440-
tw.writeKt_nullable_types(it, classId)
438+
tw.writeKt_nullable_types(it, javaClassId)
441439
})
442440
TypeResult(kotlinId, kotlinSignature)
443441
} else {
444-
val kotlinSignature = javaSignature // TODO: Is this right?
445-
val kotlinLabel = "@\"kt_type;notnull;$qualClassName\""
442+
val kotlinSignature = kotlinQualClassName // TODO: Is this right?
443+
val kotlinLabel = "@\"kt_type;notnull;$kotlinQualClassName\""
446444
val kotlinId: Label<DbKt_notnull_type> = tw.getLabelFor(kotlinLabel, {
447-
tw.writeKt_notnull_types(it, classId)
445+
tw.writeKt_notnull_types(it, javaClassId)
448446
})
449447
TypeResult(kotlinId, kotlinSignature)
450448
}
@@ -619,7 +617,7 @@ class X {
619617
}
620618
}
621619

622-
fun useClassInstance(c: IrClass, typeArgs: List<IrTypeArgument>): Label<out DbClassorinterface> {
620+
fun useClassInstance(c: IrClass, typeArgs: List<IrTypeArgument>): UseClassInstanceResult {
623621
// TODO: only substitute in class and function signatures
624622
// because within function bodies we can get things like Unit.INSTANCE
625623
// and List.asIterable (an extension, i.e. static, method)
@@ -632,7 +630,7 @@ class X {
632630
val extractClass = substituteClass ?: c
633631

634632
val classId = getClassLabel(extractClass, typeArgs)
635-
return tw.getLabelFor(classId, {
633+
val classLabel : Label<out DbClassorinterface> = tw.getLabelFor(classId, {
636634
// If this is a generic type instantiation then it has no
637635
// source entity, so we need to extract it here
638636
if (typeArgs.isNotEmpty()) {
@@ -644,6 +642,8 @@ class X {
644642
extractClassLaterIfExternal(c)
645643
substituteClass?.let { extractClassLaterIfExternal(it) }
646644
})
645+
646+
return UseClassInstanceResult(classLabel, extractClass)
647647
}
648648

649649
fun extractClassCommon(c: IrClass, id: Label<out DbClassorinterface>) {
@@ -657,7 +657,7 @@ class X {
657657
t.classifier.owner is IrClass -> {
658658
val classifier: IrClassifierSymbol = t.classifier
659659
val tcls: IrClass = classifier.owner as IrClass
660-
val l = useClassInstance(tcls, t.arguments)
660+
val l = useClassInstance(tcls, t.arguments).classLabel
661661
tw.writeExtendsReftype(id, l)
662662
} else -> {
663663
logger.warn(Severity.ErrorSevere, "Unexpected simple type supertype: " + t.javaClass + ": " + t.render())

0 commit comments

Comments
 (0)