Skip to content

Commit d0ea7ea

Browse files
authored
Merge pull request #10677 from tamasvajk/kotlin-param-modifiers
Kotlin: Extract parameter modifiers (`noinline`, `crossinline`)
2 parents c45a04a + 81fffce commit d0ea7ea

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
@@ -649,11 +649,11 @@ open class KotlinFileExtractor(
649649
extractTypeAccessRecursive(substitutedType, location, id, -1)
650650
}
651651
val syntheticParameterNames = isUnderscoreParameter(vp) || ((vp.parent as? IrFunction)?.let { hasSynthesizedParameterNames(it) } ?: true)
652-
return extractValueParameter(id, substitutedType, vp.name.asString(), location, parent, idx, useValueParameter(vp, parentSourceDeclaration), vp.isVararg, syntheticParameterNames)
652+
return extractValueParameter(id, substitutedType, vp.name.asString(), location, parent, idx, useValueParameter(vp, parentSourceDeclaration), syntheticParameterNames, vp.isVararg, vp.isNoinline, vp.isCrossinline)
653653
}
654654
}
655655

656-
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 {
656+
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 {
657657
val type = useType(t)
658658
tw.writeParams(id, type.javaResult.id, idx, parent, paramSourceDeclaration)
659659
tw.writeParamsKotlinType(id, type.kotlinResult.id)
@@ -664,6 +664,12 @@ open class KotlinFileExtractor(
664664
if (isVararg) {
665665
tw.writeIsVarargsParam(id)
666666
}
667+
if (isNoinline) {
668+
addModifiers(id, "noinline")
669+
}
670+
if (isCrossinline) {
671+
addModifiers(id, "crossinline")
672+
}
667673
return type
668674
}
669675

@@ -3586,7 +3592,7 @@ open class KotlinFileExtractor(
35863592
stmtIdx: Int
35873593
) {
35883594
val paramId = tw.getFreshIdLabel<DbParam>()
3589-
val paramTypeRes = extractValueParameter(paramId, paramType, paramName, locId, ids.constructor, paramIdx, paramId, isVararg = false, syntheticParameterNames = false)
3595+
val paramTypeRes = extractValueParameter(paramId, paramType, paramName, locId, ids.constructor, paramIdx, paramId, syntheticParameterNames = false, isVararg = false, isNoinline = false, isCrossinline = false)
35903596

35913597
val assignmentStmtId = tw.getFreshIdLabel<DbExprstmt>()
35923598
tw.writeStmts_exprstmt(assignmentStmtId, ids.constructorBlock, stmtIdx, ids.constructor)
@@ -4259,7 +4265,7 @@ open class KotlinFileExtractor(
42594265

42604266
val parameters = parameterTypes.mapIndexed { idx, p ->
42614267
val paramId = tw.getFreshIdLabel<DbParam>()
4262-
val paramType = extractValueParameter(paramId, p, "a$idx", locId, methodId, idx, paramId, isVararg = false, syntheticParameterNames = false)
4268+
val paramType = extractValueParameter(paramId, p, "a$idx", locId, methodId, idx, paramId, syntheticParameterNames = false, isVararg = false, isNoinline = false, isCrossinline = false)
42634269

42644270
Pair(paramId, paramType)
42654271
}

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)