Test case for generic inner type instantiation

This commit is contained in:
Tamas Vajk
2021-12-21 13:13:58 +01:00
committed by Ian Lynagh
parent 978978b86a
commit 9e21fa838e
4 changed files with 310 additions and 0 deletions

View File

@@ -0,0 +1,230 @@
generics.kt:
# 0| [CompilationUnit] generics
# 0| 1: [Class] GenericsKt
# 3| 1: [ExtensionMethod] f0
#-----| 2: (Generic Parameters)
# 3| 0: [TypeVariable] S
#-----| 4: (Parameters)
# 3| 0: [Parameter] <this>
# 3| 1: [Parameter] s
# 3| 5: [BlockStmt] { ... }
# 4| 0: [ReturnStmt] return ...
# 4| 0: [VarAccess] s
# 7| 2: [ExtensionMethod] f1
#-----| 2: (Generic Parameters)
# 7| 0: [TypeVariable] S
#-----| 4: (Parameters)
# 7| 0: [Parameter] <this>
# 7| 1: [Parameter] s
# 7| 5: [BlockStmt] { ... }
# 8| 0: [ReturnStmt] return ...
# 8| 0: [NullLiteral] null
# 24| 3: [Method] m
# 24| 5: [BlockStmt] { ... }
# 25| 0: [LocalVariableDeclStmt] var ...;
# 25| 1: [LocalVariableDeclExpr] c1
# 25| 0: [ClassInstanceExpr] new C1<Integer,Integer>(...)
# 25| -3: [TypeAccess] C1<Integer,Integer>
# 25| 0: [TypeAccess] Integer
# 25| 1: [TypeAccess] Integer
# 25| 0: [IntegerLiteral] 1
# 26| 1: [ExprStmt] <Expr>;
# 26| 0: [MethodAccess] f1(...)
# 26| -1: [VarAccess] c1
# 26| 0: [IntegerLiteral] 2
# 27| 2: [LocalVariableDeclStmt] var ...;
# 27| 1: [LocalVariableDeclExpr] x1
# 27| 0: [MethodAccess] f2(...)
# 27| -2: [TypeAccess] String
# 27| -1: [VarAccess] c1
# 27| 0: [StringLiteral]
# 28| 3: [LocalVariableDeclStmt] var ...;
# 28| 1: [LocalVariableDeclExpr] c2
# 28| 0: [ClassInstanceExpr] new C1<String,Integer>(...)
# 28| -3: [TypeAccess] C1<String,Integer>
# 28| 0: [TypeAccess] String
# 28| 1: [TypeAccess] Integer
# 28| 0: [StringLiteral]
# 29| 4: [ExprStmt] <Expr>;
# 29| 0: [MethodAccess] f1(...)
# 29| -1: [VarAccess] c2
# 29| 0: [StringLiteral] a
# 30| 5: [LocalVariableDeclStmt] var ...;
# 30| 1: [LocalVariableDeclExpr] x2
# 30| 0: [MethodAccess] f2(...)
# 30| -2: [TypeAccess] Integer
# 30| -1: [VarAccess] c2
# 30| 0: [IntegerLiteral] 3
# 31| 6: [LocalVariableDeclStmt] var ...;
# 31| 1: [LocalVariableDeclExpr] c3
# 31| 0: [ClassInstanceExpr] new C2(...)
# 31| -3: [TypeAccess] C2
# 32| 7: [ExprStmt] <Expr>;
# 32| 0: [MethodAccess] f4(...)
# 32| -2: [TypeAccess] Integer
# 32| -1: [VarAccess] c3
# 32| 0: [IntegerLiteral] 5
# 33| 8: [LocalVariableDeclStmt] var ...;
# 33| 1: [LocalVariableDeclExpr] c4
# 33| 0: [ClassInstanceExpr] new C0<Integer>(...)
# 33| -3: [TypeAccess] C0<Integer>
# 33| 0: [TypeAccess] Integer
# 11| 2: [Class,GenericType,ParameterizedType] C0
#-----| -2: (Generic Parameters)
# 11| 0: [TypeVariable] V
# 11| 2: [Constructor] C0
# 11| 5: [BlockStmt] { ... }
# 11| 0: [SuperConstructorInvocationStmt] super(...)
# 11| 1: [ExprStmt] <Expr>;
# 11| 0: [MethodAccess] <obinit>(...)
# 13| 9: [Class,GenericType,ParameterizedType] C1
#-----| -2: (Generic Parameters)
# 13| 0: [TypeVariable] T
# 13| 1: [TypeVariable] W
# 13| 1: [Constructor] C1
#-----| 4: (Parameters)
# 13| 0: [Parameter] t
# 13| 5: [BlockStmt] { ... }
# 13| 0: [SuperConstructorInvocationStmt] super(...)
# 13| 1: [ExprStmt] <Expr>;
# 13| 0: [MethodAccess] <obinit>(...)
# 13| 3: [Method] getT
# 13| 5: [BlockStmt] { ... }
# 13| 0: [ReturnStmt] return ...
# 13| 0: [VarAccess] this.t
# 13| -1: [ThisAccess] this
# 13| 3: [FieldDeclaration] T t;
# 13| -1: [TypeAccess] T
# 14| 5: [Method] f1
#-----| 4: (Parameters)
# 14| 0: [Parameter] t
# 14| 5: [BlockStmt] { ... }
# 15| 6: [Method] f2
#-----| 2: (Generic Parameters)
# 15| 0: [TypeVariable] U
#-----| 4: (Parameters)
# 15| 0: [Parameter] u
# 15| 5: [BlockStmt] { ... }
# 16| 0: [ReturnStmt] return ...
# 16| 0: [ClassInstanceExpr] new C1<U,U>(...)
# 16| -3: [TypeAccess] C1<U,U>
# 16| 0: [TypeAccess] U
# 16| 1: [TypeAccess] U
# 16| 0: [VarAccess] u
# 20| 15: [Class] C2
# 20| 1: [Constructor] C2
# 20| 5: [BlockStmt] { ... }
# 20| 0: [SuperConstructorInvocationStmt] super(...)
# 20| 1: [ExprStmt] <Expr>;
# 20| 0: [MethodAccess] <obinit>(...)
# 21| 3: [Method] f4
#-----| 2: (Generic Parameters)
# 21| 0: [TypeVariable] P
#-----| 4: (Parameters)
# 21| 0: [Parameter] p
# 21| 5: [BlockStmt] { ... }
# 36| 16: [Class,GenericType,ParameterizedType] BoundedTest
#-----| -2: (Generic Parameters)
# 36| 0: [TypeVariable] T
# 36| 1: [TypeVariable] S
# 36| 1: [Constructor] BoundedTest
# 36| 5: [BlockStmt] { ... }
# 36| 0: [SuperConstructorInvocationStmt] super(...)
# 36| 1: [ExprStmt] <Expr>;
# 36| 0: [MethodAccess] <obinit>(...)
# 38| 3: [Method] m
#-----| 4: (Parameters)
# 38| 0: [Parameter] s
# 38| 1: [Parameter] t
# 38| 5: [BlockStmt] { ... }
# 42| 17: [Class,GenericType,ParameterizedType] Outer
#-----| -2: (Generic Parameters)
# 42| 0: [TypeVariable] T1
# 42| 1: [TypeVariable] T2
# 42| 1: [Constructor] Outer
# 42| 5: [BlockStmt] { ... }
# 42| 0: [SuperConstructorInvocationStmt] super(...)
# 42| 1: [ExprStmt] <Expr>;
# 42| 0: [MethodAccess] <obinit>(...)
# 43| 3: [Class,GenericType,ParameterizedType] Inner1
#-----| -2: (Generic Parameters)
# 43| 0: [TypeVariable] T3
# 43| 1: [TypeVariable] T4
# 43| 2: [Constructor] Inner1
# 43| 5: [BlockStmt] { ... }
# 43| 0: [SuperConstructorInvocationStmt] super(...)
# 43| 1: [ExprStmt] <Expr>;
# 43| 0: [MethodAccess] <obinit>(...)
# 44| 3: [Method] fn1
#-----| 4: (Parameters)
# 44| 0: [Parameter] t1
# 44| 1: [Parameter] t2
# 44| 2: [Parameter] t3
# 44| 3: [Parameter] t4
# 44| 5: [BlockStmt] { ... }
# 45| 0: [LocalVariableDeclStmt] var ...;
# 45| 1: [LocalVariableDeclExpr] c
# 45| 0: [ClassInstanceExpr] new Inner1<Integer,String,T1,T2>(...)
# 45| -3: [TypeAccess] Inner1<Integer,String,T1,T2>
# 45| 0: [TypeAccess] Integer
# 45| 1: [TypeAccess] String
# 45| -2: [ThisAccess] Outer.this
# 45| 0: [TypeAccess] Outer
# 49| 4: [Class,GenericType,ParameterizedType] Nested1
#-----| -2: (Generic Parameters)
# 49| 0: [TypeVariable] T3
# 49| 1: [TypeVariable] T4
# 49| 1: [Constructor] Nested1
# 49| 5: [BlockStmt] { ... }
# 49| 0: [SuperConstructorInvocationStmt] super(...)
# 49| 1: [ExprStmt] <Expr>;
# 49| 0: [MethodAccess] <obinit>(...)
# 50| 3: [Method] fn2
#-----| 4: (Parameters)
# 50| 0: [Parameter] t3
# 50| 1: [Parameter] t4
# 50| 5: [BlockStmt] { ... }
# 51| 0: [LocalVariableDeclStmt] var ...;
# 51| 1: [LocalVariableDeclExpr] c
# 51| 0: [ClassInstanceExpr] new Nested1<Integer,String>(...)
# 51| -3: [TypeAccess] Nested1<Integer,String>
# 51| 0: [TypeAccess] Integer
# 51| 1: [TypeAccess] String
# 56| 21: [Class,GenericType,ParameterizedType] Class1
#-----| -2: (Generic Parameters)
# 56| 0: [TypeVariable] T1
# 56| 1: [Constructor] Class1
# 56| 5: [BlockStmt] { ... }
# 56| 0: [SuperConstructorInvocationStmt] super(...)
# 56| 1: [ExprStmt] <Expr>;
# 56| 0: [MethodAccess] <obinit>(...)
# 57| 3: [Method] fn1
#-----| 2: (Generic Parameters)
# 57| 0: [TypeVariable] T2
#-----| 4: (Parameters)
# 57| 0: [Parameter] t
# 57| 5: [BlockStmt] { ... }
# 58| 0: [LocalTypeDeclStmt] class ...
# 58| 0: [Class,GenericType,LocalClass,ParameterizedType] Local
#-----| -2: (Generic Parameters)
# 58| 0: [TypeVariable] T3
# 58| 1: [Constructor] Local
# 58| 5: [BlockStmt] { ... }
# 58| 0: [SuperConstructorInvocationStmt] super(...)
# 58| 1: [ExprStmt] <Expr>;
# 58| 0: [MethodAccess] <obinit>(...)
# 59| 3: [Method] fn2
#-----| 2: (Generic Parameters)
# 59| 0: [TypeVariable] T4
#-----| 4: (Parameters)
# 59| 0: [Parameter] t2
# 59| 1: [Parameter] t4
# 59| 5: [BlockStmt] { ... }
# 61| 1: [ExprStmt] <Expr>;
# 61| 0: [MethodAccess] fn2(...)
# 61| -2: [TypeAccess] String
# 61| -1: [ClassInstanceExpr] new Local<Integer,T2,T1>(...)
# 61| -3: [TypeAccess] Local<Integer,T2,T1>
# 61| 0: [TypeAccess] Integer
# 61| 0: [VarAccess] t
# 61| 1: [StringLiteral]

