Skip to content

Commit a8b69e5

Browse files
committed
Kotlin: Fix build on old versions
1 parent eb27428 commit a8b69e5

File tree

5 files changed

+50
-51
lines changed

5 files changed

+50
-51
lines changed

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

Lines changed: 4 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import org.jetbrains.kotlin.builtins.functions.BuiltInFunctionArity
1111
import org.jetbrains.kotlin.config.JvmAnalysisFlags
1212
import org.jetbrains.kotlin.descriptors.*
1313
import org.jetbrains.kotlin.descriptors.java.JavaVisibilities
14-
import org.jetbrains.kotlin.load.kotlin.FacadeClassSource
1514
import org.jetbrains.kotlin.ir.IrElement
1615
import org.jetbrains.kotlin.ir.IrStatement
1716
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
@@ -2384,23 +2383,11 @@ open class KotlinFileExtractor(
23842383
val parent = target.parent
23852384
if (parent is IrExternalPackageFragment) {
23862385
// This is in a file class.
2387-
// Get the name in a similar way to the compiler's ExternalPackageParentPatcherLowering
2388-
// visitMemberAccess/generateOrGetFacadeClass.
2389-
if (target is IrMemberWithContainerSource) {
2390-
val containerSource = target.containerSource
2391-
if (containerSource is FacadeClassSource) {
2392-
val facadeClassName = containerSource.facadeClassName
2393-
if (facadeClassName != null) {
2394-
// TODO: This is really a multifile-class rather than a file-class
2395-
extractTypeAccess(useFileClassType(facadeClassName.fqNameForTopLevelClassMaybeWithDollars), locId, parentExpr, -1, enclosingCallable, enclosingStmt)
2396-
} else {
2397-
extractTypeAccess(useFileClassType(containerSource.className.fqNameForTopLevelClassMaybeWithDollars), locId, parentExpr, -1, enclosingCallable, enclosingStmt)
2398-
}
2399-
} else {
2400-
logger.warnElement("Unexpected container source ${containerSource?.javaClass}", target)
2401-
}
2386+
val fqName = getFileClassFqName(target)
2387+
if (fqName == null) {
2388+
logger.error("Can't get FqName for element in external package fragment ${target.javaClass}")
24022389
} else {
2403-
logger.warnElement("Element in external package fragment without container source ${target.javaClass}", target)
2390+
extractTypeAccess(useFileClassType(fqName), locId, parentExpr, -1, enclosingCallable, enclosingStmt)
24042391
}
24052392
} else if (parent is IrClass) {
24062393
extractTypeAccessRecursive(parent.toRawType(), locId, parentExpr, -1, enclosingCallable, enclosingStmt)

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

Lines changed: 5 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package com.github.codeql
22

33
import com.github.codeql.utils.*
44
import com.github.codeql.utils.versions.codeQlWithHasQuestionMark
5+
import com.github.codeql.utils.versions.getFileClassFqName
56
import com.github.codeql.utils.versions.getKotlinType
67
import com.github.codeql.utils.versions.isRawType
78
import com.semmle.extractor.java.OdasaOutput
@@ -24,7 +25,6 @@ import org.jetbrains.kotlin.load.java.JvmAbi
2425
import org.jetbrains.kotlin.load.java.sources.JavaSourceElement
2526
import org.jetbrains.kotlin.load.java.structure.*
2627
import org.jetbrains.kotlin.load.java.typeEnhancement.hasEnhancedNullability
27-
import org.jetbrains.kotlin.load.kotlin.FacadeClassSource
2828
import org.jetbrains.kotlin.load.kotlin.getJvmModuleNameForDeserializedDescriptor
2929
import org.jetbrains.kotlin.name.FqName
3030
import org.jetbrains.kotlin.name.NameUtils
@@ -821,26 +821,12 @@ open class KotlinUsesExtractor(
821821
val parent = parentOf(d)
822822
if (parent is IrExternalPackageFragment) {
823823
// This is in a file class.
824-
// Get the name in a similar way to the compiler's ExternalPackageParentPatcherLowering
825-
// visitMemberAccess/generateOrGetFacadeClass.
826-
if (d is IrMemberWithContainerSource) {
827-
val containerSource = d.containerSource
828-
if (containerSource is FacadeClassSource) {
829-
val facadeClassName = containerSource.facadeClassName
830-
if (facadeClassName != null) {
831-
// TODO: This is really a multifile-class rather than a file-class
832-
return extractFileClass(facadeClassName.fqNameForTopLevelClassMaybeWithDollars)
833-
} else {
834-
return extractFileClass(containerSource.className.fqNameForTopLevelClassMaybeWithDollars)
835-
}
836-
} else {
837-
logger.error("Unexpected container source ${containerSource?.javaClass}")
838-
return null
839-
}
840-
} else {
841-
logger.error("Element in external package fragment without container source ${d.javaClass}")
824+
val fqName = getFileClassFqName(d)
825+
if (fqName == null) {
826+
logger.error("Can't get FqName for element in external package fragment ${d.javaClass}")
842827
return null
843828
}
829+
return extractFileClass(fqName)
844830
}
845831
return useDeclarationParent(parent, canBeTopLevel, classTypeArguments, inReceiverContext)
846832
}

java/kotlin-extractor/src/main/kotlin/utils/ClassNames.kt

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.github.codeql
22

33
import com.github.codeql.utils.getJvmName
4+
import com.github.codeql.utils.versions.getFileClassFqName
45
import com.intellij.openapi.vfs.StandardFileSystems
56
import org.jetbrains.kotlin.load.java.sources.JavaSourceElement
67
import org.jetbrains.kotlin.load.java.structure.impl.classFiles.BinaryJavaClass
@@ -13,7 +14,6 @@ import org.jetbrains.kotlin.ir.IrElement
1314
import org.jetbrains.kotlin.ir.declarations.*
1415
import org.jetbrains.kotlin.ir.util.fqNameWhenAvailable
1516
import org.jetbrains.kotlin.ir.util.parentClassOrNull
16-
import org.jetbrains.kotlin.load.kotlin.FacadeClassSource
1717
import org.jetbrains.kotlin.load.kotlin.JvmPackagePartSource
1818

1919
// Adapted from Kotlin's interpreter/Utils.kt function 'internalName'
@@ -122,20 +122,9 @@ fun getIrDeclarationBinaryPath(d: IrDeclaration): String? {
122122
}
123123
if (d.parent is IrExternalPackageFragment) {
124124
// This is in a file class.
125-
// Get the name in a similar way to the compiler's ExternalPackageParentPatcherLowering
126-
// visitMemberAccess/generateOrGetFacadeClass.
127-
if (d is IrMemberWithContainerSource) {
128-
val containerSource = d.containerSource
129-
if (containerSource is FacadeClassSource) {
130-
val facadeClassName = containerSource.facadeClassName
131-
if (facadeClassName != null) {
132-
// This is a multifile-class
133-
return getUnknownBinaryLocation(facadeClassName.fqNameForTopLevelClassMaybeWithDollars.asString())
134-
} else {
135-
// This is a file-class
136-
return getUnknownBinaryLocation(containerSource.className.fqNameForTopLevelClassMaybeWithDollars.asString())
137-
}
138-
}
125+
val fqName = getFileClassFqName(d)
126+
if (fqName != null) {
127+
return getUnknownBinaryLocation(fqName.asString())
139128
}
140129
}
141130
return null
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.github.codeql.utils.versions
2+
3+
import org.jetbrains.kotlin.name.FqName
4+
import org.jetbrains.kotlin.ir.declarations.IrDeclaration
5+
6+
fun getFileClassFqName(@Suppress("UNUSED_PARAMETER") d: IrDeclaration): FqName? {
7+
return null
8+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package com.github.codeql.utils.versions
2+
3+
import org.jetbrains.kotlin.name.FqName
4+
import org.jetbrains.kotlin.ir.declarations.IrDeclaration
5+
import org.jetbrains.kotlin.ir.declarations.IrMemberWithContainerSource
6+
import org.jetbrains.kotlin.load.kotlin.FacadeClassSource
7+
8+
fun getFileClassFqName(d: IrDeclaration): FqName? {
9+
// d is in a file class.
10+
// Get the name in a similar way to the compiler's ExternalPackageParentPatcherLowering
11+
// visitMemberAccess/generateOrGetFacadeClass.
12+
if (d is IrMemberWithContainerSource) {
13+
val containerSource = d.containerSource
14+
if (containerSource is FacadeClassSource) {
15+
val facadeClassName = containerSource.facadeClassName
16+
if (facadeClassName != null) {
17+
// TODO: This is really a multifile-class rather than a file-class,
18+
// but for now we treat them the same.
19+
return facadeClassName.fqNameForTopLevelClassMaybeWithDollars
20+
} else {
21+
return containerSource.className.fqNameForTopLevelClassMaybeWithDollars
22+
}
23+
} else {
24+
return null
25+
}
26+
} else {
27+
return null
28+
}
29+
}

0 commit comments

Comments
 (0)