Skip to content

Commit fcc8691

Browse files
authored
Merge pull request #9625 from smowton/smowton/test/kotlin-1-7-support
Switch to using Kotlin 1.7 by default
2 parents ae16a87 + 1aae3c5 commit fcc8691

File tree

15 files changed

+70
-37
lines changed

15 files changed

+70
-37
lines changed

java/kotlin-extractor/build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,8 @@ sourceSets {
3535
"utils/versions/v_1_5_21/*.kt",
3636
"utils/versions/v_1_5_31/*.kt",
3737
"utils/versions/v_1_6_10/*.kt",
38-
"utils/versions/v_1_7_0-RC/*.kt",
39-
// "utils/versions/v_1_6_20/*.kt",
38+
"utils/versions/v_1_6_20/*.kt",
39+
// "utils/versions/v_1_7_0/*.kt",
4040
]
4141
}
4242
}

java/kotlin-extractor/gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
kotlin.code.style=official
2-
kotlinVersion=1.6.20
2+
kotlinVersion=1.7.0
33

44
GROUP=com.github.codeql
55
VERSION_NAME=0.0.1

java/kotlin-extractor/kotlin_plugin_versions.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ def version_string_to_tuple(version):
2121
m = re.match(r'([0-9]+)\.([0-9]+)\.([0-9]+)(.*)', version)
2222
return tuple([int(m.group(i)) for i in range(1, 4)] + [m.group(4)])
2323

24-
many_versions = [ '1.4.32', '1.5.0', '1.5.10', '1.5.21', '1.5.31', '1.6.10', '1.7.0-RC', '1.6.20' ]
24+
many_versions = [ '1.4.32', '1.5.0', '1.5.10', '1.5.21', '1.5.31', '1.6.10', '1.6.20', '1.7.0' ]
2525

2626
many_versions_tuples = [version_string_to_tuple(v) for v in many_versions]
2727

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

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,28 +6,32 @@ import com.semmle.extractor.java.OdasaOutput
66
import com.semmle.util.data.StringDigestor
77
import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext
88
import org.jetbrains.kotlin.ir.declarations.*
9+
import org.jetbrains.kotlin.ir.util.fqNameWhenAvailable
910
import org.jetbrains.kotlin.ir.util.isFileClass
1011
import org.jetbrains.kotlin.ir.util.packageFqName
1112
import org.jetbrains.kotlin.ir.util.parentClassOrNull
13+
import org.jetbrains.kotlin.name.FqName
1214
import java.io.File
1315
import java.util.ArrayList
1416
import java.util.HashSet
1517
import java.util.zip.GZIPOutputStream
1618

