From 3267d7c96e6d1673f790b7ca35ae1760a1efcd62 Mon Sep 17 00:00:00 2001 From: Tamas Vajk Date: Fri, 9 Sep 2022 11:06:29 +0200 Subject: [PATCH] Kotlin: Add test case with various nested generics --- .../typeParametersInScope.expected | 1 + .../library-tests/classes/PrintAst.expected | 168 ++++++++++++++++++ .../classes/anonymousClasses.expected | 5 + .../library-tests/classes/classes.expected | 12 ++ .../kotlin/library-tests/classes/classes.kt | 20 +++ .../library-tests/classes/ctorCalls.expected | 12 ++ .../library-tests/classes/diags.expected | 5 + .../classes/genericExprTypes.expected | 31 ++++ .../classes/generic_anonymous.kt | 20 +++ .../library-tests/classes/interfaces.expected | 2 + .../library-tests/classes/localClass.expected | 3 + .../library-tests/classes/paramTypes.expected | 7 + .../library-tests/classes/superTypes.expected | 17 ++ 13 files changed, 303 insertions(+) create mode 100644 java/ql/test/kotlin/library-tests/classes/CONSISTENCY/typeParametersInScope.expected diff --git a/java/ql/test/kotlin/library-tests/classes/CONSISTENCY/typeParametersInScope.expected b/java/ql/test/kotlin/library-tests/classes/CONSISTENCY/typeParametersInScope.expected new file mode 100644 index 00000000000..61b33166c32 --- /dev/null +++ b/java/ql/test/kotlin/library-tests/classes/CONSISTENCY/typeParametersInScope.expected @@ -0,0 +1 @@ +| Type Cl1 uses out-of-scope type variable U2. Note the Java extractor is known to sometimes do this; the Kotlin extractor should not. | diff --git a/java/ql/test/kotlin/library-tests/classes/PrintAst.expected b/java/ql/test/kotlin/library-tests/classes/PrintAst.expected index 1ba8a3396bf..e8308516f84 100644 --- a/java/ql/test/kotlin/library-tests/classes/PrintAst.expected +++ b/java/ql/test/kotlin/library-tests/classes/PrintAst.expected @@ -498,6 +498,66 @@ classes.kt: # 127| 1: [ExprStmt] ; # 127| 0: [ClassInstanceExpr] new (...) # 127| -3: [TypeAccess] Object +# 138| 25: [Class,GenericType,ParameterizedType] Cl0 +#-----| -2: (Generic Parameters) +# 138| 0: [TypeVariable] U0 +# 138| 1: [Constructor] Cl0 +# 138| 5: [BlockStmt] { ... } +# 138| 0: [SuperConstructorInvocationStmt] super(...) +# 138| 1: [BlockStmt] { ... } +# 139| 2: [Method] func1 +#-----| 2: (Generic Parameters) +# 139| 0: [TypeVariable] U1 +# 139| 3: [TypeAccess] Unit +# 139| 5: [BlockStmt] { ... } +# 140| 0: [LocalTypeDeclStmt] class ... +# 140| 0: [LocalClass] +# 140| 1: [Constructor] +# 140| 5: [BlockStmt] { ... } +# 140| 0: [SuperConstructorInvocationStmt] super(...) +# 140| 2: [Method] func2 +#-----| 2: (Generic Parameters) +# 140| 0: [TypeVariable] U2 +# 140| 3: [TypeAccess] Unit +# 140| 5: [BlockStmt] { ... } +# 141| 0: [LocalTypeDeclStmt] class ... +# 141| 0: [Class,GenericType,LocalClass,ParameterizedType] Cl1 +#-----| -2: (Generic Parameters) +# 141| 0: [TypeVariable] U3 +# 141| 1: [Constructor] Cl1 +# 141| 5: [BlockStmt] { ... } +# 141| 0: [SuperConstructorInvocationStmt] super(...) +# 141| 1: [BlockStmt] { ... } +# 142| 2: [Method] fn +# 142| 3: [TypeAccess] Unit +# 142| 5: [BlockStmt] { ... } +# 143| 0: [LocalVariableDeclStmt] var ...; +# 143| 1: [LocalVariableDeclExpr] x +# 143| 0: [ClassInstanceExpr] new Cl1(...) +# 143| -3: [TypeAccess] Cl1 +# 143| 0: [TypeAccess] U3 +# 150| 26: [Class,GenericType,ParameterizedType] Cl00 +#-----| -2: (Generic Parameters) +# 150| 0: [TypeVariable] U0 +# 150| 1: [Constructor] Cl00 +# 150| 5: [BlockStmt] { ... } +# 150| 0: [SuperConstructorInvocationStmt] super(...) +# 150| 1: [BlockStmt] { ... } +# 151| 2: [Class,GenericType,ParameterizedType] Cl01 +#-----| -2: (Generic Parameters) +# 151| 0: [TypeVariable] U1 +# 151| 1: [Constructor] Cl01 +# 151| 5: [BlockStmt] { ... } +# 151| 0: [SuperConstructorInvocationStmt] super(...) +# 151| 1: [BlockStmt] { ... } +# 152| 2: [Method] fn +# 152| 3: [TypeAccess] Unit +# 152| 5: [BlockStmt] { ... } +# 153| 0: [LocalVariableDeclStmt] var ...; +# 153| 1: [LocalVariableDeclExpr] x +# 153| 0: [ClassInstanceExpr] new Cl01(...) +# 153| -3: [TypeAccess] Cl01 +# 153| 0: [TypeAccess] U1 generic_anonymous.kt: # 0| [CompilationUnit] generic_anonymous # 0| 1: [Class] Generic_anonymousKt @@ -592,6 +652,114 @@ generic_anonymous.kt: # 7| 0: [MethodAccess] getMember(...) # 7| -1: [MethodAccess] getX$private(...) # 7| -1: [ThisAccess] this +# 15| 3: [Class,GenericType,ParameterizedType] Outer +#-----| -2: (Generic Parameters) +# 15| 0: [TypeVariable] T0 +# 15| 6: [Constructor] Outer +# 15| 5: [BlockStmt] { ... } +# 15| 0: [SuperConstructorInvocationStmt] super(...) +# 15| 1: [BlockStmt] { ... } +# 16| 7: [GenericType,Interface,ParameterizedType] C0 +#-----| -2: (Generic Parameters) +# 16| 0: [TypeVariable] T0 +# 17| 1: [Method] fn0 +# 17| 3: [TypeAccess] T0 +# 17| 5: [BlockStmt] { ... } +# 17| 0: [ReturnStmt] return ... +# 17| 0: [NullLiteral] null +# 20| 8: [GenericType,Interface,ParameterizedType] C1 +#-----| -2: (Generic Parameters) +# 20| 0: [TypeVariable] T1 +# 21| 1: [Method] fn1 +# 21| 3: [TypeAccess] T1 +# 21| 5: [BlockStmt] { ... } +# 21| 0: [ReturnStmt] return ... +# 21| 0: [NullLiteral] null +# 24| 9: [Method] func1 +#-----| 2: (Generic Parameters) +# 24| 0: [TypeVariable] U2 +# 24| 3: [TypeAccess] Unit +# 24| 5: [BlockStmt] { ... } +# 25| 0: [LocalTypeDeclStmt] class ... +# 25| 0: [LocalClass] +# 25| 1: [Constructor] +# 25| 5: [BlockStmt] { ... } +# 25| 0: [SuperConstructorInvocationStmt] super(...) +# 25| 2: [Method] func2 +#-----| 2: (Generic Parameters) +# 25| 0: [TypeVariable] U3 +# 25| 3: [TypeAccess] Unit +# 25| 5: [BlockStmt] { ... } +# 26| 0: [ExprStmt] ; +# 26| 0: [ImplicitCoercionToUnitExpr] +# 26| 0: [TypeAccess] Unit +# 26| 1: [StmtExpr] +# 26| 0: [BlockStmt] { ... } +# 26| 0: [LocalTypeDeclStmt] class ... +# 26| 0: [AnonymousClass,LocalClass] new Object(...) { ... } +# 26| 1: [Constructor] +# 26| 5: [BlockStmt] { ... } +# 26| 0: [SuperConstructorInvocationStmt] super(...) +# 26| 1: [BlockStmt] { ... } +# 26| 1: [ExprStmt] ; +# 26| 0: [ClassInstanceExpr] new (...) +# 26| -3: [TypeAccess] Object +# 27| 1: [ExprStmt] ; +# 27| 0: [ImplicitCoercionToUnitExpr] +# 27| 0: [TypeAccess] Unit +# 27| 1: [StmtExpr] +# 27| 0: [BlockStmt] { ... } +# 27| 0: [LocalTypeDeclStmt] class ... +# 27| 0: [AnonymousClass,LocalClass] new Object(...) { ... } +# 27| 1: [Constructor] +# 27| 5: [BlockStmt] { ... } +# 27| 0: [SuperConstructorInvocationStmt] super(...) +# 27| 1: [BlockStmt] { ... } +# 27| 1: [ExprStmt] ; +# 27| 0: [ClassInstanceExpr] new (...) +# 27| -3: [TypeAccess] Object +# 28| 2: [ExprStmt] ; +# 28| 0: [ImplicitCoercionToUnitExpr] +# 28| 0: [TypeAccess] Unit +# 28| 1: [StmtExpr] +# 28| 0: [BlockStmt] { ... } +# 28| 0: [LocalTypeDeclStmt] class ... +# 28| 0: [AnonymousClass,LocalClass] new Object(...) { ... } +# 28| 1: [Constructor] +# 28| 5: [BlockStmt] { ... } +# 28| 0: [SuperConstructorInvocationStmt] super(...) +# 28| 1: [BlockStmt] { ... } +# 28| 1: [ExprStmt] ; +# 28| 0: [ClassInstanceExpr] new (...) +# 28| -3: [TypeAccess] Object +# 29| 3: [ExprStmt] ; +# 29| 0: [ImplicitCoercionToUnitExpr] +# 29| 0: [TypeAccess] Unit +# 29| 1: [StmtExpr] +# 29| 0: [BlockStmt] { ... } +# 29| 0: [LocalTypeDeclStmt] class ... +# 29| 0: [AnonymousClass,LocalClass] new C0(...) { ... } +# 29| 1: [Constructor] +# 29| 5: [BlockStmt] { ... } +# 29| 0: [SuperConstructorInvocationStmt] super(...) +# 29| 1: [BlockStmt] { ... } +# 29| 1: [ExprStmt] ; +# 29| 0: [ClassInstanceExpr] new (...) +# 29| -3: [TypeAccess] C0 +# 30| 4: [ExprStmt] ; +# 30| 0: [ImplicitCoercionToUnitExpr] +# 30| 0: [TypeAccess] Unit +# 30| 1: [StmtExpr] +# 30| 0: [BlockStmt] { ... } +# 30| 0: [LocalTypeDeclStmt] class ... +# 30| 0: [AnonymousClass,LocalClass] new C0(...) { ... } +# 30| 1: [Constructor] +# 30| 5: [BlockStmt] { ... } +# 30| 0: [SuperConstructorInvocationStmt] super(...) +# 30| 1: [BlockStmt] { ... } +# 30| 1: [ExprStmt] ; +# 30| 0: [ClassInstanceExpr] new (...) +# 30| -3: [TypeAccess] C0 localClassField.kt: # 0| [CompilationUnit] localClassField # 1| 1: [Class] A diff --git a/java/ql/test/kotlin/library-tests/classes/anonymousClasses.expected b/java/ql/test/kotlin/library-tests/classes/anonymousClasses.expected index 686eb8a9159..e8e58d04440 100644 --- a/java/ql/test/kotlin/library-tests/classes/anonymousClasses.expected +++ b/java/ql/test/kotlin/library-tests/classes/anonymousClasses.expected @@ -7,6 +7,11 @@ | classes.kt:89:16:89:44 | new Interface3(...) { ... } | classes.kt:89:16:89:44 | new (...) | | classes.kt:89:16:89:44 | Interface3 | classes.kt:89:16:89:44 | class ... | | classes.kt:127:16:134:9 | new Object(...) { ... } | classes.kt:127:16:134:9 | new (...) | | classes.kt:127:16:134:9 | Object | classes.kt:127:16:134:9 | class ... | | generic_anonymous.kt:3:19:5:3 | new Object(...) { ... } | generic_anonymous.kt:3:19:5:3 | new (...) | | generic_anonymous.kt:3:19:5:3 | Object | generic_anonymous.kt:3:19:5:3 | class ... | +| generic_anonymous.kt:26:13:26:37 | new Object(...) { ... } | generic_anonymous.kt:26:13:26:37 | new (...) | | generic_anonymous.kt:26:13:26:37 | Object | generic_anonymous.kt:26:13:26:37 | class ... | +| generic_anonymous.kt:27:13:27:37 | new Object(...) { ... } | generic_anonymous.kt:27:13:27:37 | new (...) | | generic_anonymous.kt:27:13:27:37 | Object | generic_anonymous.kt:27:13:27:37 | class ... | +| generic_anonymous.kt:28:13:28:41 | new Object(...) { ... } | generic_anonymous.kt:28:13:28:41 | new (...) | | generic_anonymous.kt:28:13:28:41 | Object | generic_anonymous.kt:28:13:28:41 | class ... | +| generic_anonymous.kt:29:13:29:29 | new C0(...) { ... } | generic_anonymous.kt:29:13:29:29 | new (...) | | generic_anonymous.kt:29:13:29:29 | C0 | generic_anonymous.kt:29:13:29:29 | class ... | +| generic_anonymous.kt:30:13:30:33 | new C0(...) { ... } | generic_anonymous.kt:30:13:30:33 | new (...) | | generic_anonymous.kt:30:13:30:33 | C0 | generic_anonymous.kt:30:13:30:33 | class ... | | local_anonymous.kt:5:16:7:9 | new Object(...) { ... } | local_anonymous.kt:5:16:7:9 | new (...) | | local_anonymous.kt:5:16:7:9 | Object | local_anonymous.kt:5:16:7:9 | class ... | | local_anonymous.kt:29:31:35:5 | new Object(...) { ... } | local_anonymous.kt:29:31:35:5 | new (...) | | local_anonymous.kt:29:31:35:5 | Object | local_anonymous.kt:29:31:35:5 | class ... | | local_anonymous.kt:40:14:44:5 | new Interface2(...) { ... } | local_anonymous.kt:40:14:44:5 | new (...) | | local_anonymous.kt:40:14:44:5 | Interface2 | local_anonymous.kt:40:14:44:5 | class ... | diff --git a/java/ql/test/kotlin/library-tests/classes/classes.expected b/java/ql/test/kotlin/library-tests/classes/classes.expected index 2e3fd5a4305..d2f085665e1 100644 --- a/java/ql/test/kotlin/library-tests/classes/classes.expected +++ b/java/ql/test/kotlin/library-tests/classes/classes.expected @@ -34,9 +34,21 @@ | classes.kt:119:13:121:13 | Local2 | C1$Local2 | final, private | | classes.kt:127:16:134:9 | new Object(...) { ... } | | final, private | | classes.kt:129:17:131:17 | Local3 | C1$$Local3 | final, private | +| classes.kt:138:1:148:1 | Cl0 | Cl0 | final, public | +| classes.kt:140:9:146:9 | | Cl0$ | final, private | +| classes.kt:141:13:145:13 | Cl1 | Cl0$Cl1 | final, private | +| classes.kt:150:1:156:1 | Cl00 | Cl00 | final, public | +| classes.kt:151:5:155:5 | Cl01 | Cl00$Cl01 | final, public | | generic_anonymous.kt:0:0:0:0 | Generic_anonymousKt | Generic_anonymousKt | final, public | | generic_anonymous.kt:1:1:9:1 | Generic | Generic | final, private | | generic_anonymous.kt:3:19:5:3 | new Object(...) { ... } | | final, private | +| generic_anonymous.kt:15:1:33:1 | Outer | Outer | final, public | +| generic_anonymous.kt:25:9:31:9 | | Outer$ | final, private | +| generic_anonymous.kt:26:13:26:37 | new Object(...) { ... } | | final, private | +| generic_anonymous.kt:27:13:27:37 | new Object(...) { ... } | | final, private | +| generic_anonymous.kt:28:13:28:41 | new Object(...) { ... } | | final, private | +| generic_anonymous.kt:29:13:29:29 | new C0(...) { ... } | | final, private | +| generic_anonymous.kt:30:13:30:33 | new C0(...) { ... } | | final, private | | localClassField.kt:1:1:11:1 | A | A | final, public | | localClassField.kt:3:9:3:19 | L | A$L | final, private | | localClassField.kt:8:9:8:19 | L | A$L | final, private | diff --git a/java/ql/test/kotlin/library-tests/classes/classes.kt b/java/ql/test/kotlin/library-tests/classes/classes.kt index a5c73dbea75..d43ebf248ca 100644 --- a/java/ql/test/kotlin/library-tests/classes/classes.kt +++ b/java/ql/test/kotlin/library-tests/classes/classes.kt @@ -133,4 +133,24 @@ class C1 { } } } +} + +class Cl0 { + fun func1() { + fun func2() { + class Cl1{ + fun fn() { + val x = Cl1() + } + } + } + } +} + +class Cl00 { + class Cl01{ + fun fn() { + val x = Cl01() + } + } } \ No newline at end of file diff --git a/java/ql/test/kotlin/library-tests/classes/ctorCalls.expected b/java/ql/test/kotlin/library-tests/classes/ctorCalls.expected index 6567b235b6c..1b2abb08056 100644 --- a/java/ql/test/kotlin/library-tests/classes/ctorCalls.expected +++ b/java/ql/test/kotlin/library-tests/classes/ctorCalls.expected @@ -34,8 +34,20 @@ superCall | classes.kt:119:13:121:13 | super(...) | | classes.kt:127:16:134:9 | super(...) | | classes.kt:129:17:131:17 | super(...) | +| classes.kt:138:1:148:1 | super(...) | +| classes.kt:140:9:146:9 | super(...) | +| classes.kt:141:13:145:13 | super(...) | +| classes.kt:150:1:156:1 | super(...) | +| classes.kt:151:5:155:5 | super(...) | | generic_anonymous.kt:1:1:9:1 | super(...) | | generic_anonymous.kt:3:19:5:3 | super(...) | +| generic_anonymous.kt:15:1:33:1 | super(...) | +| generic_anonymous.kt:25:9:31:9 | super(...) | +| generic_anonymous.kt:26:13:26:37 | super(...) | +| generic_anonymous.kt:27:13:27:37 | super(...) | +| generic_anonymous.kt:28:13:28:41 | super(...) | +| generic_anonymous.kt:29:13:29:29 | super(...) | +| generic_anonymous.kt:30:13:30:33 | super(...) | | localClassField.kt:1:1:11:1 | super(...) | | localClassField.kt:3:9:3:19 | super(...) | | localClassField.kt:8:9:8:19 | super(...) | diff --git a/java/ql/test/kotlin/library-tests/classes/diags.expected b/java/ql/test/kotlin/library-tests/classes/diags.expected index e69de29bb2d..5e5e247bfc0 100644 --- a/java/ql/test/kotlin/library-tests/classes/diags.expected +++ b/java/ql/test/kotlin/library-tests/classes/diags.expected @@ -0,0 +1,5 @@ +| file://:0:0:0:0 | Unexpected specialised instance of generic anonymous class | CodeQL Kotlin extractor | 5 | | Unexpected specialised instance of generic anonymous class | 2022-09-09 11:08:33 Unexpected specialised instance of generic anonymous class ...while extracting a expression () at generic_anonymous.kt:26:13:26:37\n ...while extracting a type operator call () at generic_anonymous.kt:26:13:26:37\n ...while extracting a expression () at generic_anonymous.kt:26:13:26:37\n ...while extracting a statement () at generic_anonymous.kt:26:13:26:37\n ...while extracting a block body () at generic_anonymous.kt:25:26:31:9\n ...while extracting a body () at generic_anonymous.kt:25:26:31:9\n ...while extracting a function (func2) at generic_anonymous.kt:25:9:31:9\n ...while extracting a generated class (func2) at generic_anonymous.kt:25:9:31:9\n ...while extracting a statement (func2) at generic_anonymous.kt:25:9:31:9\n ...while extracting a block body () at generic_anonymous.kt:24:22:32:5\n ...while extracting a body () at generic_anonymous.kt:24:22:32:5\n ...while extracting a function (func1) at generic_anonymous.kt:24:5:32:5\n ...while extracting a declaration (func1) at generic_anonymous.kt:24:5:32:5\n ...while extracting a class source (Outer) at generic_anonymous.kt:15:1:33:1\n ...while extracting a declaration (Outer) at generic_anonymous.kt:15:1:33:1\n ...while extracting a file (generic_anonymous.kt) at generic_anonymous.kt:1:1:34:0\n | +| file://:0:0:0:0 | Unexpected specialised instance of generic anonymous class | CodeQL Kotlin extractor | 5 | | Unexpected specialised instance of generic anonymous class | 2022-09-09 11:08:33 Unexpected specialised instance of generic anonymous class ...while extracting a expression () at generic_anonymous.kt:27:13:27:37\n ...while extracting a type operator call () at generic_anonymous.kt:27:13:27:37\n ...while extracting a expression () at generic_anonymous.kt:27:13:27:37\n ...while extracting a statement () at generic_anonymous.kt:27:13:27:37\n ...while extracting a block body () at generic_anonymous.kt:25:26:31:9\n ...while extracting a body () at generic_anonymous.kt:25:26:31:9\n ...while extracting a function (func2) at generic_anonymous.kt:25:9:31:9\n ...while extracting a generated class (func2) at generic_anonymous.kt:25:9:31:9\n ...while extracting a statement (func2) at generic_anonymous.kt:25:9:31:9\n ...while extracting a block body () at generic_anonymous.kt:24:22:32:5\n ...while extracting a body () at generic_anonymous.kt:24:22:32:5\n ...while extracting a function (func1) at generic_anonymous.kt:24:5:32:5\n ...while extracting a declaration (func1) at generic_anonymous.kt:24:5:32:5\n ...while extracting a class source (Outer) at generic_anonymous.kt:15:1:33:1\n ...while extracting a declaration (Outer) at generic_anonymous.kt:15:1:33:1\n ...while extracting a file (generic_anonymous.kt) at generic_anonymous.kt:1:1:34:0\n | +| file://:0:0:0:0 | Unexpected specialised instance of generic anonymous class | CodeQL Kotlin extractor | 5 | | Unexpected specialised instance of generic anonymous class | 2022-09-09 11:08:33 Unexpected specialised instance of generic anonymous class ...while extracting a expression () at generic_anonymous.kt:28:13:28:41\n ...while extracting a type operator call () at generic_anonymous.kt:28:13:28:41\n ...while extracting a expression () at generic_anonymous.kt:28:13:28:41\n ...while extracting a statement () at generic_anonymous.kt:28:13:28:41\n ...while extracting a block body () at generic_anonymous.kt:25:26:31:9\n ...while extracting a body () at generic_anonymous.kt:25:26:31:9\n ...while extracting a function (func2) at generic_anonymous.kt:25:9:31:9\n ...while extracting a generated class (func2) at generic_anonymous.kt:25:9:31:9\n ...while extracting a statement (func2) at generic_anonymous.kt:25:9:31:9\n ...while extracting a block body () at generic_anonymous.kt:24:22:32:5\n ...while extracting a body () at generic_anonymous.kt:24:22:32:5\n ...while extracting a function (func1) at generic_anonymous.kt:24:5:32:5\n ...while extracting a declaration (func1) at generic_anonymous.kt:24:5:32:5\n ...while extracting a class source (Outer) at generic_anonymous.kt:15:1:33:1\n ...while extracting a declaration (Outer) at generic_anonymous.kt:15:1:33:1\n ...while extracting a file (generic_anonymous.kt) at generic_anonymous.kt:1:1:34:0\n | +| file://:0:0:0:0 | Unexpected specialised instance of generic anonymous class | CodeQL Kotlin extractor | 5 | | Unexpected specialised instance of generic anonymous class | 2022-09-09 11:08:33 Unexpected specialised instance of generic anonymous class ...while extracting a expression () at generic_anonymous.kt:29:13:29:29\n ...while extracting a type operator call () at generic_anonymous.kt:29:13:29:29\n ...while extracting a expression () at generic_anonymous.kt:29:13:29:29\n ...while extracting a statement () at generic_anonymous.kt:29:13:29:29\n ...while extracting a block body () at generic_anonymous.kt:25:26:31:9\n ...while extracting a body () at generic_anonymous.kt:25:26:31:9\n ...while extracting a function (func2) at generic_anonymous.kt:25:9:31:9\n ...while extracting a generated class (func2) at generic_anonymous.kt:25:9:31:9\n ...while extracting a statement (func2) at generic_anonymous.kt:25:9:31:9\n ...while extracting a block body () at generic_anonymous.kt:24:22:32:5\n ...while extracting a body () at generic_anonymous.kt:24:22:32:5\n ...while extracting a function (func1) at generic_anonymous.kt:24:5:32:5\n ...while extracting a declaration (func1) at generic_anonymous.kt:24:5:32:5\n ...while extracting a class source (Outer) at generic_anonymous.kt:15:1:33:1\n ...while extracting a declaration (Outer) at generic_anonymous.kt:15:1:33:1\n ...while extracting a file (generic_anonymous.kt) at generic_anonymous.kt:1:1:34:0\n | +| file://:0:0:0:0 | Unexpected specialised instance of generic anonymous class | CodeQL Kotlin extractor | 5 | | Unexpected specialised instance of generic anonymous class | 2022-09-09 11:08:33 Unexpected specialised instance of generic anonymous class ...while extracting a expression () at generic_anonymous.kt:30:13:30:33\n ...while extracting a type operator call () at generic_anonymous.kt:30:13:30:33\n ...while extracting a expression () at generic_anonymous.kt:30:13:30:33\n ...while extracting a statement () at generic_anonymous.kt:30:13:30:33\n ...while extracting a block body () at generic_anonymous.kt:25:26:31:9\n ...while extracting a body () at generic_anonymous.kt:25:26:31:9\n ...while extracting a function (func2) at generic_anonymous.kt:25:9:31:9\n ...while extracting a generated class (func2) at generic_anonymous.kt:25:9:31:9\n ...while extracting a statement (func2) at generic_anonymous.kt:25:9:31:9\n ...while extracting a block body () at generic_anonymous.kt:24:22:32:5\n ...while extracting a body () at generic_anonymous.kt:24:22:32:5\n ...while extracting a function (func1) at generic_anonymous.kt:24:5:32:5\n ...while extracting a declaration (func1) at generic_anonymous.kt:24:5:32:5\n ...while extracting a class source (Outer) at generic_anonymous.kt:15:1:33:1\n ...while extracting a declaration (Outer) at generic_anonymous.kt:15:1:33:1\n ...while extracting a file (generic_anonymous.kt) at generic_anonymous.kt:1:1:34:0\n | diff --git a/java/ql/test/kotlin/library-tests/classes/genericExprTypes.expected b/java/ql/test/kotlin/library-tests/classes/genericExprTypes.expected index aa9514774a6..f4628d21bf8 100644 --- a/java/ql/test/kotlin/library-tests/classes/genericExprTypes.expected +++ b/java/ql/test/kotlin/library-tests/classes/genericExprTypes.expected @@ -44,3 +44,34 @@ | generic_anonymous.kt:13:27:13:41 | new Generic(...) | Generic | | generic_anonymous.kt:13:40:13:40 | i | int | | generic_anonymous.kt:13:43:13:47 | get(...) | int | +| generic_anonymous.kt:17:9:17:29 | T0 | T0 | +| generic_anonymous.kt:17:26:17:29 | null | Void | +| generic_anonymous.kt:21:9:21:29 | T1 | T1 | +| generic_anonymous.kt:21:26:21:29 | null | Void | +| generic_anonymous.kt:24:5:32:5 | Unit | Unit | +| generic_anonymous.kt:25:9:31:9 | Unit | Unit | +| generic_anonymous.kt:26:13:26:37 | | new Object(...) { ... } | +| generic_anonymous.kt:26:13:26:37 | | Unit | +| generic_anonymous.kt:26:13:26:37 | Object | Object | +| generic_anonymous.kt:26:13:26:37 | Unit | Unit | +| generic_anonymous.kt:26:13:26:37 | new (...) | new Object(...) { ... } | +| generic_anonymous.kt:27:13:27:37 | | new Object(...) { ... } | +| generic_anonymous.kt:27:13:27:37 | | Unit | +| generic_anonymous.kt:27:13:27:37 | Object | Object | +| generic_anonymous.kt:27:13:27:37 | Unit | Unit | +| generic_anonymous.kt:27:13:27:37 | new (...) | new Object(...) { ... } | +| generic_anonymous.kt:28:13:28:41 | | new Object(...) { ... } | +| generic_anonymous.kt:28:13:28:41 | | Unit | +| generic_anonymous.kt:28:13:28:41 | Object | Object | +| generic_anonymous.kt:28:13:28:41 | Unit | Unit | +| generic_anonymous.kt:28:13:28:41 | new (...) | new Object(...) { ... } | +| generic_anonymous.kt:29:13:29:29 | | new C0(...) { ... } | +| generic_anonymous.kt:29:13:29:29 | | Unit | +| generic_anonymous.kt:29:13:29:29 | C0 | C0 | +| generic_anonymous.kt:29:13:29:29 | Unit | Unit | +| generic_anonymous.kt:29:13:29:29 | new (...) | new C0(...) { ... } | +| generic_anonymous.kt:30:13:30:33 | | new C0(...) { ... } | +| generic_anonymous.kt:30:13:30:33 | | Unit | +| generic_anonymous.kt:30:13:30:33 | C0 | C0 | +| generic_anonymous.kt:30:13:30:33 | Unit | Unit | +| generic_anonymous.kt:30:13:30:33 | new (...) | new C0(...) { ... } | diff --git a/java/ql/test/kotlin/library-tests/classes/generic_anonymous.kt b/java/ql/test/kotlin/library-tests/classes/generic_anonymous.kt index df8d3a2a894..cca9b0e4668 100644 --- a/java/ql/test/kotlin/library-tests/classes/generic_anonymous.kt +++ b/java/ql/test/kotlin/library-tests/classes/generic_anonymous.kt @@ -11,3 +11,23 @@ private class Generic(val t: T) { fun stringIdentity(s: String) = Generic(s).get() fun intIdentity(i: Int) = Generic(i).get() + +class Outer { + open interface C0 { + fun fn0(): T0? = null + } + + open interface C1 { + fun fn1(): T1? = null + } + + fun func1() { + fun func2() { + object: C0, C1 {} + object: C0, C1 {} + object: C0, C1 {} + object: C0 {} + object: C0 {} + } + } +} diff --git a/java/ql/test/kotlin/library-tests/classes/interfaces.expected b/java/ql/test/kotlin/library-tests/classes/interfaces.expected index 79faca1ad6a..ffe6722111c 100644 --- a/java/ql/test/kotlin/library-tests/classes/interfaces.expected +++ b/java/ql/test/kotlin/library-tests/classes/interfaces.expected @@ -3,4 +3,6 @@ | classes.kt:59:1:59:23 | Interface1 | | classes.kt:60:1:60:23 | Interface2 | | classes.kt:61:1:61:26 | Interface3 | +| generic_anonymous.kt:16:5:18:5 | C0 | +| generic_anonymous.kt:20:5:22:5 | C1 | | local_anonymous.kt:38:1:38:23 | Interface2 | diff --git a/java/ql/test/kotlin/library-tests/classes/localClass.expected b/java/ql/test/kotlin/library-tests/classes/localClass.expected index 751b6649982..a53a8b3d477 100644 --- a/java/ql/test/kotlin/library-tests/classes/localClass.expected +++ b/java/ql/test/kotlin/library-tests/classes/localClass.expected @@ -2,6 +2,9 @@ | classes.kt:118:9:123:9 | class ... | classes.kt:118:9:123:9 | | classes.kt:117:5:124:5 | fn2 | classes.kt:109:1:136:1 | C1 | | classes.kt:119:13:121:13 | class ... | classes.kt:119:13:121:13 | Local2 | classes.kt:118:9:123:9 | localFn | classes.kt:109:1:136:1 | C1 | | classes.kt:129:17:131:17 | class ... | classes.kt:129:17:131:17 | Local3 | classes.kt:128:13:133:13 | fn | classes.kt:127:16:134:9 | new Object(...) { ... } | +| classes.kt:140:9:146:9 | class ... | classes.kt:140:9:146:9 | | classes.kt:139:5:147:5 | func1 | classes.kt:138:1:148:1 | Cl0 | +| classes.kt:141:13:145:13 | class ... | classes.kt:141:13:145:13 | Cl1 | classes.kt:140:9:146:9 | func2 | classes.kt:138:1:148:1 | Cl0 | +| generic_anonymous.kt:25:9:31:9 | class ... | generic_anonymous.kt:25:9:31:9 | | generic_anonymous.kt:24:5:32:5 | func1 | generic_anonymous.kt:15:1:33:1 | Outer | | localClassField.kt:3:9:3:19 | class ... | localClassField.kt:3:9:3:19 | L | localClassField.kt:1:1:11:1 | A | localClassField.kt:1:1:11:1 | A | | localClassField.kt:8:9:8:19 | class ... | localClassField.kt:8:9:8:19 | L | localClassField.kt:1:1:11:1 | A | localClassField.kt:1:1:11:1 | A | | local_anonymous.kt:11:9:11:24 | class ... | local_anonymous.kt:11:9:11:24 | | local_anonymous.kt:10:5:13:5 | fn2 | local_anonymous.kt:3:1:36:1 | Class1 | diff --git a/java/ql/test/kotlin/library-tests/classes/paramTypes.expected b/java/ql/test/kotlin/library-tests/classes/paramTypes.expected index 4c18ea2ed72..4b2d26f37a4 100644 --- a/java/ql/test/kotlin/library-tests/classes/paramTypes.expected +++ b/java/ql/test/kotlin/library-tests/classes/paramTypes.expected @@ -1,9 +1,15 @@ | classes.kt:111:9:113:9 | Local1 | 0 | classes.kt:111:22:111:23 | T1 | | classes.kt:119:13:121:13 | Local2 | 0 | classes.kt:119:26:119:27 | T1 | | classes.kt:129:17:131:17 | Local3 | 0 | classes.kt:129:30:129:31 | T1 | +| classes.kt:138:1:148:1 | Cl0 | 0 | classes.kt:138:11:138:12 | U0 | +| classes.kt:141:13:145:13 | Cl1 | 0 | classes.kt:141:23:141:24 | U3 | +| classes.kt:150:1:156:1 | Cl00 | 0 | classes.kt:150:12:150:13 | U0 | +| classes.kt:151:5:155:5 | Cl01 | 0 | classes.kt:151:16:151:17 | U1 | | file:///C1$$Local3.class:0:0:0:0 | Local3 | 0 | file:///Integer.class:0:0:0:0 | Integer | | file:///C1$Local1.class:0:0:0:0 | Local1 | 0 | file:///Integer.class:0:0:0:0 | Integer | | file:///C1$Local2.class:0:0:0:0 | Local2 | 0 | file:///Integer.class:0:0:0:0 | Integer | +| file:///Cl0$Cl1.class:0:0:0:0 | Cl1 | 0 | classes.kt:141:23:141:24 | U3 | +| file:///Cl0.class:0:0:0:0 | Cl0 | 0 | classes.kt:140:14:140:15 | U2 | | file:///Generic.class:0:0:0:0 | Generic | 0 | file:///Integer.class:0:0:0:0 | Integer | | file:///Generic.class:0:0:0:0 | Generic | 0 | file:///String.class:0:0:0:0 | String | | file:///SuperChain1.class:0:0:0:0 | SuperChain1 | 0 | superChain.kt:2:24:2:25 | T3 | @@ -13,6 +19,7 @@ | file:///SuperChain2.class:0:0:0:0 | SuperChain2 | 0 | superChain.kt:3:24:3:25 | T5 | | file:///SuperChain2.class:0:0:0:0 | SuperChain2 | 1 | file:///String.class:0:0:0:0 | String | | generic_anonymous.kt:1:1:9:1 | Generic | 0 | generic_anonymous.kt:1:23:1:23 | T | +| generic_anonymous.kt:15:1:33:1 | Outer | 0 | generic_anonymous.kt:15:13:15:14 | T0 | | superChain.kt:1:1:1:33 | SuperChain1 | 0 | superChain.kt:1:24:1:25 | T1 | | superChain.kt:1:1:1:33 | SuperChain1 | 1 | superChain.kt:1:28:1:29 | T2 | | superChain.kt:2:1:2:60 | SuperChain2 | 0 | superChain.kt:2:24:2:25 | T3 | diff --git a/java/ql/test/kotlin/library-tests/classes/superTypes.expected b/java/ql/test/kotlin/library-tests/classes/superTypes.expected index f0b7f0ca3e9..da7654d0098 100644 --- a/java/ql/test/kotlin/library-tests/classes/superTypes.expected +++ b/java/ql/test/kotlin/library-tests/classes/superTypes.expected @@ -39,9 +39,16 @@ | classes.kt:119:13:121:13 | Local2 | file:///Object.class:0:0:0:0 | Object | | classes.kt:127:16:134:9 | new Object(...) { ... } | file:///Object.class:0:0:0:0 | Object | | classes.kt:129:17:131:17 | Local3 | file:///Object.class:0:0:0:0 | Object | +| classes.kt:138:1:148:1 | Cl0 | file:///Object.class:0:0:0:0 | Object | +| classes.kt:140:9:146:9 | | file:///Object.class:0:0:0:0 | Object | +| classes.kt:141:13:145:13 | Cl1 | file:///Object.class:0:0:0:0 | Object | +| classes.kt:150:1:156:1 | Cl00 | file:///Object.class:0:0:0:0 | Object | +| classes.kt:151:5:155:5 | Cl01 | file:///Object.class:0:0:0:0 | Object | | file:///C1$$Local3.class:0:0:0:0 | Local3 | file:///Object.class:0:0:0:0 | Object | | file:///C1$Local1.class:0:0:0:0 | Local1 | file:///Object.class:0:0:0:0 | Object | | file:///C1$Local2.class:0:0:0:0 | Local2 | file:///Object.class:0:0:0:0 | Object | +| file:///Cl0$Cl1.class:0:0:0:0 | Cl1 | file:///Object.class:0:0:0:0 | Object | +| file:///Cl0.class:0:0:0:0 | Cl0 | file:///Object.class:0:0:0:0 | Object | | file:///Generic.class:0:0:0:0 | Generic | file:///Object.class:0:0:0:0 | Object | | file:///Generic.class:0:0:0:0 | Generic | file:///Object.class:0:0:0:0 | Object | | file:///SuperChain1.class:0:0:0:0 | SuperChain1 | file:///Object.class:0:0:0:0 | Object | @@ -49,6 +56,16 @@ | file:///SuperChain2.class:0:0:0:0 | SuperChain2 | file:///SuperChain1.class:0:0:0:0 | SuperChain1 | | generic_anonymous.kt:1:1:9:1 | Generic | file:///Object.class:0:0:0:0 | Object | | generic_anonymous.kt:3:19:5:3 | new Object(...) { ... } | file:///Object.class:0:0:0:0 | Object | +| generic_anonymous.kt:15:1:33:1 | Outer | file:///Object.class:0:0:0:0 | Object | +| generic_anonymous.kt:25:9:31:9 | | file:///Object.class:0:0:0:0 | Object | +| generic_anonymous.kt:26:13:26:37 | new Object(...) { ... } | file:///Outer$C0.class:0:0:0:0 | C0 | +| generic_anonymous.kt:26:13:26:37 | new Object(...) { ... } | file:///Outer$C1.class:0:0:0:0 | C1 | +| generic_anonymous.kt:27:13:27:37 | new Object(...) { ... } | file:///Outer$C0.class:0:0:0:0 | C0 | +| generic_anonymous.kt:27:13:27:37 | new Object(...) { ... } | file:///Outer$C1.class:0:0:0:0 | C1 | +| generic_anonymous.kt:28:13:28:41 | new Object(...) { ... } | file:///Outer$C0.class:0:0:0:0 | C0 | +| generic_anonymous.kt:28:13:28:41 | new Object(...) { ... } | file:///Outer$C1.class:0:0:0:0 | C1 | +| generic_anonymous.kt:29:13:29:29 | new C0(...) { ... } | file:///Outer$C0.class:0:0:0:0 | C0 | +| generic_anonymous.kt:30:13:30:33 | new C0(...) { ... } | file:///Outer$C0.class:0:0:0:0 | C0 | | localClassField.kt:1:1:11:1 | A | file:///Object.class:0:0:0:0 | Object | | localClassField.kt:3:9:3:19 | L | file:///Object.class:0:0:0:0 | Object | | localClassField.kt:8:9:8:19 | L | file:///Object.class:0:0:0:0 | Object |