WIP: type arg extraction

This commit is contained in:
Tamas Vajk
2021-10-06 17:27:19 +02:00
committed by Ian Lynagh
parent 0c6e20928c
commit 8dff527a0e
8 changed files with 199 additions and 48 deletions

View File

@@ -475,7 +475,7 @@ class GenericCall extends Call {
result.(Wildcard).getUpperBound().getType() = v.getUpperBoundType()
}
private RefType getAnExplicitTypeArgument(TypeVariable v) {
private Type getAnExplicitTypeArgument(TypeVariable v) {
exists(GenericCallable gen, MethodAccess call, int i |
this = call and
gen = call.getCallee() and
@@ -485,8 +485,8 @@ class GenericCall extends Call {
}
/** Gets a type argument of the call for the given `TypeVariable`. */
RefType getATypeArgument(TypeVariable v) {
result = this.getAnExplicitTypeArgument(v)
Type getATypeArgument(TypeVariable v) {
result = getAnExplicitTypeArgument(v)
or
not exists(this.getAnExplicitTypeArgument(v)) and
result = this.getAnInferredTypeArgument(v)

View File

@@ -0,0 +1,30 @@
[VALUE_NOT_IN_TYPE] predicate typeArgs(@reftype argumentid, int pos, @typeorcallable parentid): Value 11 of field argumentid is not in type @reftype. The value is however in the following types: @primitive. Appears in tuple (11,0,132)
Relevant element: argumentid=11
Full ID for 11: @"type;int"
Relevant element: parentid=132
Full ID for 132: @"class;foo.bar.C1;(11);(11)". The ID may expand to @"class;foo.bar.C1;{@"type;int"};{@"type;int"}"
[VALUE_NOT_IN_TYPE] predicate typeArgs(@reftype argumentid, int pos, @typeorcallable parentid): Value 11 of field argumentid is not in type @reftype. The value is however in the following types: @primitive. Appears in tuple (11,1,132)
Relevant element: argumentid=11
Full ID for 11: @"type;int"
Relevant element: parentid=132
Full ID for 132: @"class;foo.bar.C1;(11);(11)". The ID may expand to @"class;foo.bar.C1;{@"type;int"};{@"type;int"}"
[VALUE_NOT_IN_TYPE] predicate typeArgs(@reftype argumentid, int pos, @typeorcallable parentid): Value 11 of field argumentid is not in type @reftype. The value is however in the following types: @primitive. Appears in tuple (11,1,157)
Relevant element: argumentid=11
Full ID for 11: @"type;int"
Relevant element: parentid=157
Full ID for 157: @"class;foo.bar.C1;(13);(11)". The ID may expand to @"class;foo.bar.C1;{@"type;string"};{@"type;int"}"
[VALUE_NOT_IN_TYPE] predicate typeArgs(@reftype argumentid, int pos, @typeorcallable parentid): Value 13 of field argumentid is not in type @reftype. The value is however in the following types: @primitive. Appears in tuple (13,0,146)
Relevant element: argumentid=13
Full ID for 13: @"type;string"
Relevant element: parentid=146
Full ID for 146: @"class;foo.bar.C1;(13);(13)". The ID may expand to @"class;foo.bar.C1;{@"type;string"};{@"type;string"}"
[VALUE_NOT_IN_TYPE] predicate typeArgs(@reftype argumentid, int pos, @typeorcallable parentid): Value 13 of field argumentid is not in type @reftype. The value is however in the following types: @primitive. Appears in tuple (13,0,157)
Relevant element: argumentid=13
Full ID for 13: @"type;string"
Relevant element: parentid=157
Full ID for 157: @"class;foo.bar.C1;(13);(11)". The ID may expand to @"class;foo.bar.C1;{@"type;string"};{@"type;int"}"
[VALUE_NOT_IN_TYPE] predicate typeArgs(@reftype argumentid, int pos, @typeorcallable parentid): Value 13 of field argumentid is not in type @reftype. The value is however in the following types: @primitive. Appears in tuple (13,1,146)
Relevant element: argumentid=13
Full ID for 13: @"type;string"
Relevant element: parentid=146
Full ID for 146: @"class;foo.bar.C1;(13);(13)". The ID may expand to @"class;foo.bar.C1;{@"type;string"};{@"type;string"}"

View File

@@ -0,0 +1,27 @@
genericType
| generics.kt:11:1:11:19 | C0 | generics.kt:11:15:11:15 | V | 0 |
| generics.kt:13:1:18:1 | C1 | generics.kt:13:10:13:10 | T | 0 |
| generics.kt:13:1:18:1 | C1 | generics.kt:13:13:13:13 | W | 1 |
parameterizedType
| generics.kt:11:1:11:19 | C0 | generics.kt:11:1:11:19 | C0 | 0 | generics.kt:7:6:7:6 | S |
| generics.kt:11:1:11:19 | C0 | generics.kt:11:1:11:19 | C0 | 0 | generics.kt:11:15:11:15 | V |
| generics.kt:11:1:11:19 | C0 | generics.kt:11:1:11:19 | C0 | 0 | generics.kt:13:13:13:13 | W |
| generics.kt:13:1:18:1 | C1 | generics.kt:13:1:18:1 | C1 | 0 | file://:0:0:0:0 | int |
| generics.kt:13:1:18:1 | C1 | generics.kt:13:1:18:1 | C1 | 0 | file://:0:0:0:0 | string |
| generics.kt:13:1:18:1 | C1 | generics.kt:13:1:18:1 | C1 | 0 | file://:0:0:0:0 | string |
| generics.kt:13:1:18:1 | C1 | generics.kt:13:1:18:1 | C1 | 0 | generics.kt:13:10:13:10 | T |
| generics.kt:13:1:18:1 | C1 | generics.kt:13:1:18:1 | C1 | 0 | generics.kt:15:10:15:10 | U |
| generics.kt:13:1:18:1 | C1 | generics.kt:13:1:18:1 | C1 | 1 | file://:0:0:0:0 | int |
| generics.kt:13:1:18:1 | C1 | generics.kt:13:1:18:1 | C1 | 1 | file://:0:0:0:0 | int |
| generics.kt:13:1:18:1 | C1 | generics.kt:13:1:18:1 | C1 | 1 | file://:0:0:0:0 | string |
| generics.kt:13:1:18:1 | C1 | generics.kt:13:1:18:1 | C1 | 1 | generics.kt:13:13:13:13 | W |
| generics.kt:13:1:18:1 | C1 | generics.kt:13:1:18:1 | C1 | 1 | generics.kt:15:10:15:10 | U |
genericFunction
| generics.kt:3:1:5:1 | f0 | generics.kt:3:6:3:6 | S | 0 |
| generics.kt:7:1:9:1 | f1 | generics.kt:7:6:7:6 | S | 0 |
| generics.kt:15:5:17:5 | f2 | generics.kt:15:10:15:10 | U | 0 |
| generics.kt:21:5:21:23 | f4 | generics.kt:21:10:21:10 | P | 0 |
genericCall
| generics.kt:27:17:27:22 | f2(...) | generics.kt:15:10:15:10 | U | file://:0:0:0:0 | string |
| generics.kt:30:17:30:21 | f2(...) | generics.kt:15:10:15:10 | U | file://:0:0:0:0 | int |
| generics.kt:32:8:32:12 | f4(...) | generics.kt:21:10:21:10 | P | file://:0:0:0:0 | int |

View File

@@ -1,10 +1,33 @@
package foo.bar
fun <S> Int.f(s: S): S {
fun <S> Int.f0(s: S): S {
return s
}
class C1<T>(val t: T) {
fun f1(t: T) {}
fun <U> f2(u: U) {}
fun <S> Int.f1(s: S): C0<S>? {
return null
}
open class C0<V> {}
class C1<T, W>(val t: T) : C0<W>() {
fun f1(t: T) {}
fun <U> f2(u: U): C1<U, U> {
return C1<U, U>(u)
}
}
class C2() {
fun <P> f4(p: P) {}
}
fun m() {
val c1 = C1<Int, Int>(1)
c1.f1(2)
val x1 = c1.f2("")
val c2 = C1<String, Int>("")
c2.f1("a")
val x2 = c2.f2(3)
val c3 = C2()
c3.f4(5)
}

View File

@@ -0,0 +1,13 @@
import java
query predicate genericType(GenericType t, TypeVariable tv, int i) { t.getTypeParameter(i) = tv }
query predicate parameterizedType(ParameterizedType t, GenericType gt, int i, RefType ta) {
t.getGenericType() = gt and t.getTypeArgument(i) = ta
}
query predicate genericFunction(GenericCallable c, TypeVariable tv, int i) {
c.getTypeParameter(i) = tv
}
query predicate genericCall(GenericCall c, TypeVariable tv, Type t) { c.getATypeArgument(tv) = t }

View File

@@ -1,5 +0,0 @@
genericType
| generics.kt:7:10:7:10 | T | generics.kt:7:1:10:1 | C1 |
genericFunction
| generics.kt:3:6:3:6 | S | generics.kt:3:1:5:1 | f |
| generics.kt:9:10:9:10 | U | generics.kt:9:5:9:23 | f2 |

View File

@@ -1,5 +0,0 @@
import java
query predicate genericType(TypeVariable tv, RefType rt) { tv.getGenericType() = rt }
query predicate genericFunction(TypeVariable tv, GenericCallable c) { tv.getGenericCallable() = c }