Skip to content

Commit 81fffce

Browse files
committed
Kotlin: Extract parameter modifiers (noinline, crossinline)
1 parent 42a97b2 commit 81fffce

File tree

4 files changed

+27
-6
lines changed

4 files changed

+27
-6
lines changed

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

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -643,11 +643,11 @@ open class KotlinFileExtractor(
643643
extractTypeAccessRecursive(substitutedType, location, id, -1)
644644
}
645645
val syntheticParameterNames = isUnderscoreParameter(vp) || ((vp.parent as? IrFunction)?.let { hasSynthesizedParameterNames(it) } ?: true)
646-
return extractValueParameter(id, substitutedType, vp.name.asString(), location, parent, idx, useValueParameter(vp, parentSourceDeclaration), vp.isVararg, syntheticParameterNames)
646+
return extractValueParameter(id, substitutedType, vp.name.asString(), location, parent, idx, useValueParameter(vp, parentSourceDeclaration), syntheticParameterNames, vp.isVararg, vp.isNoinline, vp.isCrossinline)
647647
}
648648
}
649649

650-
private fun extractValueParameter(id: Label<out DbParam>, t: IrType, name: String, locId: Label<DbLocation>, parent: Label<out DbCallable>, idx: Int, paramSourceDeclaration: Label<out DbParam>, isVararg: Boolean, syntheticParameterNames: Boolean): TypeResults {
650+
private fun extractValueParameter(id: Label<out DbParam>, t: IrType, name: String, locId: Label<DbLocation>, parent: Label<out DbCallable>, idx: Int, paramSourceDeclaration: Label<out DbParam>, syntheticParameterNames: Boolean, isVararg: Boolean, isNoinline: Boolean, isCrossinline: Boolean): TypeResults {
651651
val type = useType(t)
652652
tw.writeParams(id, type.javaResult.id, idx, parent, paramSourceDeclaration)
653653
tw.writeParamsKotlinType(id, type.kotlinResult.id)
@@ -658,6 +658,12 @@ open class KotlinFileExtractor(
658658
if (isVararg) {
659659
tw.writeIsVarargsParam(id)
660660
}
661+
if (isNoinline) {
662+
addModifiers(id, "noinline")
663+
}
664+
if (isCrossinline) {
665+
addModifiers(id, "crossinline")
666+
}
661667
return type
662668
}
663669

@@ -3412,7 +3418,7 @@ open class KotlinFileExtractor(
34123418
stmtIdx: Int
34133419
) {
34143420
val paramId = tw.getFreshIdLabel<DbParam>()
3415-
val paramTypeRes = extractValueParameter(paramId, paramType, paramName, locId, ids.constructor, paramIdx, paramId, isVararg = false, syntheticParameterNames = false)
3421+
val paramTypeRes = extractValueParameter(paramId, paramType, paramName, locId, ids.constructor, paramIdx, paramId, syntheticParameterNames = false, isVararg = false, isNoinline = false, isCrossinline = false)
34163422

34173423
val assignmentStmtId = tw.getFreshIdLabel<DbExprstmt>()
34183424
tw.writeStmts_exprstmt(assignmentStmtId, ids.constructorBlock, stmtIdx, ids.constructor)
@@ -4085,7 +4091,7 @@ open class KotlinFileExtractor(
40854091

40864092
val parameters = parameterTypes.mapIndexed { idx, p ->
40874093
val paramId = tw.getFreshIdLabel<DbParam>()
4088-
val paramType = extractValueParameter(paramId, p, "a$idx", locId, methodId, idx, paramId, isVararg = false, syntheticParameterNames = false)
4094+
val paramType = extractValueParameter(paramId, p, "a$idx", locId, methodId, idx, paramId, syntheticParameterNames = false, isVararg = false, isNoinline = false, isCrossinline = false)
40894095

40904096
Pair(paramId, paramType)
40914097
}

java/ql/lib/semmle/code/java/Modifier.qll

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,12 @@ abstract class Modifiable extends Element {
6767
/** Holds if this element has an `inline` modifier. */
6868
predicate isInline() { this.hasModifier("inline") }
6969

70+
/** Holds if this element has an `noinline` modifier. */
71+
predicate isNoinline() { this.hasModifier("noinline") }
72+
73+
/** Holds if this element has an `crossinline` modifier. */
74+
predicate isCrossinline() { this.hasModifier("crossinline") }
75+
7076
/** Holds if this element has a `suspend` modifier. */
7177
predicate isSuspend() { this.hasModifier("suspend") }
7278

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

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
| modifiers.kt:1:1:25:1 | X | Class | public |
2-
| modifiers.kt:1:6:25:1 | X | Constructor | public |
1+
| modifiers.kt:1:1:28:1 | X | Class | public |
2+
| modifiers.kt:1:6:28:1 | X | Constructor | public |
33
| modifiers.kt:2:5:2:21 | a | Field | final |
44
| modifiers.kt:2:5:2:21 | a | Field | private |
55
| modifiers.kt:2:5:2:21 | a | Property | private |
@@ -39,3 +39,9 @@
3939
| modifiers.kt:23:9:23:27 | localClass | Constructor | public |
4040
| modifiers.kt:23:9:23:27 | localClass | LocalClass | final |
4141
| modifiers.kt:23:9:23:27 | localClass | LocalClass | private |
42+
| modifiers.kt:26:12:26:46 | fn4 | Method | inline |
43+
| modifiers.kt:26:12:26:46 | fn4 | Method | public |
44+
| modifiers.kt:26:20:26:41 | f | Parameter | noinline |
45+
| modifiers.kt:27:12:27:49 | fn5 | Method | inline |
46+
| modifiers.kt:27:12:27:49 | fn5 | Method | public |
47+
| modifiers.kt:27:20:27:44 | f | Parameter | crossinline |

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,7 @@ open class X {
2222
fun fn3() {
2323
class localClass {}
2424
}
25+
26+
inline fun fn4(noinline f: () -> Unit) { }
27+
inline fun fn5(crossinline f: () -> Unit) { }
2528
}

0 commit comments

Comments
 (0)