mirror of
https://github.com/github/codeql.git
synced 2026-04-25 16:55:19 +02:00
Kotlin: Fix build on old versions
This commit is contained in:
@@ -11,7 +11,6 @@ import org.jetbrains.kotlin.builtins.functions.BuiltInFunctionArity
|
||||
import org.jetbrains.kotlin.config.JvmAnalysisFlags
|
||||
import org.jetbrains.kotlin.descriptors.*
|
||||
import org.jetbrains.kotlin.descriptors.java.JavaVisibilities
|
||||
import org.jetbrains.kotlin.load.kotlin.FacadeClassSource
|
||||
import org.jetbrains.kotlin.ir.IrElement
|
||||
import org.jetbrains.kotlin.ir.IrStatement
|
||||
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
|
||||
@@ -2384,23 +2383,11 @@ open class KotlinFileExtractor(
|
||||
val parent = target.parent
|
||||
if (parent is IrExternalPackageFragment) {
|
||||
// This is in a file class.
|
||||
// Get the name in a similar way to the compiler's ExternalPackageParentPatcherLowering
|
||||
// visitMemberAccess/generateOrGetFacadeClass.
|
||||
if (target is IrMemberWithContainerSource) {
|
||||
val containerSource = target.containerSource
|
||||
if (containerSource is FacadeClassSource) {
|
||||
val facadeClassName = containerSource.facadeClassName
|
||||
if (facadeClassName != null) {
|
||||
// TODO: This is really a multifile-class rather than a file-class
|
||||
extractTypeAccess(useFileClassType(facadeClassName.fqNameForTopLevelClassMaybeWithDollars), locId, parentExpr, -1, enclosingCallable, enclosingStmt)
|
||||
} else {
|
||||
extractTypeAccess(useFileClassType(containerSource.className.fqNameForTopLevelClassMaybeWithDollars), locId, parentExpr, -1, enclosingCallable, enclosingStmt)
|
||||
}
|
||||
} else {
|
||||
logger.warnElement("Unexpected container source ${containerSource?.javaClass}", target)
|
||||
}
|
||||
val fqName = getFileClassFqName(target)
|
||||
if (fqName == null) {
|
||||
logger.error("Can't get FqName for element in external package fragment ${target.javaClass}")
|
||||
} else {
|
||||
logger.warnElement("Element in external package fragment without container source ${target.javaClass}", target)
|
||||
extractTypeAccess(useFileClassType(fqName), locId, parentExpr, -1, enclosingCallable, enclosingStmt)
|
||||
}
|
||||
} else if (parent is IrClass) {
|
||||
extractTypeAccessRecursive(parent.toRawType(), locId, parentExpr, -1, enclosingCallable, enclosingStmt)
|
||||
|
||||
@@ -2,6 +2,7 @@ package com.github.codeql
|
||||
|
||||
import com.github.codeql.utils.*
|
||||
import com.github.codeql.utils.versions.codeQlWithHasQuestionMark
|
||||
import com.github.codeql.utils.versions.getFileClassFqName
|
||||
import com.github.codeql.utils.versions.getKotlinType
|
||||
import com.github.codeql.utils.versions.isRawType
|
||||
import com.semmle.extractor.java.OdasaOutput
|
||||
@@ -24,7 +25,6 @@ import org.jetbrains.kotlin.load.java.JvmAbi
|
||||
import org.jetbrains.kotlin.load.java.sources.JavaSourceElement
|
||||
import org.jetbrains.kotlin.load.java.structure.*
|
||||
import org.jetbrains.kotlin.load.java.typeEnhancement.hasEnhancedNullability
|
||||
import org.jetbrains.kotlin.load.kotlin.FacadeClassSource
|
||||
import org.jetbrains.kotlin.load.kotlin.getJvmModuleNameForDeserializedDescriptor
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.name.NameUtils
|
||||
@@ -821,26 +821,12 @@ open class KotlinUsesExtractor(
|
||||
val parent = parentOf(d)
|
||||
if (parent is IrExternalPackageFragment) {
|
||||
// This is in a file class.
|
||||
// Get the name in a similar way to the compiler's ExternalPackageParentPatcherLowering
|
||||
// visitMemberAccess/generateOrGetFacadeClass.
|
||||
if (d is IrMemberWithContainerSource) {
|
||||
val containerSource = d.containerSource
|
||||
if (containerSource is FacadeClassSource) {
|
||||
val facadeClassName = containerSource.facadeClassName
|
||||
if (facadeClassName != null) {
|
||||
// TODO: This is really a multifile-class rather than a file-class
|
||||
return extractFileClass(facadeClassName.fqNameForTopLevelClassMaybeWithDollars)
|
||||
} else {
|
||||
return extractFileClass(containerSource.className.fqNameForTopLevelClassMaybeWithDollars)
|
||||
}
|
||||
} else {
|
||||
logger.error("Unexpected container source ${containerSource?.javaClass}")
|
||||
return null
|
||||
}
|
||||
} else {
|
||||
logger.error("Element in external package fragment without container source ${d.javaClass}")
|
||||
val fqName = getFileClassFqName(d)
|
||||
if (fqName == null) {
|
||||
logger.error("Can't get FqName for element in external package fragment ${d.javaClass}")
|
||||
return null
|
||||
}
|
||||
return extractFileClass(fqName)
|
||||
}
|
||||
return useDeclarationParent(parent, canBeTopLevel, classTypeArguments, inReceiverContext)
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package com.github.codeql
|
||||
|
||||
import com.github.codeql.utils.getJvmName
|
||||
import com.github.codeql.utils.versions.getFileClassFqName
|
||||
import com.intellij.openapi.vfs.StandardFileSystems
|
||||
import org.jetbrains.kotlin.load.java.sources.JavaSourceElement
|
||||
import org.jetbrains.kotlin.load.java.structure.impl.classFiles.BinaryJavaClass
|
||||
@@ -13,7 +14,6 @@ import org.jetbrains.kotlin.ir.IrElement
|
||||
import org.jetbrains.kotlin.ir.declarations.*
|
||||
import org.jetbrains.kotlin.ir.util.fqNameWhenAvailable
|
||||
import org.jetbrains.kotlin.ir.util.parentClassOrNull
|
||||
import org.jetbrains.kotlin.load.kotlin.FacadeClassSource
|
||||
import org.jetbrains.kotlin.load.kotlin.JvmPackagePartSource
|
||||
|
||||
// Adapted from Kotlin's interpreter/Utils.kt function 'internalName'
|
||||
@@ -122,20 +122,9 @@ fun getIrDeclarationBinaryPath(d: IrDeclaration): String? {
|
||||
}
|
||||
if (d.parent is IrExternalPackageFragment) {
|
||||
// This is in a file class.
|
||||
// Get the name in a similar way to the compiler's ExternalPackageParentPatcherLowering
|
||||
// visitMemberAccess/generateOrGetFacadeClass.
|
||||
if (d is IrMemberWithContainerSource) {
|
||||
val containerSource = d.containerSource
|
||||
if (containerSource is FacadeClassSource) {
|
||||
val facadeClassName = containerSource.facadeClassName
|
||||
if (facadeClassName != null) {
|
||||
// This is a multifile-class
|
||||
return getUnknownBinaryLocation(facadeClassName.fqNameForTopLevelClassMaybeWithDollars.asString())
|
||||
} else {
|
||||
// This is a file-class
|
||||
return getUnknownBinaryLocation(containerSource.className.fqNameForTopLevelClassMaybeWithDollars.asString())
|
||||
}
|
||||
}
|
||||
val fqName = getFileClassFqName(d)
|
||||
if (fqName != null) {
|
||||
return getUnknownBinaryLocation(fqName.asString())
|
||||
}
|
||||
}
|
||||
return null
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
package com.github.codeql.utils.versions
|
||||
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.ir.declarations.IrDeclaration
|
||||
|
||||
fun getFileClassFqName(@Suppress("UNUSED_PARAMETER") d: IrDeclaration): FqName? {
|
||||
return null
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
package com.github.codeql.utils.versions
|
||||
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.ir.declarations.IrDeclaration
|
||||
import org.jetbrains.kotlin.ir.declarations.IrMemberWithContainerSource
|
||||
import org.jetbrains.kotlin.load.kotlin.FacadeClassSource
|
||||
|
||||
fun getFileClassFqName(d: IrDeclaration): FqName? {
|
||||
// d is in a file class.
|
||||
// Get the name in a similar way to the compiler's ExternalPackageParentPatcherLowering
|
||||
// visitMemberAccess/generateOrGetFacadeClass.
|
||||
if (d is IrMemberWithContainerSource) {
|
||||
val containerSource = d.containerSource
|
||||
if (containerSource is FacadeClassSource) {
|
||||
val facadeClassName = containerSource.facadeClassName
|
||||
if (facadeClassName != null) {
|
||||
// TODO: This is really a multifile-class rather than a file-class,
|
||||
// but for now we treat them the same.
|
||||
return facadeClassName.fqNameForTopLevelClassMaybeWithDollars
|
||||
} else {
|
||||
return containerSource.className.fqNameForTopLevelClassMaybeWithDollars
|
||||
}
|
||||
} else {
|
||||
return null
|
||||
}
|
||||
} else {
|
||||
return null
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user