Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit f0e2de1

Browse files
committed
Kotlin: Add file classes
Kotlin invents a class for each file that has a top-level functionp/property, so that Java can use them.
1 parent ed2c6e6 commit f0e2de1

9 files changed

Lines changed: 91 additions & 70 deletions

File tree

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

Lines changed: 46 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ class KotlinExtractorExtension(private val tests: List<String>) : IrGenerationEx
3333
trapDir.mkdirs()
3434
val srcDir = File(System.getenv("CODEQL_EXTRACTOR_JAVA_SOURCE_ARCHIVE_DIR").takeUnless { it.isNullOrEmpty() } ?: "kotlin-extractor/src")
3535
srcDir.mkdirs()
36-
moduleFragment.files.map { extractFile(logger, trapDir, srcDir, it) }
36+
moduleFragment.files.map { doFile(logger, trapDir, srcDir, it) }
3737
logger.printLimitedWarningCounts()
3838
// We don't want the compiler to continue and generate class
3939
// files etc, so we just exit when we are finished extracting.
@@ -149,7 +149,7 @@ class TrapWriter (
149149
}
150150
}
151151

152-
fun extractFile(logger: Logger, trapDir: File, srcDir: File, declaration: IrFile) {
152+
fun doFile(logger: Logger, trapDir: File, srcDir: File, declaration: IrFile) {
153153
val filePath = declaration.path
154154
val file = File(filePath)
155155
val fileLabel = "@\"$filePath;sourcefile\""
@@ -168,10 +168,7 @@ fun extractFile(logger: Logger, trapDir: File, srcDir: File, declaration: IrFile
168168
val id: Label<DbFile> = tw.getLabelFor(fileLabel)
169169
tw.writeFiles(id, filePath, basename, extension, 0)
170170
val fileExtractor = KotlinFileExtractor(logger, tw)
171-
val pkg = declaration.fqName.asString()
172-
val pkgId = fileExtractor.extractPackage(pkg)
173-
tw.writeCupackage(id, pkgId)
174-
declaration.declarations.map { fileExtractor.extractDeclaration(it, pkgId) }
171+
fileExtractor.extractFile(id, declaration)
175172
}
176173
}
177174

@@ -183,6 +180,47 @@ fun <T> fakeLabel(): Label<T> {
183180
}
184181

185182
class KotlinFileExtractor(val logger: Logger, val tw: TrapWriter) {
183+
fun extractFile(id: Label<DbFile>, f: IrFile) {
184+
val pkg = f.fqName.asString()
185+
val pkgId = extractPackage(pkg)
186+
tw.writeCupackage(id, pkgId)
187+
// TODO: This shouldn't really exist if there is nothing to go on it
188+
val fileClass = extractFileClass(f)
189+
f.declarations.map { extractDeclaration(it, fileClass) }
190+
}
191+
192+
fun extractFileClass(f: IrFile): Label<out DbClass> {
193+
val fileName = f.fileEntry.name
194+
val pkg = f.fqName.asString()
195+
val defaultName = fileName.replaceFirst(Regex(""".*[/\\]"""), "").replaceFirst(Regex("""\.kt$"""), "").replaceFirstChar({ it.uppercase() }) + "Kt"
196+
var jvmName = defaultName
197+
for(a: IrConstructorCall in f.annotations) {
198+
val t = a.type
199+
if(t is IrSimpleType && a.valueArgumentsCount == 1) {
200+
val owner = t.classifier.owner
201+
val v = a.getValueArgument(0)
202+
if(owner is IrClass) {
203+
val aPkg = owner.packageFqName?.asString()
204+
val name = owner.name.asString()
205+
if(aPkg == "kotlin.jvm" && name == "JvmName" && v is IrConst<*>) {
206+
val value = v.value
207+
if(value is String) {
208+
jvmName = value
209+
}
210+
}
211+
}
212+
}
213+
}
214+
val qualClassName = if (pkg.isEmpty()) jvmName else "$pkg.$jvmName"
215+
val label = "@\"class;$qualClassName\""
216+
val id: Label<DbClass> = tw.getLabelFor(label)
217+
val locId = tw.getLocation(-1, -1) // TODO: This should be the whole file
218+
val pkgId = extractPackage(pkg)
219+
tw.writeClasses(id, jvmName, pkgId, id)
220+
tw.writeHasLocation(id, locId)
221+
return id
222+
}
223+
186224
fun usePackage(pkg: String): Label<out DbPackage> {
187225
return extractPackage(pkg)
188226
}
@@ -195,7 +233,7 @@ class KotlinFileExtractor(val logger: Logger, val tw: TrapWriter) {
195233
return id
196234
}
197235

198-
fun extractDeclaration(declaration: IrDeclaration, parentid: Label<out DbPackage_or_reftype>) {
236+
fun extractDeclaration(declaration: IrDeclaration, parentid: Label<out DbReftype>) {
199237
when (declaration) {
200238
is IrClass -> extractClass(declaration)
201239
is IrFunction -> extractFunction(declaration, parentid)
@@ -325,7 +363,7 @@ class KotlinFileExtractor(val logger: Logger, val tw: TrapWriter) {
325363
tw.writeParamName(id, vp.name.asString())
326364
}
327365

328-
fun extractFunction(f: IrFunction, parentid: Label<out DbPackage_or_reftype>) {
366+
fun extractFunction(f: IrFunction, parentid: Label<out DbReftype>) {
329367
val id = useFunction(f)
330368
val locId = tw.getLocation(f.startOffset, f.endOffset)
331369
val signature = "TODO"

java/ql/lib/config/semmlecode.dbscheme

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -339,7 +339,7 @@ methods(
339339
string nodeName: string ref,
340340
string signature: string ref,
341341
int typeid: @type ref,
342-
int parentid: @package_or_reftype ref,
342+
int parentid: @reftype ref,
343343
int sourceid: @method ref
344344
);
345345

java/ql/test/kotlin/library-tests/classes/classes.expected

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
| classes.kt:0:0:0:0 | Any |
2+
| classes.kt:0:0:0:0 | ClassesKt |
23
| classes.kt:0:0:0:0 | Unit |
34
| classes.kt:2:1:2:18 | ClassOne |
45
| classes.kt:4:1:6:1 | ClassTwo |

java/ql/test/kotlin/library-tests/exprs/exprs.expected

Lines changed: 21 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -11,64 +11,33 @@
1111
| exprs.kt:7:14:7:14 | x |
1212
| exprs.kt:7:14:7:18 | ... % ... |
1313
| exprs.kt:7:18:7:18 | y |
14-
| exprs.kt:8:14:8:14 | x |
15-
| exprs.kt:8:14:8:20 | (no string representation) |
16-
| exprs.kt:8:20:8:20 | y |
17-
| exprs.kt:9:14:9:14 | x |
18-
| exprs.kt:9:14:9:20 | (no string representation) |
19-
| exprs.kt:9:20:9:20 | y |
20-
| exprs.kt:10:14:10:14 | x |
21-
| exprs.kt:10:14:10:21 | (no string representation) |
22-
| exprs.kt:10:21:10:21 | y |
23-
| exprs.kt:11:14:11:14 | x |
24-
| exprs.kt:11:14:11:20 | (no string representation) |
25-
| exprs.kt:11:20:11:20 | y |
26-
| exprs.kt:12:15:12:15 | x |
27-
| exprs.kt:12:15:12:20 | (no string representation) |
28-
| exprs.kt:12:20:12:20 | y |
29-
| exprs.kt:13:15:13:15 | x |
30-
| exprs.kt:13:15:13:21 | (no string representation) |
31-
| exprs.kt:13:21:13:21 | y |
32-
| exprs.kt:14:15:14:15 | x |
33-
| exprs.kt:14:17:14:21 | (no string representation) |
34-
| exprs.kt:15:15:15:15 | x |
35-
| exprs.kt:15:15:15:20 | ... == ... |
36-
| exprs.kt:15:20:15:20 | y |
37-
| exprs.kt:16:15:16:15 | x |
38-
| exprs.kt:16:15:16:20 | ... != ... |
39-
| exprs.kt:16:15:16:20 | ... != ... |
40-
| exprs.kt:16:20:16:20 | y |
41-
| exprs.kt:17:15:17:15 | x |
42-
| exprs.kt:17:15:17:19 | ... < ... |
43-
| exprs.kt:17:19:17:19 | y |
4414
| exprs.kt:18:15:18:15 | x |
45-
| exprs.kt:18:15:18:20 | ... <= ... |
15+
| exprs.kt:18:15:18:20 | ... == ... |
4616
| exprs.kt:18:20:18:20 | y |
4717
| exprs.kt:19:15:19:15 | x |
48-
| exprs.kt:19:15:19:19 | ... > ... |
49-
| exprs.kt:19:19:19:19 | y |
18+
| exprs.kt:19:15:19:20 | ... != ... |
19+
| exprs.kt:19:15:19:20 | ... != ... |
20+
| exprs.kt:19:20:19:20 | y |
5021
| exprs.kt:20:15:20:15 | x |
51-
| exprs.kt:20:15:20:20 | ... >= ... |
52-
| exprs.kt:20:20:20:20 | y |
22+
| exprs.kt:20:15:20:19 | ... < ... |
23+
| exprs.kt:20:19:20:19 | y |
5324
| exprs.kt:21:15:21:15 | x |
54-
| exprs.kt:21:15:21:25 | (no string representation) |
55-
| exprs.kt:21:20:21:20 | x |
56-
| exprs.kt:21:20:21:25 | (no string representation) |
57-
| exprs.kt:21:25:21:25 | y |
25+
| exprs.kt:21:15:21:20 | ... <= ... |
26+
| exprs.kt:21:20:21:20 | y |
5827
| exprs.kt:22:15:22:15 | x |
59-
| exprs.kt:22:15:22:26 | (no string representation) |
60-
| exprs.kt:22:15:22:26 | (no string representation) |
61-
| exprs.kt:22:21:22:21 | x |
62-
| exprs.kt:22:21:22:26 | (no string representation) |
63-
| exprs.kt:22:26:22:26 | y |
64-
| exprs.kt:23:14:23:17 | true |
65-
| exprs.kt:24:14:24:18 | false |
66-
| exprs.kt:31:13:31:15 | x |
67-
| exprs.kt:32:16:32:25 | string lit |
68-
| exprs.kt:33:25:33:37 | string " lit |
69-
| exprs.kt:37:12:37:14 | 123 |
70-
| exprs.kt:37:12:37:20 | ... + ... |
71-
| exprs.kt:37:18:37:20 | 456 |
28+
| exprs.kt:22:15:22:19 | ... > ... |
29+
| exprs.kt:22:19:22:19 | y |
30+
| exprs.kt:23:15:23:15 | x |
31+
| exprs.kt:23:15:23:20 | ... >= ... |
32+
| exprs.kt:23:20:23:20 | y |
33+
| exprs.kt:29:14:29:17 | true |
34+
| exprs.kt:30:14:30:18 | false |
35+
| exprs.kt:37:13:37:15 | x |
36+
| exprs.kt:38:16:38:25 | string lit |
37+
| exprs.kt:39:25:39:37 | string " lit |
38+
| exprs.kt:43:12:43:14 | 123 |
39+
| exprs.kt:43:12:43:20 | ... + ... |
40+
| exprs.kt:43:18:43:20 | 456 |
7241
| file://:0:0:0:0 | b1 |
7342
| file://:0:0:0:0 | b2 |
7443
| file://:0:0:0:0 | b6 |
@@ -80,20 +49,11 @@
8049
| file://:0:0:0:0 | i3 |
8150
| file://:0:0:0:0 | i4 |
8251
| file://:0:0:0:0 | i5 |
83-
| file://:0:0:0:0 | i6 |
84-
| file://:0:0:0:0 | i7 |
85-
| file://:0:0:0:0 | i8 |
86-
| file://:0:0:0:0 | i9 |
87-
| file://:0:0:0:0 | i10 |
88-
| file://:0:0:0:0 | i11 |
89-
| file://:0:0:0:0 | i12 |
9052
| file://:0:0:0:0 | i13 |
9153
| file://:0:0:0:0 | i14 |
9254
| file://:0:0:0:0 | i15 |
9355
| file://:0:0:0:0 | i16 |
9456
| file://:0:0:0:0 | i17 |
9557
| file://:0:0:0:0 | i18 |
96-
| file://:0:0:0:0 | i20 |
97-
| file://:0:0:0:0 | i21 |
9858
| file://:0:0:0:0 | str |
9959
| file://:0:0:0:0 | strWithQuote |

java/ql/test/kotlin/library-tests/exprs/exprs.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,21 +5,27 @@ fun topLevelMethod(x: Int, y: Int): Int {
55
val i3 = x - y
66
val i4 = x / y
77
val i5 = x % y
8+
/*
9+
TODO
810
val i6 = x shl y
911
val i7 = x shr y
1012
val i8 = x ushr y
1113
val i9 = x and y
1214
val i10 = x or y
1315
val i11 = x xor y
1416
val i12 = x.inv()
17+
*/
1518
val i13 = x == y
1619
val i14 = x != y
1720
val i15 = x < y
1821
val i16 = x <= y
1922
val i17 = x > y
2023
val i18 = x >= y
24+
/*
25+
TODO
2126
val i20 = x in x .. y
2227
val i21 = x !in x .. y
28+
*/
2329
val b1 = true
2430
val b2 = false
2531
/*

java/ql/test/kotlin/library-tests/methods/methods.expected

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
| methods2.kt:0:0:0:0 | hashCode |
66
| methods2.kt:0:0:0:0 | toString |
77
| methods2.kt:0:0:0:0 | toString |
8+
| methods2.kt:4:1:5:1 | fooBarTopLevelMethod |
89
| methods2.kt:7:1:10:1 | <init> |
910
| methods2.kt:7:1:10:1 | equals |
1011
| methods2.kt:7:1:10:1 | hashCode |
@@ -17,6 +18,7 @@
1718
| methods.kt:0:0:0:0 | hashCode |
1819
| methods.kt:0:0:0:0 | toString |
1920
| methods.kt:0:0:0:0 | toString |
21+
| methods.kt:2:1:3:1 | topLevelMethod |
2022
| methods.kt:5:1:13:1 | <init> |
2123
| methods.kt:5:1:13:1 | equals |
2224
| methods.kt:5:1:13:1 | hashCode |
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,10 @@
11
| file1.kt:0:0:0:0 | Any |
2+
| file1.kt:0:0:0:0 | File1Kt |
23
| file1.kt:2:1:2:16 | Class1 |
34
| file2.kt:0:0:0:0 | Any |
5+
| file2.kt:0:0:0:0 | File2Kt |
46
| file2.kt:2:1:2:16 | Class2 |
7+
| file3.kt:0:0:0:0 | Any |
8+
| file3.kt:0:0:0:0 | MyJvmName |
9+
| file3.kt:0:0:0:0 | Unit |
10+
| file3.kt:3:1:3:16 | Class3 |
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
@file:JvmName("MyJvmName")
2+
3+
class Class3 { }
4+
5+
fun fun3() {
6+
}
7+

java/ql/test/kotlin/library-tests/types/types.expected

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,5 @@
88
| file://:0:0:0:0 | short | PrimitiveType |
99
| file://:0:0:0:0 | string | ??? |
1010
| types.kt:0:0:0:0 | Any | Class |
11+
| types.kt:0:0:0:0 | TypesKt | Class |
1112
| types.kt:2:1:33:1 | Foo | Class |

0 commit comments

Comments
 (0)