View File

@@ -0,0 +1 @@
semmle/code/java/PrintAst.ql

View File

@@ -4,6 +4,14 @@ genericType
| generics.kt:13:1:18:1 | C1 | generics.kt:13:13:13:13 | W | 1 |
| generics.kt:36:1:40:1 | BoundedTest | generics.kt:36:19:36:34 | T | 0 |
| generics.kt:36:1:40:1 | BoundedTest | generics.kt:36:37:36:41 | S | 1 |
| generics.kt:42:1:54:1 | Outer | generics.kt:42:13:42:14 | T1 | 0 |
| generics.kt:42:1:54:1 | Outer | generics.kt:42:17:42:18 | T2 | 1 |
| generics.kt:43:5:47:5 | Inner1 | generics.kt:43:24:43:25 | T3 | 0 |
| generics.kt:43:5:47:5 | Inner1 | generics.kt:43:28:43:29 | T4 | 1 |
| generics.kt:49:5:53:5 | Nested1 | generics.kt:49:19:49:20 | T3 | 0 |
| generics.kt:49:5:53:5 | Nested1 | generics.kt:49:23:49:24 | T4 | 1 |
| generics.kt:56:1:63:1 | Class1 | generics.kt:56:14:56:15 | T1 | 0 |
| generics.kt:58:9:60:9 | Local | generics.kt:58:21:58:22 | T3 | 0 |
parameterizedType
| generics.kt:11:1:11:19 | C0 | generics.kt:11:1:11:19 | C0 | 0 | V |
| generics.kt:11:1:11:19 | C0<?> | generics.kt:11:1:11:19 | C0 | 0 | ? |
@@ -26,6 +34,25 @@ parameterizedType
| generics.kt:13:1:18:1 | C1<U,U> | generics.kt:13:1:18:1 | C1 | 1 | U |
| generics.kt:36:1:40:1 | BoundedTest | generics.kt:36:1:40:1 | BoundedTest | 0 | T |
| generics.kt:36:1:40:1 | BoundedTest | generics.kt:36:1:40:1 | BoundedTest | 1 | S |
| generics.kt:42:1:54:1 | Outer | generics.kt:42:1:54:1 | Outer | 0 | T1 |
| generics.kt:42:1:54:1 | Outer | generics.kt:42:1:54:1 | Outer | 1 | T2 |
| generics.kt:42:1:54:1 | Outer<T1,T2> | generics.kt:42:1:54:1 | Outer | 0 | T1 |
| generics.kt:42:1:54:1 | Outer<T1,T2> | generics.kt:42:1:54:1 | Outer | 1 | T2 |
| generics.kt:43:5:47:5 | Inner1 | generics.kt:43:5:47:5 | Inner1 | 0 | T3 |
| generics.kt:43:5:47:5 | Inner1 | generics.kt:43:5:47:5 | Inner1 | 1 | T4 |
| generics.kt:43:5:47:5 | Inner1<Integer,String,T1,T2> | generics.kt:43:5:47:5 | Inner1 | 0 | Integer |
| generics.kt:43:5:47:5 | Inner1<Integer,String,T1,T2> | generics.kt:43:5:47:5 | Inner1 | 1 | String |
| generics.kt:43:5:47:5 | Inner1<Integer,String,T1,T2> | generics.kt:43:5:47:5 | Inner1 | 2 | T1 |
| generics.kt:43:5:47:5 | Inner1<Integer,String,T1,T2> | generics.kt:43:5:47:5 | Inner1 | 3 | T2 |
| generics.kt:49:5:53:5 | Nested1 | generics.kt:49:5:53:5 | Nested1 | 0 | T3 |
| generics.kt:49:5:53:5 | Nested1 | generics.kt:49:5:53:5 | Nested1 | 1 | T4 |
| generics.kt:49:5:53:5 | Nested1<Integer,String> | generics.kt:49:5:53:5 | Nested1 | 0 | Integer |
| generics.kt:49:5:53:5 | Nested1<Integer,String> | generics.kt:49:5:53:5 | Nested1 | 1 | String |
| generics.kt:56:1:63:1 | Class1 | generics.kt:56:1:63:1 | Class1 | 0 | T1 |
| generics.kt:58:9:60:9 | Local | generics.kt:58:9:60:9 | Local | 0 | T3 |
| generics.kt:58:9:60:9 | Local<Integer,T2,T1> | generics.kt:58:9:60:9 | Local | 0 | Integer |
| generics.kt:58:9:60:9 | Local<Integer,T2,T1> | generics.kt:58:9:60:9 | Local | 1 | T2 |
| generics.kt:58:9:60:9 | Local<Integer,T2,T1> | generics.kt:58:9:60:9 | Local | 2 | T1 |
function
| generics.kt:3:1:5:1 | f0 | f0(int,java.lang.Object) |
| generics.kt:7:1:9:1 | f1 | f1(int,java.lang.Object) |
@@ -56,6 +83,26 @@ function
| generics.kt:36:1:40:1 | <obinit> | <obinit>() |
| generics.kt:36:1:40:1 | BoundedTest | BoundedTest() |
| generics.kt:38:5:38:25 | m | m(java.lang.CharSequence,java.lang.CharSequence) |
| generics.kt:42:1:54:1 | <obinit> | <obinit>() |
| generics.kt:42:1:54:1 | Outer | Outer() |
| generics.kt:43:5:47:5 | <obinit> | <obinit>() |
| generics.kt:43:11:47:5 | Inner1 | Inner1() |
| generics.kt:43:11:47:5 | Inner1<Integer,String,T1,T2> | Inner1<Integer,String,T1,T2>() |
| generics.kt:44:9:46:9 | fn1 | fn1(java.lang.Object,java.lang.Object,int,java.lang.String) |
| generics.kt:44:9:46:9 | fn1 | fn1(java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object) |
| generics.kt:49:5:53:5 | <obinit> | <obinit>() |
| generics.kt:49:5:53:5 | Nested1 | Nested1() |
| generics.kt:49:5:53:5 | Nested1<Integer,String> | Nested1<Integer,String>() |
| generics.kt:50:9:52:9 | fn2 | fn2(int,java.lang.String) |
| generics.kt:50:9:52:9 | fn2 | fn2(java.lang.Object,java.lang.Object) |
| generics.kt:56:1:63:1 | <obinit> | <obinit>() |
| generics.kt:56:1:63:1 | Class1 | Class1() |
| generics.kt:57:5:62:5 | fn1 | fn1(java.lang.Object) |
| generics.kt:58:9:60:9 | <obinit> | <obinit>() |
| generics.kt:58:9:60:9 | Local | Local() |
| generics.kt:58:9:60:9 | Local<Integer,T2,T1> | Local<Integer,T2,T1>() |
| generics.kt:59:13:59:43 | fn2 | fn2(java.lang.Object,java.lang.Object) |
| generics.kt:59:13:59:43 | fn2 | fn2(java.lang.Object,java.lang.Object) |
genericFunction
| generics.kt:3:1:5:1 | f0 | generics.kt:0:0:0:0 | GenericsKt | generics.kt:3:6:3:6 | S | 0 |
| generics.kt:7:1:9:1 | f1 | generics.kt:0:0:0:0 | GenericsKt | generics.kt:7:6:7:6 | S | 0 |
@@ -64,10 +111,14 @@ genericFunction
| generics.kt:15:5:17:5 | f2 | generics.kt:13:1:18:1 | C1<String,Integer> | generics.kt:15:10:15:10 | U | 0 |
| generics.kt:15:5:17:5 | f2 | generics.kt:13:1:18:1 | C1<U,U> | generics.kt:15:10:15:10 | U | 0 |
| generics.kt:21:5:21:23 | f4 | generics.kt:20:1:22:1 | C2 | generics.kt:21:10:21:10 | P | 0 |
| generics.kt:57:5:62:5 | fn1 | generics.kt:56:1:63:1 | Class1 | generics.kt:57:10:57:11 | T2 | 0 |
| generics.kt:59:13:59:43 | fn2 | generics.kt:58:9:60:9 | Local | generics.kt:59:18:59:19 | T4 | 0 |
| generics.kt:59:13:59:43 | fn2 | generics.kt:58:9:60:9 | Local<Integer,T2,T1> | generics.kt:59:18:59:19 | T4 | 0 |
genericCall
| generics.kt:27:17:27:22 | f2(...) | generics.kt:15:10:15:10 | U | String |
| generics.kt:30:17:30:21 | f2(...) | generics.kt:15:10:15:10 | U | Integer |
| generics.kt:32:8:32:12 | f4(...) | generics.kt:21:10:21:10 | P | Integer |
| generics.kt:61:22:61:31 | fn2(...) | generics.kt:59:18:59:19 | T4 | String |
genericCtor
| generics.kt:16:16:16:26 | new C1<U,U>(...) | 0 | U |
| generics.kt:16:16:16:26 | new C1<U,U>(...) | 1 | U |
@@ -76,3 +127,8 @@ genericCtor
| generics.kt:28:14:28:32 | new C1<String,Integer>(...) | 0 | String |
| generics.kt:28:14:28:32 | new C1<String,Integer>(...) | 1 | Integer |
| generics.kt:33:21:33:29 | new C0<Integer>(...) | 0 | Integer |
| generics.kt:45:21:45:41 | new Inner1<Integer,String,T1,T2>(...) | 0 | Integer |
| generics.kt:45:21:45:41 | new Inner1<Integer,String,T1,T2>(...) | 1 | String |
| generics.kt:51:21:51:42 | new Nested1<Integer,String>(...) | 0 | Integer |
| generics.kt:51:21:51:42 | new Nested1<Integer,String>(...) | 1 | String |
| generics.kt:61:9:61:20 | new Local<Integer,T2,T1>(...) | 0 | Integer |

View File

@@ -38,3 +38,26 @@ class BoundedTest<T : CharSequence, S : T> {
fun m(s: S, t: T) { }
}
class Outer<T1, T2> {
inner class Inner1<T3, T4> {
fun fn1(t1: T1, t2: T2, t3: T3, t4: T4) {
val c = Inner1<Int, String>()
}
}
class Nested1<T3, T4> {
fun fn2(t3: T3, t4: T4) {
val c = Nested1<Int, String>()
}
}
}
class Class1<T1> {
fun <T2> fn1(t: T2) {
class Local<T3> {
fun <T4> fn2(t2: T2, t4: T4) {}
}
Local<Int>().fn2(t, "")
}
}