Skip to content

Commit 9eea6d4

Browse files
committed
Kotlin: Extract type parameter modifiers (reified, in, out)
1 parent 7ac9c1e commit 9eea6d4

File tree

6 files changed

+51
-14
lines changed

6 files changed

+51
-14
lines changed

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,16 @@ open class KotlinFileExtractor(
203203
}
204204
}
205205

206+
if (tp.isReified) {
207+
addModifiers(id, "reified")
208+
}
209+
210+
if (tp.variance == Variance.IN_VARIANCE) {
211+
addModifiers(id, "in")
212+
} else if (tp.variance == Variance.OUT_VARIANCE) {
213+
addModifiers(id, "out")
214+
}
215+
206216
return id
207217
}
208218
}

java/ql/lib/config/semmlecode.dbscheme

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1033,7 +1033,7 @@ javadocText(
10331033
@boundedtype | @array | @localvar | @expr | @stmt | @import | @fielddecl | @kt_type | @kt_type_alias |
10341034
@kt_property;
10351035

1036-
@modifiable = @member_modifiable| @param | @localvar ;
1036+
@modifiable = @member_modifiable| @param | @localvar | @typevariable;
10371037

10381038
@member_modifiable = @class | @interface | @method | @constructor | @field | @kt_property;
10391039

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ abstract class BoundedType extends RefType, @boundedtype {
137137
* For example, `T` is a type parameter in
138138
* `class X<T> { }` and in `<T> void m() { }`.
139139
*/
140-
class TypeVariable extends BoundedType, @typevariable {
140+
class TypeVariable extends BoundedType, Modifiable, @typevariable {
141141
/** Gets the generic type that is parameterized by this type parameter, if any. */
142142
GenericType getGenericType() { typeVars(this, _, _, _, result) }
143143

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,4 +96,13 @@ abstract class Modifiable extends Element {
9696

9797
/** Holds if this element has a `lateinit` modifier. */
9898
predicate isLateinit() { this.hasModifier("lateinit") }
99+
100+
/** Holds if this element has a `reified` modifier. */
101+
predicate isReified() { this.hasModifier("reified") }
102+
103+
/** Holds if this element has an `in` modifier. */
104+
predicate isIn() { this.hasModifier("in") }
105+
106+
/** Holds if this element has an `out` modifier. */
107+
predicate isOut() { this.hasModifier("out") }
99108
}

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

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
| modifiers.kt:1:1:28:1 | X | Class | public |
2-
| modifiers.kt:1:6:28:1 | X | Constructor | public |
1+
| modifiers.kt:1:1:29:1 | X | Class | public |
2+
| modifiers.kt:1:6:29: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 |
@@ -45,13 +45,26 @@
4545
| modifiers.kt:27:12:27:49 | fn5 | Method | inline |
4646
| modifiers.kt:27:12:27:49 | fn5 | Method | public |
4747
| modifiers.kt:27:20:27:44 | f | Parameter | crossinline |
48-
| modifiers.kt:30:1:36:1 | LateInit | Class | final |
49-
| modifiers.kt:30:1:36:1 | LateInit | Class | public |
50-
| modifiers.kt:30:8:36:1 | LateInit | Constructor | public |
51-
| modifiers.kt:31:5:31:40 | test0 | Field | private |
52-
| modifiers.kt:31:5:31:40 | test0 | Property | lateinit |
53-
| modifiers.kt:31:5:31:40 | test0 | Property | private |
54-
| modifiers.kt:31:22:31:40 | getTest0$private | Method | private |
55-
| modifiers.kt:31:22:31:40 | setTest0$private | Method | private |
56-
| modifiers.kt:33:5:35:5 | fn | Method | public |
57-
| modifiers.kt:34:9:34:36 | LateInit test1 | LocalVariableDecl | lateinit |
48+
| modifiers.kt:28:12:28:39 | fn6 | Method | inline |
49+
| modifiers.kt:28:12:28:39 | fn6 | Method | public |
50+
| modifiers.kt:28:17:28:25 | T | TypeVariable | reified |
51+
| modifiers.kt:31:1:33:1 | Y | Class | final |
52+
| modifiers.kt:31:1:33:1 | Y | Class | public |
53+
| modifiers.kt:31:1:33:1 | Y | Constructor | public |
54+
| modifiers.kt:31:1:33:1 | Y | GenericType | final |
55+
| modifiers.kt:31:1:33:1 | Y | GenericType | public |
56+
| modifiers.kt:31:1:33:1 | Y | ParameterizedType | final |
57+
| modifiers.kt:31:1:33:1 | Y | ParameterizedType | public |
58+
| modifiers.kt:31:9:31:13 | T1 | TypeVariable | in |
59+
| modifiers.kt:31:16:31:21 | T2 | TypeVariable | out |
60+
| modifiers.kt:32:5:32:32 | foo | Method | public |
61+
| modifiers.kt:35:1:41:1 | LateInit | Class | final |
62+
| modifiers.kt:35:1:41:1 | LateInit | Class | public |
63+
| modifiers.kt:35:8:41:1 | LateInit | Constructor | public |
64+
| modifiers.kt:36:5:36:40 | test0 | Field | private |
65+
| modifiers.kt:36:5:36:40 | test0 | Property | lateinit |
66+
| modifiers.kt:36:5:36:40 | test0 | Property | private |
67+
| modifiers.kt:36:22:36:40 | getTest0$private | Method | private |
68+
| modifiers.kt:36:22:36:40 | setTest0$private | Method | private |
69+
| modifiers.kt:38:5:40:5 | fn | Method | public |
70+
| modifiers.kt:39:9:39:36 | LateInit test1 | LocalVariableDecl | lateinit |

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,11 @@ open class X {
2525

2626
inline fun fn4(noinline f: () -> Unit) { }
2727
inline fun fn5(crossinline f: () -> Unit) { }
28+
inline fun <reified T> fn6(x: T) {}
29+
}
30+
31+
class Y<in T1, out T2> {
32+
fun foo(t: T1) : T2 = null!!
2833
}
2934

3035
public class LateInit {

0 commit comments

Comments
 (0)