mirror of
https://github.com/github/codeql.git
synced 2025-12-17 01:03:14 +01:00
Merge pull request #10678 from tamasvajk/kotlin-type-param-modifiers
Kotlin: Extract type parameter modifiers (`reified`, `in`, `out`)
This commit is contained in:
@@ -0,0 +1,19 @@
|
||||
class Modifier extends @modifier {
|
||||
string toString() { none() }
|
||||
}
|
||||
|
||||
class TypeVariable extends @typevariable {
|
||||
string toString() { none() }
|
||||
}
|
||||
|
||||
class Modified extends @modifiable {
|
||||
Modified() { hasModifier(this, _) }
|
||||
|
||||
string toString() { none() }
|
||||
}
|
||||
|
||||
from Modified m1, Modifier m2
|
||||
where
|
||||
hasModifier(m1, m2) and
|
||||
not m1 instanceof TypeVariable
|
||||
select m1, m2
|
||||
@@ -0,0 +1,11 @@
|
||||
class Modifier extends @modifier {
|
||||
string toString() { none() }
|
||||
|
||||
string getName() { modifiers(this, result) }
|
||||
}
|
||||
|
||||
from Modifier m, string s
|
||||
where
|
||||
s = m.getName() and
|
||||
not s in ["in", "out", "reified"]
|
||||
select m, m.getName()
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,4 @@
|
||||
description: Remove type parameters from modifiable entities
|
||||
compatibility: backwards
|
||||
hasModifier.rel: run hasModifier.qlo
|
||||
modifiers.rel: run modifiers.qlo
|
||||
@@ -206,6 +206,16 @@ open class KotlinFileExtractor(
|
||||
}
|
||||
}
|
||||
|
||||
if (tp.isReified) {
|
||||
addModifiers(id, "reified")
|
||||
}
|
||||
|
||||
if (tp.variance == Variance.IN_VARIANCE) {
|
||||
addModifiers(id, "in")
|
||||
} else if (tp.variance == Variance.OUT_VARIANCE) {
|
||||
addModifiers(id, "out")
|
||||
}
|
||||
|
||||
return id
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
---
|
||||
category: minorAnalysis
|
||||
---
|
||||
* The class `TypeVariable` now also extends `Modifiable`.
|
||||
@@ -1033,7 +1033,7 @@ javadocText(
|
||||
@boundedtype | @array | @localvar | @expr | @stmt | @import | @fielddecl | @kt_type | @kt_type_alias |
|
||||
@kt_property;
|
||||
|
||||
@modifiable = @member_modifiable| @param | @localvar ;
|
||||
@modifiable = @member_modifiable| @param | @localvar | @typevariable;
|
||||
|
||||
@member_modifiable = @class | @interface | @method | @constructor | @field | @kt_property;
|
||||
|
||||
|
||||
@@ -137,7 +137,7 @@ abstract class BoundedType extends RefType, @boundedtype {
|
||||
* For example, `T` is a type parameter in
|
||||
* `class X<T> { }` and in `<T> void m() { }`.
|
||||
*/
|
||||
class TypeVariable extends BoundedType, @typevariable {
|
||||
class TypeVariable extends BoundedType, Modifiable, @typevariable {
|
||||
/** Gets the generic type that is parameterized by this type parameter, if any. */
|
||||
GenericType getGenericType() { typeVars(this, _, _, _, result) }
|
||||
|
||||
|
||||
@@ -96,4 +96,13 @@ abstract class Modifiable extends Element {
|
||||
|
||||
/** Holds if this element has a `lateinit` modifier. */
|
||||
predicate isLateinit() { this.hasModifier("lateinit") }
|
||||
|
||||
/** Holds if this element has a `reified` modifier. */
|
||||
predicate isReified() { this.hasModifier("reified") }
|
||||
|
||||
/** Holds if this element has an `in` modifier. */
|
||||
predicate isIn() { this.hasModifier("in") }
|
||||
|
||||
/** Holds if this element has an `out` modifier. */
|
||||
predicate isOut() { this.hasModifier("out") }
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,2 @@
|
||||
description: Make type parameters modifiable
|
||||
compatibility: backwards
|
||||
@@ -1,5 +1,5 @@
|
||||
| modifiers.kt:1:1:28:1 | X | Class | public |
|
||||
| modifiers.kt:1:6:28:1 | X | Constructor | public |
|
||||
| modifiers.kt:1:1:29:1 | X | Class | public |
|
||||
| modifiers.kt:1:6:29:1 | X | Constructor | public |
|
||||
| modifiers.kt:2:5:2:21 | a | Field | final |
|
||||
| modifiers.kt:2:5:2:21 | a | Field | private |
|
||||
| modifiers.kt:2:5:2:21 | a | Property | private |
|
||||
@@ -45,13 +45,26 @@
|
||||
| modifiers.kt:27:12:27:49 | fn5 | Method | inline |
|
||||
| modifiers.kt:27:12:27:49 | fn5 | Method | public |
|
||||
| modifiers.kt:27:20:27:44 | f | Parameter | crossinline |
|
||||
| modifiers.kt:30:1:36:1 | LateInit | Class | final |
|
||||
| modifiers.kt:30:1:36:1 | LateInit | Class | public |
|
||||
| modifiers.kt:30:8:36:1 | LateInit | Constructor | public |
|
||||
| modifiers.kt:31:5:31:40 | test0 | Field | private |
|
||||
| modifiers.kt:31:5:31:40 | test0 | Property | lateinit |
|
||||
| modifiers.kt:31:5:31:40 | test0 | Property | private |
|
||||
| modifiers.kt:31:22:31:40 | getTest0$private | Method | private |
|
||||
| modifiers.kt:31:22:31:40 | setTest0$private | Method | private |
|
||||
| modifiers.kt:33:5:35:5 | fn | Method | public |
|
||||
| modifiers.kt:34:9:34:36 | LateInit test1 | LocalVariableDecl | lateinit |
|
||||
| modifiers.kt:28:12:28:39 | fn6 | Method | inline |
|
||||
| modifiers.kt:28:12:28:39 | fn6 | Method | public |
|
||||
| modifiers.kt:28:17:28:25 | T | TypeVariable | reified |
|
||||
| modifiers.kt:31:1:33:1 | Y | Class | final |
|
||||
| modifiers.kt:31:1:33:1 | Y | Class | public |
|
||||
| modifiers.kt:31:1:33:1 | Y | Constructor | public |
|
||||
| modifiers.kt:31:1:33:1 | Y | GenericType | final |
|
||||
| modifiers.kt:31:1:33:1 | Y | GenericType | public |
|
||||
| modifiers.kt:31:1:33:1 | Y | ParameterizedType | final |
|
||||
| modifiers.kt:31:1:33:1 | Y | ParameterizedType | public |
|
||||
| modifiers.kt:31:9:31:13 | T1 | TypeVariable | in |
|
||||
| modifiers.kt:31:16:31:21 | T2 | TypeVariable | out |
|
||||
| modifiers.kt:32:5:32:32 | foo | Method | public |
|
||||
| modifiers.kt:35:1:41:1 | LateInit | Class | final |
|
||||
| modifiers.kt:35:1:41:1 | LateInit | Class | public |
|
||||
| modifiers.kt:35:8:41:1 | LateInit | Constructor | public |
|
||||
| modifiers.kt:36:5:36:40 | test0 | Field | private |
|
||||
| modifiers.kt:36:5:36:40 | test0 | Property | lateinit |
|
||||
| modifiers.kt:36:5:36:40 | test0 | Property | private |
|
||||
| modifiers.kt:36:22:36:40 | getTest0$private | Method | private |
|
||||
| modifiers.kt:36:22:36:40 | setTest0$private | Method | private |
|
||||
| modifiers.kt:38:5:40:5 | fn | Method | public |
|
||||
| modifiers.kt:39:9:39:36 | LateInit test1 | LocalVariableDecl | lateinit |
|
||||
|
||||
@@ -25,6 +25,11 @@ open class X {
|
||||
|
||||
inline fun fn4(noinline f: () -> Unit) { }
|
||||
inline fun fn5(crossinline f: () -> Unit) { }
|
||||
inline fun <reified T> fn6(x: T) {}
|
||||
}
|
||||
|
||||
class Y<in T1, out T2> {
|
||||
fun foo(t: T1) : T2 = null!!
|
||||
}
|
||||
|
||||
public class LateInit {
|
||||
|
||||
Reference in New Issue
Block a user