@@ -323,9 +323,9 @@ open class KotlinUsesExtractor(
323323 return id
324324 }
325325
326- data class UseClassInstanceResult (val classLabel : Label < out DbClassorinterface >, val javaClass : IrClass , val shortName : String )
327- data class TypeResult <LabelType >(val id : Label <LabelType >, val signature : String , val shortName : String )
328- data class TypeResults (val javaResult : TypeResult <out DbType >, val kotlinResult : TypeResult <out DbKt_type >)
326+ data class UseClassInstanceResult (val typeResult : TypeResult < DbClassorinterface >, val javaClass : IrClass )
327+ data class TypeResult <out LabelType >(val id : Label <out LabelType >, val signature : String? , val shortName : String )
328+ data class TypeResults (val javaResult : TypeResult <DbType >, val kotlinResult : TypeResult <DbKt_type >)
329329
330330 fun useType (t : IrType , canReturnPrimitiveTypes : Boolean = true) =
331331 when (t) {
@@ -382,7 +382,7 @@ open class KotlinUsesExtractor(
382382 substituteClass?.let { extractClassLaterIfExternal(it) }
383383 })
384384
385- return UseClassInstanceResult (classLabel, extractClass, classId.shortName)
385+ return UseClassInstanceResult (TypeResult ( classLabel, extractClass.fqNameWhenAvailable?.asString() , classId.shortName), extractClass )
386386 }
387387
388388 fun isExternalDeclaration (d : IrDeclaration ): Boolean {
@@ -412,22 +412,20 @@ open class KotlinUsesExtractor(
412412 externalClassExtractor.extractLater(c)
413413 }
414414
415- fun addClassLabel (c : IrClass , typeArgs : List <IrTypeArgument >): TypeResult <out DbClassorinterface > {
415+ fun addClassLabel (c : IrClass , typeArgs : List <IrTypeArgument >): TypeResult <DbClassorinterface > {
416416 val classLabelResult = getClassLabel(c, typeArgs)
417417 return TypeResult (
418418 tw.getLabelFor(classLabelResult.classLabel),
419- " TODO " ,
419+ c.fqNameWhenAvailable?.asString() ,
420420 classLabelResult.shortName)
421421 }
422422
423423 fun useSimpleTypeClass (c : IrClass , args : List <IrTypeArgument >, hasQuestionMark : Boolean ): TypeResults {
424424 val classInstanceResult = useClassInstance(c, args)
425- val javaClassId = classInstanceResult.classLabel
425+ val javaClassId = classInstanceResult.typeResult.id
426426 val kotlinQualClassName = getUnquotedClassLabel(c, args).classLabel
427- val javaQualClassName = classInstanceResult.javaClass.fqNameForIrSerialization.asString()
428- val javaSignature = javaQualClassName // TODO: Is this right?
429427 // TODO: args ought to be substituted, so e.g. MutableList<MutableList<String>> gets the Java type List<List<String>>
430- val javaResult = TypeResult (javaClassId, javaSignature, classInstanceResult.shortName)
428+ val javaResult = classInstanceResult.typeResult
431429 val kotlinResult = if (hasQuestionMark) {
432430 val kotlinSignature = " $kotlinQualClassName ?" // TODO: Is this right?
433431 val kotlinLabel = " @\" kt_type;nullable;$kotlinQualClassName \" "
@@ -547,10 +545,10 @@ open class KotlinUsesExtractor(
547545 TypeResult (label, primitiveName, primitiveName)
548546 } else {
549547 val label = makeClass(javaPackageName, javaClassName)
550- val signature = " $javaPackageName .$javaClassName " // TODO: Is this right?
548+ val signature = " $javaPackageName .$javaClassName "
551549 TypeResult (label, signature, javaClassName)
552550 }
553- val kotlinClassId = useClassInstance(kotlinClass, listOf ()).classLabel
551+ val kotlinClassId = useClassInstance(kotlinClass, listOf ()).typeResult.id
554552 val kotlinResult = if (s.hasQuestionMark) {
555553 val kotlinSignature = " $kotlinPackageName .$kotlinClassName ?" // TODO: Is this right?
556554 val kotlinLabel = " @\" kt_type;nullable;$kotlinPackageName .$kotlinClassName \" "
@@ -700,7 +698,7 @@ class X {
700698
701699 fun getTypeArgumentLabel (
702700 arg : IrTypeArgument
703- ): TypeResult <out DbReftype > {
701+ ): TypeResult <DbReftype > {
704702
705703 fun extractBoundedWildcard (wildcardKind : Int , wildcardLabelStr : String , wildcardShortName : String , boundLabel : Label <out DbReftype >): Label <DbWildcard > =
706704 tw.getLabelFor(wildcardLabelStr) { wildcardLabel ->
@@ -711,11 +709,12 @@ class X {
711709 }
712710 }
713711
712+ // Note this function doesn't return a signature because type arguments are never incorporated into function signatures.
714713 return when (arg) {
715714 is IrStarProjection -> {
716715 @Suppress(" UNCHECKED_CAST" )
717716 val anyTypeLabel = useType(pluginContext.irBuiltIns.anyType).javaResult.id as Label <out DbReftype >
718- TypeResult (extractBoundedWildcard(1 , " @\" wildcard;\" " , " ?" , anyTypeLabel), " ? " , " ?" )
717+ TypeResult (extractBoundedWildcard(1 , " @\" wildcard;\" " , " ?" , anyTypeLabel), null , " ?" )
719718 }
720719 is IrTypeProjection -> {
721720 val boundResults = useType(arg.type, false )
@@ -724,14 +723,14 @@ class X {
724723
725724 return if (arg.variance == Variance .INVARIANT )
726725 @Suppress(" UNCHECKED_CAST" )
727- boundResults.javaResult as TypeResult <out DbReftype >
726+ boundResults.javaResult as TypeResult <DbReftype >
728727 else {
729728 val keyPrefix = if (arg.variance == Variance .IN_VARIANCE ) " super" else " extends"
730729 val wildcardKind = if (arg.variance == Variance .IN_VARIANCE ) 2 else 1
731730 val wildcardShortName = " ? $keyPrefix ${boundResults.javaResult.shortName} "
732731 TypeResult (
733732 extractBoundedWildcard(wildcardKind, " @\" wildcard;$keyPrefix {$boundLabel }\" " , wildcardShortName, boundLabel),
734- " TODO " ,
733+ null ,
735734 wildcardShortName)
736735 }
737736 }
@@ -799,7 +798,7 @@ class X {
799798 // in extractClassSource or extractFunction
800799 logger.warn(Severity .ErrorSevere , " Missing type parameter label" )
801800 },
802- param.name.asString() ,
801+ useType(eraseTypeParameter( param)).javaResult.signature ,
803802 param.name.asString()
804803 )
805804
@@ -828,7 +827,7 @@ class X {
828827 is IrClass -> {
829828 val classifier: IrClassifierSymbol = t.classifier
830829 val tcls: IrClass = classifier.owner as IrClass
831- val l = useClassInstance(tcls, t.arguments).classLabel
830+ val l = useClassInstance(tcls, t.arguments).typeResult.id
832831 tw.writeExtendsReftype(id, l)
833832 }
834833 else -> {
@@ -857,7 +856,7 @@ class X {
857856 val classifier = t.classifier
858857 val owner = classifier.owner
859858 if (owner is IrTypeParameter ) {
860- return erase (owner.superTypes[ 0 ] )
859+ return eraseTypeParameter (owner)
861860 }
862861
863862 // todo: fix this:
@@ -874,6 +873,9 @@ class X {
874873 return t
875874 }
876875
876+ fun eraseTypeParameter (t : IrTypeParameter ) =
877+ erase(t.superTypes[0 ])
878+
877879 fun getValueParameterLabel (vp : IrValueParameter ): String {
878880 @Suppress(" UNCHECKED_CAST" )
879881 val parentId: Label <out DbMethod > = useDeclarationParent(vp.parent) as Label <out DbMethod >
@@ -1062,7 +1064,7 @@ open class KotlinFileExtractor(
10621064
10631065 val parent = c.parent
10641066 if (parent is IrClass ) {
1065- val parentId = useClassInstance(parent, listOf ()).classLabel
1067+ val parentId = useClassInstance(parent, listOf ()).typeResult.id
10661068 tw.writeEnclInReftype(id, parentId)
10671069 if (c.isCompanion) {
10681070 // If we are a companion then our parent has a
@@ -1116,7 +1118,7 @@ open class KotlinFileExtractor(
11161118 logger.warn(Severity .ErrorSevere , " Using companion instance for non-companion class" )
11171119 return null
11181120 } else {
1119- val parentId = useClassInstance(parent, listOf ()).classLabel
1121+ val parentId = useClassInstance(parent, listOf ()).typeResult.id
11201122 val instanceName = c.name.asString()
11211123 val instanceLabel = " @\" field;{$parentId };$instanceName \" "
11221124 val instanceId: Label <DbField > = tw.getLabelFor(instanceLabel)
@@ -1128,20 +1130,21 @@ open class KotlinFileExtractor(
11281130 if (! c.isNonCompanionObject) {
11291131 logger.warn(Severity .ErrorSevere , " Using instance for non-object class" )
11301132 }
1131- val classId = useClassInstance(c, listOf ()).classLabel
1133+ val classId = useClassInstance(c, listOf ()).typeResult.id
11321134 val instanceName = " INSTANCE"
11331135 val instanceLabel = " @\" field;{$classId };$instanceName \" "
11341136 val instanceId: Label <DbField > = tw.getLabelFor(instanceLabel)
11351137 return FieldResult (instanceId, instanceName)
11361138 }
11371139
1138- fun extractValueParameter (vp : IrValueParameter , parent : Label <out DbCallable >, idx : Int ) {
1140+ fun extractValueParameter (vp : IrValueParameter , parent : Label <out DbCallable >, idx : Int ): TypeResults {
11391141 val id = useValueParameter(vp)
11401142 val type = useType(vp.type)
11411143 val locId = tw.getLocation(vp)
11421144 tw.writeParams(id, type.javaResult.id, type.kotlinResult.id, idx, parent, id)
11431145 tw.writeHasLocation(id, locId)
11441146 tw.writeParamName(id, vp.name.asString())
1147+ return type
11451148 }
11461149
11471150 private fun extractObjectInitializerFunction (c : IrClass , parentId : Label <out DbReftype >) {
@@ -1152,9 +1155,8 @@ open class KotlinFileExtractor(
11521155 // add method:
11531156 val obinitLabel = getFunctionLabel(c, " <obinit>" , listOf (), pluginContext.irBuiltIns.unitType)
11541157 val obinitId = tw.getLabelFor<DbMethod >(obinitLabel)
1155- val signature = " TODO"
11561158 val returnType = useType(pluginContext.irBuiltIns.unitType)
1157- tw.writeMethods(obinitId, " <obinit>" , signature , returnType.javaResult.id, returnType.kotlinResult.id, parentId, obinitId)
1159+ tw.writeMethods(obinitId, " <obinit>" , " <obinit>() " , returnType.javaResult.id, returnType.kotlinResult.id, parentId, obinitId)
11581160
11591161 val locId = tw.getLocation(c)
11601162 tw.writeHasLocation(obinitId, locId)
@@ -1216,17 +1218,23 @@ open class KotlinFileExtractor(
12161218 f.typeParameters.map { extractTypeParameter(it) }
12171219
12181220 val locId = tw.getLocation(f)
1219- val signature = " TODO"
12201221
1221- val id: Label <out DbCallable >
1222+ val id = useFunction<DbCallable >(f)
1223+ val paramTypes = f.valueParameters.mapIndexed { i, vp ->
1224+ extractValueParameter(vp, id, i)
1225+ }
1226+ val paramsSignature = paramTypes.joinToString(separator = " ," , prefix = " (" , postfix = " )" ) { it.javaResult.signature!! }
1227+
12221228 if (f.symbol is IrConstructorSymbol ) {
12231229 val returnType = useType(erase(f.returnType))
1224- id = useFunction<DbConstructor >(f)
1225- tw.writeConstrs(id, f.returnType.classFqName?.shortName()?.asString() ? : f.name.asString(), signature, returnType.javaResult.id, returnType.kotlinResult.id, parentId, id)
1230+ val shortName = f.returnType.classFqName?.shortName()?.asString() ? : f.name.asString()
1231+ @Suppress(" UNCHECKED_CAST" )
1232+ tw.writeConstrs(id as Label <DbConstructor >, shortName, " $shortName$paramsSignature " , returnType.javaResult.id, returnType.kotlinResult.id, parentId, id)
12261233 } else {
12271234 val returnType = useType(f.returnType)
1228- id = useFunction<DbMethod >(f)
1229- tw.writeMethods(id, f.name.asString(), signature, returnType.javaResult.id, returnType.kotlinResult.id, parentId, id)
1235+ val shortName = f.name.asString()
1236+ @Suppress(" UNCHECKED_CAST" )
1237+ tw.writeMethods(id as Label <DbMethod >, shortName, " $shortName$paramsSignature " , returnType.javaResult.id, returnType.kotlinResult.id, parentId, id)
12301238
12311239 val extReceiver = f.extensionReceiverParameter
12321240 if (extReceiver != null ) {
@@ -1240,9 +1248,6 @@ open class KotlinFileExtractor(
12401248 if (body != null ) {
12411249 extractBody(body, id)
12421250 }
1243- f.valueParameters.forEachIndexed { i, vp ->
1244- extractValueParameter(vp, id, i)
1245- }
12461251
12471252 currentFunction = null
12481253 return id
0 commit comments