Skip to content

Commit cfde0a1

Browse files
authored
Merge pull request #9109 from igfoo/igfoo/kotlin_merge
Initial Kotlin support
2 parents 5be3020 + c0a755e commit cfde0a1

File tree

539 files changed

+59455
-11247
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

539 files changed

+59455
-11247
lines changed

CODEOWNERS

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
/python/ @github/codeql-python
66
/ruby/ @github/codeql-ruby
77
/swift/ @github/codeql-c
8+
/java/kotlin-extractor/ @github/codeql-kotlin
9+
/java/kotlin-explorer/ @github/codeql-kotlin
810

911
# ML-powered queries
1012
/javascript/ql/experimental/adaptivethreatmodeling/ @github/codeql-ml-powered-queries-reviewers

csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/SignAnalysisCommon.qll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ private predicate unknownSign(Expr e) {
4949
or
5050
exists(LongLiteral lit | lit = e and not exists(lit.getValue().toFloat()))
5151
or
52-
exists(CastExpr cast, Type fromtyp |
52+
exists(CastingExpr cast, Type fromtyp |
5353
cast = e and
5454
fromtyp = cast.getSourceType() and
5555
not fromtyp instanceof NumericOrCharType

csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/SignAnalysisSpecific.qll

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ module Private {
2929

3030
class CastExpr = RU::ExprNode::CastExpr;
3131

32+
class CastingExpr = CastExpr;
33+
3234
class Type = CS::Type;
3335

3436
class Expr = CS::ControlFlow::Nodes::ExprNode;

java/kotlin-explorer/.gitignore

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
.classpath
2+
.gradle
3+
.idea
4+
.project
5+
.settings
6+
bin/
7+
build/
8+
gradle/
9+
gradlew
10+
gradlew.bat

java/kotlin-explorer/README

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
2+
This shows what is encoded in the kotlin.Metadata section shown in the
3+
output of `javap -v SomeKotlinClass`.
4+
5+
It is not currently able to extract the information from .class files
6+
itself; the values are hard coded in src/main/kotlin/Explorer.kt
7+
8+
Run `gradle run` in this directory to run it.
9+

java/kotlin-explorer/build.gradle

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
plugins {
2+
id 'org.jetbrains.kotlin.jvm' version "${kotlinVersion}"
3+
id 'org.jetbrains.dokka' version '1.4.32'
4+
id "com.vanniktech.maven.publish" version '0.15.1'
5+
id 'application'
6+
}
7+
8+
group 'com.github.codeql'
9+
version '0.0.1'
10+
11+
dependencies {
12+
implementation "org.jetbrains.kotlin:kotlin-stdlib"
13+
implementation "org.jetbrains.kotlinx:kotlinx-metadata-jvm:0.3.0"
14+
}
15+
16+
repositories {
17+
mavenCentral()
18+
}
19+
20+
tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach {
21+
kotlinOptions {
22+
jvmTarget = "1.8"
23+
}
24+
}
25+
26+
application {
27+
mainClass = 'com.github.codeql.ExplorerKt'
28+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
kotlin.code.style=official
2+
kotlinVersion=1.5.21
3+
4+
GROUP=com.github.codeql
5+
VERSION_NAME=0.0.1
6+
POM_DESCRIPTION=CodeQL Kotlin explorer
7+

java/kotlin-explorer/settings.gradle

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
pluginManagement {
2+
repositories {
3+
mavenCentral()
4+
gradlePluginPortal()
5+
}
6+
}
7+
8+
rootProject.name = 'codeql-kotlin-explorer'
Lines changed: 217 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,217 @@
1+
package com.github.codeql
2+
import kotlinx.metadata.internal.metadata.jvm.deserialization.JvmMetadataVersion
3+
import kotlinx.metadata.jvm.*
4+
import kotlinx.metadata.*
5+
6+
fun main(args : Array<String>) {
7+
/*
8+
Values from `javap -v` on TestKt.class from:
9+
10+
class MyClass {}
11+
12+
class MyParamClass<T> {}
13+
14+
fun f(x: MyClass, y: MyClass?,
15+
l1: MyParamClass<MyClass>,
16+
l2: MyParamClass<MyClass?>,
17+
l3: MyParamClass<MyClass>?,
18+
l4: MyParamClass<MyClass?>?) {
19+
}
20+
*/
21+
val kind = 2
22+
val metadataVersion = intArrayOf(1, 5, 1)
23+
val data1 = arrayOf("\u0000\u0018\n\u0000\n\u0002\u0010\u0002\n\u0000\n\u0002\u0018\u0002\n\u0002\b\u0002\n\u0002\u0018\u0002\n\u0002\b\u0003\u001aX\u0010\u0000\u001a\u00020\u00012\u0006\u0010\u0002\u001a\u00020\u00032\b\u0010\u0004\u001a\u0004\u0018\u00010\u00032\u000c\u0010\u0005\u001a\b\u0012\u0004\u0012\u00020\u00030\u00062\u000e\u0010\u0007\u001a\n\u0012\u0006\u0012\u0004\u0018\u00010\u00030\u00062\u000e\u0010\b\u001a\n\u0012\u0004\u0012\u00020\u0003\u0018\u00010\u00062\u0010\u0010\t\u001a\u000c\u0012\u0006\u0012\u0004\u0018\u00010\u0003\u0018\u00010\u0006")
24+
val data2 = arrayOf("f","","x","LMyClass;","y","l1","LMyParamClass;","l2","l3","l4")
25+
val extraString = null
26+
val packageName = null
27+
val extraInt = 48
28+
val kch = KotlinClassHeader(kind, metadataVersion, data1, data2, extraString, packageName, extraInt)
29+
30+
val md = KotlinClassMetadata.read(kch)
31+
when (md) {
32+
is KotlinClassMetadata.Class -> println("Metadata for Class not yet supported")
33+
is KotlinClassMetadata.FileFacade -> {
34+
println("Metadata for FileFacade:")
35+
val kmp = md.toKmPackage()
36+
kmp.accept(MyPackageVisitor(0))
37+
}
38+
is KotlinClassMetadata.SyntheticClass -> println("Metadata for SyntheticClass not yet supported")
39+
is KotlinClassMetadata.MultiFileClassFacade -> println("Metadata for MultiFileClassFacade not yet supported")
40+
is KotlinClassMetadata.MultiFileClassPart -> println("Metadata for MultiFileClassPart not yet supported")
41+
is KotlinClassMetadata.Unknown -> println("Unknown kind")
42+
else -> println("Unexpected kind")
43+
}
44+
}
45+
46+
fun pr(indent: Int, s: String) {
47+
println(" ".repeat(indent) + s)
48+
}
49+
50+
class MyPackageVisitor(val indent: Int): KmPackageVisitor() {
51+
override fun visitFunction(flags: Flags, name: String): KmFunctionVisitor? {
52+
pr(indent, "=> Function; flags:$flags, name:$name")
53+
return MyFunctionVisitor(indent + 1)
54+
}
55+
56+
override fun visitProperty(flags: Flags, name: String, getterFlags: Flags, setterFlags: Flags): KmPropertyVisitor? {
57+
pr(indent, "=> Properties not yet handled")
58+
return null
59+
}
60+
61+
override fun visitTypeAlias(flags: Flags, name: String): KmTypeAliasVisitor? {
62+
pr(indent, "=> Type aliases not yet handled")
63+
return null
64+
}
65+
66+
override fun visitExtensions(type: KmExtensionType): KmPackageExtensionVisitor? {
67+
pr(indent, "=> Package extensions; type:$type")
68+
when (type) {
69+
JvmPackageExtensionVisitor.TYPE -> return MyJvmPackageExtensionVisitor(indent + 1)
70+
else -> {
71+
pr(indent, "- Not yet handled")
72+
return null
73+
}
74+
}
75+
}
76+
}
77+
78+
class MyFunctionVisitor(val indent: Int): KmFunctionVisitor() {
79+
override fun visitTypeParameter(flags: Flags, name: String, id: Int, variance: KmVariance): KmTypeParameterVisitor? {
80+
pr(indent, "=> Type parameter; flags:$flags, name:$name, id:$id, variance:$variance")
81+
pr(indent, " -> Not yet handled")
82+
return null
83+
}
84+
override fun visitReceiverParameterType(flags: Flags): KmTypeVisitor? {
85+
pr(indent, "=> Receiver parameter type; flags:$flags")
86+
pr(indent, " -> Not yet handled")
87+
return null
88+
}
89+
90+
override fun visitValueParameter(flags: Flags, name: String): KmValueParameterVisitor? {
91+
pr(indent, "=> Value parameter; flags:$flags, name:$name")
92+
return MyValueParameterVisitor(indent + 1)
93+
}
94+
95+
override fun visitReturnType(flags: Flags): KmTypeVisitor? {
96+
pr(indent, "=> Return type; flags:$flags")
97+
return MyTypeVisitor(indent + 1)
98+
}
99+
100+
override fun visitVersionRequirement(): KmVersionRequirementVisitor? {
101+
pr(indent, "=> VersionRequirement not yet handled")
102+
return null
103+
}
104+
105+
override fun visitContract(): KmContractVisitor? {
106+
pr(indent, "=> Contract not yet handled")
107+
return null
108+
}
109+
110+
override fun visitExtensions(type: KmExtensionType): KmFunctionExtensionVisitor? {
111+
pr(indent, "=> Function extensions; type:$type")
112+
when (type) {
113+
JvmFunctionExtensionVisitor.TYPE -> return MyJvmFunctionExtensionVisitor(indent + 1)
114+
else -> {
115+
pr(indent, "- Not yet handled")
116+
return null
117+
}
118+
}
119+
}
120+
}
121+
122+
class MyValueParameterVisitor(val indent: Int): KmValueParameterVisitor() {
123+
override fun visitType(flags: Flags): KmTypeVisitor? {
124+
pr(indent, "=> Type; flags:$flags")
125+
return MyTypeVisitor(indent + 1)
126+
}
127+
128+
override fun visitVarargElementType(flags: Flags): KmTypeVisitor? {
129+
pr(indent, "=> VarargElementType not yet handled")
130+
return null
131+
}
132+
133+
override fun visitExtensions(type: KmExtensionType): KmValueParameterExtensionVisitor? {
134+
pr(indent, "=> Value parameter extensions; type:$type; not yet handled")
135+
return null
136+
}
137+
}
138+
139+
class MyTypeVisitor(val indent: Int): KmTypeVisitor() {
140+
override fun visitClass(name: ClassName) {
141+
pr(indent, "=> Class; name:$name")
142+
}
143+
144+
override fun visitTypeAlias(name: ClassName) {
145+
pr(indent, "=> Type alias; name:$name")
146+
}
147+
148+
override fun visitTypeParameter(id: Int) {
149+
pr(indent, "=> Type parameter; id:$id")
150+
}
151+
152+
override fun visitArgument(flags: Flags, variance: KmVariance): KmTypeVisitor? {
153+
pr(indent, "=> Argument; flags:$flags, variance:$variance")
154+
return MyTypeVisitor(indent + 1)
155+
}
156+
157+
override fun visitStarProjection() {
158+
pr(indent, "=> Star projection")
159+
}
160+
161+
override fun visitAbbreviatedType(flags: Flags): KmTypeVisitor? {
162+
pr(indent, "=> AbbreviatedType not yet handled")
163+
return null
164+
}
165+
166+
override fun visitOuterType(flags: Flags): KmTypeVisitor? {
167+
pr(indent, "=> OuterType not yet handled")
168+
return null
169+
}
170+
171+
override fun visitFlexibleTypeUpperBound(flags: Flags, typeFlexibilityId: String?): KmTypeVisitor? {
172+
pr(indent, "=> FlexibleTypeUpperBound not yet handled")
173+
return null
174+
}
175+
176+
override fun visitExtensions(type: KmExtensionType): KmTypeExtensionVisitor? {
177+
pr(indent, "=> Type extensions; type:$type")
178+
when (type) {
179+
JvmTypeExtensionVisitor.TYPE -> return MyJvmTypeExtensionVisitor(indent + 1)
180+
else -> {
181+
pr(indent, "- Not yet handled")
182+
return null
183+
}
184+
}
185+
}
186+
}
187+
188+
class MyJvmTypeExtensionVisitor(val indent: Int): JvmTypeExtensionVisitor() {
189+
override fun visit(isRaw: Boolean) {
190+
pr(indent, "=> isRaw:$isRaw")
191+
}
192+
193+
override fun visitAnnotation(annotation: KmAnnotation) {
194+
pr(indent, "=> Annotation; annotation:$annotation")
195+
}
196+
}
197+
198+
class MyJvmPackageExtensionVisitor(val indent: Int): JvmPackageExtensionVisitor() {
199+
override fun visitLocalDelegatedProperty(flags: Flags, name: String, getterFlags: Flags, setterFlags: Flags): KmPropertyVisitor? {
200+
pr(indent, "=> Local delegate not yet handled")
201+
return null
202+
}
203+
204+
override fun visitModuleName(name: String) {
205+
pr(indent, "=> Module name; name:$name")
206+
}
207+
}
208+
209+
class MyJvmFunctionExtensionVisitor(val indent: Int): JvmFunctionExtensionVisitor() {
210+
override fun visit(signature: JvmMethodSignature?) {
211+
pr(indent, "=> signature:$signature")
212+
}
213+
214+
override fun visitLambdaClassOriginName(internalName: String) {
215+
pr(indent, "=> LambdaClassOriginName; internalName:$internalName")
216+
}
217+
}

java/kotlin-extractor/.gitignore

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
.classpath
2+
.gradle
3+
.idea
4+
.project
5+
.settings
6+
bin/
7+
build/
8+
gradle/
9+
gradlew
10+
gradlew.bat
11+
12+
src/main/kotlin/KotlinExtractorDbScheme.kt

0 commit comments

Comments
 (0)