@@ -14,8 +14,6 @@ import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
1414import org.jetbrains.kotlin.ir.symbols.IrClassifierSymbol
1515import org.jetbrains.kotlin.ir.symbols.IrConstructorSymbol
1616import org.jetbrains.kotlin.ir.types.*
17- import org.jetbrains.kotlin.ir.util.packageFqName
18- import org.jetbrains.kotlin.ir.util.render
1917import org.jetbrains.kotlin.name.FqName
2018import java.io.File
2119import java.io.FileOutputStream
@@ -29,8 +27,7 @@ import com.intellij.openapi.vfs.StandardFileSystems
2927import com.semmle.extractor.java.OdasaOutput
3028import com.semmle.extractor.java.OdasaOutput.TrapFileManager
3129import 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.*
3431import kotlin.system.exitProcess
3532
3633class 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