mirror of
https://github.com/github/codeql.git
synced 2025-12-24 04:36:35 +01:00
Kotlin: Add file classes
Kotlin invents a class for each file that has a top-level functionp/property, so that Java can use them.
This commit is contained in:
@@ -33,7 +33,7 @@ class KotlinExtractorExtension(private val tests: List<String>) : IrGenerationEx
|
|||||||
trapDir.mkdirs()
|
trapDir.mkdirs()
|
||||||
val srcDir = File(System.getenv("CODEQL_EXTRACTOR_JAVA_SOURCE_ARCHIVE_DIR").takeUnless { it.isNullOrEmpty() } ?: "kotlin-extractor/src")
|
val srcDir = File(System.getenv("CODEQL_EXTRACTOR_JAVA_SOURCE_ARCHIVE_DIR").takeUnless { it.isNullOrEmpty() } ?: "kotlin-extractor/src")
|
||||||
srcDir.mkdirs()
|
srcDir.mkdirs()
|
||||||
moduleFragment.files.map { extractFile(logger, trapDir, srcDir, it) }
|
moduleFragment.files.map { doFile(logger, trapDir, srcDir, it) }
|
||||||
logger.printLimitedWarningCounts()
|
logger.printLimitedWarningCounts()
|
||||||
// We don't want the compiler to continue and generate class
|
// We don't want the compiler to continue and generate class
|
||||||
// files etc, so we just exit when we are finished extracting.
|
// files etc, so we just exit when we are finished extracting.
|
||||||
@@ -149,7 +149,7 @@ class TrapWriter (
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun extractFile(logger: Logger, trapDir: File, srcDir: File, declaration: IrFile) {
|
fun doFile(logger: Logger, trapDir: File, srcDir: File, declaration: IrFile) {
|
||||||
val filePath = declaration.path
|
val filePath = declaration.path
|
||||||
val file = File(filePath)
|
val file = File(filePath)
|
||||||
val fileLabel = "@\"$filePath;sourcefile\""
|
val fileLabel = "@\"$filePath;sourcefile\""
|
||||||
@@ -168,10 +168,7 @@ fun extractFile(logger: Logger, trapDir: File, srcDir: File, declaration: IrFile
|
|||||||
val id: Label<DbFile> = tw.getLabelFor(fileLabel)
|
val id: Label<DbFile> = tw.getLabelFor(fileLabel)
|
||||||
tw.writeFiles(id, filePath, basename, extension, 0)
|
tw.writeFiles(id, filePath, basename, extension, 0)
|
||||||
val fileExtractor = KotlinFileExtractor(logger, tw)
|
val fileExtractor = KotlinFileExtractor(logger, tw)
|
||||||
val pkg = declaration.fqName.asString()
|
fileExtractor.extractFile(id, declaration)
|
||||||
val pkgId = fileExtractor.extractPackage(pkg)
|
|
||||||
tw.writeCupackage(id, pkgId)
|
|
||||||
declaration.declarations.map { fileExtractor.extractDeclaration(it, pkgId) }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -183,6 +180,47 @@ fun <T> fakeLabel(): Label<T> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class KotlinFileExtractor(val logger: Logger, val tw: TrapWriter) {
|
class KotlinFileExtractor(val logger: Logger, val tw: TrapWriter) {
|
||||||
|
fun extractFile(id: Label<DbFile>, f: IrFile) {
|
||||||
|
val pkg = f.fqName.asString()
|
||||||
|
val pkgId = extractPackage(pkg)
|
||||||
|
tw.writeCupackage(id, pkgId)
|
||||||
|
// TODO: This shouldn't really exist if there is nothing to go on it
|
||||||
|
val fileClass = extractFileClass(f)
|
||||||
|
f.declarations.map { extractDeclaration(it, fileClass) }
|
||||||
|
}
|
||||||
|
|
||||||
|
fun extractFileClass(f: IrFile): Label<out DbClass> {
|
||||||
|
val fileName = f.fileEntry.name
|
||||||
|
val pkg = f.fqName.asString()
|
||||||
|
val defaultName = fileName.replaceFirst(Regex(""".*[/\\]"""), "").replaceFirst(Regex("""\.kt$"""), "").replaceFirstChar({ it.uppercase() }) + "Kt"
|
||||||
|
var jvmName = defaultName
|
||||||
|
for(a: IrConstructorCall in f.annotations) {
|
||||||
|
val t = a.type
|
||||||
|
if(t is IrSimpleType && a.valueArgumentsCount == 1) {
|
||||||
|
val owner = t.classifier.owner
|
||||||
|
val v = a.getValueArgument(0)
|
||||||
|
if(owner is IrClass) {
|
||||||
|
val aPkg = owner.packageFqName?.asString()
|
||||||
|
val name = owner.name.asString()
|
||||||
|
if(aPkg == "kotlin.jvm" && name == "JvmName" && v is IrConst<*>) {
|
||||||
|
val value = v.value
|
||||||
|
if(value is String) {
|
||||||
|
jvmName = value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
val qualClassName = if (pkg.isEmpty()) jvmName else "$pkg.$jvmName"
|
||||||
|
val label = "@\"class;$qualClassName\""
|
||||||
|
val id: Label<DbClass> = tw.getLabelFor(label)
|
||||||
|
val locId = tw.getLocation(-1, -1) // TODO: This should be the whole file
|
||||||
|
val pkgId = extractPackage(pkg)
|
||||||
|
tw.writeClasses(id, jvmName, pkgId, id)
|
||||||
|
tw.writeHasLocation(id, locId)
|
||||||
|
return id
|
||||||
|
}
|
||||||
|
|
||||||
fun usePackage(pkg: String): Label<out DbPackage> {
|
fun usePackage(pkg: String): Label<out DbPackage> {
|
||||||
return extractPackage(pkg)
|
return extractPackage(pkg)
|
||||||
}
|
}
|
||||||
@@ -195,7 +233,7 @@ class KotlinFileExtractor(val logger: Logger, val tw: TrapWriter) {
|
|||||||
return id
|
return id
|
||||||
}
|
}
|
||||||
|
|
||||||
fun extractDeclaration(declaration: IrDeclaration, parentid: Label<out DbPackage_or_reftype>) {
|
fun extractDeclaration(declaration: IrDeclaration, parentid: Label<out DbReftype>) {
|
||||||
when (declaration) {
|
when (declaration) {
|
||||||
is IrClass -> extractClass(declaration)
|
is IrClass -> extractClass(declaration)
|
||||||
is IrFunction -> extractFunction(declaration, parentid)
|
is IrFunction -> extractFunction(declaration, parentid)
|
||||||
@@ -325,7 +363,7 @@ class KotlinFileExtractor(val logger: Logger, val tw: TrapWriter) {
|
|||||||
tw.writeParamName(id, vp.name.asString())
|
tw.writeParamName(id, vp.name.asString())
|
||||||
}
|
}
|
||||||
|
|
||||||
fun extractFunction(f: IrFunction, parentid: Label<out DbPackage_or_reftype>) {
|
fun extractFunction(f: IrFunction, parentid: Label<out DbReftype>) {
|
||||||
val id = useFunction(f)
|
val id = useFunction(f)
|
||||||
val locId = tw.getLocation(f.startOffset, f.endOffset)
|
val locId = tw.getLocation(f.startOffset, f.endOffset)
|
||||||
val signature = "TODO"
|
val signature = "TODO"
|
||||||
|
|||||||
@@ -339,7 +339,7 @@ methods(
|
|||||||
string nodeName: string ref,
|
string nodeName: string ref,
|
||||||
string signature: string ref,
|
string signature: string ref,
|
||||||
int typeid: @type ref,
|
int typeid: @type ref,
|
||||||
int parentid: @package_or_reftype ref,
|
int parentid: @reftype ref,
|
||||||
int sourceid: @method ref
|
int sourceid: @method ref
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
| classes.kt:0:0:0:0 | Any |
|
| classes.kt:0:0:0:0 | Any |
|
||||||
|
| classes.kt:0:0:0:0 | ClassesKt |
|
||||||
| classes.kt:0:0:0:0 | Unit |
|
| classes.kt:0:0:0:0 | Unit |
|
||||||
| classes.kt:2:1:2:18 | ClassOne |
|
| classes.kt:2:1:2:18 | ClassOne |
|
||||||
| classes.kt:4:1:6:1 | ClassTwo |
|
| classes.kt:4:1:6:1 | ClassTwo |
|
||||||
|
|||||||
@@ -11,64 +11,33 @@
|
|||||||
| exprs.kt:7:14:7:14 | x |
|
| exprs.kt:7:14:7:14 | x |
|
||||||
| exprs.kt:7:14:7:18 | ... % ... |
|
| exprs.kt:7:14:7:18 | ... % ... |
|
||||||
| exprs.kt:7:18:7:18 | y |
|
| exprs.kt:7:18:7:18 | y |
|
||||||
| exprs.kt:8:14:8:14 | x |
|
|
||||||
| exprs.kt:8:14:8:20 | (no string representation) |
|
|
||||||
| exprs.kt:8:20:8:20 | y |
|
|
||||||
| exprs.kt:9:14:9:14 | x |
|
|
||||||
| exprs.kt:9:14:9:20 | (no string representation) |
|
|
||||||
| exprs.kt:9:20:9:20 | y |
|
|
||||||
| exprs.kt:10:14:10:14 | x |
|
|
||||||
| exprs.kt:10:14:10:21 | (no string representation) |
|
|
||||||
| exprs.kt:10:21:10:21 | y |
|
|
||||||
| exprs.kt:11:14:11:14 | x |
|
|
||||||
| exprs.kt:11:14:11:20 | (no string representation) |
|
|
||||||
| exprs.kt:11:20:11:20 | y |
|
|
||||||
| exprs.kt:12:15:12:15 | x |
|
|
||||||
| exprs.kt:12:15:12:20 | (no string representation) |
|
|
||||||
| exprs.kt:12:20:12:20 | y |
|
|
||||||
| exprs.kt:13:15:13:15 | x |
|
|
||||||
| exprs.kt:13:15:13:21 | (no string representation) |
|
|
||||||
| exprs.kt:13:21:13:21 | y |
|
|
||||||
| exprs.kt:14:15:14:15 | x |
|
|
||||||
| exprs.kt:14:17:14:21 | (no string representation) |
|
|
||||||
| exprs.kt:15:15:15:15 | x |
|
|
||||||
| exprs.kt:15:15:15:20 | ... == ... |
|
|
||||||
| exprs.kt:15:20:15:20 | y |
|
|
||||||
| exprs.kt:16:15:16:15 | x |
|
|
||||||
| exprs.kt:16:15:16:20 | ... != ... |
|
|
||||||
| exprs.kt:16:15:16:20 | ... != ... |
|
|
||||||
| exprs.kt:16:20:16:20 | y |
|
|
||||||
| exprs.kt:17:15:17:15 | x |
|
|
||||||
| exprs.kt:17:15:17:19 | ... < ... |
|
|
||||||
| exprs.kt:17:19:17:19 | y |
|
|
||||||
| exprs.kt:18:15:18:15 | x |
|
| exprs.kt:18:15:18:15 | x |
|
||||||
| exprs.kt:18:15:18:20 | ... <= ... |
|
| exprs.kt:18:15:18:20 | ... == ... |
|
||||||
| exprs.kt:18:20:18:20 | y |
|
| exprs.kt:18:20:18:20 | y |
|
||||||
| exprs.kt:19:15:19:15 | x |
|
| exprs.kt:19:15:19:15 | x |
|
||||||
| exprs.kt:19:15:19:19 | ... > ... |
|
| exprs.kt:19:15:19:20 | ... != ... |
|
||||||
| exprs.kt:19:19:19:19 | y |
|
| exprs.kt:19:15:19:20 | ... != ... |
|
||||||
|
| exprs.kt:19:20:19:20 | y |
|
||||||
| exprs.kt:20:15:20:15 | x |
|
| exprs.kt:20:15:20:15 | x |
|
||||||
| exprs.kt:20:15:20:20 | ... >= ... |
|
| exprs.kt:20:15:20:19 | ... < ... |
|
||||||
| exprs.kt:20:20:20:20 | y |
|
| exprs.kt:20:19:20:19 | y |
|
||||||
| exprs.kt:21:15:21:15 | x |
|
| exprs.kt:21:15:21:15 | x |
|
||||||
| exprs.kt:21:15:21:25 | (no string representation) |
|
| exprs.kt:21:15:21:20 | ... <= ... |
|
||||||
| exprs.kt:21:20:21:20 | x |
|
| exprs.kt:21:20:21:20 | y |
|
||||||
| exprs.kt:21:20:21:25 | (no string representation) |
|
|
||||||
| exprs.kt:21:25:21:25 | y |
|
|
||||||
| exprs.kt:22:15:22:15 | x |
|
| exprs.kt:22:15:22:15 | x |
|
||||||
| exprs.kt:22:15:22:26 | (no string representation) |
|
| exprs.kt:22:15:22:19 | ... > ... |
|
||||||
| exprs.kt:22:15:22:26 | (no string representation) |
|
| exprs.kt:22:19:22:19 | y |
|
||||||
| exprs.kt:22:21:22:21 | x |
|
| exprs.kt:23:15:23:15 | x |
|
||||||
| exprs.kt:22:21:22:26 | (no string representation) |
|
| exprs.kt:23:15:23:20 | ... >= ... |
|
||||||
| exprs.kt:22:26:22:26 | y |
|
| exprs.kt:23:20:23:20 | y |
|
||||||
| exprs.kt:23:14:23:17 | true |
|
| exprs.kt:29:14:29:17 | true |
|
||||||
| exprs.kt:24:14:24:18 | false |
|
| exprs.kt:30:14:30:18 | false |
|
||||||
| exprs.kt:31:13:31:15 | x |
|
| exprs.kt:37:13:37:15 | x |
|
||||||
| exprs.kt:32:16:32:25 | string lit |
|
| exprs.kt:38:16:38:25 | string lit |
|
||||||
| exprs.kt:33:25:33:37 | string " lit |
|
| exprs.kt:39:25:39:37 | string " lit |
|
||||||
| exprs.kt:37:12:37:14 | 123 |
|
| exprs.kt:43:12:43:14 | 123 |
|
||||||
| exprs.kt:37:12:37:20 | ... + ... |
|
| exprs.kt:43:12:43:20 | ... + ... |
|
||||||
| exprs.kt:37:18:37:20 | 456 |
|
| exprs.kt:43:18:43:20 | 456 |
|
||||||
| file://:0:0:0:0 | b1 |
|
| file://:0:0:0:0 | b1 |
|
||||||
| file://:0:0:0:0 | b2 |
|
| file://:0:0:0:0 | b2 |
|
||||||
| file://:0:0:0:0 | b6 |
|
| file://:0:0:0:0 | b6 |
|
||||||
@@ -80,20 +49,11 @@
|
|||||||
| file://:0:0:0:0 | i3 |
|
| file://:0:0:0:0 | i3 |
|
||||||
| file://:0:0:0:0 | i4 |
|
| file://:0:0:0:0 | i4 |
|
||||||
| file://:0:0:0:0 | i5 |
|
| file://:0:0:0:0 | i5 |
|
||||||
| file://:0:0:0:0 | i6 |
|
|
||||||
| file://:0:0:0:0 | i7 |
|
|
||||||
| file://:0:0:0:0 | i8 |
|
|
||||||
| file://:0:0:0:0 | i9 |
|
|
||||||
| file://:0:0:0:0 | i10 |
|
|
||||||
| file://:0:0:0:0 | i11 |
|
|
||||||
| file://:0:0:0:0 | i12 |
|
|
||||||
| file://:0:0:0:0 | i13 |
|
| file://:0:0:0:0 | i13 |
|
||||||
| file://:0:0:0:0 | i14 |
|
| file://:0:0:0:0 | i14 |
|
||||||
| file://:0:0:0:0 | i15 |
|
| file://:0:0:0:0 | i15 |
|
||||||
| file://:0:0:0:0 | i16 |
|
| file://:0:0:0:0 | i16 |
|
||||||
| file://:0:0:0:0 | i17 |
|
| file://:0:0:0:0 | i17 |
|
||||||
| file://:0:0:0:0 | i18 |
|
| file://:0:0:0:0 | i18 |
|
||||||
| file://:0:0:0:0 | i20 |
|
|
||||||
| file://:0:0:0:0 | i21 |
|
|
||||||
| file://:0:0:0:0 | str |
|
| file://:0:0:0:0 | str |
|
||||||
| file://:0:0:0:0 | strWithQuote |
|
| file://:0:0:0:0 | strWithQuote |
|
||||||
|
|||||||
@@ -5,6 +5,8 @@ fun topLevelMethod(x: Int, y: Int): Int {
|
|||||||
val i3 = x - y
|
val i3 = x - y
|
||||||
val i4 = x / y
|
val i4 = x / y
|
||||||
val i5 = x % y
|
val i5 = x % y
|
||||||
|
/*
|
||||||
|
TODO
|
||||||
val i6 = x shl y
|
val i6 = x shl y
|
||||||
val i7 = x shr y
|
val i7 = x shr y
|
||||||
val i8 = x ushr y
|
val i8 = x ushr y
|
||||||
@@ -12,14 +14,18 @@ fun topLevelMethod(x: Int, y: Int): Int {
|
|||||||
val i10 = x or y
|
val i10 = x or y
|
||||||
val i11 = x xor y
|
val i11 = x xor y
|
||||||
val i12 = x.inv()
|
val i12 = x.inv()
|
||||||
|
*/
|
||||||
val i13 = x == y
|
val i13 = x == y
|
||||||
val i14 = x != y
|
val i14 = x != y
|
||||||
val i15 = x < y
|
val i15 = x < y
|
||||||
val i16 = x <= y
|
val i16 = x <= y
|
||||||
val i17 = x > y
|
val i17 = x > y
|
||||||
val i18 = x >= y
|
val i18 = x >= y
|
||||||
|
/*
|
||||||
|
TODO
|
||||||
val i20 = x in x .. y
|
val i20 = x in x .. y
|
||||||
val i21 = x !in x .. y
|
val i21 = x !in x .. y
|
||||||
|
*/
|
||||||
val b1 = true
|
val b1 = true
|
||||||
val b2 = false
|
val b2 = false
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
| methods2.kt:0:0:0:0 | hashCode |
|
| methods2.kt:0:0:0:0 | hashCode |
|
||||||
| methods2.kt:0:0:0:0 | toString |
|
| methods2.kt:0:0:0:0 | toString |
|
||||||
| methods2.kt:0:0:0:0 | toString |
|
| methods2.kt:0:0:0:0 | toString |
|
||||||
|
| methods2.kt:4:1:5:1 | fooBarTopLevelMethod |
|
||||||
| methods2.kt:7:1:10:1 | <init> |
|
| methods2.kt:7:1:10:1 | <init> |
|
||||||
| methods2.kt:7:1:10:1 | equals |
|
| methods2.kt:7:1:10:1 | equals |
|
||||||
| methods2.kt:7:1:10:1 | hashCode |
|
| methods2.kt:7:1:10:1 | hashCode |
|
||||||
@@ -17,6 +18,7 @@
|
|||||||
| methods.kt:0:0:0:0 | hashCode |
|
| methods.kt:0:0:0:0 | hashCode |
|
||||||
| methods.kt:0:0:0:0 | toString |
|
| methods.kt:0:0:0:0 | toString |
|
||||||
| methods.kt:0:0:0:0 | toString |
|
| methods.kt:0:0:0:0 | toString |
|
||||||
|
| methods.kt:2:1:3:1 | topLevelMethod |
|
||||||
| methods.kt:5:1:13:1 | <init> |
|
| methods.kt:5:1:13:1 | <init> |
|
||||||
| methods.kt:5:1:13:1 | equals |
|
| methods.kt:5:1:13:1 | equals |
|
||||||
| methods.kt:5:1:13:1 | hashCode |
|
| methods.kt:5:1:13:1 | hashCode |
|
||||||
|
|||||||
@@ -1,4 +1,10 @@
|
|||||||
| file1.kt:0:0:0:0 | Any |
|
| file1.kt:0:0:0:0 | Any |
|
||||||
|
| file1.kt:0:0:0:0 | File1Kt |
|
||||||
| file1.kt:2:1:2:16 | Class1 |
|
| file1.kt:2:1:2:16 | Class1 |
|
||||||
| file2.kt:0:0:0:0 | Any |
|
| file2.kt:0:0:0:0 | Any |
|
||||||
|
| file2.kt:0:0:0:0 | File2Kt |
|
||||||
| file2.kt:2:1:2:16 | Class2 |
|
| file2.kt:2:1:2:16 | Class2 |
|
||||||
|
| file3.kt:0:0:0:0 | Any |
|
||||||
|
| file3.kt:0:0:0:0 | MyJvmName |
|
||||||
|
| file3.kt:0:0:0:0 | Unit |
|
||||||
|
| file3.kt:3:1:3:16 | Class3 |
|
||||||
|
|||||||
@@ -0,0 +1,7 @@
|
|||||||
|
@file:JvmName("MyJvmName")
|
||||||
|
|
||||||
|
class Class3 { }
|
||||||
|
|
||||||
|
fun fun3() {
|
||||||
|
}
|
||||||
|
|
||||||
@@ -8,4 +8,5 @@
|
|||||||
| file://:0:0:0:0 | short | PrimitiveType |
|
| file://:0:0:0:0 | short | PrimitiveType |
|
||||||
| file://:0:0:0:0 | string | ??? |
|
| file://:0:0:0:0 | string | ??? |
|
||||||
| types.kt:0:0:0:0 | Any | Class |
|
| types.kt:0:0:0:0 | Any | Class |
|
||||||
|
| types.kt:0:0:0:0 | TypesKt | Class |
|
||||||
| types.kt:2:1:33:1 | Foo | Class |
|
| types.kt:2:1:33:1 | Foo | Class |
|
||||||
|
|||||||
Reference in New Issue
Block a user