1719
class ExternalDeclExtractor(val logger: FileLogger, val invocationTrapFile: String, val sourceFilePath: String, val primitiveTypeMapping: PrimitiveTypeMapping, val pluginContext: IrPluginContext, val globalExtensionState: KotlinExtractorGlobalState, val diagnosticTrapWriter: TrapWriter) {
1820

19-
val externalDeclsDone = HashSet<IrDeclaration>()
21+
val declBinaryNames = HashMap<IrDeclaration, String>()
22+
val externalDeclsDone = HashSet<Pair<String, String>>()
2023
val externalDeclWorkList = ArrayList<Pair<IrDeclaration, String>>()
2124

2225
val propertySignature = ";property"
2326
val fieldSignature = ";field"
2427

25-
fun extractLater(d: IrDeclaration, signature: String): Boolean {
28+
fun extractLater(d: IrDeclarationWithName, signature: String): Boolean {
2629
if (d !is IrClass && !isExternalFileClassMember(d)) {
2730
logger.errorElement("External declaration is neither a class, nor a top-level declaration", d)
2831
return false
2932
}
30-
val ret = externalDeclsDone.add(d)
33+
val declBinaryName = declBinaryNames.getOrPut(d) { getIrDeclBinaryName(d) }
34+
val ret = externalDeclsDone.add(Pair(declBinaryName, signature))
3135
if (ret) externalDeclWorkList.add(Pair(d, signature))
3236
return ret
3337
}

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ open class KotlinFileExtractor(
8686
}
8787
}
8888

89+
@OptIn(ObsoleteDescriptorBasedAPI::class)
8990
private fun isFake(d: IrDeclarationWithVisibility): Boolean {
9091
val visibility = d.visibility
9192
if (visibility is DelegatedDescriptorVisibility && visibility.delegate == Visibilities.InvisibleFake) {
@@ -94,6 +95,9 @@ open class KotlinFileExtractor(
9495
if (d.isFakeOverride) {
9596
return true
9697
}
98+
if ((d as? IrFunction)?.descriptor?.isHiddenToOvercomeSignatureClash == true) {
99+
return true
100+
}
97101
return false
98102
}
99103

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

Lines changed: 24 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,21 @@
11
package com.github.codeql
22

33
import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext
4+
import org.jetbrains.kotlin.builtins.StandardNames
45
import org.jetbrains.kotlin.ir.declarations.IrClass
6+
import org.jetbrains.kotlin.ir.declarations.IrPackageFragment
57
import org.jetbrains.kotlin.ir.types.IrSimpleType
6-
import org.jetbrains.kotlin.ir.types.IdSignatureValues
7-
import org.jetbrains.kotlin.ir.util.IdSignature
8+
import org.jetbrains.kotlin.ir.types.classOrNull
89
import org.jetbrains.kotlin.name.FqName
910

1011
class PrimitiveTypeMapping(val logger: Logger, val pluginContext: IrPluginContext) {
11-
fun getPrimitiveInfo(s: IrSimpleType) = mapping[s.classifier.signature]
12+
fun getPrimitiveInfo(s: IrSimpleType) =
13+
s.classOrNull?.let {
14+
if ((it.owner.parent as? IrPackageFragment)?.fqName == StandardNames.BUILT_INS_PACKAGE_FQ_NAME)
15+
mapping[it.owner.name]
16+
else
17+
null
18+
}
1219

1320
data class PrimitiveTypeInfo(
1421
val primitiveName: String?,
@@ -60,25 +67,25 @@ class PrimitiveTypeMapping(val logger: Logger, val pluginContext: IrPluginContex
6067
val javaLangVoid = findClass("java.lang.Void", kotlinNothing)
6168

6269
mapOf(
63-
IdSignatureValues._byte to PrimitiveTypeInfo("byte", true, javaLangByte, "kotlin", "Byte"),
64-
IdSignatureValues._short to PrimitiveTypeInfo("short", true, javaLangShort, "kotlin", "Short"),
65-
IdSignatureValues._int to PrimitiveTypeInfo("int", true, javaLangInteger, "kotlin", "Int"),
66-
IdSignatureValues._long to PrimitiveTypeInfo("long", true, javaLangLong, "kotlin", "Long"),
70+
StandardNames.FqNames._byte.shortName() to PrimitiveTypeInfo("byte", true, javaLangByte, "kotlin", "Byte"),
71+
StandardNames.FqNames._short.shortName() to PrimitiveTypeInfo("short", true, javaLangShort, "kotlin", "Short"),
72+
StandardNames.FqNames._int.shortName() to PrimitiveTypeInfo("int", true, javaLangInteger, "kotlin", "Int"),
73+
StandardNames.FqNames._long.shortName() to PrimitiveTypeInfo("long", true, javaLangLong, "kotlin", "Long"),
6774

68-
IdSignatureValues.uByte to PrimitiveTypeInfo("byte", true, kotlinUByte, "kotlin", "UByte"),
69-
IdSignatureValues.uShort to PrimitiveTypeInfo("short", true, kotlinUShort, "kotlin", "UShort"),
70-
IdSignatureValues.uInt to PrimitiveTypeInfo("int", true, kotlinUInt, "kotlin", "UInt"),
71-
IdSignatureValues.uLong to PrimitiveTypeInfo("long", true, kotlinULong, "kotlin", "ULong"),
75+
StandardNames.FqNames.uByteFqName.shortName() to PrimitiveTypeInfo("byte", true, kotlinUByte, "kotlin", "UByte"),
76+
StandardNames.FqNames.uShortFqName.shortName() to PrimitiveTypeInfo("short", true, kotlinUShort, "kotlin", "UShort"),
77+
StandardNames.FqNames.uIntFqName.shortName() to PrimitiveTypeInfo("int", true, kotlinUInt, "kotlin", "UInt"),
78+
StandardNames.FqNames.uLongFqName.shortName() to PrimitiveTypeInfo("long", true, kotlinULong, "kotlin", "ULong"),
7279

73-
IdSignatureValues._double to PrimitiveTypeInfo("double", true, javaLangDouble, "kotlin", "Double"),
74-
IdSignatureValues._float to PrimitiveTypeInfo("float", true, javaLangFloat, "kotlin", "Float"),
80+
StandardNames.FqNames._double.shortName() to PrimitiveTypeInfo("double", true, javaLangDouble, "kotlin", "Double"),
81+
StandardNames.FqNames._float.shortName() to PrimitiveTypeInfo("float", true, javaLangFloat, "kotlin", "Float"),
7582

76-
IdSignatureValues._boolean to PrimitiveTypeInfo("boolean", true, javaLangBoolean, "kotlin", "Boolean"),
83+
StandardNames.FqNames._boolean.shortName() to PrimitiveTypeInfo("boolean", true, javaLangBoolean, "kotlin", "Boolean"),
7784

78-
IdSignatureValues._char to PrimitiveTypeInfo("char", true, javaLangCharacter, "kotlin", "Char"),
85+
StandardNames.FqNames._char.shortName() to PrimitiveTypeInfo("char", true, javaLangCharacter, "kotlin", "Char"),
7986

80-
IdSignatureValues.unit to PrimitiveTypeInfo("void", false, kotlinUnit, "kotlin", "Unit"),
81-
IdSignatureValues.nothing to PrimitiveTypeInfo(null, true, javaLangVoid, "kotlin", "Nothing"),
87+
StandardNames.FqNames.unit.shortName() to PrimitiveTypeInfo("void", false, kotlinUnit, "kotlin", "Unit"),
88+
StandardNames.FqNames.nothing.shortName() to PrimitiveTypeInfo(null, true, javaLangVoid, "kotlin", "Nothing"),
8289
)
8390
}()
8491
}

java/kotlin-extractor/src/main/kotlin/utils/versions/v_1_7_0-RC/Descriptors.kt

Lines changed: 0 additions & 9 deletions
This file was deleted.
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package com.github.codeql.utils.versions
2+
3+
import com.github.codeql.KotlinUsesExtractor
4+
import org.jetbrains.kotlin.backend.common.serialization.DescriptorByIdSignatureFinderImpl
5+
import org.jetbrains.kotlin.idea.MainFunctionDetector
6+
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
7+
import org.jetbrains.kotlin.ir.backend.jvm.serialization.JvmDescriptorMangler
8+
import org.jetbrains.kotlin.ir.util.DeclarationStubGenerator
9+
import org.jetbrains.kotlin.ir.util.SymbolTable
10+
import org.jetbrains.kotlin.psi2ir.generators.DeclarationStubGeneratorImpl
11+
12+
@OptIn(ObsoleteDescriptorBasedAPI::class)
13+
fun <TIrStub> KotlinUsesExtractor.getIrStubFromDescriptor(generateStub: (DeclarationStubGenerator) -> TIrStub) : TIrStub? =
14+
(pluginContext.symbolTable as? SymbolTable) ?.let {
15+
// Copying the construction seen in JvmIrLinker.kt
16+
val mangler = JvmDescriptorMangler(MainFunctionDetector(pluginContext.bindingContext, pluginContext.languageVersionSettings))
17+
val descriptorFinder = DescriptorByIdSignatureFinderImpl(
18+
pluginContext.moduleDescriptor,
19+
mangler,
20+
DescriptorByIdSignatureFinderImpl.LookupMode.MODULE_ONLY
21+
)
22+
val stubGenerator = DeclarationStubGeneratorImpl(pluginContext.moduleDescriptor, it, pluginContext.irBuiltIns, descriptorFinder)
23+
generateStub(stubGenerator)
24+
} ?: run {
25+
logger.error("Plugin context has no symbol table, couldn't get IR stub")
26+
null
27+
}

java/ql/test/kotlin/library-tests/dataflow/whenexpr/WhenExpr.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
class WhenExpr {
22
fun taint() = Uri()
33

4-
fun sink(s: String) { }
4+
fun sink(s: String?) { }
55

6-
fun bad() {
7-
val s0 = taint()
6+
fun bad(b: Boolean) {
7+
val s0 = if (b) taint() else null
88
sink(s0?.getQueryParameter())
99
}
1010
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
| WhenExpr.kt:7:14:7:20 | taint(...) | WhenExpr.kt:8:14:8:32 | <Stmt> |
1+
| WhenExpr.kt:7:21:7:27 | taint(...) | WhenExpr.kt:8:14:8:32 | <Stmt> |

0 commit comments

Comments
 (0)