Skip to content

Commit 77004f3

Browse files
authored
Merge pull request github#11258 from smowton/smowton/feature/kotlin-annotation-extraction
Kotlin: extract annotations
2 parents e0f1b38 + 5282c86 commit 77004f3

File tree

66 files changed

+2139
-426
lines changed

Some content is hidden

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

66 files changed

+2139
-426
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ class ExternalDeclExtractor(val logger: FileLogger, val invocationTrapFile: Stri
119119

120120
fileExtractor.extractClassSource(irDecl, extractDeclarations = !irDecl.isFileClass, extractStaticInitializer = false, extractPrivateMembers = false, extractFunctionBodies = false)
121121
} else {
122-
fileExtractor.extractDeclaration(irDecl, extractPrivateMembers = false, extractFunctionBodies = false)
122+
fileExtractor.extractDeclaration(irDecl, extractPrivateMembers = false, extractFunctionBodies = false, extractAnnotations = true)
123123
}
124124
}
125125
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,7 @@ class KotlinExtractorGlobalState {
207207
val syntheticToRealClassMap = HashMap<IrClass, IrClass?>()
208208
val syntheticToRealFunctionMap = HashMap<IrFunction, IrFunction?>()
209209
val syntheticToRealFieldMap = HashMap<IrField, IrField?>()
210+
val syntheticRepeatableAnnotationContainers = HashMap<IrClass, IrClass>()
210211
}
211212

212213
/*

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

Lines changed: 478 additions & 211 deletions
Large diffs are not rendered by default.

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

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -40,11 +40,15 @@ open class KotlinUsesExtractor(
4040
val pluginContext: IrPluginContext,
4141
val globalExtensionState: KotlinExtractorGlobalState
4242
) {
43-
val javaLangObject by lazy {
44-
val result = pluginContext.referenceClass(FqName("java.lang.Object"))?.owner
45-
result?.let { extractExternalClassLater(it) }
46-
result
47-
}
43+
fun referenceExternalClass(name: String) =
44+
pluginContext.referenceClass(FqName(name))?.owner.also {
45+
if (it == null)
46+
logger.warn("Unable to resolve external class $name")
47+
else
48+
extractExternalClassLater(it)
49+
}
50+
51+
val javaLangObject by lazy { referenceExternalClass("java.lang.Object") }
4852

4953
val javaLangObjectType by lazy {
5054
javaLangObject?.typeWith()
@@ -885,11 +889,7 @@ open class KotlinUsesExtractor(
885889
else -> null
886890
}
887891

888-
val javaUtilCollection by lazy {
889-
val result = pluginContext.referenceClass(FqName("java.util.Collection"))?.owner
890-
result?.let { extractExternalClassLater(it) }
891-
result
892-
}
892+
val javaUtilCollection by lazy { referenceExternalClass("java.util.Collection") }
893893

894894
val wildcardCollectionType by lazy {
895895
javaUtilCollection?.let {
@@ -1152,11 +1152,7 @@ open class KotlinUsesExtractor(
11521152
return "@\"$prefix;{$parentId}.$name($paramTypeIds){$returnTypeId}${typeArgSuffix}\""
11531153
}
11541154

1155-
val javaLangClass by lazy {
1156-
val result = pluginContext.referenceClass(FqName("java.lang.Class"))?.owner
1157-
result?.let { extractExternalClassLater(it) }
1158-
result
1159-
}
1155+
val javaLangClass by lazy { referenceExternalClass("java.lang.Class") }
11601156

11611157
fun kClassToJavaClass(t: IrType): IrType {
11621158
when(t) {

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

Lines changed: 396 additions & 0 deletions
Large diffs are not rendered by default.
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.backend.common.extensions.IrPluginContext
4+
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
5+
6+
@OptIn(ObsoleteDescriptorBasedAPI::class)
7+
fun getAnnotationType(context: IrPluginContext) =
8+
context.typeTranslator.translateType(context.builtIns.annotationType)
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.github.codeql.utils.versions
2+
3+
import org.jetbrains.kotlin.ir.declarations.IrFunction
4+
import org.jetbrains.kotlin.ir.declarations.IrValueParameter
5+
import org.jetbrains.kotlin.backend.common.ir.copyTo
6+
7+
fun copyParameterToFunction(p: IrValueParameter, f: IrFunction) = p.copyTo(f)
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package com.github.codeql.utils.versions
2+
3+
import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext
4+
5+
fun getAnnotationType(context: IrPluginContext) =
6+
context.irBuiltIns.annotationType
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.github.codeql.utils.versions
2+
3+
import org.jetbrains.kotlin.ir.declarations.IrFunction
4+
import org.jetbrains.kotlin.ir.declarations.IrValueParameter
5+
import org.jetbrains.kotlin.ir.util.copyTo
6+
7+
fun copyParameterToFunction(p: IrValueParameter, f: IrFunction) = p.copyTo(f)

java/ql/consistency-queries/cfgDeadEnds.ql

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ predicate shouldBeDeadEnd(ControlFlowNode n) {
5353
not exists(n.getFile().getRelativePath()) // TODO
5454
or
5555
n = any(ConstCase c).getValue(_) // TODO
56+
or
57+
n instanceof ErrorExpr // TODO
5658
}
5759

5860
from ControlFlowNode n, string s

0 commit comments

Comments
 (0)