diff --git a/java/kotlin-extractor/src/main/kotlin/KotlinExtractorExtension.kt b/java/kotlin-extractor/src/main/kotlin/KotlinExtractorExtension.kt index 3edeb3c5477..1774abf5b4e 100644 --- a/java/kotlin-extractor/src/main/kotlin/KotlinExtractorExtension.kt +++ b/java/kotlin-extractor/src/main/kotlin/KotlinExtractorExtension.kt @@ -367,15 +367,27 @@ open class KotlinUsesExtractor( return UseClassInstanceResult(classLabel, extractClass) } + fun isExternalDeclaration(d: IrDeclaration): Boolean { + return d.origin == IrDeclarationOrigin.IR_EXTERNAL_DECLARATION_STUB || + d.origin == IrDeclarationOrigin.IR_EXTERNAL_JAVA_DECLARATION_STUB + } + fun extractClassLaterIfExternal(c: IrClass) { - // we don't have an "external dependencies" extractor yet, - // so for now we extract the source class for those too - if (c.origin == IrDeclarationOrigin.IR_EXTERNAL_DECLARATION_STUB || - c.origin == IrDeclarationOrigin.IR_EXTERNAL_JAVA_DECLARATION_STUB) { + if (isExternalDeclaration(c)) { extractExternalClassLater(c) } } + fun extractExternalEnclosingClassLater(d: IrDeclaration) { + val parent = d.parent + when (parent) { + is IrClass -> extractExternalClassLater(parent) + is IrFunction -> extractExternalEnclosingClassLater(parent) + is IrFile -> logger.warn(Severity.ErrorSevere, "extractExternalEnclosingClassLater but no enclosing class.") + else -> logger.warn(Severity.ErrorSevere, "Unrecognised extractExternalEnclosingClassLater: " + d.javaClass) + } + } + fun extractExternalClassLater(c: IrClass) { dependencyCollector?.addDependency(c) externalClassExtractor.extractLater(c) @@ -633,7 +645,8 @@ class X { val javaSignature = "an array" // TODO: Wrong val javaResult = TypeResult(id, javaSignature) - val kotlinClassName = getUnquotedClassLabel(s.classifier.owner as IrClass, listOf(makeTypeProjection(componentType, Variance.INVARIANT))) + val owner: IrClass = s.classifier.owner as IrClass + val kotlinClassName = getUnquotedClassLabel(owner, listOf(makeTypeProjection(componentType, Variance.INVARIANT))) val kotlinSignature = "$javaSignature?" // TODO: Wrong val kotlinLabel = "@\"kt_type;nullable;${kotlinClassName}\"" val kotlinId: Label = tw.getLabelFor(kotlinLabel, { @@ -712,6 +725,9 @@ class X { fun useFunction(f: IrFunction): Label { val label = getFunctionLabel(f) val id: Label = tw.getLabelFor(label) + if(isExternalDeclaration(f)) { + extractExternalEnclosingClassLater(f) + } return id } @@ -1118,8 +1134,7 @@ open class KotlinFileExtractor( } private fun extractObjectInitializerFunction(c: IrClass, parentId: Label) { - if (c.origin == IrDeclarationOrigin.IR_EXTERNAL_DECLARATION_STUB || - c.origin == IrDeclarationOrigin.IR_EXTERNAL_JAVA_DECLARATION_STUB) { + if (isExternalDeclaration(c)) { return } diff --git a/java/ql/test/kotlin/library-tests/vararg/test.kt b/java/ql/test/kotlin/library-tests/vararg/test.kt index af6482cc220..97f18e183bf 100644 --- a/java/ql/test/kotlin/library-tests/vararg/test.kt +++ b/java/ql/test/kotlin/library-tests/vararg/test.kt @@ -9,7 +9,7 @@ fun funWithMiddleVarArgs(x: String, vararg xs: Int, y: Boolean) { } fun myFun() { - // TODO val xs = listOf(10, 11, 12) + val xs = listOf(10, 11, 12) funWithOnlyVarArgs(20, 21, 22) funWithArgsAndVarArgs("foo", true, 30, 31, 32) funWithMiddleVarArgs("foo", 41, 42, 43, y = true)