@@ -13,9 +13,7 @@ import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
1313import org.jetbrains.kotlin.ir.symbols.IrClassifierSymbol
1414import org.jetbrains.kotlin.ir.symbols.IrConstructorSymbol
1515import org.jetbrains.kotlin.ir.types.*
16- import org.jetbrains.kotlin.ir.util.dumpKotlinLike
1716import org.jetbrains.kotlin.ir.util.packageFqName
18- import org.jetbrains.kotlin.ir.util.parentAsClass
1917import org.jetbrains.kotlin.ir.util.render
2018import java.io.File
2119import java.io.FileOutputStream
@@ -221,7 +219,7 @@ class KotlinFileExtractor(val logger: FileLogger, val tw: FileTrapWriter, val fi
221219
222220 fun extractDeclaration (declaration : IrDeclaration ) {
223221 when (declaration) {
224- is IrClass -> useClass (declaration, listOf ())
222+ is IrClass -> extractClass (declaration, listOf ())
225223 is IrFunction -> extractFunction(declaration)
226224 is IrAnonymousInitializer -> {
227225 // Leaving this intentionally empty. init blocks are extracted during class extraction.
@@ -321,7 +319,19 @@ class KotlinFileExtractor(val logger: FileLogger, val tw: FileTrapWriter, val fi
321319
322320 fun useTypeParameter (param : IrTypeParameter ): Label <out DbTypevariable > {
323321 val l = getTypeParameterLabel(param)
324- return tw.getExistingLabelFor(l) ? : extractTypeParameter(param)
322+ val label = tw.getExistingLabelFor<DbTypevariable >(l)
323+ if (label != null ) {
324+ return label
325+ }
326+
327+ // todo: fix this
328+ if (param.origin == IrDeclarationOrigin .IR_EXTERNAL_DECLARATION_STUB ||
329+ param.origin == IrDeclarationOrigin .IR_EXTERNAL_JAVA_DECLARATION_STUB ){
330+ return extractTypeParameter(param)
331+ }
332+
333+ logger.warnElement(Severity .ErrorSevere , " Missing type parameter label" , param)
334+ return tw.getLabelFor(l)
325335 }
326336
327337 private fun extractTypeParameter (tp : IrTypeParameter ): Label <out DbTypevariable > {
@@ -348,14 +358,21 @@ class KotlinFileExtractor(val logger: FileLogger, val tw: FileTrapWriter, val fi
348358 private fun getClassLabel (c : IrClass , typeArgs : List <IrTypeArgument >): String {
349359 val pkg = c.packageFqName?.asString() ? : " "
350360 val cls = c.name.asString()
351- val qualClassName = if (pkg.isEmpty()) cls else " $pkg .$cls "
352- var label = " @\" class;$qualClassName "
361+ var label: String
362+ val parent = c.parent
363+ if (parent is IrClass ) {
364+ // todo: fix this. Ugly string concat to handle nested class IDs.
365+ // todo: Can the containing class have type arguments?
366+ val p = getClassLabel(parent, listOf ())
367+ label = " ${p.substring(0 , p.length - 1 )} \$ $cls "
368+ } else {
369+ val qualClassName = if (pkg.isEmpty()) cls else " $pkg .$cls "
370+ label = " @\" class;$qualClassName "
371+ }
353372
354- if (typeArgs.isNotEmpty()) {
355- for (arg in typeArgs) {
356- val argId = getTypeArgumentLabel(arg, c)
357- label + = " ;{$argId }"
358- }
373+ for (arg in typeArgs) {
374+ val argId = getTypeArgumentLabel(arg, c)
375+ label + = " ;{$argId }"
359376 }
360377
361378 label + = " \" "
@@ -403,7 +420,23 @@ class KotlinFileExtractor(val logger: FileLogger, val tw: FileTrapWriter, val fi
403420 }
404421
405422 val classId = getClassLabel(c, args)
406- return tw.getExistingLabelFor<DbClass >(classId) ? : extractClass(c, args)
423+ val label = tw.getExistingLabelFor<DbClass >(classId)
424+ if (label != null ) {
425+ return label
426+ }
427+
428+ if (typeArgs.isNotEmpty()) {
429+ return extractClass(c, typeArgs)
430+ }
431+
432+ // todo: fix this
433+ if (c.origin == IrDeclarationOrigin .IR_EXTERNAL_DECLARATION_STUB ||
434+ c.origin == IrDeclarationOrigin .IR_EXTERNAL_JAVA_DECLARATION_STUB ){
435+ return extractClass(c, listOf ())
436+ }
437+
438+ logger.warnElement(Severity .ErrorSevere , " Missing class label" , c)
439+ return tw.getLabelFor(classId)
407440 }
408441
409442 private fun typeArgsMatchTypeParameters (typeArgs : List <IrTypeArgument >, typeParameters : List <IrTypeParameter >): Boolean {
@@ -437,6 +470,11 @@ class KotlinFileExtractor(val logger: FileLogger, val tw: FileTrapWriter, val fi
437470 }
438471 val locId = tw.getLocation(c)
439472 tw.writeHasLocation(id, locId)
473+
474+ if (typeArgs.isEmpty()) {
475+ c.typeParameters.map { extractTypeParameter(it) }
476+ }
477+
440478 for (t in c.superTypes) {
441479 when (t) {
442480 is IrSimpleType -> {
@@ -465,8 +503,6 @@ class KotlinFileExtractor(val logger: FileLogger, val tw: FileTrapWriter, val fi
465503 val unbound = useClass(c, listOf ())
466504 tw.writeErasure(id, unbound)
467505 } else {
468- c.typeParameters.map { extractTypeParameter(it) }
469-
470506 c.declarations.map { extractDeclaration(it) }
471507
472508 extractObjectInitializerFunction(c, id)
@@ -650,6 +686,8 @@ class KotlinFileExtractor(val logger: FileLogger, val tw: FileTrapWriter, val fi
650686 fun extractFunction (f : IrFunction ) {
651687 currentFunction = f
652688
689+ f.typeParameters.map { extractTypeParameter(it) }
690+
653691 val locId = tw.getLocation(f)
654692 val signature = " TODO"
655693 val returnTypeId = useType(f.returnType)
@@ -680,8 +718,6 @@ class KotlinFileExtractor(val logger: FileLogger, val tw: FileTrapWriter, val fi
680718 extractValueParameter(vp, id, i)
681719 }
682720
683- f.typeParameters.map { extractTypeParameter(it) }
684-
685721 currentFunction = null
686722 }
687723
@@ -882,7 +918,7 @@ class KotlinFileExtractor(val logger: FileLogger, val tw: FileTrapWriter, val fi
882918 ) {
883919 for (argIdx in 0 until c.typeArgumentsCount) {
884920 val arg = c.getTypeArgument(argIdx)!!
885- val argTypeId = useType(arg)
921+ val argTypeId = useType(arg, false )
886922 val argId = tw.getFreshIdLabel<DbUnannotatedtypeaccess >()
887923 val mul = if (reverse) - 1 else 1
888924 tw.writeExprs_unannotatedtypeaccess(argId, argTypeId, id, argIdx * mul + startIndex)
0 commit comments