diff --git a/codeql-workspace.yml b/codeql-workspace.yml index 31c94676962..5d8b300c8f4 100644 --- a/codeql-workspace.yml +++ b/codeql-workspace.yml @@ -1,7 +1,7 @@ provide: - "*/ql/src/qlpack.yml" - "*/ql/lib/qlpack.yml" - - "*/ql/test/qlpack.yml" + - "*/ql/test*/qlpack.yml" - "*/ql/examples/qlpack.yml" - "*/ql/consistency-queries/qlpack.yml" - "*/ql/automodel/src/qlpack.yml" diff --git a/java/ql/test-kotlin2/library-tests/.gitignore b/java/ql/test-kotlin2/library-tests/.gitignore new file mode 100644 index 00000000000..3e31e72635e --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/.gitignore @@ -0,0 +1,2 @@ +META-INF +*.class diff --git a/java/ql/test-kotlin2/library-tests/GeneratedFiles/Generated.expected b/java/ql/test-kotlin2/library-tests/GeneratedFiles/Generated.expected new file mode 100644 index 00000000000..6b4abd0e1a4 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/GeneratedFiles/Generated.expected @@ -0,0 +1 @@ +| Generated.kt:0:0:0:0 | Generated | diff --git a/java/ql/test-kotlin2/library-tests/GeneratedFiles/Generated.kt b/java/ql/test-kotlin2/library-tests/GeneratedFiles/Generated.kt new file mode 100644 index 00000000000..4aa496a1b7d --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/GeneratedFiles/Generated.kt @@ -0,0 +1,3 @@ +// This file was auto generated by me + +class B \ No newline at end of file diff --git a/java/ql/test-kotlin2/library-tests/GeneratedFiles/Generated.ql b/java/ql/test-kotlin2/library-tests/GeneratedFiles/Generated.ql new file mode 100644 index 00000000000..131acde1993 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/GeneratedFiles/Generated.ql @@ -0,0 +1,4 @@ +import java + +from GeneratedFile f +select f diff --git a/java/ql/test-kotlin2/library-tests/GeneratedFiles/NonGenerated.kt b/java/ql/test-kotlin2/library-tests/GeneratedFiles/NonGenerated.kt new file mode 100644 index 00000000000..4fd8af3f7a3 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/GeneratedFiles/NonGenerated.kt @@ -0,0 +1,3 @@ +// This file was not generated + +class A \ No newline at end of file diff --git a/java/ql/test-kotlin2/library-tests/android_function_return_types/returnTypes.expected b/java/ql/test-kotlin2/library-tests/android_function_return_types/returnTypes.expected new file mode 100644 index 00000000000..b482f60c01b --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/android_function_return_types/returnTypes.expected @@ -0,0 +1,4 @@ +| test.kt:4:5:6:5 | keySet | 0 | java.util.concurrent.ConcurrentHashMap$KeySetView | +| test.kt:8:5:10:5 | keySet | 1 | java.util.concurrent.ConcurrentHashMap$KeySetView | +| test.kt:17:5:19:5 | keySet | 0 | java.util.Set | +| test.kt:21:5:23:5 | keySet | 1 | java.util.concurrent.OtherConcurrentHashMap$KeySetView | diff --git a/java/ql/test-kotlin2/library-tests/android_function_return_types/returnTypes.ql b/java/ql/test-kotlin2/library-tests/android_function_return_types/returnTypes.ql new file mode 100644 index 00000000000..61951308af0 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/android_function_return_types/returnTypes.ql @@ -0,0 +1,5 @@ +import java + +from Method m +where m.fromSource() +select m, m.getNumberOfParameters(), m.getReturnType().(RefType).getQualifiedName() diff --git a/java/ql/test-kotlin2/library-tests/android_function_return_types/test.kt b/java/ql/test-kotlin2/library-tests/android_function_return_types/test.kt new file mode 100644 index 00000000000..eaebacd5b01 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/android_function_return_types/test.kt @@ -0,0 +1,27 @@ +package java.util.concurrent + +class ConcurrentHashMap { + fun keySet(): MutableSet { + return null!! + } + + fun keySet(p: V): KeySetView? { + return null + } + + class KeySetView { + } +} + +class OtherConcurrentHashMap { + fun keySet(): MutableSet { + return null!! + } + + fun keySet(p: V): KeySetView? { + return null + } + + class KeySetView { + } +} diff --git a/java/ql/test-kotlin2/library-tests/annotation-accessor-result-type/PrintAst.expected b/java/ql/test-kotlin2/library-tests/annotation-accessor-result-type/PrintAst.expected new file mode 100644 index 00000000000..3f91fe4f141 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/annotation-accessor-result-type/PrintAst.expected @@ -0,0 +1,21 @@ +test.kt: +# 0| [CompilationUnit] test +# 3| 1: [Interface] A +#-----| -3: (Annotations) +# 0| 1: [Annotation] Retention +# 0| 1: [VarAccess] RetentionPolicy.RUNTIME +# 0| -1: [TypeAccess] RetentionPolicy +# 3| 1: [Method] c1 +# 3| 3: [TypeAccess] Class +# 3| 0: [WildcardTypeAccess] ? ... +# 3| 2: [Method] c2 +# 3| 3: [TypeAccess] Class +# 3| 0: [WildcardTypeAccess] ? ... +# 3| 0: [TypeAccess] CharSequence +# 3| 3: [Method] c3 +# 3| 3: [TypeAccess] Class +# 3| 0: [TypeAccess] String +# 3| 4: [Method] c4 +# 3| 3: [TypeAccess] Class[] +# 3| 0: [TypeAccess] Class +# 3| 0: [WildcardTypeAccess] ? ... diff --git a/java/ql/test-kotlin2/library-tests/annotation-accessor-result-type/PrintAst.qlref b/java/ql/test-kotlin2/library-tests/annotation-accessor-result-type/PrintAst.qlref new file mode 100644 index 00000000000..c7fd5faf239 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/annotation-accessor-result-type/PrintAst.qlref @@ -0,0 +1 @@ +semmle/code/java/PrintAst.ql \ No newline at end of file diff --git a/java/ql/test-kotlin2/library-tests/annotation-accessor-result-type/test.expected b/java/ql/test-kotlin2/library-tests/annotation-accessor-result-type/test.expected new file mode 100644 index 00000000000..0391e2d9b86 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/annotation-accessor-result-type/test.expected @@ -0,0 +1,11 @@ +classExprs +| test.kt:3:20:3:36 | Class | Class | +| test.kt:3:39:3:70 | Class | Class | +| test.kt:3:73:3:94 | Class | Class | +| test.kt:3:97:3:120 | Class | Class | +| test.kt:3:97:3:120 | Class[] | Class[] | +#select +| test.kt:3:20:3:36 | c1 | Class | +| test.kt:3:39:3:70 | c2 | Class | +| test.kt:3:73:3:94 | c3 | Class | +| test.kt:3:97:3:120 | c4 | Class[] | diff --git a/java/ql/test-kotlin2/library-tests/annotation-accessor-result-type/test.kt b/java/ql/test-kotlin2/library-tests/annotation-accessor-result-type/test.kt new file mode 100644 index 00000000000..15d03914a1a --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/annotation-accessor-result-type/test.kt @@ -0,0 +1,3 @@ +import kotlin.reflect.KClass + +annotation class A(val c1: KClass<*>, val c2: KClass, val c3: KClass, val c4: Array>) { } diff --git a/java/ql/test-kotlin2/library-tests/annotation-accessor-result-type/test.ql b/java/ql/test-kotlin2/library-tests/annotation-accessor-result-type/test.ql new file mode 100644 index 00000000000..65576a7c19d --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/annotation-accessor-result-type/test.ql @@ -0,0 +1,11 @@ +import java + +query predicate classExprs(Expr e, string tstr) { + exists(e.getFile().getRelativePath()) and + tstr = e.getType().toString() and + tstr.matches("%Class%") +} + +from Method m +where m.getDeclaringType().fromSource() +select m, m.getReturnType().toString() diff --git a/java/ql/test-kotlin2/library-tests/annotation_classes/Annot0j.java b/java/ql/test-kotlin2/library-tests/annotation_classes/Annot0j.java new file mode 100644 index 00000000000..acadc19cc97 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/annotation_classes/Annot0j.java @@ -0,0 +1,3 @@ +public @interface Annot0j { + int abc() default 0; +} \ No newline at end of file diff --git a/java/ql/test-kotlin2/library-tests/annotation_classes/Annot1j.java b/java/ql/test-kotlin2/library-tests/annotation_classes/Annot1j.java new file mode 100644 index 00000000000..b3b1f072eee --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/annotation_classes/Annot1j.java @@ -0,0 +1,15 @@ +public @interface Annot1j { + int a() default 2; + + String b() default "ab"; + + Class c() default X.class; + + Y d() default Y.A; + + Y[] e() default { Y.A, Y.B }; + + Annot0j f() default @Annot0j( + abc = 1 + ); +} \ No newline at end of file diff --git a/java/ql/test-kotlin2/library-tests/annotation_classes/PrintAst.expected b/java/ql/test-kotlin2/library-tests/annotation_classes/PrintAst.expected new file mode 100644 index 00000000000..dfec79078ce --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/annotation_classes/PrintAst.expected @@ -0,0 +1,283 @@ +Annot0j.java: +# 0| [CompilationUnit] Annot0j +# 1| 1: [Interface] Annot0j +# 2| 1: [Method] abc +# 2| 3: [TypeAccess] int +Annot1j.java: +# 0| [CompilationUnit] Annot1j +# 1| 1: [Interface] Annot1j +# 2| 1: [Method] a +# 2| 3: [TypeAccess] int +# 4| 2: [Method] b +# 4| 3: [TypeAccess] String +# 6| 3: [Method] c +# 6| 3: [TypeAccess] Class<> +# 8| 4: [Method] d +# 8| 3: [TypeAccess] Y +# 10| 5: [Method] e +# 10| 3: [ArrayTypeAccess] ...[] +# 10| 0: [TypeAccess] Y +# 12| 6: [Method] f +# 12| 3: [TypeAccess] Annot0j +def.kt: +# 0| [CompilationUnit] def +# 0| 1: [Class] DefKt +# 45| 2: [Method] fn +#-----| 1: (Annotations) +# 45| 1: [Annotation] Annot0k +# 21| 1: [IntegerLiteral] 0 +#-----| 2: (Generic Parameters) +# 46| 0: [TypeVariable] T +# 45| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 46| 0: [Parameter] a +#-----| -1: (Annotations) +# 46| 1: [Annotation] Annot0k +# 21| 1: [IntegerLiteral] 0 +# 46| 0: [TypeAccess] Annot0k +# 46| 5: [BlockStmt] { ... } +# 47| 0: [ExprStmt] ; +# 47| 0: [MethodCall] println(...) +# 47| -1: [TypeAccess] ConsoleKt +# 47| 0: [MethodCall] a(...) +# 47| -1: [VarAccess] a +# 49| 1: [LocalVariableDeclStmt] var ...; +# 49| 1: [LocalVariableDeclExpr] x +# 50| 0: [IntegerLiteral] 10 +# 53| 3: [Method] getP +#-----| 1: (Annotations) +# 54| 1: [Annotation] Annot0k +# 21| 1: [IntegerLiteral] 0 +# 53| 3: [TypeAccess] int +# 53| 5: [BlockStmt] { ... } +# 53| 0: [ReturnStmt] return ... +# 53| 0: [VarAccess] DefKt.p +# 53| -1: [TypeAccess] DefKt +# 53| 4: [FieldDeclaration] int p; +#-----| -2: (Annotations) +# 56| 1: [Annotation] Annot0k +# 21| 1: [IntegerLiteral] 0 +# 53| -1: [TypeAccess] int +# 57| 0: [IntegerLiteral] 5 +# 53| 5: [Method] setP +#-----| 1: (Annotations) +# 55| 1: [Annotation] Annot0k +# 21| 1: [IntegerLiteral] 0 +# 53| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 53| 0: [Parameter] +# 53| 0: [TypeAccess] int +# 53| 5: [BlockStmt] { ... } +# 53| 0: [ExprStmt] ; +# 53| 0: [AssignExpr] ...=... +# 53| 0: [VarAccess] DefKt.p +# 53| -1: [TypeAccess] DefKt +# 53| 1: [VarAccess] +# 59| 6: [ExtensionMethod] myExtension +# 59| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 59| 0: [Parameter] +#-----| -1: (Annotations) +# 59| 1: [Annotation] Annot0k +# 21| 1: [IntegerLiteral] 0 +# 59| 0: [TypeAccess] String +# 59| 5: [BlockStmt] { ... } +# 5| 2: [Interface] Annot0k +#-----| -3: (Annotations) +# 0| 1: [Annotation] Retention +# 0| 1: [VarAccess] RetentionPolicy.RUNTIME +# 0| -1: [TypeAccess] RetentionPolicy +# 0| 2: [Annotation] Target +# 0| 1: [ArrayInit] {...} +# 0| 1: [VarAccess] ElementType.TYPE +# 0| -1: [TypeAccess] ElementType +# 0| 2: [VarAccess] ElementType.FIELD +# 0| -1: [TypeAccess] ElementType +# 0| 3: [VarAccess] ElementType.METHOD +# 0| -1: [TypeAccess] ElementType +# 0| 4: [VarAccess] ElementType.PARAMETER +# 0| -1: [TypeAccess] ElementType +# 0| 5: [VarAccess] ElementType.CONSTRUCTOR +# 0| -1: [TypeAccess] ElementType +# 0| 6: [VarAccess] ElementType.LOCAL_VARIABLE +# 0| -1: [TypeAccess] ElementType +# 0| 7: [VarAccess] ElementType.ANNOTATION_TYPE +# 0| -1: [TypeAccess] ElementType +# 0| 8: [VarAccess] ElementType.TYPE_PARAMETER +# 0| -1: [TypeAccess] ElementType +# 0| 9: [VarAccess] ElementType.TYPE_USE +# 0| -1: [TypeAccess] ElementType +# 5| 3: [Annotation] Target +# 5| 1: [ArrayInit] {...} +# 5| 1: [VarAccess] AnnotationTarget.CLASS +# 5| -1: [TypeAccess] AnnotationTarget +# 6| 2: [VarAccess] AnnotationTarget.ANNOTATION_CLASS +# 6| -1: [TypeAccess] AnnotationTarget +# 7| 3: [VarAccess] AnnotationTarget.TYPE_PARAMETER +# 7| -1: [TypeAccess] AnnotationTarget +# 8| 4: [VarAccess] AnnotationTarget.PROPERTY +# 8| -1: [TypeAccess] AnnotationTarget +# 9| 5: [VarAccess] AnnotationTarget.FIELD +# 9| -1: [TypeAccess] AnnotationTarget +# 10| 6: [VarAccess] AnnotationTarget.LOCAL_VARIABLE +# 10| -1: [TypeAccess] AnnotationTarget +# 11| 7: [VarAccess] AnnotationTarget.VALUE_PARAMETER +# 11| -1: [TypeAccess] AnnotationTarget +# 12| 8: [VarAccess] AnnotationTarget.CONSTRUCTOR +# 12| -1: [TypeAccess] AnnotationTarget +# 13| 9: [VarAccess] AnnotationTarget.FUNCTION +# 13| -1: [TypeAccess] AnnotationTarget +# 14| 10: [VarAccess] AnnotationTarget.PROPERTY_GETTER +# 14| -1: [TypeAccess] AnnotationTarget +# 15| 11: [VarAccess] AnnotationTarget.PROPERTY_SETTER +# 15| -1: [TypeAccess] AnnotationTarget +# 16| 12: [VarAccess] AnnotationTarget.TYPE +# 16| -1: [TypeAccess] AnnotationTarget +# 18| 13: [VarAccess] AnnotationTarget.FILE +# 18| -1: [TypeAccess] AnnotationTarget +# 19| 14: [VarAccess] AnnotationTarget.TYPEALIAS +# 19| -1: [TypeAccess] AnnotationTarget +# 21| 1: [Method] a +#-----| 1: (Annotations) +# 21| 1: [Annotation] JvmName +# 21| 1: [StringLiteral] "a" +# 21| 3: [TypeAccess] int +# 23| 3: [Interface] Annot1k +#-----| -3: (Annotations) +# 0| 1: [Annotation] Retention +# 0| 1: [VarAccess] RetentionPolicy.RUNTIME +# 0| -1: [TypeAccess] RetentionPolicy +# 23| 2: [Annotation] Annot0k +# 21| 1: [IntegerLiteral] 0 +# 25| 1: [Method] a +# 25| 3: [TypeAccess] int +# 26| 2: [Method] b +# 26| 3: [TypeAccess] String +# 27| 3: [Method] c +# 27| 3: [TypeAccess] Class +# 27| 0: [WildcardTypeAccess] ? ... +# 28| 4: [Method] d +# 28| 3: [TypeAccess] Y +# 29| 5: [Method] e +# 29| 3: [TypeAccess] Y[] +# 29| 0: [TypeAccess] Y +# 30| 6: [Method] f +# 30| 3: [TypeAccess] Annot0k +# 33| 4: [Class] X +# 33| 1: [Constructor] X +# 33| 5: [BlockStmt] { ... } +# 33| 0: [SuperConstructorInvocationStmt] super(...) +# 33| 1: [BlockStmt] { ... } +# 34| 5: [Class] Y +# 34| 2: [Constructor] Y +# 34| 5: [BlockStmt] { ... } +# 34| 0: [ExprStmt] ; +# 34| 0: [ClassInstanceExpr] new Enum(...) +# 34| -3: [TypeAccess] Enum +# 34| 0: [TypeAccess] Y +# 34| 0: [NullLiteral] null +# 34| 1: [IntegerLiteral] 0 +# 34| 1: [BlockStmt] { ... } +# 34| 3: [Method] getEntries +# 34| 3: [TypeAccess] EnumEntries +# 34| 0: [TypeAccess] Y +# 34| 4: [Method] valueOf +# 34| 3: [TypeAccess] Y +#-----| 4: (Parameters) +# 34| 0: [Parameter] value +# 34| 0: [TypeAccess] String +# 34| 5: [Method] values +# 34| 3: [TypeAccess] Y[] +# 34| 0: [TypeAccess] Y +# 35| 6: [FieldDeclaration] Y A; +# 35| -1: [TypeAccess] Y +# 35| 0: [ClassInstanceExpr] new Y(...) +# 35| -3: [TypeAccess] Y +# 35| 7: [FieldDeclaration] Y B; +# 35| -1: [TypeAccess] Y +# 35| 0: [ClassInstanceExpr] new Y(...) +# 35| -3: [TypeAccess] Y +# 35| 8: [FieldDeclaration] Y C; +# 35| -1: [TypeAccess] Y +# 35| 0: [ClassInstanceExpr] new Y(...) +# 35| -3: [TypeAccess] Y +# 38| 6: [Class] Z +#-----| -3: (Annotations) +# 38| 1: [Annotation] Annot0k +# 38| 1: [IntegerLiteral] 1 +# 39| 2: [Annotation] Annot1k +# 25| 1: [IntegerLiteral] 2 +# 26| 2: [StringLiteral] "ab" +# 27| 3: [TypeLiteral] X.class +# 27| 0: [TypeAccess] X +# 30| 4: [Annotation] Annot0k +# 30| 1: [IntegerLiteral] 1 +# 39| 5: [VarAccess] Y.B +# 39| -1: [TypeAccess] Y +# 39| 6: [ArrayInit] {...} +# 39| 1: [VarAccess] Y.C +# 39| -1: [TypeAccess] Y +# 39| 2: [VarAccess] Y.A +# 39| -1: [TypeAccess] Y +# 41| 1: [Constructor] Z +#-----| 1: (Annotations) +# 41| 1: [Annotation] Annot0k +# 21| 1: [IntegerLiteral] 0 +# 41| 5: [BlockStmt] { ... } +# 42| 0: [SuperConstructorInvocationStmt] super(...) +# 41| 1: [BlockStmt] { ... } +use.java: +# 0| [CompilationUnit] use +# 1| 1: [Class] use +#-----| -1: (Base Types) +# 1| 0: [TypeAccess] Annot0k +# 3| 2: [Method] a +#-----| 1: (Annotations) +# 2| 1: [Annotation] Override +# 3| 3: [TypeAccess] int +# 3| 5: [BlockStmt] { ... } +# 3| 0: [ReturnStmt] return ... +# 3| 0: [IntegerLiteral] 1 +# 6| 3: [Method] annotationType +#-----| 1: (Annotations) +# 5| 1: [Annotation] Override +# 6| 3: [TypeAccess] Class +# 6| 0: [WildcardTypeAccess] ? ... +# 6| 0: [TypeAccess] Annotation +# 6| 5: [BlockStmt] { ... } +# 7| 0: [ReturnStmt] return ... +# 7| 0: [NullLiteral] null +# 14| 4: [Class] Z +#-----| -3: (Annotations) +# 10| 1: [Annotation] Annot0j +# 10| 1: [IntegerLiteral] 1 +# 11| 2: [Annotation] Annot1j +# 11| 1: [IntegerLiteral] 1 +# 11| 2: [StringLiteral] "ac" +# 11| 3: [TypeLiteral] X.class +# 11| 0: [TypeAccess] X +# 11| 4: [VarAccess] Y.B +# 11| -1: [TypeAccess] Y +# 11| 5: [ArrayInit] {...} +# 11| 3: [VarAccess] Y.C +# 11| -1: [TypeAccess] Y +# 11| 4: [VarAccess] Y.A +# 11| -1: [TypeAccess] Y +# 11| 6: [Annotation] Annot0j +# 11| 1: [IntegerLiteral] 2 +# 12| 3: [Annotation] Annot0k +# 12| 1: [IntegerLiteral] 1 +# 13| 4: [Annotation] Annot1k +# 13| 1: [IntegerLiteral] 1 +# 13| 2: [StringLiteral] "ac" +# 13| 3: [TypeLiteral] X.class +# 13| 0: [TypeAccess] X +# 13| 4: [VarAccess] Y.B +# 13| -1: [TypeAccess] Y +# 13| 5: [ArrayInit] {...} +# 13| 3: [VarAccess] Y.C +# 13| -1: [TypeAccess] Y +# 13| 4: [VarAccess] Y.A +# 13| -1: [TypeAccess] Y +# 13| 6: [Annotation] Annot0k +# 13| 1: [IntegerLiteral] 2 diff --git a/java/ql/test-kotlin2/library-tests/annotation_classes/PrintAst.qlref b/java/ql/test-kotlin2/library-tests/annotation_classes/PrintAst.qlref new file mode 100644 index 00000000000..c7fd5faf239 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/annotation_classes/PrintAst.qlref @@ -0,0 +1 @@ +semmle/code/java/PrintAst.ql \ No newline at end of file diff --git a/java/ql/test-kotlin2/library-tests/annotation_classes/classes.expected b/java/ql/test-kotlin2/library-tests/annotation_classes/classes.expected new file mode 100644 index 00000000000..cf47ffc15bd --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/annotation_classes/classes.expected @@ -0,0 +1,82 @@ +#select +| Annot0j.java:1:19:1:25 | Annot0j | Interface | +| Annot1j.java:1:19:1:25 | Annot1j | Interface | +| def.kt:0:0:0:0 | DefKt | Class | +| def.kt:5:1:21:60 | Annot0k | Interface | +| def.kt:23:1:31:1 | Annot1k | Interface | +| def.kt:33:1:33:10 | X | Class | +| def.kt:34:1:36:1 | Y | Class | +| def.kt:38:1:43:1 | Z | Class | +| use.java:1:14:1:16 | use | Class | +| use.java:14:18:14:18 | Z | Class | +annotationDeclarations +| Annot0j.java:1:19:1:25 | Annot0j | Annot0j.java:2:9:2:11 | abc | +| Annot1j.java:1:19:1:25 | Annot1j | Annot1j.java:2:9:2:9 | a | +| Annot1j.java:1:19:1:25 | Annot1j | Annot1j.java:4:12:4:12 | b | +| Annot1j.java:1:19:1:25 | Annot1j | Annot1j.java:6:11:6:11 | c | +| Annot1j.java:1:19:1:25 | Annot1j | Annot1j.java:8:7:8:7 | d | +| Annot1j.java:1:19:1:25 | Annot1j | Annot1j.java:10:9:10:9 | e | +| Annot1j.java:1:19:1:25 | Annot1j | Annot1j.java:12:13:12:13 | f | +| def.kt:5:1:21:60 | Annot0k | def.kt:21:26:21:59 | a | +| def.kt:23:1:31:1 | Annot1k | def.kt:25:5:25:18 | a | +| def.kt:23:1:31:1 | Annot1k | def.kt:26:5:26:24 | b | +| def.kt:23:1:31:1 | Annot1k | def.kt:27:5:27:31 | c | +| def.kt:23:1:31:1 | Annot1k | def.kt:28:5:28:18 | d | +| def.kt:23:1:31:1 | Annot1k | def.kt:29:5:29:32 | e | +| def.kt:23:1:31:1 | Annot1k | def.kt:30:5:30:31 | f | +annotations +| def.kt:23:1:23:8 | Annot0k | def.kt:23:1:31:1 | Annot1k | def.kt:5:1:21:60 | Annot0k | +| def.kt:30:22:30:31 | Annot0k | def.kt:39:1:39:40 | Annot1k | def.kt:5:1:21:60 | Annot0k | +| def.kt:38:1:38:17 | Annot0k | def.kt:38:1:43:1 | Z | def.kt:5:1:21:60 | Annot0k | +| def.kt:39:1:39:40 | Annot1k | def.kt:38:1:43:1 | Z | def.kt:23:1:31:1 | Annot1k | +| def.kt:41:5:41:12 | Annot0k | def.kt:41:5:42:19 | Z | def.kt:5:1:21:60 | Annot0k | +| def.kt:45:1:45:8 | Annot0k | def.kt:45:1:51:1 | fn | def.kt:5:1:21:60 | Annot0k | +| def.kt:46:21:46:28 | Annot0k | def.kt:46:21:46:39 | a | def.kt:5:1:21:60 | Annot0k | +| def.kt:54:1:54:12 | Annot0k | def.kt:53:1:57:23 | getP | def.kt:5:1:21:60 | Annot0k | +| def.kt:55:1:55:12 | Annot0k | def.kt:53:1:57:23 | setP | def.kt:5:1:21:60 | Annot0k | +| def.kt:56:1:56:14 | Annot0k | def.kt:53:1:57:23 | p | def.kt:5:1:21:60 | Annot0k | +| def.kt:59:5:59:21 | Annot0k | def.kt:59:5:59:28 | | def.kt:5:1:21:60 | Annot0k | +| use.java:10:5:10:21 | Annot0j | use.java:14:18:14:18 | Z | Annot0j.java:1:19:1:25 | Annot0j | +| use.java:11:5:11:90 | Annot1j | use.java:14:18:14:18 | Z | Annot1j.java:1:19:1:25 | Annot1j | +| use.java:11:73:11:89 | Annot0j | use.java:11:5:11:90 | Annot1j | Annot0j.java:1:19:1:25 | Annot0j | +| use.java:12:5:12:19 | Annot0k | use.java:14:18:14:18 | Z | def.kt:5:1:21:60 | Annot0k | +| use.java:13:5:13:88 | Annot1k | use.java:14:18:14:18 | Z | def.kt:23:1:31:1 | Annot1k | +| use.java:13:73:13:87 | Annot0k | use.java:13:5:13:88 | Annot1k | def.kt:5:1:21:60 | Annot0k | +annotationValues +| def.kt:0:0:0:0 | Retention | def.kt:0:0:0:0 | RetentionPolicy.RUNTIME | +| def.kt:0:0:0:0 | Retention | def.kt:0:0:0:0 | RetentionPolicy.RUNTIME | +| def.kt:0:0:0:0 | Target | def.kt:0:0:0:0 | {...} | +| def.kt:5:1:20:1 | Target | def.kt:5:9:19:30 | {...} | +| def.kt:21:26:21:42 | JvmName | def.kt:21:39:21:41 | "a" | +| def.kt:23:1:23:8 | Annot0k | def.kt:21:59:21:59 | 0 | +| def.kt:30:22:30:31 | Annot0k | def.kt:30:30:30:30 | 1 | +| def.kt:38:1:38:17 | Annot0k | def.kt:38:16:38:16 | 1 | +| def.kt:39:1:39:40 | Annot1k | def.kt:25:18:25:18 | 2 | +| def.kt:39:1:39:40 | Annot1k | def.kt:26:21:26:24 | "ab" | +| def.kt:39:1:39:40 | Annot1k | def.kt:27:24:27:31 | X.class | +| def.kt:39:1:39:40 | Annot1k | def.kt:30:22:30:31 | Annot0k | +| def.kt:39:1:39:40 | Annot1k | def.kt:39:16:39:16 | Y.B | +| def.kt:39:1:39:40 | Annot1k | def.kt:39:23:39:39 | {...} | +| def.kt:41:5:41:12 | Annot0k | def.kt:21:59:21:59 | 0 | +| def.kt:45:1:45:8 | Annot0k | def.kt:21:59:21:59 | 0 | +| def.kt:46:21:46:28 | Annot0k | def.kt:21:59:21:59 | 0 | +| def.kt:54:1:54:12 | Annot0k | def.kt:21:59:21:59 | 0 | +| def.kt:55:1:55:12 | Annot0k | def.kt:21:59:21:59 | 0 | +| def.kt:56:1:56:14 | Annot0k | def.kt:21:59:21:59 | 0 | +| def.kt:59:5:59:21 | Annot0k | def.kt:21:59:21:59 | 0 | +| use.java:10:5:10:21 | Annot0j | use.java:10:20:10:20 | 1 | +| use.java:11:5:11:90 | Annot1j | use.java:11:18:11:18 | 1 | +| use.java:11:5:11:90 | Annot1j | use.java:11:25:11:28 | "ac" | +| use.java:11:5:11:90 | Annot1j | use.java:11:35:11:41 | X.class | +| use.java:11:5:11:90 | Annot1j | use.java:11:48:11:50 | Y.B | +| use.java:11:5:11:90 | Annot1j | use.java:11:57:11:66 | {...} | +| use.java:11:5:11:90 | Annot1j | use.java:11:73:11:89 | Annot0j | +| use.java:11:73:11:89 | Annot0j | use.java:11:88:11:88 | 2 | +| use.java:12:5:12:19 | Annot0k | use.java:12:18:12:18 | 1 | +| use.java:13:5:13:88 | Annot1k | use.java:13:18:13:18 | 1 | +| use.java:13:5:13:88 | Annot1k | use.java:13:25:13:28 | "ac" | +| use.java:13:5:13:88 | Annot1k | use.java:13:35:13:41 | X.class | +| use.java:13:5:13:88 | Annot1k | use.java:13:48:13:50 | Y.B | +| use.java:13:5:13:88 | Annot1k | use.java:13:57:13:66 | {...} | +| use.java:13:5:13:88 | Annot1k | use.java:13:73:13:87 | Annot0k | +| use.java:13:73:13:87 | Annot0k | use.java:13:86:13:86 | 2 | diff --git a/java/ql/test-kotlin2/library-tests/annotation_classes/classes.ql b/java/ql/test-kotlin2/library-tests/annotation_classes/classes.ql new file mode 100644 index 00000000000..936165cf023 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/annotation_classes/classes.ql @@ -0,0 +1,20 @@ +import java + +from ClassOrInterface x +where x.fromSource() +select x, x.getPrimaryQlClasses() + +query predicate annotationDeclarations(AnnotationType at, AnnotationElement ae) { + at.fromSource() and + at.getAnAnnotationElement() = ae +} + +query predicate annotations(Annotation a, Element e, AnnotationType at) { + at.fromSource() and + a.getAnnotatedElement() = e and + at = a.getType() +} + +query predicate annotationValues(Annotation a, Expr v) { + a.getValue(_) = v and v.getFile().isSourceFile() +} diff --git a/java/ql/test-kotlin2/library-tests/annotation_classes/def.kt b/java/ql/test-kotlin2/library-tests/annotation_classes/def.kt new file mode 100644 index 00000000000..f499d1026fc --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/annotation_classes/def.kt @@ -0,0 +1,62 @@ +@file:Annot0k + +import kotlin.reflect.KClass + +@Target(AnnotationTarget.CLASS, + AnnotationTarget.ANNOTATION_CLASS, + AnnotationTarget.TYPE_PARAMETER, + AnnotationTarget.PROPERTY, + AnnotationTarget.FIELD, + AnnotationTarget.LOCAL_VARIABLE, // TODO + AnnotationTarget.VALUE_PARAMETER, + AnnotationTarget.CONSTRUCTOR, + AnnotationTarget.FUNCTION, + AnnotationTarget.PROPERTY_GETTER, + AnnotationTarget.PROPERTY_SETTER, + AnnotationTarget.TYPE, // TODO + //AnnotationTarget.EXPRESSION, // TODO + AnnotationTarget.FILE, // TODO + AnnotationTarget.TYPEALIAS // TODO +) +annotation class Annot0k(@get:JvmName("a") val abc: Int = 0) + +@Annot0k +annotation class Annot1k( + val a: Int = 2, + val b: String = "ab", + val c: KClass<*> = X::class, + val d: Y = Y.A, + val e: Array = [Y.A, Y.B], + val f: Annot0k = Annot0k(1) +) + +class X {} +enum class Y { + A,B,C +} + +@Annot0k(abc = 1) +@Annot1k(d = Y.B, e = arrayOf(Y.C, Y.A)) +class Z { + @Annot0k + constructor(){} +} + +@Annot0k +fun <@Annot0k T> fn(@Annot0k a: Annot0k) { + println(a.abc) + + @Annot0k + var x = 10 +} + +@Annot0k +@get:Annot0k +@set:Annot0k +@field:Annot0k +var p: @Annot0k Int = 5 + +fun @receiver:Annot0k String.myExtension() { } + +@Annot0k +typealias AAA = Z diff --git a/java/ql/test-kotlin2/library-tests/annotation_classes/use.java b/java/ql/test-kotlin2/library-tests/annotation_classes/use.java new file mode 100644 index 00000000000..ec0dd0fa447 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/annotation_classes/use.java @@ -0,0 +1,15 @@ +public class use implements Annot0k { + @Override + public int a() { return 1; } + + @Override + public Class annotationType() { + return null; + } + + @Annot0j(abc = 1) + @Annot1j(a = 1, b = "ac", c = X.class, d = Y.B, e = {Y.C, Y.A}, f = @Annot0j(abc = 2)) + @Annot0k(a = 1) + @Annot1k(a = 1, b = "ac", c = X.class, d = Y.B, e = {Y.C, Y.A}, f = @Annot0k(a = 2)) + public class Z { } +} diff --git a/java/ql/test-kotlin2/library-tests/annotations/jvmName/Test.java b/java/ql/test-kotlin2/library-tests/annotations/jvmName/Test.java new file mode 100644 index 00000000000..f76fd8e018d --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/annotations/jvmName/Test.java @@ -0,0 +1,5 @@ +class Test { + public void m() { + int i = new X().getX_prop(); + } +} \ No newline at end of file diff --git a/java/ql/test-kotlin2/library-tests/annotations/jvmName/test.expected b/java/ql/test-kotlin2/library-tests/annotations/jvmName/test.expected new file mode 100644 index 00000000000..a3313a519ca --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/annotations/jvmName/test.expected @@ -0,0 +1,8 @@ +| Test.java:2:17:2:17 | m | m | m | +| test.kt:3:9:4:18 | getX_prop | getX_prop | getX | +| test.kt:6:5:6:19 | getX | getX | getX | +| test.kt:8:5:10:19 | changeY | changeY | setY | +| test.kt:8:5:10:19 | y | y | getY | +| test.kt:12:5:13:15 | method | method | fn | +| test.kt:17:5:17:14 | p | p | p | +| test.kt:18:5:18:32 | w | w | q | diff --git a/java/ql/test-kotlin2/library-tests/annotations/jvmName/test.kt b/java/ql/test-kotlin2/library-tests/annotations/jvmName/test.kt new file mode 100644 index 00000000000..eea98625d5c --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/annotations/jvmName/test.kt @@ -0,0 +1,18 @@ +class X { + val x: Int + @JvmName("getX_prop") + get() = 15 + + fun getX() = 10 + + @get:JvmName("y") + @set:JvmName("changeY") + var y: Int = 23 + + @JvmName("method") + fun fn() {} +} + +annotation class Ann( + val p: Int, + @get:JvmName("w") val q: Int) diff --git a/java/ql/test-kotlin2/library-tests/annotations/jvmName/test.ql b/java/ql/test-kotlin2/library-tests/annotations/jvmName/test.ql new file mode 100644 index 00000000000..7285e3a1053 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/annotations/jvmName/test.ql @@ -0,0 +1,5 @@ +import java + +query predicate names(Method m, string name, string kotlinName) { + m.fromSource() and name = m.getName() and kotlinName = m.getKotlinName() +} diff --git a/java/ql/test-kotlin2/library-tests/arrays-with-variances/User.java b/java/ql/test-kotlin2/library-tests/arrays-with-variances/User.java new file mode 100644 index 00000000000..d3c00088d13 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/arrays-with-variances/User.java @@ -0,0 +1,11 @@ +public class User { + + public static void test() { + + TakesArrayList tal = new TakesArrayList(); + tal.invarArray(null); + // Using one method suffices to get the extractor to describe all the methods defined on takesArrayList. + + } + +} diff --git a/java/ql/test-kotlin2/library-tests/arrays-with-variances/takesArrayList.kt b/java/ql/test-kotlin2/library-tests/arrays-with-variances/takesArrayList.kt new file mode 100644 index 00000000000..1278d866d84 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/arrays-with-variances/takesArrayList.kt @@ -0,0 +1,112 @@ +public class TakesArrayList { + + // There is a Java user to flag up any problems, as if the .class file differs from my + // claimed types above we'll see two overloads and two parameter types instead of one. + + // Test how Array types with a variance should be lowered: + fun invarArray(a: Array) { } + fun outArray(a: Array) { } + fun inArray(a: Array) { } + + fun invarInvarArray(a: Array>) { } + fun invarOutArray(a: Array>) { } + fun invarInArray(a: Array>) { } + + fun outInvarArray(a: Array>) { } + fun outOutArray(a: Array>) { } + fun outInArray(a: Array>) { } + + fun inInvarArray(a: Array>) { } + fun inOutArray(a: Array>) { } + fun inInArray(a: Array>) { } + + // Test how Array type arguments with a variance should acquire implicit wildcards: + fun invarArrayList(l: List>) { } + fun outArrayList(l: List>) { } + fun inArrayList(l: List>) { } + + // Check the cases of nested arrays: + fun invarInvarArrayList(l: List>>) { } + fun invarOutArrayList(l: List>>) { } + fun invarInArrayList(l: List>>) { } + fun outInvarArrayList(l: List>>) { } + fun outOutArrayList(l: List>>) { } + fun outInArrayList(l: List>>) { } + fun inInvarArrayList(l: List>>) { } + fun inOutArrayList(l: List>>) { } + fun inInArrayList(l: List>>) { } + + // Now check all of that again for Comparable, whose type parameter is contravariant: + fun invarArrayComparable(c: Comparable>) { } + fun outArrayComparable(c: Comparable>) { } + fun inArrayComparable(c: Comparable>) { } + + fun invarInvarArrayComparable(c: Comparable>>) { } + fun invarOutArrayComparable(c: Comparable>>) { } + fun invarInArrayComparable(c: Comparable>>) { } + fun outInvarArrayComparable(c: Comparable>>) { } + fun outOutArrayComparable(c: Comparable>>) { } + fun outInArrayComparable(c: Comparable>>) { } + fun inInvarArrayComparable(c: Comparable>>) { } + fun inOutArrayComparable(c: Comparable>>) { } + fun inInArrayComparable(c: Comparable>>) { } + + // ... duplicate all of that for a final array element (I choose String as a final type), which sometimes suppresses addition of `? extends ...` + fun invarArrayListFinal(l: List>) { } + fun outArrayListFinal(l: List>) { } + fun inArrayListFinal(l: List>) { } + + fun invarInvarArrayListFinal(l: List>>) { } + fun invarOutArrayListFinal(l: List>>) { } + fun invarInArrayListFinal(l: List>>) { } + fun outInvarArrayListFinal(l: List>>) { } + fun outOutArrayListFinal(l: List>>) { } + fun outInArrayListFinal(l: List>>) { } + fun inInvarArrayListFinal(l: List>>) { } + fun inOutArrayListFinal(l: List>>) { } + fun inInArrayListFinal(l: List>>) { } + + fun invarArrayComparableFinal(c: Comparable>) { } + fun outArrayComparableFinal(c: Comparable>) { } + fun inArrayComparableFinal(c: Comparable>) { } + + fun invarInvarArrayComparableFinal(c: Comparable>>) { } + fun invarOutArrayComparableFinal(c: Comparable>>) { } + fun invarInArrayComparableFinal(c: Comparable>>) { } + fun outInvarArrayComparableFinal(c: Comparable>>) { } + fun outOutArrayComparableFinal(c: Comparable>>) { } + fun outInArrayComparableFinal(c: Comparable>>) { } + fun inInvarArrayComparableFinal(c: Comparable>>) { } + fun inOutArrayComparableFinal(c: Comparable>>) { } + fun inInArrayComparableFinal(c: Comparable>>) { } + + // ... and duplicate it once more with Any as the array element, which can suppress adding `? super ...` + fun invarArrayListAny(l: List>) { } + fun outArrayListAny(l: List>) { } + fun inArrayListAny(l: List>) { } + + fun invarInvarArrayListAny(l: List>>) { } + fun invarOutArrayListAny(l: List>>) { } + fun invarInArrayListAny(l: List>>) { } + fun outInvarArrayListAny(l: List>>) { } + fun outOutArrayListAny(l: List>>) { } + fun outInArrayListAny(l: List>>) { } + fun inInvarArrayListAny(l: List>>) { } + fun inOutArrayListAny(l: List>>) { } + fun inInArrayListAny(l: List>>) { } + + fun invarArrayComparableAny(c: Comparable>) { } + fun outArrayComparableAny(c: Comparable>) { } + fun inArrayComparableAny(c: Comparable>) { } + + fun invarInvarArrayComparableAny(c: Comparable>>) { } + fun invarOutArrayComparableAny(c: Comparable>>) { } + fun invarInArrayComparableAny(c: Comparable>>) { } + fun outInvarArrayComparableAny(c: Comparable>>) { } + fun outOutArrayComparableAny(c: Comparable>>) { } + fun outInArrayComparableAny(c: Comparable>>) { } + fun inInvarArrayComparableAny(c: Comparable>>) { } + fun inOutArrayComparableAny(c: Comparable>>) { } + fun inInArrayComparableAny(c: Comparable>>) { } + +} diff --git a/java/ql/test-kotlin2/library-tests/arrays-with-variances/test.expected b/java/ql/test-kotlin2/library-tests/arrays-with-variances/test.expected new file mode 100644 index 00000000000..d552925819e --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/arrays-with-variances/test.expected @@ -0,0 +1,86 @@ +broken +#select +| inArray | Object[] | +| inArrayComparable | Comparable | +| inArrayComparableAny | Comparable | +| inArrayComparableFinal | Comparable | +| inArrayList | List | +| inArrayListAny | List | +| inArrayListFinal | List | +| inInArray | Object[] | +| inInArrayComparable | Comparable | +| inInArrayComparableAny | Comparable | +| inInArrayComparableFinal | Comparable | +| inInArrayList | List | +| inInArrayListAny | List | +| inInArrayListFinal | List | +| inInvarArray | Object[] | +| inInvarArrayComparable | Comparable | +| inInvarArrayComparableAny | Comparable | +| inInvarArrayComparableFinal | Comparable | +| inInvarArrayList | List | +| inInvarArrayListAny | List | +| inInvarArrayListFinal | List | +| inOutArray | Object[] | +| inOutArrayComparable | Comparable | +| inOutArrayComparableAny | Comparable | +| inOutArrayComparableFinal | Comparable | +| inOutArrayList | List | +| inOutArrayListAny | List | +| inOutArrayListFinal | List | +| invarArray | CharSequence[] | +| invarArrayComparable | Comparable | +| invarArrayComparableAny | Comparable | +| invarArrayComparableFinal | Comparable | +| invarArrayList | List | +| invarArrayListAny | List | +| invarArrayListFinal | List | +| invarInArray | Object[][] | +| invarInArrayComparable | Comparable | +| invarInArrayComparableAny | Comparable | +| invarInArrayComparableFinal | Comparable | +| invarInArrayList | List | +| invarInArrayListAny | List | +| invarInArrayListFinal | List | +| invarInvarArray | CharSequence[][] | +| invarInvarArrayComparable | Comparable | +| invarInvarArrayComparableAny | Comparable | +| invarInvarArrayComparableFinal | Comparable | +| invarInvarArrayList | List | +| invarInvarArrayListAny | List | +| invarInvarArrayListFinal | List | +| invarOutArray | CharSequence[][] | +| invarOutArrayComparable | Comparable | +| invarOutArrayComparableAny | Comparable | +| invarOutArrayComparableFinal | Comparable | +| invarOutArrayList | List | +| invarOutArrayListAny | List | +| invarOutArrayListFinal | List | +| outArray | CharSequence[] | +| outArrayComparable | Comparable | +| outArrayComparableAny | Comparable | +| outArrayComparableFinal | Comparable | +| outArrayList | List | +| outArrayListAny | List | +| outArrayListFinal | List | +| outInArray | Object[][] | +| outInArrayComparable | Comparable | +| outInArrayComparableAny | Comparable | +| outInArrayComparableFinal | Comparable | +| outInArrayList | List | +| outInArrayListAny | List | +| outInArrayListFinal | List | +| outInvarArray | CharSequence[][] | +| outInvarArrayComparable | Comparable | +| outInvarArrayComparableAny | Comparable | +| outInvarArrayComparableFinal | Comparable | +| outInvarArrayList | List | +| outInvarArrayListAny | List | +| outInvarArrayListFinal | List | +| outOutArray | CharSequence[][] | +| outOutArrayComparable | Comparable | +| outOutArrayComparableAny | Comparable | +| outOutArrayComparableFinal | Comparable | +| outOutArrayList | List | +| outOutArrayListAny | List | +| outOutArrayListFinal | List | diff --git a/java/ql/test-kotlin2/library-tests/arrays-with-variances/test.ql b/java/ql/test-kotlin2/library-tests/arrays-with-variances/test.ql new file mode 100644 index 00000000000..92c138cc0f2 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/arrays-with-variances/test.ql @@ -0,0 +1,13 @@ +import java + +class InterestingMethod extends Method { + InterestingMethod() { this.getDeclaringType().getName() = "TakesArrayList" } +} + +query predicate broken(string methodName) { + methodName = any(InterestingMethod m).getName() and + count(Type t, InterestingMethod m | methodName = m.getName() and t = m.getAParamType() | t) != 1 +} + +from InterestingMethod m +select m.getName(), m.getAParamType().toString() diff --git a/java/ql/test-kotlin2/library-tests/arrays/arrayAccesses.expected b/java/ql/test-kotlin2/library-tests/arrays/arrayAccesses.expected new file mode 100644 index 00000000000..986bdeed21f --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/arrays/arrayAccesses.expected @@ -0,0 +1,22 @@ +| arrayGetsSets.kt:12:3:12:7 | ...[...] | arrayGetsSets.kt:12:3:12:7 | ...=... | int[] | arrayGetsSets.kt:12:3:12:4 | a1 | arrayGetsSets.kt:12:6:12:6 | 0 | +| arrayGetsSets.kt:12:11:12:15 | ...[...] | arrayGetsSets.kt:12:3:12:7 | ...=... | int | arrayGetsSets.kt:12:11:12:12 | a1 | arrayGetsSets.kt:12:14:12:14 | 0 | +| arrayGetsSets.kt:13:3:13:7 | ...[...] | arrayGetsSets.kt:13:3:13:7 | ...=... | short[] | arrayGetsSets.kt:13:3:13:4 | a2 | arrayGetsSets.kt:13:6:13:6 | 0 | +| arrayGetsSets.kt:13:11:13:15 | ...[...] | arrayGetsSets.kt:13:3:13:7 | ...=... | short | arrayGetsSets.kt:13:11:13:12 | a2 | arrayGetsSets.kt:13:14:13:14 | 0 | +| arrayGetsSets.kt:14:3:14:7 | ...[...] | arrayGetsSets.kt:14:3:14:7 | ...=... | byte[] | arrayGetsSets.kt:14:3:14:4 | a3 | arrayGetsSets.kt:14:6:14:6 | 0 | +| arrayGetsSets.kt:14:11:14:15 | ...[...] | arrayGetsSets.kt:14:3:14:7 | ...=... | byte | arrayGetsSets.kt:14:11:14:12 | a3 | arrayGetsSets.kt:14:14:14:14 | 0 | +| arrayGetsSets.kt:15:3:15:7 | ...[...] | arrayGetsSets.kt:15:3:15:7 | ...=... | long[] | arrayGetsSets.kt:15:3:15:4 | a4 | arrayGetsSets.kt:15:6:15:6 | 0 | +| arrayGetsSets.kt:15:11:15:15 | ...[...] | arrayGetsSets.kt:15:3:15:7 | ...=... | long | arrayGetsSets.kt:15:11:15:12 | a4 | arrayGetsSets.kt:15:14:15:14 | 0 | +| arrayGetsSets.kt:16:3:16:7 | ...[...] | arrayGetsSets.kt:16:3:16:7 | ...=... | float[] | arrayGetsSets.kt:16:3:16:4 | a5 | arrayGetsSets.kt:16:6:16:6 | 0 | +| arrayGetsSets.kt:16:11:16:15 | ...[...] | arrayGetsSets.kt:16:3:16:7 | ...=... | float | arrayGetsSets.kt:16:11:16:12 | a5 | arrayGetsSets.kt:16:14:16:14 | 0 | +| arrayGetsSets.kt:17:3:17:7 | ...[...] | arrayGetsSets.kt:17:3:17:7 | ...=... | double[] | arrayGetsSets.kt:17:3:17:4 | a6 | arrayGetsSets.kt:17:6:17:6 | 0 | +| arrayGetsSets.kt:17:11:17:15 | ...[...] | arrayGetsSets.kt:17:3:17:7 | ...=... | double | arrayGetsSets.kt:17:11:17:12 | a6 | arrayGetsSets.kt:17:14:17:14 | 0 | +| arrayGetsSets.kt:18:3:18:7 | ...[...] | arrayGetsSets.kt:18:3:18:7 | ...=... | boolean[] | arrayGetsSets.kt:18:3:18:4 | a7 | arrayGetsSets.kt:18:6:18:6 | 0 | +| arrayGetsSets.kt:18:11:18:15 | ...[...] | arrayGetsSets.kt:18:3:18:7 | ...=... | boolean | arrayGetsSets.kt:18:11:18:12 | a7 | arrayGetsSets.kt:18:14:18:14 | 0 | +| arrayGetsSets.kt:19:3:19:7 | ...[...] | arrayGetsSets.kt:19:3:19:7 | ...=... | char[] | arrayGetsSets.kt:19:3:19:4 | a8 | arrayGetsSets.kt:19:6:19:6 | 0 | +| arrayGetsSets.kt:19:11:19:15 | ...[...] | arrayGetsSets.kt:19:3:19:7 | ...=... | char | arrayGetsSets.kt:19:11:19:12 | a8 | arrayGetsSets.kt:19:14:19:14 | 0 | +| arrayGetsSets.kt:20:3:20:7 | ...[...] | arrayGetsSets.kt:20:3:20:7 | ...=... | Object[] | arrayGetsSets.kt:20:3:20:4 | a9 | arrayGetsSets.kt:20:6:20:6 | 0 | +| arrayGetsSets.kt:20:11:20:15 | ...[...] | arrayGetsSets.kt:20:3:20:7 | ...=... | Object | arrayGetsSets.kt:20:11:20:12 | a9 | arrayGetsSets.kt:20:14:20:14 | 0 | +| arrayGetsSets.kt:32:3:32:7 | ...[...] | arrayGetsSets.kt:32:3:32:7 | ...+=... | int | arrayGetsSets.kt:32:3:32:4 | a1 | arrayGetsSets.kt:32:6:32:6 | 0 | +| arrayGetsSets.kt:38:3:38:7 | ...[...] | arrayGetsSets.kt:38:3:38:7 | .../=... | long | arrayGetsSets.kt:38:3:38:4 | a4 | arrayGetsSets.kt:38:6:38:6 | 0 | +| arrayGetsSets.kt:39:3:39:7 | ...[...] | arrayGetsSets.kt:39:3:39:7 | ...-=... | float | arrayGetsSets.kt:39:3:39:4 | a5 | arrayGetsSets.kt:39:6:39:6 | 0 | +| arrayGetsSets.kt:40:3:40:7 | ...[...] | arrayGetsSets.kt:40:3:40:7 | ...*=... | double | arrayGetsSets.kt:40:3:40:4 | a6 | arrayGetsSets.kt:40:6:40:6 | 0 | diff --git a/java/ql/test-kotlin2/library-tests/arrays/arrayAccesses.ql b/java/ql/test-kotlin2/library-tests/arrays/arrayAccesses.ql new file mode 100644 index 00000000000..8219b13425c --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/arrays/arrayAccesses.ql @@ -0,0 +1,4 @@ +import java + +from ArrayAccess aa +select aa, aa.getParent(), aa.getType().toString(), aa.getArray(), aa.getIndexExpr() diff --git a/java/ql/test-kotlin2/library-tests/arrays/arrayCreations.expected b/java/ql/test-kotlin2/library-tests/arrays/arrayCreations.expected new file mode 100644 index 00000000000..8b8c3fe591f --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/arrays/arrayCreations.expected @@ -0,0 +1,115 @@ +arrayCreationTypes +| arrayCreations.kt:5:14:5:33 | new Integer[] | file://:0:0:0:0 | Integer[] | arrayCreations.kt:5:14:5:33 | Integer | +| arrayCreations.kt:6:14:6:32 | new Integer[] | file://:0:0:0:0 | Integer[] | arrayCreations.kt:6:14:6:32 | Integer | +| arrayCreations.kt:7:14:7:46 | new double[] | file://:0:0:0:0 | double[] | arrayCreations.kt:7:14:7:46 | double | +| arrayCreations.kt:8:14:8:49 | new float[] | file://:0:0:0:0 | float[] | arrayCreations.kt:8:14:8:49 | float | +| arrayCreations.kt:9:14:9:36 | new long[] | file://:0:0:0:0 | long[] | arrayCreations.kt:9:14:9:36 | long | +| arrayCreations.kt:10:14:10:35 | new int[] | file://:0:0:0:0 | int[] | arrayCreations.kt:10:14:10:35 | int | +| arrayCreations.kt:11:14:11:34 | new char[] | file://:0:0:0:0 | char[] | arrayCreations.kt:11:14:11:34 | char | +| arrayCreations.kt:12:14:12:37 | new short[] | file://:0:0:0:0 | short[] | arrayCreations.kt:12:14:12:37 | short | +| arrayCreations.kt:13:14:13:36 | new byte[] | file://:0:0:0:0 | byte[] | arrayCreations.kt:13:14:13:36 | byte | +| arrayCreations.kt:14:14:14:52 | new boolean[] | file://:0:0:0:0 | boolean[] | arrayCreations.kt:14:14:14:52 | boolean | +| arrayCreations.kt:17:14:17:68 | new int[][] | file://:0:0:0:0 | int[][] | arrayCreations.kt:17:14:17:68 | int[] | +| arrayCreations.kt:17:22:17:43 | new int[] | file://:0:0:0:0 | int[] | arrayCreations.kt:17:22:17:43 | int | +| arrayCreations.kt:17:46:17:67 | new int[] | file://:0:0:0:0 | int[] | arrayCreations.kt:17:46:17:67 | int | +| arrayCreations.kt:18:14:18:65 | new Object[] | file://:0:0:0:0 | Object[] | arrayCreations.kt:18:14:18:65 | Object | +| arrayCreations.kt:18:22:18:43 | new int[] | file://:0:0:0:0 | int[] | arrayCreations.kt:18:22:18:43 | int | +| arrayCreations.kt:18:46:18:64 | new Integer[] | file://:0:0:0:0 | Integer[] | arrayCreations.kt:18:46:18:64 | Integer | +| arrayCreations.kt:19:14:19:62 | new Integer[][] | file://:0:0:0:0 | Integer[][] | arrayCreations.kt:19:14:19:62 | Integer[] | +| arrayCreations.kt:19:22:19:40 | new Integer[] | file://:0:0:0:0 | Integer[] | arrayCreations.kt:19:22:19:40 | Integer | +| arrayCreations.kt:19:43:19:61 | new Integer[] | file://:0:0:0:0 | Integer[] | arrayCreations.kt:19:43:19:61 | Integer | +arrayCreationDimensions +| arrayCreations.kt:5:14:5:33 | new Integer[] | arrayCreations.kt:5:32:5:32 | 1 | 0 | +| arrayCreations.kt:6:14:6:32 | new Integer[] | arrayCreations.kt:6:14:6:32 | 4 | 0 | +| arrayCreations.kt:7:14:7:46 | new double[] | arrayCreations.kt:7:14:7:46 | 4 | 0 | +| arrayCreations.kt:8:14:8:49 | new float[] | arrayCreations.kt:8:14:8:49 | 4 | 0 | +| arrayCreations.kt:9:14:9:36 | new long[] | arrayCreations.kt:9:14:9:36 | 4 | 0 | +| arrayCreations.kt:10:14:10:35 | new int[] | arrayCreations.kt:10:14:10:35 | 4 | 0 | +| arrayCreations.kt:11:14:11:34 | new char[] | arrayCreations.kt:11:14:11:34 | 2 | 0 | +| arrayCreations.kt:12:14:12:37 | new short[] | arrayCreations.kt:12:14:12:37 | 4 | 0 | +| arrayCreations.kt:13:14:13:36 | new byte[] | arrayCreations.kt:13:14:13:36 | 4 | 0 | +| arrayCreations.kt:14:14:14:52 | new boolean[] | arrayCreations.kt:14:14:14:52 | 4 | 0 | +| arrayCreations.kt:17:14:17:68 | new int[][] | arrayCreations.kt:17:14:17:68 | 2 | 0 | +| arrayCreations.kt:17:22:17:43 | new int[] | arrayCreations.kt:17:22:17:43 | 4 | 0 | +| arrayCreations.kt:17:46:17:67 | new int[] | arrayCreations.kt:17:46:17:67 | 4 | 0 | +| arrayCreations.kt:18:14:18:65 | new Object[] | arrayCreations.kt:18:14:18:65 | 2 | 0 | +| arrayCreations.kt:18:22:18:43 | new int[] | arrayCreations.kt:18:22:18:43 | 4 | 0 | +| arrayCreations.kt:18:46:18:64 | new Integer[] | arrayCreations.kt:18:46:18:64 | 4 | 0 | +| arrayCreations.kt:19:14:19:62 | new Integer[][] | arrayCreations.kt:19:14:19:62 | 2 | 0 | +| arrayCreations.kt:19:22:19:40 | new Integer[] | arrayCreations.kt:19:22:19:40 | 4 | 0 | +| arrayCreations.kt:19:43:19:61 | new Integer[] | arrayCreations.kt:19:43:19:61 | 4 | 0 | +arrayCreationInit +| arrayCreations.kt:6:14:6:32 | new Integer[] | arrayCreations.kt:6:14:6:32 | {...} | arrayCreations.kt:6:22:6:22 | 1 | 0 | +| arrayCreations.kt:6:14:6:32 | new Integer[] | arrayCreations.kt:6:14:6:32 | {...} | arrayCreations.kt:6:25:6:25 | 2 | 1 | +| arrayCreations.kt:6:14:6:32 | new Integer[] | arrayCreations.kt:6:14:6:32 | {...} | arrayCreations.kt:6:28:6:28 | 3 | 2 | +| arrayCreations.kt:6:14:6:32 | new Integer[] | arrayCreations.kt:6:14:6:32 | {...} | arrayCreations.kt:6:31:6:31 | 4 | 3 | +| arrayCreations.kt:7:14:7:46 | new double[] | arrayCreations.kt:7:14:7:46 | {...} | arrayCreations.kt:7:28:7:30 | 1.0 | 0 | +| arrayCreations.kt:7:14:7:46 | new double[] | arrayCreations.kt:7:14:7:46 | {...} | arrayCreations.kt:7:33:7:35 | 2.0 | 1 | +| arrayCreations.kt:7:14:7:46 | new double[] | arrayCreations.kt:7:14:7:46 | {...} | arrayCreations.kt:7:38:7:40 | 3.0 | 2 | +| arrayCreations.kt:7:14:7:46 | new double[] | arrayCreations.kt:7:14:7:46 | {...} | arrayCreations.kt:7:43:7:45 | 4.0 | 3 | +| arrayCreations.kt:8:14:8:49 | new float[] | arrayCreations.kt:8:14:8:49 | {...} | arrayCreations.kt:8:27:8:30 | 1.0 | 0 | +| arrayCreations.kt:8:14:8:49 | new float[] | arrayCreations.kt:8:14:8:49 | {...} | arrayCreations.kt:8:33:8:36 | 2.0 | 1 | +| arrayCreations.kt:8:14:8:49 | new float[] | arrayCreations.kt:8:14:8:49 | {...} | arrayCreations.kt:8:39:8:42 | 3.0 | 2 | +| arrayCreations.kt:8:14:8:49 | new float[] | arrayCreations.kt:8:14:8:49 | {...} | arrayCreations.kt:8:45:8:48 | 4.0 | 3 | +| arrayCreations.kt:9:14:9:36 | new long[] | arrayCreations.kt:9:14:9:36 | {...} | arrayCreations.kt:9:26:9:26 | 1 | 0 | +| arrayCreations.kt:9:14:9:36 | new long[] | arrayCreations.kt:9:14:9:36 | {...} | arrayCreations.kt:9:29:9:29 | 2 | 1 | +| arrayCreations.kt:9:14:9:36 | new long[] | arrayCreations.kt:9:14:9:36 | {...} | arrayCreations.kt:9:32:9:32 | 3 | 2 | +| arrayCreations.kt:9:14:9:36 | new long[] | arrayCreations.kt:9:14:9:36 | {...} | arrayCreations.kt:9:35:9:35 | 4 | 3 | +| arrayCreations.kt:10:14:10:35 | new int[] | arrayCreations.kt:10:14:10:35 | {...} | arrayCreations.kt:10:25:10:25 | 1 | 0 | +| arrayCreations.kt:10:14:10:35 | new int[] | arrayCreations.kt:10:14:10:35 | {...} | arrayCreations.kt:10:28:10:28 | 2 | 1 | +| arrayCreations.kt:10:14:10:35 | new int[] | arrayCreations.kt:10:14:10:35 | {...} | arrayCreations.kt:10:31:10:31 | 3 | 2 | +| arrayCreations.kt:10:14:10:35 | new int[] | arrayCreations.kt:10:14:10:35 | {...} | arrayCreations.kt:10:34:10:34 | 4 | 3 | +| arrayCreations.kt:11:14:11:34 | new char[] | arrayCreations.kt:11:14:11:34 | {...} | arrayCreations.kt:11:26:11:28 | a | 0 | +| arrayCreations.kt:11:14:11:34 | new char[] | arrayCreations.kt:11:14:11:34 | {...} | arrayCreations.kt:11:31:11:33 | b | 1 | +| arrayCreations.kt:12:14:12:37 | new short[] | arrayCreations.kt:12:14:12:37 | {...} | arrayCreations.kt:12:27:12:27 | 1 | 0 | +| arrayCreations.kt:12:14:12:37 | new short[] | arrayCreations.kt:12:14:12:37 | {...} | arrayCreations.kt:12:30:12:30 | 2 | 1 | +| arrayCreations.kt:12:14:12:37 | new short[] | arrayCreations.kt:12:14:12:37 | {...} | arrayCreations.kt:12:33:12:33 | 3 | 2 | +| arrayCreations.kt:12:14:12:37 | new short[] | arrayCreations.kt:12:14:12:37 | {...} | arrayCreations.kt:12:36:12:36 | 4 | 3 | +| arrayCreations.kt:13:14:13:36 | new byte[] | arrayCreations.kt:13:14:13:36 | {...} | arrayCreations.kt:13:26:13:26 | 1 | 0 | +| arrayCreations.kt:13:14:13:36 | new byte[] | arrayCreations.kt:13:14:13:36 | {...} | arrayCreations.kt:13:29:13:29 | 2 | 1 | +| arrayCreations.kt:13:14:13:36 | new byte[] | arrayCreations.kt:13:14:13:36 | {...} | arrayCreations.kt:13:32:13:32 | 3 | 2 | +| arrayCreations.kt:13:14:13:36 | new byte[] | arrayCreations.kt:13:14:13:36 | {...} | arrayCreations.kt:13:35:13:35 | 4 | 3 | +| arrayCreations.kt:14:14:14:52 | new boolean[] | arrayCreations.kt:14:14:14:52 | {...} | arrayCreations.kt:14:29:14:32 | true | 0 | +| arrayCreations.kt:14:14:14:52 | new boolean[] | arrayCreations.kt:14:14:14:52 | {...} | arrayCreations.kt:14:35:14:39 | false | 1 | +| arrayCreations.kt:14:14:14:52 | new boolean[] | arrayCreations.kt:14:14:14:52 | {...} | arrayCreations.kt:14:42:14:45 | true | 2 | +| arrayCreations.kt:14:14:14:52 | new boolean[] | arrayCreations.kt:14:14:14:52 | {...} | arrayCreations.kt:14:48:14:51 | true | 3 | +| arrayCreations.kt:17:14:17:68 | new int[][] | arrayCreations.kt:17:14:17:68 | {...} | arrayCreations.kt:17:22:17:43 | new int[] | 0 | +| arrayCreations.kt:17:14:17:68 | new int[][] | arrayCreations.kt:17:14:17:68 | {...} | arrayCreations.kt:17:46:17:67 | new int[] | 1 | +| arrayCreations.kt:17:22:17:43 | new int[] | arrayCreations.kt:17:22:17:43 | {...} | arrayCreations.kt:17:33:17:33 | 1 | 0 | +| arrayCreations.kt:17:22:17:43 | new int[] | arrayCreations.kt:17:22:17:43 | {...} | arrayCreations.kt:17:36:17:36 | 2 | 1 | +| arrayCreations.kt:17:22:17:43 | new int[] | arrayCreations.kt:17:22:17:43 | {...} | arrayCreations.kt:17:39:17:39 | 3 | 2 | +| arrayCreations.kt:17:22:17:43 | new int[] | arrayCreations.kt:17:22:17:43 | {...} | arrayCreations.kt:17:42:17:42 | 4 | 3 | +| arrayCreations.kt:17:46:17:67 | new int[] | arrayCreations.kt:17:46:17:67 | {...} | arrayCreations.kt:17:57:17:57 | 1 | 0 | +| arrayCreations.kt:17:46:17:67 | new int[] | arrayCreations.kt:17:46:17:67 | {...} | arrayCreations.kt:17:60:17:60 | 2 | 1 | +| arrayCreations.kt:17:46:17:67 | new int[] | arrayCreations.kt:17:46:17:67 | {...} | arrayCreations.kt:17:63:17:63 | 3 | 2 | +| arrayCreations.kt:17:46:17:67 | new int[] | arrayCreations.kt:17:46:17:67 | {...} | arrayCreations.kt:17:66:17:66 | 4 | 3 | +| arrayCreations.kt:18:14:18:65 | new Object[] | arrayCreations.kt:18:14:18:65 | {...} | arrayCreations.kt:18:22:18:43 | new int[] | 0 | +| arrayCreations.kt:18:14:18:65 | new Object[] | arrayCreations.kt:18:14:18:65 | {...} | arrayCreations.kt:18:46:18:64 | new Integer[] | 1 | +| arrayCreations.kt:18:22:18:43 | new int[] | arrayCreations.kt:18:22:18:43 | {...} | arrayCreations.kt:18:33:18:33 | 1 | 0 | +| arrayCreations.kt:18:22:18:43 | new int[] | arrayCreations.kt:18:22:18:43 | {...} | arrayCreations.kt:18:36:18:36 | 2 | 1 | +| arrayCreations.kt:18:22:18:43 | new int[] | arrayCreations.kt:18:22:18:43 | {...} | arrayCreations.kt:18:39:18:39 | 3 | 2 | +| arrayCreations.kt:18:22:18:43 | new int[] | arrayCreations.kt:18:22:18:43 | {...} | arrayCreations.kt:18:42:18:42 | 4 | 3 | +| arrayCreations.kt:18:46:18:64 | new Integer[] | arrayCreations.kt:18:46:18:64 | {...} | arrayCreations.kt:18:54:18:54 | 1 | 0 | +| arrayCreations.kt:18:46:18:64 | new Integer[] | arrayCreations.kt:18:46:18:64 | {...} | arrayCreations.kt:18:57:18:57 | 2 | 1 | +| arrayCreations.kt:18:46:18:64 | new Integer[] | arrayCreations.kt:18:46:18:64 | {...} | arrayCreations.kt:18:60:18:60 | 3 | 2 | +| arrayCreations.kt:18:46:18:64 | new Integer[] | arrayCreations.kt:18:46:18:64 | {...} | arrayCreations.kt:18:63:18:63 | 4 | 3 | +| arrayCreations.kt:19:14:19:62 | new Integer[][] | arrayCreations.kt:19:14:19:62 | {...} | arrayCreations.kt:19:22:19:40 | new Integer[] | 0 | +| arrayCreations.kt:19:14:19:62 | new Integer[][] | arrayCreations.kt:19:14:19:62 | {...} | arrayCreations.kt:19:43:19:61 | new Integer[] | 1 | +| arrayCreations.kt:19:22:19:40 | new Integer[] | arrayCreations.kt:19:22:19:40 | {...} | arrayCreations.kt:19:30:19:30 | 1 | 0 | +| arrayCreations.kt:19:22:19:40 | new Integer[] | arrayCreations.kt:19:22:19:40 | {...} | arrayCreations.kt:19:33:19:33 | 2 | 1 | +| arrayCreations.kt:19:22:19:40 | new Integer[] | arrayCreations.kt:19:22:19:40 | {...} | arrayCreations.kt:19:36:19:36 | 3 | 2 | +| arrayCreations.kt:19:22:19:40 | new Integer[] | arrayCreations.kt:19:22:19:40 | {...} | arrayCreations.kt:19:39:19:39 | 4 | 3 | +| arrayCreations.kt:19:43:19:61 | new Integer[] | arrayCreations.kt:19:43:19:61 | {...} | arrayCreations.kt:19:51:19:51 | 1 | 0 | +| arrayCreations.kt:19:43:19:61 | new Integer[] | arrayCreations.kt:19:43:19:61 | {...} | arrayCreations.kt:19:54:19:54 | 2 | 1 | +| arrayCreations.kt:19:43:19:61 | new Integer[] | arrayCreations.kt:19:43:19:61 | {...} | arrayCreations.kt:19:57:19:57 | 3 | 2 | +| arrayCreations.kt:19:43:19:61 | new Integer[] | arrayCreations.kt:19:43:19:61 | {...} | arrayCreations.kt:19:60:19:60 | 4 | 3 | +cloneCalls +| arrayCreations.kt:29:18:29:29 | clone(...) | file://:0:0:0:0 | Integer[] | +| arrayCreations.kt:30:18:30:35 | clone(...) | file://:0:0:0:0 | double[] | +| arrayCreations.kt:31:18:31:34 | clone(...) | file://:0:0:0:0 | float[] | +| arrayCreations.kt:32:18:32:33 | clone(...) | file://:0:0:0:0 | long[] | +| arrayCreations.kt:33:18:33:32 | clone(...) | file://:0:0:0:0 | int[] | +| arrayCreations.kt:34:18:34:33 | clone(...) | file://:0:0:0:0 | char[] | +| arrayCreations.kt:35:18:35:34 | clone(...) | file://:0:0:0:0 | short[] | +| arrayCreations.kt:36:18:36:33 | clone(...) | file://:0:0:0:0 | byte[] | +| arrayCreations.kt:37:18:37:36 | clone(...) | file://:0:0:0:0 | boolean[] | diff --git a/java/ql/test-kotlin2/library-tests/arrays/arrayCreations.kt b/java/ql/test-kotlin2/library-tests/arrays/arrayCreations.kt new file mode 100644 index 00000000000..e374f7a24bd --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/arrays/arrayCreations.kt @@ -0,0 +1,39 @@ +package test + +class TestArrayCreation { + fun test1() { + val a0 = arrayOfNulls(1) + val a1 = arrayOf(1, 2, 3, 4) + val a2 = doubleArrayOf(1.0, 2.0, 3.0, 4.0) + val a3 = floatArrayOf(1.0f, 2.0f, 3.0f, 4.0f) + val a4 = longArrayOf(1, 2, 3, 4) + val a5 = intArrayOf(1, 2, 3, 4) + val a6 = charArrayOf('a', 'b') + val a7 = shortArrayOf(1, 2, 3, 4) + val a8 = byteArrayOf(1, 2, 3, 4) + val a9 = booleanArrayOf(true, false, true, true) + + // TODO: These don't match the corresponding Java hierarchy + val n0 = arrayOf(intArrayOf(1, 2, 3, 4), intArrayOf(1, 2, 3, 4)) // int[][] + val n1 = arrayOf(intArrayOf(1, 2, 3, 4), arrayOf(1, 2, 3, 4)) // Object[] + val n2 = arrayOf(arrayOf(1, 2, 3, 4), arrayOf(1, 2, 3, 4)) // Integer[][] + + // TODO: these are constructor calls: + val a10 = Array(1) { 1 } + val a11 = Array(5) { 1 } + val a12 = IntArray(5) + val a13 = IntArray(5) { 1 } + var a14 = IntArray(5) { it * 1 } + val a15 = Array(4) { IntArray(2) } + + val clone1 = arrayOf(*a1) + val clone2 = doubleArrayOf(*a2) + val clone3 = floatArrayOf(*a3) + val clone4 = longArrayOf(*a4) + val clone5 = intArrayOf(*a5) + val clone6 = charArrayOf(*a6) + val clone7 = shortArrayOf(*a7) + val clone8 = byteArrayOf(*a8) + val clone9 = booleanArrayOf(*a9) + } +} diff --git a/java/ql/test-kotlin2/library-tests/arrays/arrayCreations.ql b/java/ql/test-kotlin2/library-tests/arrays/arrayCreations.ql new file mode 100644 index 00000000000..522b9012731 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/arrays/arrayCreations.ql @@ -0,0 +1,18 @@ +import java + +query predicate arrayCreationTypes(ArrayCreationExpr ace, Type t, TypeAccess elementType) { + t = ace.getType() and elementType.getParent() = ace +} + +query predicate arrayCreationDimensions(ArrayCreationExpr ace, Expr dimension, int dimensionIdx) { + ace.getDimension(dimensionIdx) = dimension +} + +query predicate arrayCreationInit(ArrayCreationExpr ace, ArrayInit init, Expr e, int idx) { + ace.getInit() = init and + init.getInit(idx) = e +} + +query predicate cloneCalls(MethodCall ma, Type resultType) { + ma.getMethod().getName() = "clone" and resultType = ma.getType() +} diff --git a/java/ql/test-kotlin2/library-tests/arrays/arrayGetsSets.kt b/java/ql/test-kotlin2/library-tests/arrays/arrayGetsSets.kt new file mode 100644 index 00000000000..b4c31b3ef4c --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/arrays/arrayGetsSets.kt @@ -0,0 +1,41 @@ +fun arrayGetSet( + a1: IntArray, + a2: ShortArray, + a3: ByteArray, + a4: LongArray, + a5: FloatArray, + a6: DoubleArray, + a7: BooleanArray, + a8: CharArray, + a9: Array) { + + a1[0] = a1[0] + a2[0] = a2[0] + a3[0] = a3[0] + a4[0] = a4[0] + a5[0] = a5[0] + a6[0] = a6[0] + a7[0] = a7[0] + a8[0] = a8[0] + a9[0] = a9[0] + +} + +fun arrayGetSetInPlace( + a1: IntArray, + //a2: ShortArray, + //a3: ByteArray, + a4: LongArray, + a5: FloatArray, + a6: DoubleArray) { + + a1[0] += 1 + // Short and Byte's arithmetic operators yield an Int, + // so we don't have syntax to convert the result of the arithmetic op + // back to the right type. + //a2[0] %= 1.toShort() + //a3[0] *= 1.toByte() + a4[0] /= 1L + a5[0] -= 1f + a6[0] *= 1.0 +} \ No newline at end of file diff --git a/java/ql/test-kotlin2/library-tests/arrays/arrayIterators.expected b/java/ql/test-kotlin2/library-tests/arrays/arrayIterators.expected new file mode 100644 index 00000000000..31bd3681b39 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/arrays/arrayIterators.expected @@ -0,0 +1,3 @@ +| arrayIterators.kt:10:14:10:25 | iterator(...) | iterator(java.lang.Object[]) | kotlin.jvm.internal.ArrayIteratorKt | +| arrayIterators.kt:11:14:11:25 | iterator(...) | iterator(int[]) | kotlin.jvm.internal.ArrayIteratorsKt | +| arrayIterators.kt:12:14:12:25 | iterator(...) | iterator(boolean[]) | kotlin.jvm.internal.ArrayIteratorsKt | diff --git a/java/ql/test-kotlin2/library-tests/arrays/arrayIterators.kt b/java/ql/test-kotlin2/library-tests/arrays/arrayIterators.kt new file mode 100644 index 00000000000..45a49b80097 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/arrays/arrayIterators.kt @@ -0,0 +1,13 @@ +fun test( + a: Array, + b: IntArray, + c: BooleanArray) { + + for (i in a) { } + for (i in b) { } + for (i in c) { } + + val i1 = a.iterator() + val i2 = b.iterator() + val i3 = c.iterator() +} diff --git a/java/ql/test-kotlin2/library-tests/arrays/arrayIterators.ql b/java/ql/test-kotlin2/library-tests/arrays/arrayIterators.ql new file mode 100644 index 00000000000..21e9e0c20c1 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/arrays/arrayIterators.ql @@ -0,0 +1,10 @@ +import java + +query predicate iterator(MethodCall ma, string mn, string t) { + exists(Method m | + ma.getMethod() = m and + m.getName() = "iterator" and + mn = m.getSignature() and + t = ma.getMethod().getDeclaringType().getQualifiedName() + ) +} diff --git a/java/ql/test-kotlin2/library-tests/arrays/assignExprs.expected b/java/ql/test-kotlin2/library-tests/arrays/assignExprs.expected new file mode 100644 index 00000000000..da09855b1e0 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/arrays/assignExprs.expected @@ -0,0 +1,4 @@ +| arrayGetsSets.kt:32:3:32:7 | ...+=... | += | int[] | arrayGetsSets.kt:32:3:32:7 | ...[...] | int | arrayGetsSets.kt:32:12:32:12 | 1 | int | +| arrayGetsSets.kt:38:3:38:7 | .../=... | /= | long[] | arrayGetsSets.kt:38:3:38:7 | ...[...] | long | arrayGetsSets.kt:38:12:38:13 | 1 | long | +| arrayGetsSets.kt:39:3:39:7 | ...-=... | -= | float[] | arrayGetsSets.kt:39:3:39:7 | ...[...] | float | arrayGetsSets.kt:39:12:39:13 | 1.0 | float | +| arrayGetsSets.kt:40:3:40:7 | ...*=... | *= | double[] | arrayGetsSets.kt:40:3:40:7 | ...[...] | double | arrayGetsSets.kt:40:12:40:14 | 1.0 | double | diff --git a/java/ql/test-kotlin2/library-tests/arrays/assignExprs.ql b/java/ql/test-kotlin2/library-tests/arrays/assignExprs.ql new file mode 100644 index 00000000000..8b3f4f29a8d --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/arrays/assignExprs.ql @@ -0,0 +1,5 @@ +import java + +from AssignOp ae +select ae, ae.getOp(), ae.getType().toString(), ae.getDest(), ae.getDest().getType().toString(), + ae.getRhs(), ae.getRhs().getType().toString() diff --git a/java/ql/test-kotlin2/library-tests/arrays/primitiveArrays.kt b/java/ql/test-kotlin2/library-tests/arrays/primitiveArrays.kt new file mode 100644 index 00000000000..02f0988b208 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/arrays/primitiveArrays.kt @@ -0,0 +1,7 @@ +package test + +class Test { + + fun test(a: Array, b: Array, c: IntArray, d: Array>, e: Array>, f: Array) { } + +} diff --git a/java/ql/test-kotlin2/library-tests/arrays/test.expected b/java/ql/test-kotlin2/library-tests/arrays/test.expected new file mode 100644 index 00000000000..efdc5179609 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/arrays/test.expected @@ -0,0 +1,30 @@ +#select +| primitiveArrays.kt:5:12:5:24 | a | file://:0:0:0:0 | Integer[] | Integer | Integer | file://:0:0:0:0 | Kotlin nullable FakeKotlinClass | +| primitiveArrays.kt:5:27:5:40 | b | file://:0:0:0:0 | Integer[] | Integer | Integer | file://:0:0:0:0 | Kotlin nullable FakeKotlinClass | +| primitiveArrays.kt:5:43:5:53 | c | file://:0:0:0:0 | int[] | int | int | file://:0:0:0:0 | Kotlin nullable FakeKotlinClass | +| primitiveArrays.kt:5:56:5:76 | d | file://:0:0:0:0 | Integer[][] | Integer[] | Integer | file://:0:0:0:0 | Kotlin nullable FakeKotlinClass | +| primitiveArrays.kt:5:79:5:98 | e | file://:0:0:0:0 | Integer[][] | Integer[] | Integer | file://:0:0:0:0 | Kotlin nullable FakeKotlinClass | +| primitiveArrays.kt:5:101:5:118 | f | file://:0:0:0:0 | int[][] | int[] | int | file://:0:0:0:0 | Kotlin nullable FakeKotlinClass | +cloneMethods +| file://:0:0:0:0 | clone | clone() | file://:0:0:0:0 | Integer[] | file://:0:0:0:0 | Integer[] | file://:0:0:0:0 | Kotlin nullable FakeKotlinClass | +| file://:0:0:0:0 | clone | clone() | file://:0:0:0:0 | Integer[][] | file://:0:0:0:0 | Integer[][] | file://:0:0:0:0 | Kotlin nullable FakeKotlinClass | +| file://:0:0:0:0 | clone | clone() | file://:0:0:0:0 | int[] | file://:0:0:0:0 | int[] | file://:0:0:0:0 | Kotlin nullable FakeKotlinClass | +| file://:0:0:0:0 | clone | clone() | file://:0:0:0:0 | int[][] | file://:0:0:0:0 | int[][] | file://:0:0:0:0 | Kotlin nullable FakeKotlinClass | +sourceSignatures +| arrayCreations.kt:3:1:39:1 | TestArrayCreation | TestArrayCreation() | +| arrayCreations.kt:4:3:38:3 | test1 | test1() | +| arrayCreations.kt:22:29:22:33 | | | +| arrayCreations.kt:22:29:22:33 | invoke | invoke(int) | +| arrayCreations.kt:23:24:23:28 | | | +| arrayCreations.kt:23:24:23:28 | invoke | invoke(int) | +| arrayCreations.kt:25:27:25:31 | | | +| arrayCreations.kt:25:27:25:31 | invoke | invoke(int) | +| arrayCreations.kt:26:27:26:36 | | | +| arrayCreations.kt:26:27:26:36 | invoke | invoke(int) | +| arrayCreations.kt:27:24:27:38 | | | +| arrayCreations.kt:27:24:27:38 | invoke | invoke(int) | +| arrayGetsSets.kt:1:1:22:1 | arrayGetSet | arrayGetSet(int[],short[],byte[],long[],float[],double[],boolean[],char[],java.lang.Object[]) | +| arrayGetsSets.kt:24:1:41:1 | arrayGetSetInPlace | arrayGetSetInPlace(int[],long[],float[],double[]) | +| arrayIterators.kt:1:1:13:1 | test | test(java.lang.Integer[],int[],boolean[]) | +| primitiveArrays.kt:3:1:7:1 | Test | Test() | +| primitiveArrays.kt:5:3:5:123 | test | test(java.lang.Integer[],java.lang.Integer[],int[],java.lang.Integer[][],java.lang.Integer[][],int[][]) | diff --git a/java/ql/test-kotlin2/library-tests/arrays/test.ql b/java/ql/test-kotlin2/library-tests/arrays/test.ql new file mode 100644 index 00000000000..8fc2e64faa0 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/arrays/test.ql @@ -0,0 +1,23 @@ +import java + +class InterestingParameter extends Parameter { + InterestingParameter() { this.getFile().getBaseName() = "primitiveArrays.kt" } +} + +from InterestingParameter p, Array a, KotlinType ktType +where p.getType() = a and ktType = p.getKotlinType() +select p, a, a.getComponentType().toString(), a.getElementType().toString(), ktType + +query predicate cloneMethods( + Method m, string signature, Array declType, Type returnType, KotlinType ktReturnType +) { + any(InterestingParameter p).getType() = declType and + signature = m.getSignature() and + declType = m.getDeclaringType() and + returnType = m.getReturnType() and + ktReturnType = m.getReturnKotlinType() +} + +query predicate sourceSignatures(Callable c, string signature) { + c.getSignature() = signature and c.fromSource() +} diff --git a/java/ql/test-kotlin2/library-tests/call-int-to-char/test.expected b/java/ql/test-kotlin2/library-tests/call-int-to-char/test.expected new file mode 100644 index 00000000000..6f25264588f --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/call-int-to-char/test.expected @@ -0,0 +1 @@ +| test.kt:1:17:1:26 | toChar(...) | diff --git a/java/ql/test-kotlin2/library-tests/call-int-to-char/test.kt b/java/ql/test-kotlin2/library-tests/call-int-to-char/test.kt new file mode 100644 index 00000000000..afc1f609319 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/call-int-to-char/test.kt @@ -0,0 +1,3 @@ +fun f(x: Int) = x.toChar() + +// Diagnostic Matches: % Couldn't find a Java equivalent function to kotlin.Int.toChar in java.lang.Integer% diff --git a/java/ql/test-kotlin2/library-tests/call-int-to-char/test.ql b/java/ql/test-kotlin2/library-tests/call-int-to-char/test.ql new file mode 100644 index 00000000000..6c6c9603324 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/call-int-to-char/test.ql @@ -0,0 +1,4 @@ +import java + +from MethodCall ma +select ma diff --git a/java/ql/test-kotlin2/library-tests/clashing-extension-fields/test.expected b/java/ql/test-kotlin2/library-tests/clashing-extension-fields/test.expected new file mode 100644 index 00000000000..72fe7124394 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/clashing-extension-fields/test.expected @@ -0,0 +1,9 @@ +| | +| | +| A | +| B | +| get | +| getX | +| invoke | +| x$delegatepackagename$$subpackagename$$A | +| x$delegatepackagename$$subpackagename$$B | diff --git a/java/ql/test-kotlin2/library-tests/clashing-extension-fields/test.kt b/java/ql/test-kotlin2/library-tests/clashing-extension-fields/test.kt new file mode 100644 index 00000000000..9a7c5d51801 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/clashing-extension-fields/test.kt @@ -0,0 +1,7 @@ +package packagename.subpackagename + +public class A { } +public class B { } + +val A.x : String by lazy { "HelloA" } +val B.x : String by lazy { "HelloB" } diff --git a/java/ql/test-kotlin2/library-tests/clashing-extension-fields/test.ql b/java/ql/test-kotlin2/library-tests/clashing-extension-fields/test.ql new file mode 100644 index 00000000000..4c0a8d53b1f --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/clashing-extension-fields/test.ql @@ -0,0 +1,5 @@ +import java + +from Class c +where c.fromSource() +select c.getAMember().toString() diff --git a/java/ql/test-kotlin2/library-tests/classes/PrintAst.expected b/java/ql/test-kotlin2/library-tests/classes/PrintAst.expected new file mode 100644 index 00000000000..f98dba8f6cb --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/classes/PrintAst.expected @@ -0,0 +1,1182 @@ +classes.kt: +# 0| [CompilationUnit] classes +# 0| 1: [Class] ClassesKt +# 32| 1: [Method] f +# 32| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 32| 0: [Parameter] s +# 32| 0: [TypeAccess] String +# 32| 5: [BlockStmt] { ... } +# 158| 2: [Method] fn1 +# 158| 3: [TypeAccess] Unit +# 158| 5: [BlockStmt] { ... } +# 159| 0: [LocalTypeDeclStmt] class ... +# 159| 0: [LocalClass] X +# 159| 1: [Constructor] X +# 159| 5: [BlockStmt] { ... } +# 159| 0: [SuperConstructorInvocationStmt] super(...) +# 159| 1: [BlockStmt] { ... } +# 162| 3: [Method] fn2 +# 162| 3: [TypeAccess] Object +# 162| 5: [BlockStmt] { ... } +# 162| 0: [ReturnStmt] return ... +# 162| 0: [StmtExpr] +# 162| 0: [BlockStmt] { ... } +# 162| 0: [LocalTypeDeclStmt] class ... +# 162| 0: [AnonymousClass,LocalClass] new Object(...) { ... } +# 162| 1: [Constructor] +# 162| 5: [BlockStmt] { ... } +# 162| 0: [SuperConstructorInvocationStmt] super(...) +# 162| 1: [BlockStmt] { ... } +# 162| 1: [ExprStmt] ; +# 162| 0: [ClassInstanceExpr] new (...) +# 162| -3: [TypeAccess] Object +# 2| 2: [Class] ClassOne +# 2| 1: [Constructor] ClassOne +# 2| 5: [BlockStmt] { ... } +# 2| 0: [SuperConstructorInvocationStmt] super(...) +# 2| 1: [BlockStmt] { ... } +# 4| 3: [Class] ClassTwo +# 4| 1: [Constructor] ClassTwo +#-----| 4: (Parameters) +# 4| 0: [Parameter] arg +# 4| 0: [TypeAccess] int +# 4| 5: [BlockStmt] { ... } +# 4| 0: [SuperConstructorInvocationStmt] super(...) +# 4| 1: [BlockStmt] { ... } +# 4| 0: [ExprStmt] ; +# 4| 0: [KtInitializerAssignExpr] ...=... +# 4| 0: [VarAccess] arg +# 5| 1: [ExprStmt] ; +# 5| 0: [KtInitializerAssignExpr] ...=... +# 5| 0: [VarAccess] x +# 4| 2: [Method] getArg +# 4| 3: [TypeAccess] int +# 4| 5: [BlockStmt] { ... } +# 4| 0: [ReturnStmt] return ... +# 4| 0: [VarAccess] this.arg +# 4| -1: [ThisAccess] this +# 4| 3: [FieldDeclaration] int arg; +# 4| -1: [TypeAccess] int +# 4| 0: [VarAccess] arg +# 5| 4: [Method] getX +# 5| 3: [TypeAccess] int +# 5| 5: [BlockStmt] { ... } +# 5| 0: [ReturnStmt] return ... +# 5| 0: [VarAccess] this.x +# 5| -1: [ThisAccess] this +# 5| 5: [FieldDeclaration] int x; +# 5| -1: [TypeAccess] int +# 5| 0: [IntegerLiteral] 3 +# 8| 4: [Class] ClassThree +# 8| 1: [Constructor] ClassThree +# 8| 5: [BlockStmt] { ... } +# 8| 0: [SuperConstructorInvocationStmt] super(...) +# 8| 1: [BlockStmt] { ... } +# 9| 2: [Method] foo +# 9| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 9| 0: [Parameter] arg +# 9| 0: [TypeAccess] int +# 12| 5: [Class] ClassFour +# 12| 1: [Constructor] ClassFour +# 12| 5: [BlockStmt] { ... } +# 12| 0: [SuperConstructorInvocationStmt] super(...) +# 12| 1: [BlockStmt] { ... } +# 13| 2: [Method] foo +# 13| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 13| 0: [Parameter] arg +# 13| 0: [TypeAccess] int +# 13| 5: [BlockStmt] { ... } +# 17| 6: [Class] ClassFive +# 17| 1: [Constructor] ClassFive +# 17| 5: [BlockStmt] { ... } +# 17| 0: [SuperConstructorInvocationStmt] super(...) +# 17| 1: [BlockStmt] { ... } +# 20| 7: [Interface] IF1 +# 21| 1: [Method] funIF1 +# 21| 3: [TypeAccess] Unit +# 21| 5: [BlockStmt] { ... } +# 24| 8: [Interface] IF2 +# 25| 1: [Method] funIF2 +# 25| 3: [TypeAccess] Unit +# 25| 5: [BlockStmt] { ... } +# 28| 9: [Class] ClassSix +# 28| 1: [Method] funIF1 +# 28| 3: [TypeAccess] Unit +# 28| 5: [BlockStmt] { ... } +# 28| 0: [ReturnStmt] return ... +# 28| 0: [MethodCall] funIF1(...) +# 28| -1: [SuperAccess] IF1.super +# 28| 0: [TypeAccess] IF1 +# 28| 2: [Method] funIF2 +# 28| 3: [TypeAccess] Unit +# 28| 5: [BlockStmt] { ... } +# 28| 0: [ReturnStmt] return ... +# 28| 0: [MethodCall] funIF2(...) +# 28| -1: [SuperAccess] IF2.super +# 28| 0: [TypeAccess] IF2 +# 28| 3: [Constructor] ClassSix +# 28| 5: [BlockStmt] { ... } +# 28| 0: [SuperConstructorInvocationStmt] super(...) +# 28| 1: [BlockStmt] { ... } +# 29| 4: [Constructor] ClassSix +#-----| 4: (Parameters) +# 29| 0: [Parameter] i +# 29| 0: [TypeAccess] int +# 29| 5: [BlockStmt] { ... } +# 29| 0: [ThisConstructorInvocationStmt] this(...) +# 34| 10: [Class] ClassSeven +# 35| 1: [Constructor] ClassSeven +#-----| 4: (Parameters) +# 35| 0: [Parameter] i +# 35| 0: [TypeAccess] String +# 35| 5: [BlockStmt] { ... } +# 35| 0: [SuperConstructorInvocationStmt] super(...) +# 35| 1: [BlockStmt] { ... } +# 39| 0: [ExprStmt] ; +# 39| 0: [MethodCall] f(...) +# 39| -1: [TypeAccess] ClassesKt +# 39| 0: [StringLiteral] "init1" +# 42| 1: [ExprStmt] ; +# 42| 0: [KtInitializerAssignExpr] ...=... +# 42| 0: [VarAccess] x +# 45| 2: [ExprStmt] ; +# 45| 0: [MethodCall] f(...) +# 45| -1: [TypeAccess] ClassesKt +# 45| 0: [StringLiteral] "init2" +# 36| 2: [ExprStmt] ; +# 36| 0: [MethodCall] f(...) +# 36| -1: [TypeAccess] ClassesKt +# 36| 0: [VarAccess] i +# 42| 2: [Method] getX +# 42| 3: [TypeAccess] int +# 42| 5: [BlockStmt] { ... } +# 42| 0: [ReturnStmt] return ... +# 42| 0: [VarAccess] this.x +# 42| -1: [ThisAccess] this +# 42| 3: [FieldDeclaration] int x; +# 42| -1: [TypeAccess] int +# 42| 0: [IntegerLiteral] 3 +# 49| 11: [Class] Direction +# 49| 2: [Constructor] Direction +# 49| 5: [BlockStmt] { ... } +# 49| 0: [ExprStmt] ; +# 49| 0: [ClassInstanceExpr] new Enum(...) +# 49| -3: [TypeAccess] Enum +# 49| 0: [TypeAccess] Direction +# 49| 0: [NullLiteral] null +# 49| 1: [IntegerLiteral] 0 +# 49| 1: [BlockStmt] { ... } +# 49| 3: [Method] getEntries +# 49| 3: [TypeAccess] EnumEntries +# 49| 0: [TypeAccess] Direction +# 49| 4: [Method] valueOf +# 49| 3: [TypeAccess] Direction +#-----| 4: (Parameters) +# 49| 0: [Parameter] value +# 49| 0: [TypeAccess] String +# 49| 5: [Method] values +# 49| 3: [TypeAccess] Direction[] +# 49| 0: [TypeAccess] Direction +# 50| 6: [FieldDeclaration] Direction NORTH; +# 50| -1: [TypeAccess] Direction +# 50| 0: [ClassInstanceExpr] new Direction(...) +# 50| -3: [TypeAccess] Direction +# 50| 7: [FieldDeclaration] Direction SOUTH; +# 50| -1: [TypeAccess] Direction +# 50| 0: [ClassInstanceExpr] new Direction(...) +# 50| -3: [TypeAccess] Direction +# 50| 8: [FieldDeclaration] Direction WEST; +# 50| -1: [TypeAccess] Direction +# 50| 0: [ClassInstanceExpr] new Direction(...) +# 50| -3: [TypeAccess] Direction +# 50| 9: [FieldDeclaration] Direction EAST; +# 50| -1: [TypeAccess] Direction +# 50| 0: [ClassInstanceExpr] new Direction(...) +# 50| -3: [TypeAccess] Direction +# 53| 12: [Class] Color +# 53| 2: [Method] getEntries +# 53| 3: [TypeAccess] EnumEntries +# 53| 0: [TypeAccess] Color +# 53| 3: [Method] valueOf +# 53| 3: [TypeAccess] Color +#-----| 4: (Parameters) +# 53| 0: [Parameter] value +# 53| 0: [TypeAccess] String +# 53| 4: [Method] values +# 53| 3: [TypeAccess] Color[] +# 53| 0: [TypeAccess] Color +# 53| 5: [Constructor] Color +#-----| 4: (Parameters) +# 53| 0: [Parameter] rgb +# 53| 0: [TypeAccess] int +# 53| 5: [BlockStmt] { ... } +# 53| 0: [ExprStmt] ; +# 53| 0: [ClassInstanceExpr] new Enum(...) +# 53| -3: [TypeAccess] Enum +# 53| 0: [TypeAccess] Color +# 53| 0: [NullLiteral] null +# 53| 1: [IntegerLiteral] 0 +# 53| 1: [BlockStmt] { ... } +# 53| 0: [ExprStmt] ; +# 53| 0: [KtInitializerAssignExpr] ...=... +# 53| 0: [VarAccess] rgb +# 53| 6: [Method] getRgb +# 53| 3: [TypeAccess] int +# 53| 5: [BlockStmt] { ... } +# 53| 0: [ReturnStmt] return ... +# 53| 0: [VarAccess] this.rgb +# 53| -1: [ThisAccess] this +# 53| 7: [FieldDeclaration] int rgb; +# 53| -1: [TypeAccess] int +# 53| 0: [VarAccess] rgb +# 54| 8: [FieldDeclaration] Color RED; +# 54| -1: [TypeAccess] Color +# 54| 0: [ClassInstanceExpr] new Color(...) +# 54| -3: [TypeAccess] Color +# 54| 0: [IntegerLiteral] 16711680 +# 55| 9: [FieldDeclaration] Color GREEN; +# 55| -1: [TypeAccess] Color +# 55| 0: [ClassInstanceExpr] new Color(...) +# 55| -3: [TypeAccess] Color +# 55| 0: [IntegerLiteral] 65280 +# 56| 10: [FieldDeclaration] Color BLUE; +# 56| -1: [TypeAccess] Color +# 56| 0: [ClassInstanceExpr] new Color(...) +# 56| -3: [TypeAccess] Color +# 56| 0: [IntegerLiteral] 255 +# 59| 13: [Interface] Interface1 +# 60| 14: [Interface] Interface2 +# 61| 15: [GenericType,Interface,ParameterizedType] Interface3 +#-----| -2: (Generic Parameters) +# 61| 0: [TypeVariable] T +# 63| 16: [Class] Class1 +# 63| 1: [Constructor] Class1 +# 63| 5: [BlockStmt] { ... } +# 63| 0: [SuperConstructorInvocationStmt] super(...) +# 63| 1: [BlockStmt] { ... } +# 64| 2: [Method] getObject1 +# 64| 3: [TypeAccess] Object +#-----| 4: (Parameters) +# 64| 0: [Parameter] b +# 64| 0: [TypeAccess] boolean +# 64| 5: [BlockStmt] { ... } +# 65| 0: [ExprStmt] ; +# 65| 0: [WhenExpr] when ... +# 65| 0: [WhenBranch] ... -> ... +# 65| 0: [VarAccess] b +# 66| 1: [ReturnStmt] return ... +# 66| 0: [StmtExpr] +# 66| 0: [BlockStmt] { ... } +# 66| 0: [LocalTypeDeclStmt] class ... +# 66| 0: [AnonymousClass,LocalClass] new Object(...) { ... } +# 66| 1: [Constructor] +# 66| 5: [BlockStmt] { ... } +# 66| 0: [SuperConstructorInvocationStmt] super(...) +# 66| 1: [BlockStmt] { ... } +# 66| 1: [ExprStmt] ; +# 66| 0: [ClassInstanceExpr] new (...) +# 66| -3: [TypeAccess] Object +# 68| 1: [WhenBranch] ... -> ... +# 68| 0: [BooleanLiteral] true +# 68| 1: [ReturnStmt] return ... +# 68| 0: [StmtExpr] +# 68| 0: [BlockStmt] { ... } +# 68| 0: [LocalTypeDeclStmt] class ... +# 68| 0: [AnonymousClass,LocalClass] new Object(...) { ... } +# 68| 1: [Constructor] +# 68| 5: [BlockStmt] { ... } +# 68| 0: [SuperConstructorInvocationStmt] super(...) +# 68| 1: [BlockStmt] { ... } +# 68| 1: [ExprStmt] ; +# 68| 0: [ClassInstanceExpr] new (...) +# 68| -3: [TypeAccess] Object +# 71| 3: [Method] getObject2 +# 71| 3: [TypeAccess] Interface1 +# 71| 5: [BlockStmt] { ... } +# 72| 0: [ReturnStmt] return ... +# 72| 0: [StmtExpr] +# 72| 0: [BlockStmt] { ... } +# 72| 0: [LocalTypeDeclStmt] class ... +# 72| 0: [AnonymousClass,LocalClass] new Object(...) { ... } +# 72| 1: [Constructor] +# 72| 5: [BlockStmt] { ... } +# 72| 0: [SuperConstructorInvocationStmt] super(...) +# 72| 1: [BlockStmt] { ... } +# 73| 0: [ExprStmt] ; +# 73| 0: [KtInitializerAssignExpr] ...=... +# 73| 0: [VarAccess] x +# 73| 2: [Method] getX +# 73| 3: [TypeAccess] int +# 73| 5: [BlockStmt] { ... } +# 73| 0: [ReturnStmt] return ... +# 73| 0: [VarAccess] this.x +# 73| -1: [ThisAccess] this +# 73| 3: [FieldDeclaration] int x; +# 73| -1: [TypeAccess] int +# 73| 0: [IntegerLiteral] 1 +# 74| 4: [Method] foo +# 74| 3: [TypeAccess] Object +# 74| 5: [BlockStmt] { ... } +# 75| 0: [ReturnStmt] return ... +# 75| 0: [StmtExpr] +# 75| 0: [BlockStmt] { ... } +# 75| 0: [LocalTypeDeclStmt] class ... +# 75| 0: [AnonymousClass,LocalClass] new Object(...) { ... } +# 75| 1: [Constructor] +# 75| 5: [BlockStmt] { ... } +# 75| 0: [SuperConstructorInvocationStmt] super(...) +# 75| 1: [BlockStmt] { ... } +# 75| 1: [ExprStmt] ; +# 75| 0: [ClassInstanceExpr] new (...) +# 75| -3: [TypeAccess] Object +# 72| 1: [ExprStmt] ; +# 72| 0: [ClassInstanceExpr] new (...) +# 72| -3: [TypeAccess] Object +# 80| 4: [Method] getObject3 +# 80| 3: [TypeAccess] Object +# 80| 5: [BlockStmt] { ... } +# 81| 0: [ReturnStmt] return ... +# 81| 0: [StmtExpr] +# 81| 0: [BlockStmt] { ... } +# 81| 0: [LocalTypeDeclStmt] class ... +# 81| 0: [AnonymousClass,LocalClass] new Interface1(...) { ... } +# 81| 1: [Constructor] +# 81| 5: [BlockStmt] { ... } +# 81| 0: [SuperConstructorInvocationStmt] super(...) +# 81| 1: [BlockStmt] { ... } +# 81| 1: [ExprStmt] ; +# 81| 0: [ClassInstanceExpr] new (...) +# 81| -3: [TypeAccess] Interface1 +# 84| 5: [Method] getObject4 +# 84| 3: [TypeAccess] Object +# 84| 5: [BlockStmt] { ... } +# 85| 0: [ReturnStmt] return ... +# 85| 0: [StmtExpr] +# 85| 0: [BlockStmt] { ... } +# 85| 0: [LocalTypeDeclStmt] class ... +# 85| 0: [AnonymousClass,LocalClass] new Object(...) { ... } +# 85| 1: [Constructor] +# 85| 5: [BlockStmt] { ... } +# 85| 0: [SuperConstructorInvocationStmt] super(...) +# 85| 1: [BlockStmt] { ... } +# 85| 1: [ExprStmt] ; +# 85| 0: [ClassInstanceExpr] new (...) +# 85| -3: [TypeAccess] Object +# 88| 6: [Method] getObject5 +# 88| 3: [TypeAccess] Object +# 88| 5: [BlockStmt] { ... } +# 89| 0: [ReturnStmt] return ... +# 89| 0: [StmtExpr] +# 89| 0: [BlockStmt] { ... } +# 89| 0: [LocalTypeDeclStmt] class ... +# 89| 0: [AnonymousClass,LocalClass] new Interface3(...) { ... } +# 89| 1: [Constructor] +# 89| 5: [BlockStmt] { ... } +# 89| 0: [SuperConstructorInvocationStmt] super(...) +# 89| 1: [BlockStmt] { ... } +# 89| 1: [ExprStmt] ; +# 89| 0: [ClassInstanceExpr] new (...) +# 89| -3: [TypeAccess] Interface3 +# 93| 17: [Class] pulicClass +# 93| 1: [Constructor] pulicClass +# 93| 5: [BlockStmt] { ... } +# 93| 0: [SuperConstructorInvocationStmt] super(...) +# 93| 1: [BlockStmt] { ... } +# 94| 18: [Class] privateClass +# 94| 1: [Constructor] privateClass +# 94| 5: [BlockStmt] { ... } +# 94| 0: [SuperConstructorInvocationStmt] super(...) +# 94| 1: [BlockStmt] { ... } +# 95| 19: [Class] internalClass +# 95| 1: [Constructor] internalClass +# 95| 5: [BlockStmt] { ... } +# 95| 0: [SuperConstructorInvocationStmt] super(...) +# 95| 1: [BlockStmt] { ... } +# 96| 20: [Class] noExplicitVisibilityClass +# 96| 1: [Constructor] noExplicitVisibilityClass +# 96| 5: [BlockStmt] { ... } +# 96| 0: [SuperConstructorInvocationStmt] super(...) +# 96| 1: [BlockStmt] { ... } +# 98| 21: [Class] nestedClassVisibilities +# 98| 1: [Constructor] nestedClassVisibilities +# 98| 5: [BlockStmt] { ... } +# 98| 0: [SuperConstructorInvocationStmt] super(...) +# 98| 1: [BlockStmt] { ... } +# 99| 2: [Class] pulicNestedClass +# 99| 1: [Constructor] pulicNestedClass +# 99| 5: [BlockStmt] { ... } +# 99| 0: [SuperConstructorInvocationStmt] super(...) +# 99| 1: [BlockStmt] { ... } +# 100| 3: [Class] protectedNestedClass +# 100| 1: [Constructor] protectedNestedClass +# 100| 5: [BlockStmt] { ... } +# 100| 0: [SuperConstructorInvocationStmt] super(...) +# 100| 1: [BlockStmt] { ... } +# 101| 4: [Class] privateNestedClass +# 101| 1: [Constructor] privateNestedClass +# 101| 5: [BlockStmt] { ... } +# 101| 0: [SuperConstructorInvocationStmt] super(...) +# 101| 1: [BlockStmt] { ... } +# 102| 5: [Class] internalNestedClass +# 102| 1: [Constructor] internalNestedClass +# 102| 5: [BlockStmt] { ... } +# 102| 0: [SuperConstructorInvocationStmt] super(...) +# 102| 1: [BlockStmt] { ... } +# 103| 6: [Class] noExplicitVisibilityNestedClass +# 103| 1: [Constructor] noExplicitVisibilityNestedClass +# 103| 5: [BlockStmt] { ... } +# 103| 0: [SuperConstructorInvocationStmt] super(...) +# 103| 1: [BlockStmt] { ... } +# 106| 22: [Class] sealedClass +# 106| 1: [Constructor] sealedClass +# 106| 5: [BlockStmt] { ... } +# 106| 0: [SuperConstructorInvocationStmt] super(...) +# 106| 1: [BlockStmt] { ... } +# 107| 23: [Class] openClass +# 107| 1: [Constructor] openClass +# 107| 5: [BlockStmt] { ... } +# 107| 0: [SuperConstructorInvocationStmt] super(...) +# 107| 1: [BlockStmt] { ... } +# 109| 24: [Class] C1 +# 109| 1: [Constructor] C1 +# 109| 5: [BlockStmt] { ... } +# 109| 0: [SuperConstructorInvocationStmt] super(...) +# 109| 1: [BlockStmt] { ... } +# 110| 2: [Method] fn1 +# 110| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 110| 0: [Parameter] p +# 110| 0: [TypeAccess] int +# 110| 5: [BlockStmt] { ... } +# 111| 0: [LocalTypeDeclStmt] class ... +# 111| 0: [Class,GenericType,LocalClass,ParameterizedType] Local1 +#-----| -2: (Generic Parameters) +# 111| 0: [TypeVariable] T1 +# 111| 1: [Constructor] Local1 +# 111| 5: [BlockStmt] { ... } +# 111| 0: [SuperConstructorInvocationStmt] super(...) +# 111| 1: [BlockStmt] { ... } +# 112| 2: [Method] foo +# 112| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 112| 0: [Parameter] p +# 112| 0: [TypeAccess] int +# 112| 5: [BlockStmt] { ... } +# 114| 1: [ExprStmt] ; +# 114| 0: [MethodCall] foo(...) +# 114| -1: [ClassInstanceExpr] new Local1(...) +# 114| -3: [TypeAccess] Local1 +# 114| 0: [TypeAccess] Integer +# 114| 0: [VarAccess] p +# 117| 3: [Method] fn2 +# 117| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 117| 0: [Parameter] p +# 117| 0: [TypeAccess] int +# 117| 5: [BlockStmt] { ... } +# 118| 0: [LocalTypeDeclStmt] class ... +# 118| 0: [LocalClass] +# 118| 1: [Constructor] +# 118| 5: [BlockStmt] { ... } +# 118| 0: [SuperConstructorInvocationStmt] super(...) +# 118| 2: [Method] localFn +# 118| 3: [TypeAccess] Unit +# 118| 5: [BlockStmt] { ... } +# 119| 0: [LocalTypeDeclStmt] class ... +# 119| 0: [Class,GenericType,LocalClass,ParameterizedType] Local2 +#-----| -2: (Generic Parameters) +# 119| 0: [TypeVariable] T1 +# 119| 1: [Constructor] Local2 +# 119| 5: [BlockStmt] { ... } +# 119| 0: [SuperConstructorInvocationStmt] super(...) +# 119| 1: [BlockStmt] { ... } +# 120| 2: [Method] foo +# 120| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 120| 0: [Parameter] p +# 120| 0: [TypeAccess] int +# 120| 5: [BlockStmt] { ... } +# 122| 1: [ExprStmt] ; +# 122| 0: [MethodCall] foo(...) +# 122| -1: [ClassInstanceExpr] new Local2(...) +# 122| -3: [TypeAccess] Local2 +# 122| 0: [TypeAccess] Integer +# 122| 0: [VarAccess] p +# 126| 4: [Method] fn3 +# 126| 3: [TypeAccess] Object +#-----| 4: (Parameters) +# 126| 0: [Parameter] p +# 126| 0: [TypeAccess] int +# 126| 5: [BlockStmt] { ... } +# 127| 0: [ReturnStmt] return ... +# 127| 0: [StmtExpr] +# 127| 0: [BlockStmt] { ... } +# 127| 0: [LocalTypeDeclStmt] class ... +# 127| 0: [AnonymousClass,LocalClass] new Object(...) { ... } +# 127| 1: [Constructor] +# 127| 5: [BlockStmt] { ... } +# 127| 0: [SuperConstructorInvocationStmt] super(...) +# 127| 1: [BlockStmt] { ... } +# 128| 2: [Method] fn +# 128| 3: [TypeAccess] Unit +# 128| 5: [BlockStmt] { ... } +# 129| 0: [LocalTypeDeclStmt] class ... +# 129| 0: [Class,GenericType,LocalClass,ParameterizedType] Local3 +#-----| -2: (Generic Parameters) +# 129| 0: [TypeVariable] T1 +# 129| 1: [Constructor] Local3 +# 129| 5: [BlockStmt] { ... } +# 129| 0: [SuperConstructorInvocationStmt] super(...) +# 129| 1: [BlockStmt] { ... } +# 130| 2: [Method] foo +# 130| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 130| 0: [Parameter] p +# 130| 0: [TypeAccess] int +# 130| 5: [BlockStmt] { ... } +# 132| 1: [ExprStmt] ; +# 132| 0: [MethodCall] foo(...) +# 132| -1: [ClassInstanceExpr] new Local3(...) +# 132| -3: [TypeAccess] Local3 +# 132| 0: [TypeAccess] Integer +# 132| 0: [VarAccess] p +# 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 +# 11| 1: [Method] stringIdentity +# 11| 3: [TypeAccess] String +#-----| 4: (Parameters) +# 11| 0: [Parameter] s +# 11| 0: [TypeAccess] String +# 11| 5: [BlockStmt] { ... } +# 11| 0: [ReturnStmt] return ... +# 11| 0: [MethodCall] get(...) +# 11| -1: [ClassInstanceExpr] new Generic(...) +# 11| -3: [TypeAccess] Generic +# 11| 0: [TypeAccess] String +# 11| 0: [VarAccess] s +# 13| 2: [Method] intIdentity +# 13| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 13| 0: [Parameter] i +# 13| 0: [TypeAccess] int +# 13| 5: [BlockStmt] { ... } +# 13| 0: [ReturnStmt] return ... +# 13| 0: [MethodCall] get(...) +# 13| -1: [ClassInstanceExpr] new Generic(...) +# 13| -3: [TypeAccess] Generic +# 13| 0: [TypeAccess] Integer +# 13| 0: [VarAccess] i +# 1| 2: [Class,GenericType,ParameterizedType] Generic +#-----| -2: (Generic Parameters) +# 1| 0: [TypeVariable] T +# 1| 1: [Constructor] Generic +#-----| 4: (Parameters) +# 1| 0: [Parameter] t +# 1| 0: [TypeAccess] T +# 1| 5: [BlockStmt] { ... } +# 1| 0: [SuperConstructorInvocationStmt] super(...) +# 1| 1: [BlockStmt] { ... } +# 1| 0: [ExprStmt] ; +# 1| 0: [KtInitializerAssignExpr] ...=... +# 1| 0: [VarAccess] t +# 3| 1: [ExprStmt] ; +# 3| 0: [KtInitializerAssignExpr] ...=... +# 3| 0: [VarAccess] x +# 1| 2: [FieldDeclaration] T t; +# 1| -1: [TypeAccess] T +# 1| 0: [VarAccess] t +# 1| 3: [Method] getT +# 1| 3: [TypeAccess] T +# 1| 5: [BlockStmt] { ... } +# 1| 0: [ReturnStmt] return ... +# 1| 0: [VarAccess] this.t +# 1| -1: [ThisAccess] this +# 3| 4: [Method] getX$private +# 3| 3: [TypeAccess] new Object(...) { ... } +# 3| 0: [TypeAccess] T +# 3| 5: [BlockStmt] { ... } +# 3| 0: [ReturnStmt] return ... +# 3| 0: [VarAccess] this.x +# 3| -1: [ThisAccess] this +# 3| 5: [FieldDeclaration] new Object(...) { ... } x; +# 3| -1: [TypeAccess] new Object(...) { ... } +# 3| 0: [TypeAccess] T +# 3| 0: [StmtExpr] +# 3| 0: [BlockStmt] { ... } +# 3| 0: [LocalTypeDeclStmt] class ... +# 3| 0: [AnonymousClass,LocalClass] new Object(...) { ... } +# 3| 1: [Constructor] +# 3| 5: [BlockStmt] { ... } +# 3| 0: [SuperConstructorInvocationStmt] super(...) +# 3| 1: [BlockStmt] { ... } +# 4| 0: [ExprStmt] ; +# 4| 0: [KtInitializerAssignExpr] ...=... +# 4| 0: [VarAccess] member +# 4| 2: [FieldDeclaration] T member; +# 4| -1: [TypeAccess] T +# 4| 0: [MethodCall] getT(...) +# 4| -1: [ThisAccess] Generic.this +# 4| 0: [TypeAccess] Generic +# 4| 3: [Method] getMember +# 4| 3: [TypeAccess] T +# 4| 5: [BlockStmt] { ... } +# 4| 0: [ReturnStmt] return ... +# 4| 0: [VarAccess] this.member +# 4| -1: [ThisAccess] this +# 3| 1: [ExprStmt] ; +# 3| 0: [ClassInstanceExpr] new (...) +# 3| -3: [TypeAccess] Object +# 7| 6: [Method] get +# 7| 3: [TypeAccess] T +# 7| 5: [BlockStmt] { ... } +# 7| 0: [ReturnStmt] return ... +# 7| 0: [MethodCall] getMember(...) +# 7| -1: [MethodCall] getX$private(...) +# 7| -1: [ThisAccess] this +# 15| 4: [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| 2: [Method] fn0 +# 26| 3: [TypeAccess] U2 +# 26| 5: [BlockStmt] { ... } +# 26| 0: [ReturnStmt] return ... +# 26| 0: [MethodCall] fn0(...) +# 26| -1: [SuperAccess] C0.super +# 26| 0: [TypeAccess] C0 +# 26| 3: [Method] fn1 +# 26| 3: [TypeAccess] U3 +# 26| 5: [BlockStmt] { ... } +# 26| 0: [ReturnStmt] return ... +# 26| 0: [MethodCall] fn1(...) +# 26| -1: [SuperAccess] C1.super +# 26| 0: [TypeAccess] C1 +# 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| 2: [Method] fn0 +# 27| 3: [TypeAccess] U2 +# 27| 5: [BlockStmt] { ... } +# 27| 0: [ReturnStmt] return ... +# 27| 0: [MethodCall] fn0(...) +# 27| -1: [SuperAccess] C0.super +# 27| 0: [TypeAccess] C0 +# 27| 3: [Method] fn1 +# 27| 3: [TypeAccess] U2 +# 27| 5: [BlockStmt] { ... } +# 27| 0: [ReturnStmt] return ... +# 27| 0: [MethodCall] fn1(...) +# 27| -1: [SuperAccess] C1.super +# 27| 0: [TypeAccess] C1 +# 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| 2: [Method] fn0 +# 28| 3: [TypeAccess] U2 +# 28| 5: [BlockStmt] { ... } +# 28| 0: [ReturnStmt] return ... +# 28| 0: [MethodCall] fn0(...) +# 28| -1: [SuperAccess] C0.super +# 28| 0: [TypeAccess] C0 +# 28| 3: [Method] fn1 +# 28| 3: [TypeAccess] String +# 28| 5: [BlockStmt] { ... } +# 28| 0: [ReturnStmt] return ... +# 28| 0: [MethodCall] fn1(...) +# 28| -1: [SuperAccess] C1.super +# 28| 0: [TypeAccess] C1 +# 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| 2: [Method] fn0 +# 29| 3: [TypeAccess] U2 +# 29| 5: [BlockStmt] { ... } +# 29| 0: [ReturnStmt] return ... +# 29| 0: [MethodCall] fn0(...) +# 29| -1: [SuperAccess] C0.super +# 29| 0: [TypeAccess] C0 +# 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| 2: [Method] fn0 +# 30| 3: [TypeAccess] String +# 30| 5: [BlockStmt] { ... } +# 30| 0: [ReturnStmt] return ... +# 30| 0: [MethodCall] fn0(...) +# 30| -1: [SuperAccess] C0.super +# 30| 0: [TypeAccess] C0 +# 30| 1: [ExprStmt] ; +# 30| 0: [ClassInstanceExpr] new (...) +# 30| -3: [TypeAccess] C0 +localClassField.kt: +# 0| [CompilationUnit] localClassField +# 1| 1: [Class] A +# 1| 1: [Constructor] A +# 1| 5: [BlockStmt] { ... } +# 1| 0: [SuperConstructorInvocationStmt] super(...) +# 1| 1: [BlockStmt] { ... } +# 2| 0: [ExprStmt] ; +# 2| 0: [KtInitializerAssignExpr] ...=... +# 2| 0: [VarAccess] x +# 7| 1: [ExprStmt] ; +# 7| 0: [KtInitializerAssignExpr] ...=... +# 7| 0: [VarAccess] y +# 2| 2: [FieldDeclaration] Object x; +# 2| -1: [TypeAccess] Object +# 2| 0: [WhenExpr] when ... +# 2| 0: [WhenBranch] ... -> ... +# 2| 0: [BooleanLiteral] true +# 2| 1: [ExprStmt] ; +# 2| 0: [ImplicitCoercionToUnitExpr] +# 2| 0: [TypeAccess] Unit +# 2| 1: [StmtExpr] +# 2| 0: [BlockStmt] { ... } +# 3| 0: [LocalTypeDeclStmt] class ... +# 3| 0: [LocalClass] L +# 3| 1: [Constructor] L +# 3| 5: [BlockStmt] { ... } +# 3| 0: [SuperConstructorInvocationStmt] super(...) +# 3| 1: [BlockStmt] { ... } +# 4| 1: [ExprStmt] ; +# 4| 0: [ClassInstanceExpr] new L(...) +# 4| -3: [TypeAccess] L +# 5| 1: [WhenBranch] ... -> ... +# 5| 0: [BooleanLiteral] true +# 5| 1: [BlockStmt] { ... } +# 2| 3: [Method] getX +# 2| 3: [TypeAccess] Object +# 2| 5: [BlockStmt] { ... } +# 2| 0: [ReturnStmt] return ... +# 2| 0: [VarAccess] this.x +# 2| -1: [ThisAccess] this +# 7| 4: [FieldDeclaration] Object y; +# 7| -1: [TypeAccess] Object +# 7| 0: [WhenExpr] when ... +# 7| 0: [WhenBranch] ... -> ... +# 7| 0: [BooleanLiteral] true +# 7| 1: [ExprStmt] ; +# 7| 0: [ImplicitCoercionToUnitExpr] +# 7| 0: [TypeAccess] Unit +# 7| 1: [StmtExpr] +# 7| 0: [BlockStmt] { ... } +# 8| 0: [LocalTypeDeclStmt] class ... +# 8| 0: [LocalClass] L +# 8| 1: [Constructor] L +# 8| 5: [BlockStmt] { ... } +# 8| 0: [SuperConstructorInvocationStmt] super(...) +# 8| 1: [BlockStmt] { ... } +# 9| 1: [ExprStmt] ; +# 9| 0: [ClassInstanceExpr] new L(...) +# 9| -3: [TypeAccess] L +# 10| 1: [WhenBranch] ... -> ... +# 10| 0: [BooleanLiteral] true +# 10| 1: [BlockStmt] { ... } +# 7| 5: [Method] getY +# 7| 3: [TypeAccess] Object +# 7| 5: [BlockStmt] { ... } +# 7| 0: [ReturnStmt] return ... +# 7| 0: [VarAccess] this.y +# 7| -1: [ThisAccess] this +local_anonymous.kt: +# 0| [CompilationUnit] local_anonymous +# 3| 1: [Class] Class1 +# 3| 1: [Constructor] Class1 +# 3| 5: [BlockStmt] { ... } +# 3| 0: [SuperConstructorInvocationStmt] super(...) +# 3| 1: [BlockStmt] { ... } +# 4| 2: [Method] fn1 +# 4| 3: [TypeAccess] Object +# 4| 5: [BlockStmt] { ... } +# 5| 0: [ReturnStmt] return ... +# 5| 0: [StmtExpr] +# 5| 0: [BlockStmt] { ... } +# 5| 0: [LocalTypeDeclStmt] class ... +# 5| 0: [AnonymousClass,LocalClass] new Object(...) { ... } +# 5| 1: [Constructor] +# 5| 5: [BlockStmt] { ... } +# 5| 0: [SuperConstructorInvocationStmt] super(...) +# 5| 1: [BlockStmt] { ... } +# 6| 2: [Method] fn +# 6| 3: [TypeAccess] Unit +# 6| 5: [BlockStmt] { ... } +# 5| 1: [ExprStmt] ; +# 5| 0: [ClassInstanceExpr] new (...) +# 5| -3: [TypeAccess] Object +# 10| 3: [Method] fn2 +# 10| 3: [TypeAccess] Unit +# 10| 5: [BlockStmt] { ... } +# 11| 0: [LocalTypeDeclStmt] class ... +# 11| 0: [LocalClass] +# 11| 1: [Constructor] +# 11| 5: [BlockStmt] { ... } +# 11| 0: [SuperConstructorInvocationStmt] super(...) +# 11| 2: [Method] fnLocal +# 11| 3: [TypeAccess] Unit +# 11| 5: [BlockStmt] { ... } +# 12| 1: [ExprStmt] ; +# 12| 0: [MethodCall] fnLocal(...) +# 12| -1: [ClassInstanceExpr] new (...) +# 12| -3: [TypeAccess] Object +# 15| 4: [Method] fn3 +# 15| 3: [TypeAccess] Unit +# 15| 5: [BlockStmt] { ... } +# 16| 0: [LocalVariableDeclStmt] var ...; +# 16| 1: [LocalVariableDeclExpr] lambda1 +# 16| 0: [LambdaExpr] ...->... +# 16| -4: [AnonymousClass] new Function2(...) { ... } +# 16| 1: [Constructor] +# 16| 5: [BlockStmt] { ... } +# 16| 0: [SuperConstructorInvocationStmt] super(...) +# 16| 2: [Method] invoke +# 16| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 16| 0: [Parameter] a +# 16| 0: [TypeAccess] int +# 16| 1: [Parameter] b +# 16| 0: [TypeAccess] int +# 16| 5: [BlockStmt] { ... } +# 16| 0: [ReturnStmt] return ... +# 16| 0: [AddExpr] ... + ... +# 16| 0: [VarAccess] a +# 16| 1: [VarAccess] b +# 16| -3: [TypeAccess] Function2 +# 16| 0: [TypeAccess] Integer +# 16| 1: [TypeAccess] Integer +# 16| 2: [TypeAccess] Integer +# 17| 1: [LocalVariableDeclStmt] var ...; +# 17| 1: [LocalVariableDeclExpr] lambda2 +# 17| 0: [LambdaExpr] ...->... +# 17| -4: [AnonymousClass] new Function2(...) { ... } +# 17| 1: [Constructor] +# 17| 5: [BlockStmt] { ... } +# 17| 0: [SuperConstructorInvocationStmt] super(...) +# 17| 2: [Method] invoke +# 17| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 17| 0: [Parameter] a +# 17| 0: [TypeAccess] int +# 17| 1: [Parameter] b +# 17| 0: [TypeAccess] int +# 17| 5: [BlockStmt] { ... } +# 17| 0: [ReturnStmt] return ... +# 17| 0: [AddExpr] ... + ... +# 17| 0: [VarAccess] a +# 17| 1: [VarAccess] b +# 17| -3: [TypeAccess] Function2 +# 17| 0: [TypeAccess] Integer +# 17| 1: [TypeAccess] Integer +# 17| 2: [TypeAccess] Integer +# 20| 5: [Method] fn4 +# 20| 3: [TypeAccess] Unit +# 20| 5: [BlockStmt] { ... } +# 21| 0: [LocalVariableDeclStmt] var ...; +# 21| 1: [LocalVariableDeclExpr] fnRef +# 21| 0: [MemberRefExpr] ...::... +# 21| -4: [AnonymousClass] new Function1(...) { ... } +# 21| 1: [Constructor] +# 21| 5: [BlockStmt] { ... } +# 21| 0: [SuperConstructorInvocationStmt] super(...) +# 21| 0: [IntegerLiteral] 1 +# 21| 2: [Method] invoke +#-----| 4: (Parameters) +# 21| 0: [Parameter] a0 +# 21| 5: [BlockStmt] { ... } +# 21| 0: [ReturnStmt] return ... +# 21| 0: [MethodCall] fn3(...) +# 21| -1: [VarAccess] a0 +# 21| -3: [TypeAccess] Function1 +# 21| 0: [TypeAccess] Class1 +# 21| 1: [TypeAccess] Unit +# 24| 6: [Method] fn5 +# 24| 3: [TypeAccess] Unit +# 24| 5: [BlockStmt] { ... } +# 25| 0: [LocalTypeDeclStmt] class ... +# 25| 0: [LocalClass] LocalClass +# 25| 1: [Constructor] LocalClass +# 25| 5: [BlockStmt] { ... } +# 25| 0: [SuperConstructorInvocationStmt] super(...) +# 25| 1: [BlockStmt] { ... } +# 26| 1: [ExprStmt] ; +# 26| 0: [ImplicitCoercionToUnitExpr] +# 26| 0: [TypeAccess] Unit +# 26| 1: [ClassInstanceExpr] new LocalClass(...) +# 26| -3: [TypeAccess] LocalClass +# 29| 7: [Method] nullableAnonymous +# 29| 3: [TypeAccess] Object +# 29| 5: [BlockStmt] { ... } +# 35| 0: [ReturnStmt] return ... +# 29| 0: [StmtExpr] +# 29| 0: [BlockStmt] { ... } +# 29| 0: [LocalTypeDeclStmt] class ... +# 29| 0: [AnonymousClass,LocalClass] new Object(...) { ... } +# 29| 1: [Constructor] +# 29| 5: [BlockStmt] { ... } +# 29| 0: [SuperConstructorInvocationStmt] super(...) +# 29| 1: [BlockStmt] { ... } +# 30| 0: [ExprStmt] ; +# 30| 0: [KtInitializerAssignExpr] ...=... +# 30| 0: [VarAccess] x +# 30| 2: [Method] getX +# 30| 3: [TypeAccess] int +# 30| 5: [BlockStmt] { ... } +# 30| 0: [ReturnStmt] return ... +# 30| 0: [VarAccess] this.x +# 30| -1: [ThisAccess] this +# 30| 3: [FieldDeclaration] int x; +# 30| -1: [TypeAccess] int +# 30| 0: [IntegerLiteral] 1 +# 30| 4: [Method] setX +# 30| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 30| 0: [Parameter] +# 30| 0: [TypeAccess] int +# 30| 5: [BlockStmt] { ... } +# 30| 0: [ExprStmt] ; +# 30| 0: [AssignExpr] ...=... +# 30| 0: [VarAccess] this.x +# 30| -1: [ThisAccess] this +# 30| 1: [VarAccess] +# 32| 5: [Method] member +# 32| 3: [TypeAccess] Unit +# 32| 5: [BlockStmt] { ... } +# 33| 0: [LocalVariableDeclStmt] var ...; +# 33| 1: [LocalVariableDeclExpr] maybeThis +# 33| 0: [WhenExpr] when ... +# 33| 0: [WhenBranch] ... -> ... +# 33| 0: [ValueEQExpr] ... (value equals) ... +# 33| 0: [MethodCall] getX(...) +# 33| -1: [ThisAccess] this +# 33| 1: [IntegerLiteral] 1 +# 33| 1: [ExprStmt] ; +# 33| 0: [ThisAccess] this +# 33| 1: [WhenBranch] ... -> ... +# 33| 0: [BooleanLiteral] true +# 33| 1: [ExprStmt] ; +# 33| 0: [NullLiteral] null +# 29| 1: [ExprStmt] ; +# 29| 0: [ClassInstanceExpr] new (...) +# 29| -3: [TypeAccess] Object +# 38| 2: [Interface] Interface2 +# 39| 3: [Class] Class2 +# 39| 1: [Constructor] Class2 +# 39| 5: [BlockStmt] { ... } +# 39| 0: [SuperConstructorInvocationStmt] super(...) +# 39| 1: [BlockStmt] { ... } +# 40| 0: [ExprStmt] ; +# 40| 0: [KtInitializerAssignExpr] ...=... +# 40| 0: [VarAccess] i +# 40| 2: [FieldDeclaration] Interface2 i; +# 40| -1: [TypeAccess] Interface2 +# 40| 0: [StmtExpr] +# 40| 0: [BlockStmt] { ... } +# 40| 0: [LocalTypeDeclStmt] class ... +# 40| 0: [AnonymousClass,LocalClass] new Interface2(...) { ... } +# 40| 1: [Constructor] +# 40| 5: [BlockStmt] { ... } +# 40| 0: [SuperConstructorInvocationStmt] super(...) +# 40| 1: [BlockStmt] { ... } +# 42| 0: [LocalVariableDeclStmt] var ...; +# 42| 1: [LocalVariableDeclExpr] answer +# 42| 0: [StringLiteral] "42" +# 40| 1: [ExprStmt] ; +# 40| 0: [ClassInstanceExpr] new (...) +# 40| -3: [TypeAccess] Interface2 +# 40| 3: [Method] getI +# 40| 3: [TypeAccess] Interface2 +# 40| 5: [BlockStmt] { ... } +# 40| 0: [ReturnStmt] return ... +# 40| 0: [VarAccess] this.i +# 40| -1: [ThisAccess] this +# 40| 4: [Method] setI +# 40| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 40| 0: [Parameter] +# 40| 0: [TypeAccess] Interface2 +# 40| 5: [BlockStmt] { ... } +# 40| 0: [ExprStmt] ; +# 40| 0: [AssignExpr] ...=... +# 40| 0: [VarAccess] this.i +# 40| -1: [ThisAccess] this +# 40| 1: [VarAccess] +superChain.kt: +# 0| [CompilationUnit] superChain +# 1| 1: [Class,GenericType,ParameterizedType] SuperChain1 +#-----| -2: (Generic Parameters) +# 1| 0: [TypeVariable] T1 +# 1| 1: [TypeVariable] T2 +# 1| 1: [Constructor] SuperChain1 +# 1| 5: [BlockStmt] { ... } +# 1| 0: [SuperConstructorInvocationStmt] super(...) +# 1| 1: [BlockStmt] { ... } +# 2| 2: [Class,GenericType,ParameterizedType] SuperChain2 +#-----| -2: (Generic Parameters) +# 2| 0: [TypeVariable] T3 +# 2| 1: [TypeVariable] T4 +# 2| 1: [Constructor] SuperChain2 +# 2| 5: [BlockStmt] { ... } +# 2| 0: [SuperConstructorInvocationStmt] super(...) +# 2| 1: [BlockStmt] { ... } +# 3| 3: [Class,GenericType,ParameterizedType] SuperChain3 +#-----| -2: (Generic Parameters) +# 3| 0: [TypeVariable] T5 +# 3| 1: [TypeVariable] T6 +# 3| 1: [Constructor] SuperChain3 +# 3| 5: [BlockStmt] { ... } +# 3| 0: [SuperConstructorInvocationStmt] super(...) +# 3| 1: [BlockStmt] { ... } diff --git a/java/ql/test-kotlin2/library-tests/classes/PrintAst.qlref b/java/ql/test-kotlin2/library-tests/classes/PrintAst.qlref new file mode 100644 index 00000000000..c7fd5faf239 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/classes/PrintAst.qlref @@ -0,0 +1 @@ +semmle/code/java/PrintAst.ql \ No newline at end of file diff --git a/java/ql/test-kotlin2/library-tests/classes/anonymousClasses.expected b/java/ql/test-kotlin2/library-tests/classes/anonymousClasses.expected new file mode 100644 index 00000000000..881ed8ffacc --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/classes/anonymousClasses.expected @@ -0,0 +1,18 @@ +| classes.kt:66:20:66:54 | new Object(...) { ... } | classes.kt:66:20:66:54 | new (...) | | classes.kt:66:20:66:54 | Object | classes.kt:66:20:66:54 | class ... | +| classes.kt:68:20:68:74 | new Object(...) { ... } | classes.kt:68:20:68:74 | new (...) | | classes.kt:68:20:68:74 | Object | classes.kt:68:20:68:74 | class ... | +| classes.kt:72:16:77:10 | new Object(...) { ... } | classes.kt:72:16:77:10 | new (...) | | classes.kt:72:16:77:10 | Object | classes.kt:72:16:77:10 | class ... | +| classes.kt:75:24:75:33 | new Object(...) { ... } | classes.kt:75:24:75:33 | new (...) | | classes.kt:75:24:75:33 | Object | classes.kt:75:24:75:33 | class ... | +| classes.kt:81:16:81:38 | new Interface1(...) { ... } | classes.kt:81:16:81:38 | new (...) | | classes.kt:81:16:81:38 | Interface1 | classes.kt:81:16:81:38 | class ... | +| classes.kt:85:16:85:25 | new Object(...) { ... } | classes.kt:85:16:85:25 | new (...) | | classes.kt:85:16:85:25 | Object | classes.kt:85:16:85:25 | class ... | +| 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 ... | +| classes.kt:162:13:162:22 | new Object(...) { ... } | classes.kt:162:13:162:22 | new (...) | | classes.kt:162:13:162:22 | Object | classes.kt:162:13:162:22 | 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-kotlin2/library-tests/classes/anonymousClasses.ql b/java/ql/test-kotlin2/library-tests/classes/anonymousClasses.ql new file mode 100644 index 00000000000..f6e8e80f145 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/classes/anonymousClasses.ql @@ -0,0 +1,7 @@ +import java + +from AnonymousClass c, LocalTypeDeclStmt stmt +where c.fromSource() and stmt.getLocalType() = c +select c, c.getClassInstanceExpr(), + c.getClassInstanceExpr().getConstructor().getDeclaringType().getName(), + c.getClassInstanceExpr().getTypeName(), stmt diff --git a/java/ql/test-kotlin2/library-tests/classes/classes.expected b/java/ql/test-kotlin2/library-tests/classes/classes.expected new file mode 100644 index 00000000000..7cb3943b8d9 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/classes/classes.expected @@ -0,0 +1,69 @@ +| classes.kt:0:0:0:0 | ClassesKt | ClassesKt | final, public | +| classes.kt:2:1:2:18 | ClassOne | ClassOne | final, public | +| classes.kt:4:1:6:1 | ClassTwo | ClassTwo | final, public | +| classes.kt:8:1:10:1 | ClassThree | ClassThree | abstract, public | +| classes.kt:12:1:15:1 | ClassFour | ClassFour | public | +| classes.kt:17:1:18:1 | ClassFive | ClassFive | final, public | +| classes.kt:28:1:30:1 | ClassSix | ClassSix | final, public | +| classes.kt:34:1:47:1 | ClassSeven | ClassSeven | final, public | +| classes.kt:49:1:51:1 | Direction | Direction | final, public | +| classes.kt:53:1:57:1 | Color | Color | final, public | +| classes.kt:63:1:91:1 | Class1 | Class1 | final, public | +| classes.kt:66:20:66:54 | new Object(...) { ... } | | final, private | +| classes.kt:68:20:68:74 | new Object(...) { ... } | | final, private | +| classes.kt:72:16:77:10 | new Object(...) { ... } | | final, private | +| classes.kt:75:24:75:33 | new Object(...) { ... } | | final, private | +| classes.kt:81:16:81:38 | new Interface1(...) { ... } | | final, private | +| classes.kt:85:16:85:25 | new Object(...) { ... } | | final, private | +| classes.kt:89:16:89:44 | new Interface3(...) { ... } | | final, private | +| classes.kt:93:1:93:26 | pulicClass | pulicClass | final, public | +| classes.kt:94:1:94:29 | privateClass | privateClass | final, private | +| classes.kt:95:1:95:31 | internalClass | internalClass | final, internal | +| classes.kt:96:1:96:34 | noExplicitVisibilityClass | noExplicitVisibilityClass | final, public | +| classes.kt:98:1:104:1 | nestedClassVisibilities | nestedClassVisibilities | final, public | +| classes.kt:99:5:99:36 | pulicNestedClass | nestedClassVisibilities$pulicNestedClass | final, public | +| classes.kt:100:5:100:43 | protectedNestedClass | nestedClassVisibilities$protectedNestedClass | final, protected | +| classes.kt:101:5:101:39 | privateNestedClass | nestedClassVisibilities$privateNestedClass | final, private | +| classes.kt:102:5:102:41 | internalNestedClass | nestedClassVisibilities$internalNestedClass | final, internal | +| classes.kt:103:5:103:44 | noExplicitVisibilityNestedClass | nestedClassVisibilities$noExplicitVisibilityNestedClass | final, public | +| classes.kt:106:1:106:27 | sealedClass | sealedClass | public, sealed | +| classes.kt:107:1:107:23 | openClass | openClass | public | +| classes.kt:109:1:136:1 | C1 | C1 | final, public | +| classes.kt:111:9:113:9 | Local1 | C1$Local1 | final, private | +| classes.kt:118:9:123:9 | | C1$ | final, private | +| 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 | +| classes.kt:159:5:159:14 | X | ClassesKt$X | final, private | +| classes.kt:162:13:162:22 | new Object(...) { ... } | | final, private | +| 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 | +| local_anonymous.kt:3:1:36:1 | Class1 | LocalAnonymous.Class1 | final, public | +| local_anonymous.kt:5:16:7:9 | new Object(...) { ... } | | final, private | +| local_anonymous.kt:11:9:11:24 | | Class1$ | final, private | +| local_anonymous.kt:16:23:16:49 | new Function2(...) { ... } | | final, private | +| local_anonymous.kt:17:23:17:49 | new Function2(...) { ... } | | final, private | +| local_anonymous.kt:21:21:21:31 | new Function1(...) { ... } | | final, private | +| local_anonymous.kt:25:9:25:27 | LocalClass | LocalAnonymous.Class1$LocalClass | final, private | +| local_anonymous.kt:29:31:35:5 | new Object(...) { ... } | | final, private | +| local_anonymous.kt:39:1:45:1 | Class2 | LocalAnonymous.Class2 | final, public | +| local_anonymous.kt:40:14:44:5 | new Interface2(...) { ... } | | final, private | +| superChain.kt:1:1:1:33 | SuperChain1 | SuperChain1 | public | +| superChain.kt:2:1:2:60 | SuperChain2 | SuperChain2 | public | +| superChain.kt:3:1:3:60 | SuperChain3 | SuperChain3 | public | diff --git a/java/ql/test-kotlin2/library-tests/classes/classes.kt b/java/ql/test-kotlin2/library-tests/classes/classes.kt new file mode 100644 index 00000000000..91da724cc9e --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/classes/classes.kt @@ -0,0 +1,162 @@ + +class ClassOne { } + +class ClassTwo (val arg: Int) { + val x: Int = 3 +} + +abstract class ClassThree { + abstract fun foo(arg: Int) +} + +open class ClassFour: ClassThree() { + override fun foo(arg: Int) { + } +} + +class ClassFive: ClassFour() { +} + +interface IF1 { + fun funIF1() {} +} + +interface IF2 { + fun funIF2() {} +} + +class ClassSix(): ClassFour(), IF1, IF2 { + constructor(i: Int): this(){ } +} + +fun f(s: String) {} + +class ClassSeven { + constructor(i: String) { + f(i) + } + init { + f("init1") + } + + val x: Int = 3 + + init { + f("init2") + } +} + +enum class Direction { + NORTH, SOUTH, WEST, EAST +} + +enum class Color(val rgb: Int) { + RED(0xFF0000), + GREEN(0x00FF00), + BLUE(0x0000FF) +} + +interface Interface1 {} +interface Interface2 {} +interface Interface3 {} + +class Class1 { + private fun getObject1(b: Boolean) : Any { + if (b) + return object : Interface1, Interface2 { } + else + return object : Interface1, Interface2, Interface3 { } + } + + private fun getObject2() : Interface1 { + return object : Interface1, Interface2 { + val x = 1 + fun foo(): Any { + return object { } + } + } + } + + private fun getObject3() : Any { + return object : Interface1 { } + } + + private fun getObject4() : Any { + return object { } + } + + private fun getObject5() : Any { + return object : Interface3 { } + } +} + +public class pulicClass {} +private class privateClass {} +internal class internalClass {} +class noExplicitVisibilityClass {} + +class nestedClassVisibilities { + public class pulicNestedClass {} + protected class protectedNestedClass {} + private class privateNestedClass {} + internal class internalNestedClass {} + class noExplicitVisibilityNestedClass {} +} + +sealed class sealedClass {} +open class openClass {} + +class C1 { + fun fn1(p: Int) { + class Local1 { + fun foo(p: Int) { } + } + Local1().foo(p) + } + + fun fn2(p: Int) { + fun localFn() { + class Local2 { + fun foo(p: Int) { } + } + Local2().foo(p) + } + } + + fun fn3(p: Int): Any { + return object { + fun fn() { + class Local3 { + fun foo(p: Int) { } + } + Local3().foo(p) + } + } + } +} + +class Cl0 { + fun func1() { + fun func2() { + class Cl1{ + fun fn() { + val x = Cl1() + } + } + } + } +} + +class Cl00 { + class Cl01{ + fun fn() { + val x = Cl01() + } + } +} + +fun fn1() { + class X {} +} + +fun fn2() = object { } diff --git a/java/ql/test-kotlin2/library-tests/classes/classes.ql b/java/ql/test-kotlin2/library-tests/classes/classes.ql new file mode 100644 index 00000000000..bc0da2244ae --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/classes/classes.ql @@ -0,0 +1,5 @@ +import java + +from Class c +where c.fromSource() +select c, c.getQualifiedName(), concat(string s | c.hasModifier(s) | s, ", ") diff --git a/java/ql/test-kotlin2/library-tests/classes/ctorCalls.expected b/java/ql/test-kotlin2/library-tests/classes/ctorCalls.expected new file mode 100644 index 00000000000..0bfec48f3f2 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/classes/ctorCalls.expected @@ -0,0 +1,68 @@ +thisCall +| classes.kt:29:26:29:31 | this(...) | +superCall +| classes.kt:2:1:2:18 | super(...) | +| classes.kt:4:16:4:29 | super(...) | +| classes.kt:8:1:10:1 | super(...) | +| classes.kt:12:23:12:34 | super(...) | +| classes.kt:17:18:17:28 | super(...) | +| classes.kt:28:19:28:29 | super(...) | +| classes.kt:35:27:35:27 | super(...) | +| classes.kt:63:1:91:1 | super(...) | +| classes.kt:66:20:66:54 | super(...) | +| classes.kt:68:20:68:74 | super(...) | +| classes.kt:72:16:77:10 | super(...) | +| classes.kt:75:24:75:33 | super(...) | +| classes.kt:81:16:81:38 | super(...) | +| classes.kt:85:16:85:25 | super(...) | +| classes.kt:89:16:89:44 | super(...) | +| classes.kt:93:1:93:26 | super(...) | +| classes.kt:94:1:94:29 | super(...) | +| classes.kt:95:1:95:31 | super(...) | +| classes.kt:96:1:96:34 | super(...) | +| classes.kt:98:1:104:1 | super(...) | +| classes.kt:99:5:99:36 | super(...) | +| classes.kt:100:5:100:43 | super(...) | +| classes.kt:101:5:101:39 | super(...) | +| classes.kt:102:5:102:41 | super(...) | +| classes.kt:103:5:103:44 | super(...) | +| classes.kt:106:1:106:27 | super(...) | +| classes.kt:107:1:107:23 | super(...) | +| classes.kt:109:1:136:1 | super(...) | +| classes.kt:111:9:113:9 | super(...) | +| classes.kt:118:9:123:9 | super(...) | +| 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(...) | +| classes.kt:159:5:159:14 | super(...) | +| classes.kt:162:13:162:22 | super(...) | +| generic_anonymous.kt:1:25:1:34 | 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(...) | +| local_anonymous.kt:3:1:36:1 | super(...) | +| local_anonymous.kt:5:16:7:9 | super(...) | +| local_anonymous.kt:11:9:11:24 | super(...) | +| local_anonymous.kt:16:23:16:49 | super(...) | +| local_anonymous.kt:17:23:17:49 | super(...) | +| local_anonymous.kt:21:21:21:31 | super(...) | +| local_anonymous.kt:25:9:25:27 | super(...) | +| local_anonymous.kt:29:31:35:5 | super(...) | +| local_anonymous.kt:39:1:45:1 | super(...) | +| local_anonymous.kt:40:14:44:5 | super(...) | +| superChain.kt:1:1:1:33 | super(...) | +| superChain.kt:2:33:2:57 | super(...) | +| superChain.kt:3:33:3:57 | super(...) | diff --git a/java/ql/test-kotlin2/library-tests/classes/ctorCalls.ql b/java/ql/test-kotlin2/library-tests/classes/ctorCalls.ql new file mode 100644 index 00000000000..288c3787b8e --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/classes/ctorCalls.ql @@ -0,0 +1,5 @@ +import java + +query predicate thisCall(ThisConstructorInvocationStmt stmt) { any() } + +query predicate superCall(SuperConstructorInvocationStmt stmt) { any() } diff --git a/java/ql/test-kotlin2/library-tests/classes/genericExprTypes.expected b/java/ql/test-kotlin2/library-tests/classes/genericExprTypes.expected new file mode 100644 index 00000000000..383b5ace4bf --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/classes/genericExprTypes.expected @@ -0,0 +1,109 @@ +| generic_anonymous.kt:1:26:1:33 | ...=... | T | +| generic_anonymous.kt:1:26:1:33 | T | T | +| generic_anonymous.kt:1:26:1:33 | T | T | +| generic_anonymous.kt:1:26:1:33 | T | T | +| generic_anonymous.kt:1:26:1:33 | t | T | +| generic_anonymous.kt:1:26:1:33 | t | T | +| generic_anonymous.kt:1:26:1:33 | this | Generic | +| generic_anonymous.kt:1:26:1:33 | this.t | T | +| generic_anonymous.kt:3:3:5:3 | ...=... | new Object(...) { ... } | +| generic_anonymous.kt:3:3:5:3 | T | T | +| generic_anonymous.kt:3:3:5:3 | T | T | +| generic_anonymous.kt:3:3:5:3 | new Object(...) { ... } | new Object(...) { ... } | +| generic_anonymous.kt:3:3:5:3 | new Object(...) { ... } | new Object(...) { ... } | +| generic_anonymous.kt:3:3:5:3 | this | Generic | +| generic_anonymous.kt:3:3:5:3 | this.x | new Object(...) { ... } | +| generic_anonymous.kt:3:3:5:3 | x | new Object(...) { ... } | +| generic_anonymous.kt:3:19:5:3 | | new Object(...) { ... } | +| generic_anonymous.kt:3:19:5:3 | Object | Object | +| generic_anonymous.kt:3:19:5:3 | new (...) | new Object(...) { ... } | +| generic_anonymous.kt:4:7:4:20 | ...=... | T | +| generic_anonymous.kt:4:7:4:20 | T | T | +| generic_anonymous.kt:4:7:4:20 | T | T | +| generic_anonymous.kt:4:7:4:20 | member | T | +| generic_anonymous.kt:4:7:4:20 | this | new Object(...) { ... } | +| generic_anonymous.kt:4:7:4:20 | this.member | T | +| generic_anonymous.kt:4:20:4:20 | Generic | Generic | +| generic_anonymous.kt:4:20:4:20 | Generic.this | Generic | +| generic_anonymous.kt:4:20:4:20 | getT(...) | T | +| generic_anonymous.kt:7:3:7:22 | T | T | +| generic_anonymous.kt:7:15:7:15 | getX$private(...) | new Object(...) { ... } | +| generic_anonymous.kt:7:15:7:15 | this | Generic | +| generic_anonymous.kt:7:15:7:22 | getMember(...) | T | +| generic_anonymous.kt:11:1:11:56 | String | String | +| generic_anonymous.kt:11:20:11:28 | String | String | +| generic_anonymous.kt:11:33:11:50 | Generic | Generic | +| generic_anonymous.kt:11:33:11:50 | String | String | +| generic_anonymous.kt:11:33:11:50 | new Generic(...) | Generic | +| generic_anonymous.kt:11:33:11:56 | get(...) | String | +| generic_anonymous.kt:11:49:11:49 | s | String | +| generic_anonymous.kt:13:1:13:47 | int | int | +| generic_anonymous.kt:13:17:13:22 | int | int | +| generic_anonymous.kt:13:27:13:41 | Generic | Generic | +| generic_anonymous.kt:13:27:13:41 | Integer | Integer | +| generic_anonymous.kt:13:27:13:41 | new Generic(...) | Generic | +| generic_anonymous.kt:13:27:13:47 | get(...) | int | +| generic_anonymous.kt:13:40:13:40 | i | 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 | C0 | C0 | +| generic_anonymous.kt:26:13:26:37 | C0.super | C0 | +| generic_anonymous.kt:26:13:26:37 | C1 | C1 | +| generic_anonymous.kt:26:13:26:37 | C1.super | C1 | +| generic_anonymous.kt:26:13:26:37 | Object | Object | +| generic_anonymous.kt:26:13:26:37 | U2 | U2 | +| generic_anonymous.kt:26:13:26:37 | U3 | U3 | +| generic_anonymous.kt:26:13:26:37 | Unit | Unit | +| generic_anonymous.kt:26:13:26:37 | fn0(...) | U2 | +| generic_anonymous.kt:26:13:26:37 | fn1(...) | U3 | +| 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 | C0 | C0 | +| generic_anonymous.kt:27:13:27:37 | C0.super | C0 | +| generic_anonymous.kt:27:13:27:37 | C1 | C1 | +| generic_anonymous.kt:27:13:27:37 | C1.super | C1 | +| generic_anonymous.kt:27:13:27:37 | Object | Object | +| generic_anonymous.kt:27:13:27:37 | U2 | U2 | +| generic_anonymous.kt:27:13:27:37 | U2 | U2 | +| generic_anonymous.kt:27:13:27:37 | Unit | Unit | +| generic_anonymous.kt:27:13:27:37 | fn0(...) | U2 | +| generic_anonymous.kt:27:13:27:37 | fn1(...) | U2 | +| 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 | C0 | C0 | +| generic_anonymous.kt:28:13:28:41 | C0.super | C0 | +| generic_anonymous.kt:28:13:28:41 | C1 | C1 | +| generic_anonymous.kt:28:13:28:41 | C1.super | C1 | +| generic_anonymous.kt:28:13:28:41 | Object | Object | +| generic_anonymous.kt:28:13:28:41 | String | String | +| generic_anonymous.kt:28:13:28:41 | U2 | U2 | +| generic_anonymous.kt:28:13:28:41 | Unit | Unit | +| generic_anonymous.kt:28:13:28:41 | fn0(...) | U2 | +| generic_anonymous.kt:28:13:28:41 | fn1(...) | String | +| 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 | C0.super | C0 | +| generic_anonymous.kt:29:13:29:29 | C0 | C0 | +| generic_anonymous.kt:29:13:29:29 | U2 | U2 | +| generic_anonymous.kt:29:13:29:29 | Unit | Unit | +| generic_anonymous.kt:29:13:29:29 | fn0(...) | U2 | +| 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 | C0.super | C0 | +| generic_anonymous.kt:30:13:30:33 | C0 | C0 | +| generic_anonymous.kt:30:13:30:33 | String | String | +| generic_anonymous.kt:30:13:30:33 | Unit | Unit | +| generic_anonymous.kt:30:13:30:33 | fn0(...) | String | +| generic_anonymous.kt:30:13:30:33 | new (...) | new C0(...) { ... } | diff --git a/java/ql/test-kotlin2/library-tests/classes/genericExprTypes.ql b/java/ql/test-kotlin2/library-tests/classes/genericExprTypes.ql new file mode 100644 index 00000000000..5e4f38ab235 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/classes/genericExprTypes.ql @@ -0,0 +1,5 @@ +import java + +from Expr e +where e.getLocation().getFile().getBaseName() = "generic_anonymous.kt" +select e, e.getType().toString() diff --git a/java/ql/test-kotlin2/library-tests/classes/generic_anonymous.kt b/java/ql/test-kotlin2/library-tests/classes/generic_anonymous.kt new file mode 100644 index 00000000000..cca9b0e4668 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/classes/generic_anonymous.kt @@ -0,0 +1,33 @@ +private class Generic(val t: T) { + + private val x = object { + val member = t + } + + fun get() = x.member + +} + +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-kotlin2/library-tests/classes/interfaces.expected b/java/ql/test-kotlin2/library-tests/classes/interfaces.expected new file mode 100644 index 00000000000..ffe6722111c --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/classes/interfaces.expected @@ -0,0 +1,8 @@ +| classes.kt:20:1:22:1 | IF1 | +| classes.kt:24:1:26:1 | IF2 | +| 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-kotlin2/library-tests/classes/interfaces.ql b/java/ql/test-kotlin2/library-tests/classes/interfaces.ql new file mode 100644 index 00000000000..e3a3e5a27ce --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/classes/interfaces.ql @@ -0,0 +1,5 @@ +import java + +from Interface i +where i.fromSource() +select i diff --git a/java/ql/test-kotlin2/library-tests/classes/localClass.expected b/java/ql/test-kotlin2/library-tests/classes/localClass.expected new file mode 100644 index 00000000000..ade1f69d812 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/classes/localClass.expected @@ -0,0 +1,12 @@ +| classes.kt:111:9:113:9 | class ... | classes.kt:111:9:113:9 | Local1 | classes.kt:110:5:115:5 | fn1 | classes.kt:109:1:136:1 | C1 | +| 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 | +| classes.kt:159:5:159:14 | class ... | classes.kt:159:5:159:14 | X | classes.kt:158:1:160:1 | fn1 | classes.kt:0:0:0:0 | ClassesKt | +| 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 | +| local_anonymous.kt:25:9:25:27 | class ... | local_anonymous.kt:25:9:25:27 | LocalClass | local_anonymous.kt:24:5:27:5 | fn5 | local_anonymous.kt:3:1:36:1 | Class1 | diff --git a/java/ql/test-kotlin2/library-tests/classes/localClass.ql b/java/ql/test-kotlin2/library-tests/classes/localClass.ql new file mode 100644 index 00000000000..fc399f651e5 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/classes/localClass.ql @@ -0,0 +1,5 @@ +import java + +from LocalTypeDeclStmt s +where not s.getLocalType() instanceof AnonymousClass +select s, s.getLocalType(), s.getEnclosingCallable(), s.getLocalType().getEnclosingType() diff --git a/java/ql/test-kotlin2/library-tests/classes/localClassField.kt b/java/ql/test-kotlin2/library-tests/classes/localClassField.kt new file mode 100644 index 00000000000..f1db3f45a79 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/classes/localClassField.kt @@ -0,0 +1,11 @@ +class A { + val x = if (true) { + class L { } + L() + } else {} + + val y = if (true) { + class L { } + L() + } else {} +} diff --git a/java/ql/test-kotlin2/library-tests/classes/local_anonymous.expected b/java/ql/test-kotlin2/library-tests/classes/local_anonymous.expected new file mode 100644 index 00000000000..88c917607ff --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/classes/local_anonymous.expected @@ -0,0 +1,14 @@ +anonymousObjects +| local_anonymous.kt:5:16:7:9 | new (...) | local_anonymous.kt:5:16:7:9 | new Object(...) { ... } | anonymous | local | +| local_anonymous.kt:29:31:35:5 | new (...) | local_anonymous.kt:29:31:35:5 | new Object(...) { ... } | anonymous | local | +| local_anonymous.kt:40:14:44:5 | new (...) | local_anonymous.kt:40:14:44:5 | new Interface2(...) { ... } | anonymous | local | +localFunctions +| local_anonymous.kt:11:9:11:24 | fnLocal | local_anonymous.kt:11:9:11:24 | | not anonymous | local | +lambdas +| local_anonymous.kt:16:23:16:49 | ...->... | local_anonymous.kt:16:23:16:49 | new Function2(...) { ... } | anonymous | not local | +| local_anonymous.kt:17:23:17:49 | ...->... | local_anonymous.kt:17:23:17:49 | new Function2(...) { ... } | anonymous | not local | +memberRefs +| local_anonymous.kt:21:21:21:31 | ...::... | local_anonymous.kt:21:21:21:31 | new Function1(...) { ... } | anonymous | not local | +localClasses +| local_anonymous.kt:11:9:11:24 | | not anonymous | local | +| local_anonymous.kt:25:9:25:27 | LocalClass | not anonymous | local | diff --git a/java/ql/test-kotlin2/library-tests/classes/local_anonymous.kt b/java/ql/test-kotlin2/library-tests/classes/local_anonymous.kt new file mode 100644 index 00000000000..ff43596b64b --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/classes/local_anonymous.kt @@ -0,0 +1,45 @@ +package LocalAnonymous + +class Class1 { + fun fn1(): Any { + return object { + fun fn() {} + } + } + + fun fn2() { + fun fnLocal() {} + fnLocal() + } + + fun fn3() { + val lambda1 = { a: Int, b: Int -> a + b } + val lambda2 = fun(a: Int, b: Int) = a + b + } + + fun fn4() { + val fnRef = Class1::fn3 + } + + fun fn5() { + class LocalClass {} + LocalClass() + } + + fun nullableAnonymous() = object { + var x = 1 + + fun member() { + val maybeThis = if (x == 1) this else null // Expression with nullable anonymous type + } + } +} + +interface Interface2 {} +class Class2 { + var i = object: Interface2 { + init { + var answer: String = "42" // Local variable in anonymous class initializer + } + } +} diff --git a/java/ql/test-kotlin2/library-tests/classes/local_anonymous.ql b/java/ql/test-kotlin2/library-tests/classes/local_anonymous.ql new file mode 100644 index 00000000000..af8e63e50d8 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/classes/local_anonymous.ql @@ -0,0 +1,53 @@ +import java + +private predicate filterFile(Top t) { + t.getFile().getRelativePath().matches("%/local_anonymous.kt") +} + +private string isAnonymousType(Type t) { + if t instanceof AnonymousClass then result = "anonymous" else result = "not anonymous" +} + +private string isLocalType(Type t) { + if t instanceof LocalClassOrInterface then result = "local" else result = "not local" +} + +query predicate anonymousObjects(ClassInstanceExpr e, Type t, string anon, string local) { + filterFile(e) and + exists(AnonymousClass c | e = c.getClassInstanceExpr()) and + not exists(LambdaExpr l | l.getType() = t) and + not exists(MemberRefExpr mr | mr.getType() = t) and + not exists(Method m | m = t.(Class).getAMethod() and m.isLocal()) and + t = e.getType() and + anon = isAnonymousType(t) and + local = isLocalType(t) +} + +query predicate localFunctions(Method m, Type t, string anon, string local) { + filterFile(m) and + m.isLocal() and + t = m.getDeclaringType() and + anon = isAnonymousType(t) and + local = isLocalType(t) +} + +query predicate lambdas(LambdaExpr e, Type t, string anon, string local) { + filterFile(e) and + t = e.getType() and + anon = isAnonymousType(t) and + local = isLocalType(t) +} + +query predicate memberRefs(MemberRefExpr e, Type t, string anon, string local) { + filterFile(e) and + t = e.getType() and + anon = isAnonymousType(t) and + local = isLocalType(t) +} + +query predicate localClasses(LocalClass c, string anon, string local) { + filterFile(c) and + not c instanceof AnonymousClass and + anon = isAnonymousType(c) and + local = isLocalType(c) +} diff --git a/java/ql/test-kotlin2/library-tests/classes/paramTypes.expected b/java/ql/test-kotlin2/library-tests/classes/paramTypes.expected new file mode 100644 index 00000000000..65cac719f4b --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/classes/paramTypes.expected @@ -0,0 +1,26 @@ +| 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:///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 | +| file:///SuperChain1.class:0:0:0:0 | SuperChain1 | 1 | file:///String.class:0:0:0:0 | String | +| file:///SuperChain1.class:0:0:0:0 | SuperChain1 | 0 | superChain.kt:3:24:3:25 | T5 | +| file:///SuperChain1.class:0:0:0:0 | SuperChain1 | 1 | file:///String.class:0:0:0:0 | String | +| 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 | +| superChain.kt:2:1:2:60 | SuperChain2 | 1 | superChain.kt:2:28:2:29 | T4 | +| superChain.kt:3:1:3:60 | SuperChain3 | 0 | superChain.kt:3:24:3:25 | T5 | +| superChain.kt:3:1:3:60 | SuperChain3 | 1 | superChain.kt:3:28:3:29 | T6 | diff --git a/java/ql/test-kotlin2/library-tests/classes/paramTypes.ql b/java/ql/test-kotlin2/library-tests/classes/paramTypes.ql new file mode 100644 index 00000000000..d067ca265ec --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/classes/paramTypes.ql @@ -0,0 +1,16 @@ +import java + +// Stop external filepaths from appearing in the results +class ClassOrInterfaceLocation extends ClassOrInterface { + override predicate hasLocationInfo(string path, int sl, int sc, int el, int ec) { + exists(string fullPath | super.hasLocationInfo(fullPath, sl, sc, el, ec) | + if exists(this.getFile().getRelativePath()) + then path = fullPath + else path = fullPath.regexpReplaceAll(".*/", "/") + ) + } +} + +from ParameterizedClass c, int i +where c.getSourceDeclaration().fromSource() +select c, i, c.getTypeArgument(i) diff --git a/java/ql/test-kotlin2/library-tests/classes/superChain.kt b/java/ql/test-kotlin2/library-tests/classes/superChain.kt new file mode 100644 index 00000000000..63a27094490 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/classes/superChain.kt @@ -0,0 +1,5 @@ +open class SuperChain1 {} +open class SuperChain2: SuperChain1() {} +open class SuperChain3: SuperChain2() {} +// This should end up with SuperChain2 having +// SuperChain1 as a supertype. diff --git a/java/ql/test-kotlin2/library-tests/classes/superTypes.expected b/java/ql/test-kotlin2/library-tests/classes/superTypes.expected new file mode 100644 index 00000000000..57b683230dd --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/classes/superTypes.expected @@ -0,0 +1,198 @@ +#select +| classes.kt:2:1:2:18 | ClassOne | file:///Object.class:0:0:0:0 | Object | +| classes.kt:4:1:6:1 | ClassTwo | file:///Object.class:0:0:0:0 | Object | +| classes.kt:8:1:10:1 | ClassThree | file:///Object.class:0:0:0:0 | Object | +| classes.kt:12:1:15:1 | ClassFour | classes.kt:8:1:10:1 | ClassThree | +| classes.kt:17:1:18:1 | ClassFive | classes.kt:12:1:15:1 | ClassFour | +| classes.kt:28:1:30:1 | ClassSix | classes.kt:12:1:15:1 | ClassFour | +| classes.kt:28:1:30:1 | ClassSix | classes.kt:20:1:22:1 | IF1 | +| classes.kt:28:1:30:1 | ClassSix | classes.kt:24:1:26:1 | IF2 | +| classes.kt:34:1:47:1 | ClassSeven | file:///Object.class:0:0:0:0 | Object | +| classes.kt:49:1:51:1 | Direction | file:///Enum.class:0:0:0:0 | Enum | +| classes.kt:53:1:57:1 | Color | file:///Enum.class:0:0:0:0 | Enum | +| classes.kt:63:1:91:1 | Class1 | file:///Object.class:0:0:0:0 | Object | +| classes.kt:66:20:66:54 | new Object(...) { ... } | classes.kt:59:1:59:23 | Interface1 | +| classes.kt:66:20:66:54 | new Object(...) { ... } | classes.kt:60:1:60:23 | Interface2 | +| classes.kt:68:20:68:74 | new Object(...) { ... } | classes.kt:59:1:59:23 | Interface1 | +| classes.kt:68:20:68:74 | new Object(...) { ... } | classes.kt:60:1:60:23 | Interface2 | +| classes.kt:68:20:68:74 | new Object(...) { ... } | file:///Interface3.class:0:0:0:0 | Interface3 | +| classes.kt:72:16:77:10 | new Object(...) { ... } | classes.kt:59:1:59:23 | Interface1 | +| classes.kt:72:16:77:10 | new Object(...) { ... } | classes.kt:60:1:60:23 | Interface2 | +| classes.kt:75:24:75:33 | new Object(...) { ... } | file:///Object.class:0:0:0:0 | Object | +| classes.kt:81:16:81:38 | new Interface1(...) { ... } | classes.kt:59:1:59:23 | Interface1 | +| classes.kt:85:16:85:25 | new Object(...) { ... } | file:///Object.class:0:0:0:0 | Object | +| classes.kt:89:16:89:44 | new Interface3(...) { ... } | file:///Interface3.class:0:0:0:0 | Interface3 | +| classes.kt:93:1:93:26 | pulicClass | file:///Object.class:0:0:0:0 | Object | +| classes.kt:94:1:94:29 | privateClass | file:///Object.class:0:0:0:0 | Object | +| classes.kt:95:1:95:31 | internalClass | file:///Object.class:0:0:0:0 | Object | +| classes.kt:96:1:96:34 | noExplicitVisibilityClass | file:///Object.class:0:0:0:0 | Object | +| classes.kt:98:1:104:1 | nestedClassVisibilities | file:///Object.class:0:0:0:0 | Object | +| classes.kt:99:5:99:36 | pulicNestedClass | file:///Object.class:0:0:0:0 | Object | +| classes.kt:100:5:100:43 | protectedNestedClass | file:///Object.class:0:0:0:0 | Object | +| classes.kt:101:5:101:39 | privateNestedClass | file:///Object.class:0:0:0:0 | Object | +| classes.kt:102:5:102:41 | internalNestedClass | file:///Object.class:0:0:0:0 | Object | +| classes.kt:103:5:103:44 | noExplicitVisibilityNestedClass | file:///Object.class:0:0:0:0 | Object | +| classes.kt:106:1:106:27 | sealedClass | file:///Object.class:0:0:0:0 | Object | +| classes.kt:107:1:107:23 | openClass | file:///Object.class:0:0:0:0 | Object | +| classes.kt:109:1:136:1 | C1 | file:///Object.class:0:0:0:0 | Object | +| classes.kt:111:9:113:9 | Local1 | file:///Object.class:0:0:0:0 | Object | +| classes.kt:118:9:123:9 | | file:///Object.class:0:0:0:0 | Object | +| 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 | +| classes.kt:159:5:159:14 | X | file:///Object.class:0:0:0:0 | Object | +| classes.kt:162:13:162:22 | new Object(...) { ... } | 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:///Generic.class:0:0:0:0 | Generic | file:///Object.class:0:0:0:0 | Object | +| file:///Generic.class:0:0:0:0 | Generic | generic_anonymous.kt:1:1:9:1 | Generic<> | +| file:///Generic.class:0:0:0:0 | Generic | file:///Object.class:0:0:0:0 | Object | +| file:///Generic.class:0:0:0:0 | Generic | generic_anonymous.kt:1:1:9:1 | Generic<> | +| file:///SuperChain1.class:0:0:0:0 | SuperChain1 | file:///Object.class:0:0:0:0 | Object | +| file:///SuperChain1.class:0:0:0:0 | SuperChain1 | file:///Object.class:0:0:0:0 | Object | +| 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:1:1:9:1 | Generic | generic_anonymous.kt:1:1:9:1 | Generic<> | +| 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: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 | +| local_anonymous.kt:3:1:36:1 | Class1 | file:///Object.class:0:0:0:0 | Object | +| local_anonymous.kt:5:16:7:9 | new Object(...) { ... } | file:///Object.class:0:0:0:0 | Object | +| local_anonymous.kt:11:9:11:24 | | file:///Object.class:0:0:0:0 | Object | +| local_anonymous.kt:16:23:16:49 | new Function2(...) { ... } | file:///Function2.class:0:0:0:0 | Function2 | +| local_anonymous.kt:16:23:16:49 | new Function2(...) { ... } | file:///Object.class:0:0:0:0 | Object | +| local_anonymous.kt:17:23:17:49 | new Function2(...) { ... } | file:///Function2.class:0:0:0:0 | Function2 | +| local_anonymous.kt:17:23:17:49 | new Function2(...) { ... } | file:///Object.class:0:0:0:0 | Object | +| local_anonymous.kt:21:21:21:31 | new Function1(...) { ... } | file:///Function1.class:0:0:0:0 | Function1 | +| local_anonymous.kt:21:21:21:31 | new Function1(...) { ... } | file:///FunctionReference.class:0:0:0:0 | FunctionReference | +| local_anonymous.kt:25:9:25:27 | LocalClass | file:///Object.class:0:0:0:0 | Object | +| local_anonymous.kt:29:31:35:5 | new Object(...) { ... } | file:///Object.class:0:0:0:0 | Object | +| local_anonymous.kt:39:1:45:1 | Class2 | file:///Object.class:0:0:0:0 | Object | +| local_anonymous.kt:40:14:44:5 | new Interface2(...) { ... } | local_anonymous.kt:38:1:38:23 | Interface2 | +| superChain.kt:1:1:1:33 | SuperChain1 | file:///Object.class:0:0:0:0 | Object | +| superChain.kt:2:1:2:60 | SuperChain2 | file:///SuperChain1.class:0:0:0:0 | SuperChain1 | +| superChain.kt:3:1:3:60 | SuperChain3 | file:///SuperChain2.class:0:0:0:0 | SuperChain2 | +extendsOrImplements +| classes.kt:2:1:2:18 | ClassOne | file:///Object.class:0:0:0:0 | Object | extends | +| classes.kt:4:1:6:1 | ClassTwo | file:///Object.class:0:0:0:0 | Object | extends | +| classes.kt:8:1:10:1 | ClassThree | file:///Object.class:0:0:0:0 | Object | extends | +| classes.kt:12:1:15:1 | ClassFour | classes.kt:8:1:10:1 | ClassThree | extends | +| classes.kt:17:1:18:1 | ClassFive | classes.kt:12:1:15:1 | ClassFour | extends | +| classes.kt:20:1:22:1 | IF1 | file:///Object.class:0:0:0:0 | Object | extends | +| classes.kt:24:1:26:1 | IF2 | file:///Object.class:0:0:0:0 | Object | extends | +| classes.kt:28:1:30:1 | ClassSix | classes.kt:12:1:15:1 | ClassFour | extends | +| classes.kt:28:1:30:1 | ClassSix | classes.kt:20:1:22:1 | IF1 | implements | +| classes.kt:28:1:30:1 | ClassSix | classes.kt:24:1:26:1 | IF2 | implements | +| classes.kt:34:1:47:1 | ClassSeven | file:///Object.class:0:0:0:0 | Object | extends | +| classes.kt:49:1:51:1 | Direction | file:///Enum.class:0:0:0:0 | Enum | extends | +| classes.kt:53:1:57:1 | Color | file:///Enum.class:0:0:0:0 | Enum | extends | +| classes.kt:59:1:59:23 | Interface1 | file:///Object.class:0:0:0:0 | Object | extends | +| classes.kt:60:1:60:23 | Interface2 | file:///Object.class:0:0:0:0 | Object | extends | +| classes.kt:61:1:61:26 | Interface3 | file:///Object.class:0:0:0:0 | Object | extends | +| classes.kt:63:1:91:1 | Class1 | file:///Object.class:0:0:0:0 | Object | extends | +| classes.kt:66:20:66:54 | new Object(...) { ... } | classes.kt:59:1:59:23 | Interface1 | implements | +| classes.kt:66:20:66:54 | new Object(...) { ... } | classes.kt:60:1:60:23 | Interface2 | implements | +| classes.kt:68:20:68:74 | new Object(...) { ... } | classes.kt:59:1:59:23 | Interface1 | implements | +| classes.kt:68:20:68:74 | new Object(...) { ... } | classes.kt:60:1:60:23 | Interface2 | implements | +| classes.kt:68:20:68:74 | new Object(...) { ... } | file:///Interface3.class:0:0:0:0 | Interface3 | implements | +| classes.kt:72:16:77:10 | new Object(...) { ... } | classes.kt:59:1:59:23 | Interface1 | implements | +| classes.kt:72:16:77:10 | new Object(...) { ... } | classes.kt:60:1:60:23 | Interface2 | implements | +| classes.kt:75:24:75:33 | new Object(...) { ... } | file:///Object.class:0:0:0:0 | Object | extends | +| classes.kt:81:16:81:38 | new Interface1(...) { ... } | classes.kt:59:1:59:23 | Interface1 | implements | +| classes.kt:85:16:85:25 | new Object(...) { ... } | file:///Object.class:0:0:0:0 | Object | extends | +| classes.kt:89:16:89:44 | new Interface3(...) { ... } | file:///Interface3.class:0:0:0:0 | Interface3 | implements | +| classes.kt:93:1:93:26 | pulicClass | file:///Object.class:0:0:0:0 | Object | extends | +| classes.kt:94:1:94:29 | privateClass | file:///Object.class:0:0:0:0 | Object | extends | +| classes.kt:95:1:95:31 | internalClass | file:///Object.class:0:0:0:0 | Object | extends | +| classes.kt:96:1:96:34 | noExplicitVisibilityClass | file:///Object.class:0:0:0:0 | Object | extends | +| classes.kt:98:1:104:1 | nestedClassVisibilities | file:///Object.class:0:0:0:0 | Object | extends | +| classes.kt:99:5:99:36 | pulicNestedClass | file:///Object.class:0:0:0:0 | Object | extends | +| classes.kt:100:5:100:43 | protectedNestedClass | file:///Object.class:0:0:0:0 | Object | extends | +| classes.kt:101:5:101:39 | privateNestedClass | file:///Object.class:0:0:0:0 | Object | extends | +| classes.kt:102:5:102:41 | internalNestedClass | file:///Object.class:0:0:0:0 | Object | extends | +| classes.kt:103:5:103:44 | noExplicitVisibilityNestedClass | file:///Object.class:0:0:0:0 | Object | extends | +| classes.kt:106:1:106:27 | sealedClass | file:///Object.class:0:0:0:0 | Object | extends | +| classes.kt:107:1:107:23 | openClass | file:///Object.class:0:0:0:0 | Object | extends | +| classes.kt:109:1:136:1 | C1 | file:///Object.class:0:0:0:0 | Object | extends | +| classes.kt:111:9:113:9 | Local1 | file:///Object.class:0:0:0:0 | Object | extends | +| classes.kt:118:9:123:9 | | file:///Object.class:0:0:0:0 | Object | extends | +| classes.kt:119:13:121:13 | Local2 | file:///Object.class:0:0:0:0 | Object | extends | +| classes.kt:127:16:134:9 | new Object(...) { ... } | file:///Object.class:0:0:0:0 | Object | extends | +| classes.kt:129:17:131:17 | Local3 | file:///Object.class:0:0:0:0 | Object | extends | +| classes.kt:138:1:148:1 | Cl0 | file:///Object.class:0:0:0:0 | Object | extends | +| classes.kt:140:9:146:9 | | file:///Object.class:0:0:0:0 | Object | extends | +| classes.kt:141:13:145:13 | Cl1 | file:///Object.class:0:0:0:0 | Object | extends | +| classes.kt:150:1:156:1 | Cl00 | file:///Object.class:0:0:0:0 | Object | extends | +| classes.kt:151:5:155:5 | Cl01 | file:///Object.class:0:0:0:0 | Object | extends | +| classes.kt:159:5:159:14 | X | file:///Object.class:0:0:0:0 | Object | extends | +| classes.kt:162:13:162:22 | new Object(...) { ... } | file:///Object.class:0:0:0:0 | Object | extends | +| file:///C1$$Local3.class:0:0:0:0 | Local3 | file:///Object.class:0:0:0:0 | Object | extends | +| file:///C1$Local1.class:0:0:0:0 | Local1 | file:///Object.class:0:0:0:0 | Object | extends | +| file:///C1$Local2.class:0:0:0:0 | Local2 | file:///Object.class:0:0:0:0 | Object | extends | +| file:///Generic.class:0:0:0:0 | Generic | file:///Object.class:0:0:0:0 | Object | extends | +| file:///Generic.class:0:0:0:0 | Generic | file:///Object.class:0:0:0:0 | Object | extends | +| file:///Interface3.class:0:0:0:0 | Interface3 | file:///Object.class:0:0:0:0 | Object | extends | +| file:///Interface3.class:0:0:0:0 | Interface3 | file:///Object.class:0:0:0:0 | Object | extends | +| file:///Outer$C0.class:0:0:0:0 | C0 | file:///Object.class:0:0:0:0 | Object | extends | +| file:///Outer$C0.class:0:0:0:0 | C0 | file:///Object.class:0:0:0:0 | Object | extends | +| file:///Outer$C1.class:0:0:0:0 | C1 | file:///Object.class:0:0:0:0 | Object | extends | +| file:///Outer$C1.class:0:0:0:0 | C1 | file:///Object.class:0:0:0:0 | Object | extends | +| file:///Outer$C1.class:0:0:0:0 | C1 | file:///Object.class:0:0:0:0 | Object | extends | +| file:///SuperChain1.class:0:0:0:0 | SuperChain1 | file:///Object.class:0:0:0:0 | Object | extends | +| file:///SuperChain1.class:0:0:0:0 | SuperChain1 | file:///Object.class:0:0:0:0 | Object | extends | +| file:///SuperChain2.class:0:0:0:0 | SuperChain2 | file:///SuperChain1.class:0:0:0:0 | SuperChain1 | extends | +| generic_anonymous.kt:1:1:9:1 | Generic | file:///Object.class:0:0:0:0 | Object | extends | +| generic_anonymous.kt:1:1:9:1 | Generic<> | file:///Object.class:0:0:0:0 | Object | extends | +| generic_anonymous.kt:3:19:5:3 | new Object(...) { ... } | file:///Object.class:0:0:0:0 | Object | extends | +| generic_anonymous.kt:3:19:5:3 | new Object(...) { ... }<> | file:///Object.class:0:0:0:0 | Object | extends | +| generic_anonymous.kt:15:1:33:1 | Outer | file:///Object.class:0:0:0:0 | Object | extends | +| generic_anonymous.kt:16:5:18:5 | C0 | file:///Object.class:0:0:0:0 | Object | extends | +| generic_anonymous.kt:20:5:22:5 | C1 | file:///Object.class:0:0:0:0 | Object | extends | +| generic_anonymous.kt:25:9:31:9 | | file:///Object.class:0:0:0:0 | Object | extends | +| generic_anonymous.kt:26:13:26:37 | new Object(...) { ... } | file:///Outer$C0.class:0:0:0:0 | C0 | implements | +| generic_anonymous.kt:26:13:26:37 | new Object(...) { ... } | file:///Outer$C1.class:0:0:0:0 | C1 | implements | +| generic_anonymous.kt:27:13:27:37 | new Object(...) { ... } | file:///Outer$C0.class:0:0:0:0 | C0 | implements | +| generic_anonymous.kt:27:13:27:37 | new Object(...) { ... } | file:///Outer$C1.class:0:0:0:0 | C1 | implements | +| generic_anonymous.kt:28:13:28:41 | new Object(...) { ... } | file:///Outer$C0.class:0:0:0:0 | C0 | implements | +| generic_anonymous.kt:28:13:28:41 | new Object(...) { ... } | file:///Outer$C1.class:0:0:0:0 | C1 | implements | +| generic_anonymous.kt:29:13:29:29 | new C0(...) { ... } | file:///Outer$C0.class:0:0:0:0 | C0 | implements | +| generic_anonymous.kt:30:13:30:33 | new C0(...) { ... } | file:///Outer$C0.class:0:0:0:0 | C0 | implements | +| localClassField.kt:1:1:11:1 | A | file:///Object.class:0:0:0:0 | Object | extends | +| localClassField.kt:3:9:3:19 | L | file:///Object.class:0:0:0:0 | Object | extends | +| localClassField.kt:8:9:8:19 | L | file:///Object.class:0:0:0:0 | Object | extends | +| local_anonymous.kt:3:1:36:1 | Class1 | file:///Object.class:0:0:0:0 | Object | extends | +| local_anonymous.kt:5:16:7:9 | new Object(...) { ... } | file:///Object.class:0:0:0:0 | Object | extends | +| local_anonymous.kt:11:9:11:24 | | file:///Object.class:0:0:0:0 | Object | extends | +| local_anonymous.kt:16:23:16:49 | new Function2(...) { ... } | file:///Function2.class:0:0:0:0 | Function2 | implements | +| local_anonymous.kt:16:23:16:49 | new Function2(...) { ... } | file:///Object.class:0:0:0:0 | Object | extends | +| local_anonymous.kt:17:23:17:49 | new Function2(...) { ... } | file:///Function2.class:0:0:0:0 | Function2 | implements | +| local_anonymous.kt:17:23:17:49 | new Function2(...) { ... } | file:///Object.class:0:0:0:0 | Object | extends | +| local_anonymous.kt:21:21:21:31 | new Function1(...) { ... } | file:///Function1.class:0:0:0:0 | Function1 | implements | +| local_anonymous.kt:21:21:21:31 | new Function1(...) { ... } | file:///FunctionReference.class:0:0:0:0 | FunctionReference | extends | +| local_anonymous.kt:25:9:25:27 | LocalClass | file:///Object.class:0:0:0:0 | Object | extends | +| local_anonymous.kt:29:31:35:5 | new Object(...) { ... } | file:///Object.class:0:0:0:0 | Object | extends | +| local_anonymous.kt:38:1:38:23 | Interface2 | file:///Object.class:0:0:0:0 | Object | extends | +| local_anonymous.kt:39:1:45:1 | Class2 | file:///Object.class:0:0:0:0 | Object | extends | +| local_anonymous.kt:40:14:44:5 | new Interface2(...) { ... } | local_anonymous.kt:38:1:38:23 | Interface2 | implements | +| superChain.kt:1:1:1:33 | SuperChain1 | file:///Object.class:0:0:0:0 | Object | extends | +| superChain.kt:2:1:2:60 | SuperChain2 | file:///SuperChain1.class:0:0:0:0 | SuperChain1 | extends | +| superChain.kt:3:1:3:60 | SuperChain3 | file:///SuperChain2.class:0:0:0:0 | SuperChain2 | extends | diff --git a/java/ql/test-kotlin2/library-tests/classes/superTypes.ql b/java/ql/test-kotlin2/library-tests/classes/superTypes.ql new file mode 100644 index 00000000000..700540ce43b --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/classes/superTypes.ql @@ -0,0 +1,27 @@ +import java + +// Stop external filepaths from appearing in the results +class ClassOrInterfaceLocation extends ClassOrInterface { + override predicate hasLocationInfo(string path, int sl, int sc, int el, int ec) { + exists(string fullPath | super.hasLocationInfo(fullPath, sl, sc, el, ec) | + if exists(this.getFile().getRelativePath()) + then path = fullPath + else path = fullPath.regexpReplaceAll(".*/", "/") + ) + } +} + +from Class c, Type superType +where + c.getSourceDeclaration().fromSource() and + superType = c.getASupertype() +select c, superType + +query predicate extendsOrImplements(ClassOrInterface c, Type superType, string kind) { + c.getSourceDeclaration().fromSource() and + ( + extendsReftype(c, superType) and kind = "extends" + or + implInterface(c, superType) and kind = "implements" + ) +} diff --git a/java/ql/test-kotlin2/library-tests/collection-literals/PrintAst.expected b/java/ql/test-kotlin2/library-tests/collection-literals/PrintAst.expected new file mode 100644 index 00000000000..cbcabc82bd5 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/collection-literals/PrintAst.expected @@ -0,0 +1,12 @@ +test.kt: +# 0| [CompilationUnit] test +# 1| 1: [Interface] Ann +#-----| -3: (Annotations) +# 0| 1: [Annotation] Retention +# 0| 1: [VarAccess] RetentionPolicy.RUNTIME +# 0| -1: [TypeAccess] RetentionPolicy +# 1| 1: [Method] arr1 +# 1| 3: [TypeAccess] String[] +# 1| 0: [TypeAccess] String +# 1| 2: [Method] arr2 +# 1| 3: [TypeAccess] int[] diff --git a/java/ql/test-kotlin2/library-tests/collection-literals/PrintAst.qlref b/java/ql/test-kotlin2/library-tests/collection-literals/PrintAst.qlref new file mode 100644 index 00000000000..c7fd5faf239 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/collection-literals/PrintAst.qlref @@ -0,0 +1 @@ +semmle/code/java/PrintAst.ql \ No newline at end of file diff --git a/java/ql/test-kotlin2/library-tests/collection-literals/test.kt b/java/ql/test-kotlin2/library-tests/collection-literals/test.kt new file mode 100644 index 00000000000..615b296239a --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/collection-literals/test.kt @@ -0,0 +1 @@ +annotation class Ann(val arr1: Array = ["hello", "world"], val arr2: IntArray = [1, 2, 3]) { } diff --git a/java/ql/test-kotlin2/library-tests/comments/comments.expected b/java/ql/test-kotlin2/library-tests/comments/comments.expected new file mode 100644 index 00000000000..7bd80ec0ed0 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/comments/comments.expected @@ -0,0 +1,82 @@ +comments +| comments.kt:1:1:1:25 | /** Kdoc with no owner */ | /** Kdoc with no owner */ | +| comments.kt:4:1:11:3 | /**\n * A group of *members*.\n *\n * This class has no useful logic; it's just a documentation example.\n *\n * @property name the name of this group.\n * @constructor Creates an empty group.\n */ | /**\n * A group of *members*.\n *\n * This class has no useful logic; it's just a documentation example.\n *\n * @property name the name of this group.\n * @constructor Creates an empty group.\n */ | +| comments.kt:14:5:16:7 | /**\n * Members of this group.\n */ | /**\n * Members of this group.\n */ | +| comments.kt:19:5:22:7 | /**\n * Adds a [member] to this group.\n * @return the new size of the group.\n */ | /**\n * Adds a [member] to this group.\n * @return the new size of the group.\n */ | +| comments.kt:24:9:24:25 | // A line comment | // A line comment | +| comments.kt:28:5:30:6 | /*\n A block comment\n */ | /*\n A block comment\n */ | +| comments.kt:35:5:35:34 | /** Medium is in the middle */ | /** Medium is in the middle */ | +| comments.kt:37:5:37:23 | /** This is high */ | /** This is high */ | +| comments.kt:42:5:44:7 | /**\n * A variable.\n */ | /**\n * A variable.\n */ | +| comments.kt:48:1:50:3 | /**\n * A type alias comment\n */ | /**\n * A type alias comment\n */ | +| comments.kt:54:5:56:7 | /**\n * An init block comment\n */ | /**\n * An init block comment\n */ | +| comments.kt:61:5:63:7 | /**\n * A prop comment\n */ | /**\n * A prop comment\n */ | +| comments.kt:65:9:67:11 | /**\n * An accessor comment\n */ | /**\n * An accessor comment\n */ | +| comments.kt:71:9:73:11 | /**\n * An anonymous function comment\n */ | /**\n * An anonymous function comment\n */ | +| comments.kt:79:9:81:11 | /**\n * A local function comment\n */ | /**\n * A local function comment\n */ | +| comments.kt:88:10:90:11 | /**\n * An anonymous object comment\n */ | /**\n * An anonymous object comment\n */ | +| comments.kt:95:1:95:163 | // Diagnostic Matches: % Couldn't get owner of KDoc. The comment is extracted without an owner. ...while extracting a file (comments.kt) at %comments.kt:1:1:96:0% | // Diagnostic Matches: % Couldn't get owner of KDoc. The comment is extracted without an owner. ...while extracting a file (comments.kt) at %comments.kt:1:1:96:0% | +commentOwners +| comments.kt:4:1:11:3 | /**\n * A group of *members*.\n *\n * This class has no useful logic; it's just a documentation example.\n *\n * @property name the name of this group.\n * @constructor Creates an empty group.\n */ | comments.kt:12:1:31:1 | Group | +| comments.kt:4:1:11:3 | /**\n * A group of *members*.\n *\n * This class has no useful logic; it's just a documentation example.\n *\n * @property name the name of this group.\n * @constructor Creates an empty group.\n */ | comments.kt:12:1:31:1 | Group | +| comments.kt:14:5:16:7 | /**\n * Members of this group.\n */ | comments.kt:17:5:17:46 | members | +| comments.kt:14:5:16:7 | /**\n * Members of this group.\n */ | comments.kt:17:5:17:46 | members | +| comments.kt:14:5:16:7 | /**\n * Members of this group.\n */ | comments.kt:17:13:17:46 | getMembers$private | +| comments.kt:19:5:22:7 | /**\n * Adds a [member] to this group.\n * @return the new size of the group.\n */ | comments.kt:23:5:26:5 | add | +| comments.kt:35:5:35:34 | /** Medium is in the middle */ | comments.kt:36:5:36:14 | Medium | +| comments.kt:37:5:37:23 | /** This is high */ | comments.kt:38:5:38:11 | High | +| comments.kt:48:1:50:3 | /**\n * A type alias comment\n */ | comments.kt:51:1:51:24 | MyType | +| comments.kt:54:5:56:7 | /**\n * An init block comment\n */ | comments.kt:53:1:58:1 | InitBlock | +| comments.kt:61:5:63:7 | /**\n * A prop comment\n */ | comments.kt:64:5:68:17 | prop | +| comments.kt:65:9:67:11 | /**\n * An accessor comment\n */ | comments.kt:68:9:68:17 | getProp | +| comments.kt:71:9:73:11 | /**\n * An anonymous function comment\n */ | comments.kt:70:5:76:10 | getL | +| comments.kt:71:9:73:11 | /**\n * An anonymous function comment\n */ | comments.kt:70:5:76:10 | l | +| comments.kt:71:9:73:11 | /**\n * An anonymous function comment\n */ | comments.kt:70:5:76:10 | l | +| comments.kt:79:9:81:11 | /**\n * A local function comment\n */ | comments.kt:82:9:82:24 | localFn | +| comments.kt:88:10:90:11 | /**\n * An anonymous object comment\n */ | comments.kt:87:15:92:5 | | +| comments.kt:88:10:90:11 | /**\n * An anonymous object comment\n */ | comments.kt:87:15:92:5 | new X(...) { ... } | +commentNoOwners +| comments.kt:1:1:1:25 | /** Kdoc with no owner */ | +| comments.kt:24:9:24:25 | // A line comment | +| comments.kt:28:5:30:6 | /*\n A block comment\n */ | +| comments.kt:42:5:44:7 | /**\n * A variable.\n */ | +| comments.kt:95:1:95:163 | // Diagnostic Matches: % Couldn't get owner of KDoc. The comment is extracted without an owner. ...while extracting a file (comments.kt) at %comments.kt:1:1:96:0% | +commentSections +| comments.kt:1:1:1:25 | /** Kdoc with no owner */ | Kdoc with no owner | +| comments.kt:4:1:11:3 | /**\n * A group of *members*.\n *\n * This class has no useful logic; it's just a documentation example.\n *\n * @property name the name of this group.\n * @constructor Creates an empty group.\n */ | A group of *members*.\n\nThis class has no useful logic; it's just a documentation example.\n\n | +| comments.kt:4:1:11:3 | /**\n * A group of *members*.\n *\n * This class has no useful logic; it's just a documentation example.\n *\n * @property name the name of this group.\n * @constructor Creates an empty group.\n */ | Creates an empty group. | +| comments.kt:4:1:11:3 | /**\n * A group of *members*.\n *\n * This class has no useful logic; it's just a documentation example.\n *\n * @property name the name of this group.\n * @constructor Creates an empty group.\n */ | the name of this group. | +| comments.kt:14:5:16:7 | /**\n * Members of this group.\n */ | Members of this group. | +| comments.kt:19:5:22:7 | /**\n * Adds a [member] to this group.\n * @return the new size of the group.\n */ | Adds a [member] to this group.\n | +| comments.kt:35:5:35:34 | /** Medium is in the middle */ | Medium is in the middle | +| comments.kt:37:5:37:23 | /** This is high */ | This is high | +| comments.kt:42:5:44:7 | /**\n * A variable.\n */ | A variable. | +| comments.kt:48:1:50:3 | /**\n * A type alias comment\n */ | A type alias comment | +| comments.kt:54:5:56:7 | /**\n * An init block comment\n */ | An init block comment | +| comments.kt:61:5:63:7 | /**\n * A prop comment\n */ | A prop comment | +| comments.kt:65:9:67:11 | /**\n * An accessor comment\n */ | An accessor comment | +| comments.kt:71:9:73:11 | /**\n * An anonymous function comment\n */ | An anonymous function comment | +| comments.kt:79:9:81:11 | /**\n * A local function comment\n */ | A local function comment | +| comments.kt:88:10:90:11 | /**\n * An anonymous object comment\n */ | An anonymous object comment | +commentSectionContents +| A group of *members*.\n\nThis class has no useful logic; it's just a documentation example.\n\n | A group of *members*.\n\nThis class has no useful logic; it's just a documentation example.\n\n | +| A local function comment | A local function comment | +| A prop comment | A prop comment | +| A type alias comment | A type alias comment | +| A variable. | A variable. | +| Adds a [member] to this group.\n | Adds a [member] to this group.\n | +| An accessor comment | An accessor comment | +| An anonymous function comment | An anonymous function comment | +| An anonymous object comment | An anonymous object comment | +| An init block comment | An init block comment | +| Creates an empty group. | Creates an empty group. | +| Kdoc with no owner | Kdoc with no owner | +| Medium is in the middle | Medium is in the middle | +| Members of this group. | Members of this group. | +| This is high | This is high | +| the name of this group. | the name of this group. | +commentSectionNames +| Creates an empty group. | constructor | +| the name of this group. | property | +commentSectionSubjectNames +| the name of this group. | name | diff --git a/java/ql/test-kotlin2/library-tests/comments/comments.kt b/java/ql/test-kotlin2/library-tests/comments/comments.kt new file mode 100644 index 00000000000..4552254fa22 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/comments/comments.kt @@ -0,0 +1,95 @@ +/** Kdoc with no owner */ +package foo.bar + +/** + * A group of *members*. + * + * This class has no useful logic; it's just a documentation example. + * + * @property name the name of this group. + * @constructor Creates an empty group. + */ +class Group(val name: String) { + + /** + * Members of this group. + */ + private val members = mutableListOf() + + /** + * Adds a [member] to this group. + * @return the new size of the group. + */ + fun add(member: Int): Int { + // A line comment + return 42 + } + + /* + A block comment + */ +} + +enum class Severity(val sev: Int) { + Low(1), + /** Medium is in the middle */ + Medium(2), + /** This is high */ + High(3) +} + +fun fn1() { + /** + * A variable. + */ + val a = 1 +} + +/** + * A type alias comment + */ +typealias MyType = Group + +class InitBlock { + /** + * An init block comment + */ + init { } +} + +open class X { + /** + * A prop comment + */ + val prop: Int + /** + * An accessor comment + */ + get() = 5 + + val l: Lazy = lazy( + /** + * An anonymous function comment + */ + fun(): Int { + return 5 + }) + + fun fn() { + /** + * A local function comment + */ + fun localFn() {} + } +} + +class XX { + fun f() = object : + /** + * An anonymous object comment + */ + X() { + } +} + +// Diagnostic Matches: % Couldn't get owner of KDoc. The comment is extracted without an owner. ...while extracting a file (comments.kt) at %comments.kt:1:1:96:0% diff --git a/java/ql/test-kotlin2/library-tests/comments/comments.ql b/java/ql/test-kotlin2/library-tests/comments/comments.ql new file mode 100644 index 00000000000..ef4414550f3 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/comments/comments.ql @@ -0,0 +1,15 @@ +import java + +query predicate comments(KtComment c, string s) { c.getText() = s } + +query predicate commentOwners(KtComment c, Top t) { c.getOwner() = t } + +query predicate commentNoOwners(KtComment c) { not exists(c.getOwner()) } + +query predicate commentSections(KtComment c, KtCommentSection s) { c.getSections() = s } + +query predicate commentSectionContents(KtCommentSection s, string c) { s.getContent() = c } + +query predicate commentSectionNames(KtCommentSection s, string c) { s.getName() = c } + +query predicate commentSectionSubjectNames(KtCommentSection s, string c) { s.getSubjectName() = c } diff --git a/java/ql/test-kotlin2/library-tests/companion_objects/accesses.expected b/java/ql/test-kotlin2/library-tests/companion_objects/accesses.expected new file mode 100644 index 00000000000..df85560bac1 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/companion_objects/accesses.expected @@ -0,0 +1,2 @@ +| companion_objects.kt:3:5:5:5 | MyClassCompanion | companion_objects.kt:23:5:23:11 | MyClassCompanion | +| companion_objects.kt:10:5:12:5 | MyInterfaceCompanion | companion_objects.kt:25:5:25:15 | MyInterfaceCompanion | diff --git a/java/ql/test-kotlin2/library-tests/companion_objects/accesses.ql b/java/ql/test-kotlin2/library-tests/companion_objects/accesses.ql new file mode 100644 index 00000000000..e1cb07245b6 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/companion_objects/accesses.ql @@ -0,0 +1,5 @@ +import java + +from VarAccess va, CompanionObject cco +where va.getVariable() = cco.getInstance() +select cco, va diff --git a/java/ql/test-kotlin2/library-tests/companion_objects/companion_objects.expected b/java/ql/test-kotlin2/library-tests/companion_objects/companion_objects.expected new file mode 100644 index 00000000000..1766f462578 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/companion_objects/companion_objects.expected @@ -0,0 +1,2 @@ +| companion_objects.kt:1:1:6:1 | MyClass | companion_objects.kt:3:5:5:5 | MyClassCompanion | companion_objects.kt:3:5:5:5 | MyClassCompanion | companion_objects.kt:1:1:6:1 | MyClass | final,public,static | +| companion_objects.kt:8:1:13:1 | MyInterface | companion_objects.kt:10:5:12:5 | MyInterfaceCompanion | companion_objects.kt:10:5:12:5 | MyInterfaceCompanion | companion_objects.kt:8:1:13:1 | MyInterface | final,public,static | diff --git a/java/ql/test-kotlin2/library-tests/companion_objects/companion_objects.kt b/java/ql/test-kotlin2/library-tests/companion_objects/companion_objects.kt new file mode 100644 index 00000000000..77168743617 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/companion_objects/companion_objects.kt @@ -0,0 +1,28 @@ +class MyClass { + fun funInClass() {} + companion object MyClassCompanion { + fun funInCompanion() {} + } +} + +interface MyInterface { + fun funInInterface() + companion object MyInterfaceCompanion { + fun funInCompanion() {} + } +} + +class Imp : MyInterface { + override fun funInInterface() { + TODO("Not yet implemented") + } + +} + +fun user() { + MyClass.funInCompanion() + MyClass().funInClass() + MyInterface.funInCompanion() + Imp().funInInterface() +} + diff --git a/java/ql/test-kotlin2/library-tests/companion_objects/companion_objects.ql b/java/ql/test-kotlin2/library-tests/companion_objects/companion_objects.ql new file mode 100644 index 00000000000..a6df9bb27b6 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/companion_objects/companion_objects.ql @@ -0,0 +1,8 @@ +import java + +from ClassOrInterface c, CompanionObject cco, Field f +where + c.fromSource() and + cco = c.getCompanionObject() and + f = cco.getInstance() +select c, f, cco, f.getDeclaringType(), concat(f.getAModifier().toString(), ",") diff --git a/java/ql/test-kotlin2/library-tests/companion_objects/method_accesses.expected b/java/ql/test-kotlin2/library-tests/companion_objects/method_accesses.expected new file mode 100644 index 00000000000..e414c95fd54 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/companion_objects/method_accesses.expected @@ -0,0 +1,5 @@ +| companion_objects.kt:17:9:17:35 | StandardKt | TypeAccess | file:///!unknown-binary-location/kotlin/StandardKt.class:0:0:0:0 | TODO | +| companion_objects.kt:23:5:23:11 | MyClassCompanion | VarAccess | companion_objects.kt:4:9:4:31 | funInCompanion | +| companion_objects.kt:24:5:24:13 | new MyClass(...) | ClassInstanceExpr | companion_objects.kt:2:5:2:23 | funInClass | +| companion_objects.kt:25:5:25:15 | MyInterfaceCompanion | VarAccess | companion_objects.kt:11:9:11:31 | funInCompanion | +| companion_objects.kt:26:5:26:9 | new Imp(...) | ClassInstanceExpr | companion_objects.kt:16:5:18:5 | funInInterface | diff --git a/java/ql/test-kotlin2/library-tests/companion_objects/method_accesses.ql b/java/ql/test-kotlin2/library-tests/companion_objects/method_accesses.ql new file mode 100644 index 00000000000..c04ac2a981c --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/companion_objects/method_accesses.ql @@ -0,0 +1,4 @@ +import java + +from MethodCall ma +select ma.getQualifier(), ma.getQualifier().getAPrimaryQlClass(), ma.getCallee() diff --git a/java/ql/test-kotlin2/library-tests/compilation-units/cus.expected b/java/ql/test-kotlin2/library-tests/compilation-units/cus.expected new file mode 100644 index 00000000000..a5995ccc419 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/compilation-units/cus.expected @@ -0,0 +1,9 @@ +| AbstractList | .../AbstractList.class:0:0:0:0 | +| AbstractList$RandomAccessSpliterator | .../AbstractList$RandomAccessSpliterator.class:0:0:0:0 | +| ArrayList | .../ArrayList.class:0:0:0:0 | +| ArrayList$ArrayListSpliterator | .../ArrayList$ArrayListSpliterator.class:0:0:0:0 | +| List | .../List.class:0:0:0:0 | +| ListIterator | .../ListIterator.class:0:0:0:0 | +| MutableList | .../MutableList.class:0:0:0:0 | +| MutableListIterator | .../MutableListIterator.class:0:0:0:0 | +| test | .../test.kt:0:0:0:0 | diff --git a/java/ql/test-kotlin2/library-tests/compilation-units/cus.ql b/java/ql/test-kotlin2/library-tests/compilation-units/cus.ql new file mode 100644 index 00000000000..1886d0259ab --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/compilation-units/cus.ql @@ -0,0 +1,5 @@ +import java + +from CompilationUnit cu +where cu.fromSource() or cu.toString().matches("%List%") +select cu.toString(), cu.getLocation().toString().regexpReplaceAll(".*/", ".../") diff --git a/java/ql/test-kotlin2/library-tests/compilation-units/test.kt b/java/ql/test-kotlin2/library-tests/compilation-units/test.kt new file mode 100644 index 00000000000..259013ca382 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/compilation-units/test.kt @@ -0,0 +1,5 @@ +class A { + + val a : ArrayList = ArrayList() + +} diff --git a/java/ql/test-kotlin2/library-tests/controlflow/basic/Test.kt b/java/ql/test-kotlin2/library-tests/controlflow/basic/Test.kt new file mode 100644 index 00000000000..7ce0897901c --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/controlflow/basic/Test.kt @@ -0,0 +1,126 @@ +package dominance; + +public class Test { + fun test() { + var x: Int = 0 + var y: Long = 50 + var z: Int = 0 + var w: Int = 0 + + // if-else, multiple statements in block + if (x > 0) { + y = 20 + z = 10 + } else { + y = 30 + } + + z = 0 + + // if-else with return in one branch + if(x < 0) + y = 40 + else + return + + // this is not the start of a BB due to the return + z = 10 + + // single-branch if-else + if (x == 0) { + y = 60 + z = 10 + } + + z = 20 + + // while loop + while(x > 0) { + y = 10 + x-- + } + + z = 30 + +/* +TODO + // for loop + for(j in 0 .. 19) { + y = 0 + w = 10 + } + + z = 40 + + // nested control flow + for(j in 0 .. 9) { + y = 30 + if(z > 0) + if(y > 0) { + w = 0 + break; + } else { + w = 20 + } + else { + w = 10 + continue + } + x = 0 + } +*/ + + z = 50 + + // nested control-flow + + w = 40 + return + } +} + +fun t1(o: Any): Int { + try { + val x = o as Int + return 1 + } catch (e: ClassCastException) { + return 2 + } +} + +fun t2(o: Any?): Int { + try { + val x = o!! + return 1 + } catch (e: NullPointerException) { + return 2 + } +} + +fun fn(x:Any?, y: Any?) { + if (x == null && y == null) { + throw Exception() + } + + if (x != null) { + println("x not null") + } else if (y != null) { + println("y not null") + } +} + +fun fn(x: Boolean, y: Boolean) { + if (x && y) { + + } +} + +fun fn_when(x: Boolean, y: Boolean) { + when { + when { + x -> y + else -> false + } -> { } } +} + +// Diagnostic Matches: % Couldn't find a Java equivalent function to kotlin.Int.dec in java.lang.Integer ...while extracting a call () at %Test.kt:40:4:40:6% diff --git a/java/ql/test-kotlin2/library-tests/controlflow/basic/bbStmts.expected b/java/ql/test-kotlin2/library-tests/controlflow/basic/bbStmts.expected new file mode 100644 index 00000000000..04031bdd910 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/controlflow/basic/bbStmts.expected @@ -0,0 +1,192 @@ +| Test.kt:3:1:80:1 | { ... } | 0 | Test.kt:3:1:80:1 | { ... } | +| Test.kt:3:1:80:1 | { ... } | 1 | Test.kt:3:1:80:1 | super(...) | +| Test.kt:3:1:80:1 | { ... } | 2 | Test.kt:3:1:80:1 | { ... } | +| Test.kt:3:1:80:1 | { ... } | 3 | Test.kt:3:1:80:1 | Test | +| Test.kt:4:2:79:2 | test | 0 | Test.kt:4:2:79:2 | test | +| Test.kt:4:13:79:2 | { ... } | 0 | Test.kt:4:13:79:2 | { ... } | +| Test.kt:4:13:79:2 | { ... } | 1 | Test.kt:5:3:5:16 | var ...; | +| Test.kt:4:13:79:2 | { ... } | 2 | Test.kt:5:16:5:16 | 0 | +| Test.kt:4:13:79:2 | { ... } | 3 | Test.kt:5:3:5:16 | x | +| Test.kt:4:13:79:2 | { ... } | 4 | Test.kt:6:3:6:18 | var ...; | +| Test.kt:4:13:79:2 | { ... } | 5 | Test.kt:6:17:6:18 | 50 | +| Test.kt:4:13:79:2 | { ... } | 6 | Test.kt:6:3:6:18 | y | +| Test.kt:4:13:79:2 | { ... } | 7 | Test.kt:7:3:7:16 | var ...; | +| Test.kt:4:13:79:2 | { ... } | 8 | Test.kt:7:16:7:16 | 0 | +| Test.kt:4:13:79:2 | { ... } | 9 | Test.kt:7:3:7:16 | z | +| Test.kt:4:13:79:2 | { ... } | 10 | Test.kt:8:3:8:16 | var ...; | +| Test.kt:4:13:79:2 | { ... } | 11 | Test.kt:8:16:8:16 | 0 | +| Test.kt:4:13:79:2 | { ... } | 12 | Test.kt:8:3:8:16 | w | +| Test.kt:4:13:79:2 | { ... } | 13 | Test.kt:11:3:16:3 | ; | +| Test.kt:4:13:79:2 | { ... } | 14 | Test.kt:11:3:16:3 | when ... | +| Test.kt:4:13:79:2 | { ... } | 15 | Test.kt:11:7:11:11 | ... -> ... | +| Test.kt:4:13:79:2 | { ... } | 16 | Test.kt:11:7:11:7 | x | +| Test.kt:4:13:79:2 | { ... } | 17 | Test.kt:11:11:11:11 | 0 | +| Test.kt:4:13:79:2 | { ... } | 18 | Test.kt:11:7:11:11 | ... > ... | +| Test.kt:11:14:14:3 | { ... } | 0 | Test.kt:11:14:14:3 | { ... } | +| Test.kt:11:14:14:3 | { ... } | 1 | Test.kt:12:4:12:9 | ; | +| Test.kt:11:14:14:3 | { ... } | 2 | Test.kt:12:8:12:9 | 20 | +| Test.kt:11:14:14:3 | { ... } | 3 | Test.kt:12:4:12:9 | ...=... | +| Test.kt:11:14:14:3 | { ... } | 4 | Test.kt:13:4:13:9 | ; | +| Test.kt:11:14:14:3 | { ... } | 5 | Test.kt:13:8:13:9 | 10 | +| Test.kt:11:14:14:3 | { ... } | 6 | Test.kt:13:4:13:9 | ...=... | +| Test.kt:14:10:16:3 | ... -> ... | 0 | Test.kt:14:10:16:3 | ... -> ... | +| Test.kt:14:10:16:3 | ... -> ... | 1 | Test.kt:14:10:16:3 | true | +| Test.kt:14:10:16:3 | ... -> ... | 2 | Test.kt:14:10:16:3 | { ... } | +| Test.kt:14:10:16:3 | ... -> ... | 3 | Test.kt:15:4:15:9 | ; | +| Test.kt:14:10:16:3 | ... -> ... | 4 | Test.kt:15:8:15:9 | 30 | +| Test.kt:14:10:16:3 | ... -> ... | 5 | Test.kt:15:4:15:9 | ...=... | +| Test.kt:18:3:18:7 | ; | 0 | Test.kt:18:3:18:7 | ; | +| Test.kt:18:3:18:7 | ; | 1 | Test.kt:18:7:18:7 | 0 | +| Test.kt:18:3:18:7 | ; | 2 | Test.kt:18:3:18:7 | ...=... | +| Test.kt:18:3:18:7 | ; | 3 | Test.kt:21:3:24:9 | ; | +| Test.kt:18:3:18:7 | ; | 4 | Test.kt:21:3:24:9 | when ... | +| Test.kt:18:3:18:7 | ; | 5 | Test.kt:21:6:21:10 | ... -> ... | +| Test.kt:18:3:18:7 | ; | 6 | Test.kt:21:6:21:6 | x | +| Test.kt:18:3:18:7 | ; | 7 | Test.kt:21:10:21:10 | 0 | +| Test.kt:18:3:18:7 | ; | 8 | Test.kt:21:6:21:10 | ... < ... | +| Test.kt:22:4:22:9 | { ... } | 0 | Test.kt:22:4:22:9 | { ... } | +| Test.kt:22:4:22:9 | { ... } | 1 | Test.kt:22:4:22:9 | ; | +| Test.kt:22:4:22:9 | { ... } | 2 | Test.kt:22:8:22:9 | 40 | +| Test.kt:22:4:22:9 | { ... } | 3 | Test.kt:22:4:22:9 | ...=... | +| Test.kt:22:4:22:9 | { ... } | 4 | Test.kt:27:3:27:8 | ; | +| Test.kt:22:4:22:9 | { ... } | 5 | Test.kt:27:7:27:8 | 10 | +| Test.kt:22:4:22:9 | { ... } | 6 | Test.kt:27:3:27:8 | ...=... | +| Test.kt:22:4:22:9 | { ... } | 7 | Test.kt:30:3:33:3 | ; | +| Test.kt:22:4:22:9 | { ... } | 8 | Test.kt:30:3:33:3 | when ... | +| Test.kt:22:4:22:9 | { ... } | 9 | Test.kt:30:7:30:12 | ... -> ... | +| Test.kt:22:4:22:9 | { ... } | 10 | Test.kt:30:7:30:7 | x | +| Test.kt:22:4:22:9 | { ... } | 11 | Test.kt:30:12:30:12 | 0 | +| Test.kt:22:4:22:9 | { ... } | 12 | Test.kt:30:7:30:12 | ... (value equals) ... | +| Test.kt:24:4:24:9 | ... -> ... | 0 | Test.kt:24:4:24:9 | ... -> ... | +| Test.kt:24:4:24:9 | ... -> ... | 1 | Test.kt:24:4:24:9 | true | +| Test.kt:24:4:24:9 | ... -> ... | 2 | Test.kt:24:10:24:10 | INSTANCE | +| Test.kt:24:4:24:9 | ... -> ... | 3 | Test.kt:24:4:24:9 | return ... | +| Test.kt:30:15:33:3 | { ... } | 0 | Test.kt:30:15:33:3 | { ... } | +| Test.kt:30:15:33:3 | { ... } | 1 | Test.kt:31:4:31:9 | ; | +| Test.kt:30:15:33:3 | { ... } | 2 | Test.kt:31:8:31:9 | 60 | +| Test.kt:30:15:33:3 | { ... } | 3 | Test.kt:31:4:31:9 | ...=... | +| Test.kt:30:15:33:3 | { ... } | 4 | Test.kt:32:4:32:9 | ; | +| Test.kt:30:15:33:3 | { ... } | 5 | Test.kt:32:8:32:9 | 10 | +| Test.kt:30:15:33:3 | { ... } | 6 | Test.kt:32:4:32:9 | ...=... | +| Test.kt:35:3:35:8 | ; | 0 | Test.kt:35:3:35:8 | ; | +| Test.kt:35:3:35:8 | ; | 1 | Test.kt:35:7:35:8 | 20 | +| Test.kt:35:3:35:8 | ; | 2 | Test.kt:35:3:35:8 | ...=... | +| Test.kt:35:3:35:8 | ; | 3 | Test.kt:38:3:41:3 | while (...) | +| Test.kt:38:9:38:9 | x | 0 | Test.kt:38:9:38:9 | x | +| Test.kt:38:9:38:9 | x | 1 | Test.kt:38:13:38:13 | 0 | +| Test.kt:38:9:38:9 | x | 2 | Test.kt:38:9:38:13 | ... > ... | +| Test.kt:38:16:41:3 | { ... } | 0 | Test.kt:38:16:41:3 | { ... } | +| Test.kt:38:16:41:3 | { ... } | 1 | Test.kt:39:4:39:9 | ; | +| Test.kt:38:16:41:3 | { ... } | 2 | Test.kt:39:8:39:9 | 10 | +| Test.kt:38:16:41:3 | { ... } | 3 | Test.kt:39:4:39:9 | ...=... | +| Test.kt:38:16:41:3 | { ... } | 4 | Test.kt:40:4:40:6 | ; | +| Test.kt:38:16:41:3 | { ... } | 5 | Test.kt:40:4:40:6 | | +| Test.kt:38:16:41:3 | { ... } | 6 | Test.kt:40:4:40:6 | { ... } | +| Test.kt:38:16:41:3 | { ... } | 7 | Test.kt:40:4:40:6 | var ...; | +| Test.kt:38:16:41:3 | { ... } | 8 | Test.kt:40:4:40:4 | x | +| Test.kt:38:16:41:3 | { ... } | 9 | Test.kt:40:4:40:6 | | +| Test.kt:38:16:41:3 | { ... } | 10 | Test.kt:40:4:40:6 | ; | +| Test.kt:38:16:41:3 | { ... } | 11 | Test.kt:40:4:40:6 | | +| Test.kt:38:16:41:3 | { ... } | 12 | Test.kt:40:4:40:6 | dec(...) | +| Test.kt:38:16:41:3 | { ... } | 13 | Test.kt:40:4:40:6 | ...=... | +| Test.kt:38:16:41:3 | { ... } | 14 | Test.kt:40:4:40:6 | ; | +| Test.kt:38:16:41:3 | { ... } | 15 | Test.kt:40:4:40:6 | | +| Test.kt:38:16:41:3 | { ... } | 16 | Test.kt:40:4:40:6 | | +| Test.kt:43:3:43:8 | ; | 0 | Test.kt:43:3:43:8 | ; | +| Test.kt:43:3:43:8 | ; | 1 | Test.kt:43:7:43:8 | 30 | +| Test.kt:43:3:43:8 | ; | 2 | Test.kt:43:3:43:8 | ...=... | +| Test.kt:43:3:43:8 | ; | 3 | Test.kt:73:3:73:8 | ; | +| Test.kt:43:3:43:8 | ; | 4 | Test.kt:73:7:73:8 | 50 | +| Test.kt:43:3:43:8 | ; | 5 | Test.kt:73:3:73:8 | ...=... | +| Test.kt:43:3:43:8 | ; | 6 | Test.kt:77:3:77:8 | ; | +| Test.kt:43:3:43:8 | ; | 7 | Test.kt:77:7:77:8 | 40 | +| Test.kt:43:3:43:8 | ; | 8 | Test.kt:77:3:77:8 | ...=... | +| Test.kt:43:3:43:8 | ; | 9 | Test.kt:78:9:78:9 | INSTANCE | +| Test.kt:43:3:43:8 | ; | 10 | Test.kt:78:3:78:8 | return ... | +| Test.kt:82:1:89:1 | t1 | 0 | Test.kt:82:1:89:1 | t1 | +| Test.kt:82:21:89:1 | { ... } | 0 | Test.kt:82:21:89:1 | { ... } | +| Test.kt:82:21:89:1 | { ... } | 1 | Test.kt:83:2:88:2 | try ... | +| Test.kt:82:21:89:1 | { ... } | 2 | Test.kt:83:6:86:2 | { ... } | +| Test.kt:82:21:89:1 | { ... } | 3 | Test.kt:84:3:84:18 | var ...; | +| Test.kt:82:21:89:1 | { ... } | 4 | Test.kt:84:11:84:11 | o | +| Test.kt:82:21:89:1 | { ... } | 5 | Test.kt:84:11:84:18 | (...)... | +| Test.kt:84:3:84:18 | x | 0 | Test.kt:84:3:84:18 | x | +| Test.kt:84:3:84:18 | x | 1 | Test.kt:85:10:85:10 | 1 | +| Test.kt:84:3:84:18 | x | 2 | Test.kt:85:3:85:10 | return ... | +| Test.kt:86:4:88:2 | catch (...) | 0 | Test.kt:86:4:88:2 | catch (...) | +| Test.kt:86:4:88:2 | catch (...) | 1 | Test.kt:86:11:86:31 | e | +| Test.kt:86:4:88:2 | catch (...) | 2 | Test.kt:86:34:88:2 | { ... } | +| Test.kt:86:4:88:2 | catch (...) | 3 | Test.kt:87:10:87:10 | 2 | +| Test.kt:86:4:88:2 | catch (...) | 4 | Test.kt:87:3:87:10 | return ... | +| Test.kt:91:1:98:1 | t2 | 0 | Test.kt:91:1:98:1 | t2 | +| Test.kt:91:22:98:1 | { ... } | 0 | Test.kt:91:22:98:1 | { ... } | +| Test.kt:91:22:98:1 | { ... } | 1 | Test.kt:92:2:97:2 | try ... | +| Test.kt:91:22:98:1 | { ... } | 2 | Test.kt:92:6:95:2 | { ... } | +| Test.kt:91:22:98:1 | { ... } | 3 | Test.kt:93:3:93:13 | var ...; | +| Test.kt:91:22:98:1 | { ... } | 4 | Test.kt:93:11:93:11 | o | +| Test.kt:91:22:98:1 | { ... } | 5 | Test.kt:93:11:93:13 | ...!! | +| Test.kt:93:3:93:13 | x | 0 | Test.kt:93:3:93:13 | x | +| Test.kt:93:3:93:13 | x | 1 | Test.kt:94:10:94:10 | 1 | +| Test.kt:93:3:93:13 | x | 2 | Test.kt:94:3:94:10 | return ... | +| Test.kt:95:4:97:2 | catch (...) | 0 | Test.kt:95:4:97:2 | catch (...) | +| Test.kt:95:4:97:2 | catch (...) | 1 | Test.kt:95:11:95:33 | e | +| Test.kt:95:4:97:2 | catch (...) | 2 | Test.kt:95:36:97:2 | { ... } | +| Test.kt:95:4:97:2 | catch (...) | 3 | Test.kt:96:10:96:10 | 2 | +| Test.kt:95:4:97:2 | catch (...) | 4 | Test.kt:96:3:96:10 | return ... | +| Test.kt:100:1:110:1 | fn | 0 | Test.kt:100:1:110:1 | fn | +| Test.kt:100:25:110:1 | { ... } | 0 | Test.kt:100:25:110:1 | { ... } | +| Test.kt:100:25:110:1 | { ... } | 1 | Test.kt:101:5:103:5 | ; | +| Test.kt:100:25:110:1 | { ... } | 2 | Test.kt:101:5:103:5 | when ... | +| Test.kt:100:25:110:1 | { ... } | 3 | Test.kt:101:9:101:30 | ... -> ... | +| Test.kt:100:25:110:1 | { ... } | 4 | Test.kt:101:9:101:30 | ... && ... | +| Test.kt:100:25:110:1 | { ... } | 5 | Test.kt:101:9:101:9 | x | +| Test.kt:100:25:110:1 | { ... } | 6 | Test.kt:101:14:101:17 | null | +| Test.kt:100:25:110:1 | { ... } | 7 | Test.kt:101:9:101:17 | ... (value equals) ... | +| Test.kt:101:22:101:22 | y | 0 | Test.kt:101:22:101:22 | y | +| Test.kt:101:22:101:22 | y | 1 | Test.kt:101:27:101:30 | null | +| Test.kt:101:22:101:22 | y | 2 | Test.kt:101:22:101:30 | ... (value equals) ... | +| Test.kt:101:33:103:5 | { ... } | 0 | Test.kt:101:33:103:5 | { ... } | +| Test.kt:101:33:103:5 | { ... } | 1 | Test.kt:102:15:102:25 | new Exception(...) | +| Test.kt:101:33:103:5 | { ... } | 2 | Test.kt:102:9:102:25 | throw ... | +| Test.kt:105:5:109:5 | ; | 0 | Test.kt:105:5:109:5 | ; | +| Test.kt:105:5:109:5 | ; | 1 | Test.kt:105:5:109:5 | when ... | +| Test.kt:105:5:109:5 | ; | 2 | Test.kt:105:9:105:17 | ... -> ... | +| Test.kt:105:5:109:5 | ; | 3 | Test.kt:105:9:105:9 | x | +| Test.kt:105:5:109:5 | ; | 4 | Test.kt:105:14:105:17 | null | +| Test.kt:105:5:109:5 | ; | 5 | Test.kt:105:9:105:17 | ... (value not-equals) ... | +| Test.kt:105:20:107:5 | { ... } | 0 | Test.kt:105:20:107:5 | { ... } | +| Test.kt:105:20:107:5 | { ... } | 1 | Test.kt:106:9:106:29 | ; | +| Test.kt:105:20:107:5 | { ... } | 2 | Test.kt:106:17:106:28 | "x not null" | +| Test.kt:105:20:107:5 | { ... } | 3 | Test.kt:106:9:106:29 | println(...) | +| Test.kt:107:16:107:24 | ... -> ... | 0 | Test.kt:107:16:107:24 | ... -> ... | +| Test.kt:107:16:107:24 | ... -> ... | 1 | Test.kt:107:16:107:16 | y | +| Test.kt:107:16:107:24 | ... -> ... | 2 | Test.kt:107:21:107:24 | null | +| Test.kt:107:16:107:24 | ... -> ... | 3 | Test.kt:107:16:107:24 | ... (value not-equals) ... | +| Test.kt:107:27:109:5 | { ... } | 0 | Test.kt:107:27:109:5 | { ... } | +| Test.kt:107:27:109:5 | { ... } | 1 | Test.kt:108:9:108:29 | ; | +| Test.kt:107:27:109:5 | { ... } | 2 | Test.kt:108:17:108:28 | "y not null" | +| Test.kt:107:27:109:5 | { ... } | 3 | Test.kt:108:9:108:29 | println(...) | +| Test.kt:112:1:116:1 | fn | 0 | Test.kt:112:1:116:1 | fn | +| Test.kt:112:32:116:1 | { ... } | 0 | Test.kt:112:32:116:1 | { ... } | +| Test.kt:112:32:116:1 | { ... } | 1 | Test.kt:113:5:115:5 | ; | +| Test.kt:112:32:116:1 | { ... } | 2 | Test.kt:113:5:115:5 | when ... | +| Test.kt:112:32:116:1 | { ... } | 3 | Test.kt:113:9:113:14 | ... -> ... | +| Test.kt:112:32:116:1 | { ... } | 4 | Test.kt:113:9:113:14 | ... && ... | +| Test.kt:112:32:116:1 | { ... } | 5 | Test.kt:113:9:113:9 | x | +| Test.kt:113:14:113:14 | y | 0 | Test.kt:113:14:113:14 | y | +| Test.kt:113:17:115:5 | { ... } | 0 | Test.kt:113:17:115:5 | { ... } | +| Test.kt:118:1:124:1 | fn_when | 0 | Test.kt:118:1:124:1 | fn_when | +| Test.kt:118:37:124:1 | { ... } | 0 | Test.kt:118:37:124:1 | { ... } | +| Test.kt:118:37:124:1 | { ... } | 1 | Test.kt:119:2:123:12 | ; | +| Test.kt:118:37:124:1 | { ... } | 2 | Test.kt:119:2:123:12 | when ... | +| Test.kt:118:37:124:1 | { ... } | 3 | Test.kt:120:3:123:10 | ... -> ... | +| Test.kt:118:37:124:1 | { ... } | 4 | Test.kt:120:3:123:3 | when ... | +| Test.kt:118:37:124:1 | { ... } | 5 | Test.kt:121:4:121:9 | ... -> ... | +| Test.kt:118:37:124:1 | { ... } | 6 | Test.kt:121:4:121:4 | x | +| Test.kt:121:9:121:9 | ; | 0 | Test.kt:121:9:121:9 | ; | +| Test.kt:121:9:121:9 | ; | 1 | Test.kt:121:9:121:9 | y | +| Test.kt:122:12:122:16 | ... -> ... | 0 | Test.kt:122:12:122:16 | ... -> ... | +| Test.kt:122:12:122:16 | ... -> ... | 1 | Test.kt:122:12:122:16 | true | +| Test.kt:122:12:122:16 | ... -> ... | 2 | Test.kt:122:12:122:16 | ; | +| Test.kt:122:12:122:16 | ... -> ... | 3 | Test.kt:122:12:122:16 | false | +| Test.kt:123:8:123:10 | { ... } | 0 | Test.kt:123:8:123:10 | { ... } | diff --git a/java/ql/test-kotlin2/library-tests/controlflow/basic/bbStmts.ql b/java/ql/test-kotlin2/library-tests/controlflow/basic/bbStmts.ql new file mode 100644 index 00000000000..4e8367040f5 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/controlflow/basic/bbStmts.ql @@ -0,0 +1,7 @@ +import default + +from BasicBlock b, int i, ControlFlowNode n +where + b.getNode(i) = n and + b.getFile().(CompilationUnit).fromSource() +select b, i, n diff --git a/java/ql/test-kotlin2/library-tests/controlflow/basic/bbStrictDominance.expected b/java/ql/test-kotlin2/library-tests/controlflow/basic/bbStrictDominance.expected new file mode 100644 index 00000000000..c7506b8b0a0 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/controlflow/basic/bbStrictDominance.expected @@ -0,0 +1,56 @@ +| Test.kt:4:13:79:2 | { ... } | Test.kt:4:2:79:2 | test | +| Test.kt:4:13:79:2 | { ... } | Test.kt:11:14:14:3 | { ... } | +| Test.kt:4:13:79:2 | { ... } | Test.kt:14:10:16:3 | ... -> ... | +| Test.kt:4:13:79:2 | { ... } | Test.kt:18:3:18:7 | ; | +| Test.kt:4:13:79:2 | { ... } | Test.kt:22:4:22:9 | { ... } | +| Test.kt:4:13:79:2 | { ... } | Test.kt:24:4:24:9 | ... -> ... | +| Test.kt:4:13:79:2 | { ... } | Test.kt:30:15:33:3 | { ... } | +| Test.kt:4:13:79:2 | { ... } | Test.kt:35:3:35:8 | ; | +| Test.kt:4:13:79:2 | { ... } | Test.kt:38:9:38:9 | x | +| Test.kt:4:13:79:2 | { ... } | Test.kt:38:16:41:3 | { ... } | +| Test.kt:4:13:79:2 | { ... } | Test.kt:43:3:43:8 | ; | +| Test.kt:18:3:18:7 | ; | Test.kt:4:2:79:2 | test | +| Test.kt:18:3:18:7 | ; | Test.kt:22:4:22:9 | { ... } | +| Test.kt:18:3:18:7 | ; | Test.kt:24:4:24:9 | ... -> ... | +| Test.kt:18:3:18:7 | ; | Test.kt:30:15:33:3 | { ... } | +| Test.kt:18:3:18:7 | ; | Test.kt:35:3:35:8 | ; | +| Test.kt:18:3:18:7 | ; | Test.kt:38:9:38:9 | x | +| Test.kt:18:3:18:7 | ; | Test.kt:38:16:41:3 | { ... } | +| Test.kt:18:3:18:7 | ; | Test.kt:43:3:43:8 | ; | +| Test.kt:22:4:22:9 | { ... } | Test.kt:30:15:33:3 | { ... } | +| Test.kt:22:4:22:9 | { ... } | Test.kt:35:3:35:8 | ; | +| Test.kt:22:4:22:9 | { ... } | Test.kt:38:9:38:9 | x | +| Test.kt:22:4:22:9 | { ... } | Test.kt:38:16:41:3 | { ... } | +| Test.kt:22:4:22:9 | { ... } | Test.kt:43:3:43:8 | ; | +| Test.kt:35:3:35:8 | ; | Test.kt:38:9:38:9 | x | +| Test.kt:35:3:35:8 | ; | Test.kt:38:16:41:3 | { ... } | +| Test.kt:35:3:35:8 | ; | Test.kt:43:3:43:8 | ; | +| Test.kt:38:9:38:9 | x | Test.kt:38:16:41:3 | { ... } | +| Test.kt:38:9:38:9 | x | Test.kt:43:3:43:8 | ; | +| Test.kt:82:21:89:1 | { ... } | Test.kt:82:1:89:1 | t1 | +| Test.kt:82:21:89:1 | { ... } | Test.kt:84:3:84:18 | x | +| Test.kt:82:21:89:1 | { ... } | Test.kt:86:4:88:2 | catch (...) | +| Test.kt:91:22:98:1 | { ... } | Test.kt:91:1:98:1 | t2 | +| Test.kt:91:22:98:1 | { ... } | Test.kt:93:3:93:13 | x | +| Test.kt:91:22:98:1 | { ... } | Test.kt:95:4:97:2 | catch (...) | +| Test.kt:100:25:110:1 | { ... } | Test.kt:100:1:110:1 | fn | +| Test.kt:100:25:110:1 | { ... } | Test.kt:101:22:101:22 | y | +| Test.kt:100:25:110:1 | { ... } | Test.kt:101:33:103:5 | { ... } | +| Test.kt:100:25:110:1 | { ... } | Test.kt:105:5:109:5 | ; | +| Test.kt:100:25:110:1 | { ... } | Test.kt:105:20:107:5 | { ... } | +| Test.kt:100:25:110:1 | { ... } | Test.kt:107:16:107:24 | ... -> ... | +| Test.kt:100:25:110:1 | { ... } | Test.kt:107:27:109:5 | { ... } | +| Test.kt:101:22:101:22 | y | Test.kt:101:33:103:5 | { ... } | +| Test.kt:105:5:109:5 | ; | Test.kt:105:20:107:5 | { ... } | +| Test.kt:105:5:109:5 | ; | Test.kt:107:16:107:24 | ... -> ... | +| Test.kt:105:5:109:5 | ; | Test.kt:107:27:109:5 | { ... } | +| Test.kt:107:16:107:24 | ... -> ... | Test.kt:107:27:109:5 | { ... } | +| Test.kt:112:32:116:1 | { ... } | Test.kt:112:1:116:1 | fn | +| Test.kt:112:32:116:1 | { ... } | Test.kt:113:14:113:14 | y | +| Test.kt:112:32:116:1 | { ... } | Test.kt:113:17:115:5 | { ... } | +| Test.kt:113:14:113:14 | y | Test.kt:113:17:115:5 | { ... } | +| Test.kt:118:37:124:1 | { ... } | Test.kt:118:1:124:1 | fn_when | +| Test.kt:118:37:124:1 | { ... } | Test.kt:121:9:121:9 | ; | +| Test.kt:118:37:124:1 | { ... } | Test.kt:122:12:122:16 | ... -> ... | +| Test.kt:118:37:124:1 | { ... } | Test.kt:123:8:123:10 | { ... } | +| Test.kt:121:9:121:9 | ; | Test.kt:123:8:123:10 | { ... } | diff --git a/java/ql/test-kotlin2/library-tests/controlflow/basic/bbStrictDominance.ql b/java/ql/test-kotlin2/library-tests/controlflow/basic/bbStrictDominance.ql new file mode 100644 index 00000000000..9765b8e6cc5 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/controlflow/basic/bbStrictDominance.ql @@ -0,0 +1,6 @@ +import default +import semmle.code.java.controlflow.Dominance + +from BasicBlock b, BasicBlock b2 +where bbStrictlyDominates(b, b2) +select b, b2 diff --git a/java/ql/test-kotlin2/library-tests/controlflow/basic/bbSuccessor.expected b/java/ql/test-kotlin2/library-tests/controlflow/basic/bbSuccessor.expected new file mode 100644 index 00000000000..7f4ddbab89c --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/controlflow/basic/bbSuccessor.expected @@ -0,0 +1,45 @@ +| Test.kt:4:13:79:2 | { ... } | Test.kt:11:14:14:3 | { ... } | +| Test.kt:4:13:79:2 | { ... } | Test.kt:14:10:16:3 | ... -> ... | +| Test.kt:11:14:14:3 | { ... } | Test.kt:18:3:18:7 | ; | +| Test.kt:14:10:16:3 | ... -> ... | Test.kt:18:3:18:7 | ; | +| Test.kt:18:3:18:7 | ; | Test.kt:22:4:22:9 | { ... } | +| Test.kt:18:3:18:7 | ; | Test.kt:24:4:24:9 | ... -> ... | +| Test.kt:22:4:22:9 | { ... } | Test.kt:30:15:33:3 | { ... } | +| Test.kt:22:4:22:9 | { ... } | Test.kt:35:3:35:8 | ; | +| Test.kt:24:4:24:9 | ... -> ... | Test.kt:4:2:79:2 | test | +| Test.kt:30:15:33:3 | { ... } | Test.kt:35:3:35:8 | ; | +| Test.kt:35:3:35:8 | ; | Test.kt:38:9:38:9 | x | +| Test.kt:38:9:38:9 | x | Test.kt:38:16:41:3 | { ... } | +| Test.kt:38:9:38:9 | x | Test.kt:43:3:43:8 | ; | +| Test.kt:38:16:41:3 | { ... } | Test.kt:38:9:38:9 | x | +| Test.kt:43:3:43:8 | ; | Test.kt:4:2:79:2 | test | +| Test.kt:82:21:89:1 | { ... } | Test.kt:84:3:84:18 | x | +| Test.kt:82:21:89:1 | { ... } | Test.kt:86:4:88:2 | catch (...) | +| Test.kt:84:3:84:18 | x | Test.kt:82:1:89:1 | t1 | +| Test.kt:86:4:88:2 | catch (...) | Test.kt:82:1:89:1 | t1 | +| Test.kt:91:22:98:1 | { ... } | Test.kt:93:3:93:13 | x | +| Test.kt:91:22:98:1 | { ... } | Test.kt:95:4:97:2 | catch (...) | +| Test.kt:93:3:93:13 | x | Test.kt:91:1:98:1 | t2 | +| Test.kt:95:4:97:2 | catch (...) | Test.kt:91:1:98:1 | t2 | +| Test.kt:100:25:110:1 | { ... } | Test.kt:101:22:101:22 | y | +| Test.kt:100:25:110:1 | { ... } | Test.kt:105:5:109:5 | ; | +| Test.kt:101:22:101:22 | y | Test.kt:101:33:103:5 | { ... } | +| Test.kt:101:22:101:22 | y | Test.kt:105:5:109:5 | ; | +| Test.kt:101:33:103:5 | { ... } | Test.kt:100:1:110:1 | fn | +| Test.kt:105:5:109:5 | ; | Test.kt:105:20:107:5 | { ... } | +| Test.kt:105:5:109:5 | ; | Test.kt:107:16:107:24 | ... -> ... | +| Test.kt:105:20:107:5 | { ... } | Test.kt:100:1:110:1 | fn | +| Test.kt:107:16:107:24 | ... -> ... | Test.kt:100:1:110:1 | fn | +| Test.kt:107:16:107:24 | ... -> ... | Test.kt:107:27:109:5 | { ... } | +| Test.kt:107:27:109:5 | { ... } | Test.kt:100:1:110:1 | fn | +| Test.kt:112:32:116:1 | { ... } | Test.kt:112:1:116:1 | fn | +| Test.kt:112:32:116:1 | { ... } | Test.kt:113:14:113:14 | y | +| Test.kt:113:14:113:14 | y | Test.kt:112:1:116:1 | fn | +| Test.kt:113:14:113:14 | y | Test.kt:113:17:115:5 | { ... } | +| Test.kt:113:17:115:5 | { ... } | Test.kt:112:1:116:1 | fn | +| Test.kt:118:37:124:1 | { ... } | Test.kt:121:9:121:9 | ; | +| Test.kt:118:37:124:1 | { ... } | Test.kt:122:12:122:16 | ... -> ... | +| Test.kt:121:9:121:9 | ; | Test.kt:118:1:124:1 | fn_when | +| Test.kt:121:9:121:9 | ; | Test.kt:123:8:123:10 | { ... } | +| Test.kt:122:12:122:16 | ... -> ... | Test.kt:118:1:124:1 | fn_when | +| Test.kt:123:8:123:10 | { ... } | Test.kt:118:1:124:1 | fn_when | diff --git a/java/ql/test-kotlin2/library-tests/controlflow/basic/bbSuccessor.ql b/java/ql/test-kotlin2/library-tests/controlflow/basic/bbSuccessor.ql new file mode 100644 index 00000000000..1d464c2a31a --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/controlflow/basic/bbSuccessor.ql @@ -0,0 +1,5 @@ +import default + +from BasicBlock b, BasicBlock b2 +where b.getABBSuccessor() = b2 +select b, b2 diff --git a/java/ql/test-kotlin2/library-tests/controlflow/basic/getASuccessor.expected b/java/ql/test-kotlin2/library-tests/controlflow/basic/getASuccessor.expected new file mode 100644 index 00000000000..bda0ae70577 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/controlflow/basic/getASuccessor.expected @@ -0,0 +1,262 @@ +#select +| Test.kt:0:0:0:0 | TestKt | Class | file://:0:0:0:0 | | | +| Test.kt:3:1:80:1 | Test | Class | file://:0:0:0:0 | | | +| Test.kt:3:1:80:1 | Test | Constructor | file://:0:0:0:0 | | | +| Test.kt:3:1:80:1 | super(...) | SuperConstructorInvocationStmt | Test.kt:3:1:80:1 | { ... } | BlockStmt | +| Test.kt:3:1:80:1 | { ... } | BlockStmt | Test.kt:3:1:80:1 | Test | Constructor | +| Test.kt:3:1:80:1 | { ... } | BlockStmt | Test.kt:3:1:80:1 | super(...) | SuperConstructorInvocationStmt | +| Test.kt:4:2:79:2 | Unit | TypeAccess | file://:0:0:0:0 | | | +| Test.kt:4:2:79:2 | test | Method | file://:0:0:0:0 | | | +| Test.kt:4:13:79:2 | { ... } | BlockStmt | Test.kt:5:3:5:16 | var ...; | LocalVariableDeclStmt | +| Test.kt:5:3:5:16 | int x | LocalVariableDecl | file://:0:0:0:0 | | | +| Test.kt:5:3:5:16 | var ...; | LocalVariableDeclStmt | Test.kt:5:16:5:16 | 0 | IntegerLiteral | +| Test.kt:5:3:5:16 | x | LocalVariableDeclExpr | Test.kt:6:3:6:18 | var ...; | LocalVariableDeclStmt | +| Test.kt:5:16:5:16 | 0 | IntegerLiteral | Test.kt:5:3:5:16 | x | LocalVariableDeclExpr | +| Test.kt:6:3:6:18 | long y | LocalVariableDecl | file://:0:0:0:0 | | | +| Test.kt:6:3:6:18 | var ...; | LocalVariableDeclStmt | Test.kt:6:17:6:18 | 50 | LongLiteral | +| Test.kt:6:3:6:18 | y | LocalVariableDeclExpr | Test.kt:7:3:7:16 | var ...; | LocalVariableDeclStmt | +| Test.kt:6:17:6:18 | 50 | LongLiteral | Test.kt:6:3:6:18 | y | LocalVariableDeclExpr | +| Test.kt:7:3:7:16 | int z | LocalVariableDecl | file://:0:0:0:0 | | | +| Test.kt:7:3:7:16 | var ...; | LocalVariableDeclStmt | Test.kt:7:16:7:16 | 0 | IntegerLiteral | +| Test.kt:7:3:7:16 | z | LocalVariableDeclExpr | Test.kt:8:3:8:16 | var ...; | LocalVariableDeclStmt | +| Test.kt:7:16:7:16 | 0 | IntegerLiteral | Test.kt:7:3:7:16 | z | LocalVariableDeclExpr | +| Test.kt:8:3:8:16 | int w | LocalVariableDecl | file://:0:0:0:0 | | | +| Test.kt:8:3:8:16 | var ...; | LocalVariableDeclStmt | Test.kt:8:16:8:16 | 0 | IntegerLiteral | +| Test.kt:8:3:8:16 | w | LocalVariableDeclExpr | Test.kt:11:3:16:3 | ; | ExprStmt | +| Test.kt:8:16:8:16 | 0 | IntegerLiteral | Test.kt:8:3:8:16 | w | LocalVariableDeclExpr | +| Test.kt:11:3:16:3 | ; | ExprStmt | Test.kt:11:3:16:3 | when ... | WhenExpr | +| Test.kt:11:3:16:3 | when ... | WhenExpr | Test.kt:11:7:11:11 | ... -> ... | WhenBranch | +| Test.kt:11:7:11:7 | x | VarAccess | Test.kt:11:11:11:11 | 0 | IntegerLiteral | +| Test.kt:11:7:11:11 | ... -> ... | WhenBranch | Test.kt:11:7:11:7 | x | VarAccess | +| Test.kt:11:7:11:11 | ... > ... | GTExpr | Test.kt:11:14:14:3 | { ... } | BlockStmt | +| Test.kt:11:7:11:11 | ... > ... | GTExpr | Test.kt:14:10:16:3 | ... -> ... | WhenBranch | +| Test.kt:11:11:11:11 | 0 | IntegerLiteral | Test.kt:11:7:11:11 | ... > ... | GTExpr | +| Test.kt:11:14:14:3 | { ... } | BlockStmt | Test.kt:12:4:12:9 | ; | ExprStmt | +| Test.kt:12:4:12:9 | ...=... | AssignExpr | Test.kt:13:4:13:9 | ; | ExprStmt | +| Test.kt:12:4:12:9 | ; | ExprStmt | Test.kt:12:8:12:9 | 20 | LongLiteral | +| Test.kt:12:4:12:9 | y | VarAccess | file://:0:0:0:0 | | | +| Test.kt:12:8:12:9 | 20 | LongLiteral | Test.kt:12:4:12:9 | ...=... | AssignExpr | +| Test.kt:13:4:13:9 | ...=... | AssignExpr | Test.kt:18:3:18:7 | ; | ExprStmt | +| Test.kt:13:4:13:9 | ; | ExprStmt | Test.kt:13:8:13:9 | 10 | IntegerLiteral | +| Test.kt:13:4:13:9 | z | VarAccess | file://:0:0:0:0 | | | +| Test.kt:13:8:13:9 | 10 | IntegerLiteral | Test.kt:13:4:13:9 | ...=... | AssignExpr | +| Test.kt:14:10:16:3 | ... -> ... | WhenBranch | Test.kt:14:10:16:3 | true | BooleanLiteral | +| Test.kt:14:10:16:3 | true | BooleanLiteral | Test.kt:14:10:16:3 | { ... } | BlockStmt | +| Test.kt:14:10:16:3 | { ... } | BlockStmt | Test.kt:15:4:15:9 | ; | ExprStmt | +| Test.kt:15:4:15:9 | ...=... | AssignExpr | Test.kt:18:3:18:7 | ; | ExprStmt | +| Test.kt:15:4:15:9 | ; | ExprStmt | Test.kt:15:8:15:9 | 30 | LongLiteral | +| Test.kt:15:4:15:9 | y | VarAccess | file://:0:0:0:0 | | | +| Test.kt:15:8:15:9 | 30 | LongLiteral | Test.kt:15:4:15:9 | ...=... | AssignExpr | +| Test.kt:18:3:18:7 | ...=... | AssignExpr | Test.kt:21:3:24:9 | ; | ExprStmt | +| Test.kt:18:3:18:7 | ; | ExprStmt | Test.kt:18:7:18:7 | 0 | IntegerLiteral | +| Test.kt:18:3:18:7 | z | VarAccess | file://:0:0:0:0 | | | +| Test.kt:18:7:18:7 | 0 | IntegerLiteral | Test.kt:18:3:18:7 | ...=... | AssignExpr | +| Test.kt:21:3:24:9 | ; | ExprStmt | Test.kt:21:3:24:9 | when ... | WhenExpr | +| Test.kt:21:3:24:9 | when ... | WhenExpr | Test.kt:21:6:21:10 | ... -> ... | WhenBranch | +| Test.kt:21:6:21:6 | x | VarAccess | Test.kt:21:10:21:10 | 0 | IntegerLiteral | +| Test.kt:21:6:21:10 | ... -> ... | WhenBranch | Test.kt:21:6:21:6 | x | VarAccess | +| Test.kt:21:6:21:10 | ... < ... | LTExpr | Test.kt:22:4:22:9 | { ... } | BlockStmt | +| Test.kt:21:6:21:10 | ... < ... | LTExpr | Test.kt:24:4:24:9 | ... -> ... | WhenBranch | +| Test.kt:21:10:21:10 | 0 | IntegerLiteral | Test.kt:21:6:21:10 | ... < ... | LTExpr | +| Test.kt:22:4:22:9 | ...=... | AssignExpr | Test.kt:27:3:27:8 | ; | ExprStmt | +| Test.kt:22:4:22:9 | ; | ExprStmt | Test.kt:22:8:22:9 | 40 | LongLiteral | +| Test.kt:22:4:22:9 | y | VarAccess | file://:0:0:0:0 | | | +| Test.kt:22:4:22:9 | { ... } | BlockStmt | Test.kt:22:4:22:9 | ; | ExprStmt | +| Test.kt:22:8:22:9 | 40 | LongLiteral | Test.kt:22:4:22:9 | ...=... | AssignExpr | +| Test.kt:24:4:24:9 | ... -> ... | WhenBranch | Test.kt:24:4:24:9 | true | BooleanLiteral | +| Test.kt:24:4:24:9 | return ... | ReturnStmt | Test.kt:4:2:79:2 | test | Method | +| Test.kt:24:4:24:9 | true | BooleanLiteral | Test.kt:24:10:24:10 | INSTANCE | VarAccess | +| Test.kt:24:10:24:10 | INSTANCE | VarAccess | Test.kt:24:4:24:9 | return ... | ReturnStmt | +| Test.kt:27:3:27:8 | ...=... | AssignExpr | Test.kt:30:3:33:3 | ; | ExprStmt | +| Test.kt:27:3:27:8 | ; | ExprStmt | Test.kt:27:7:27:8 | 10 | IntegerLiteral | +| Test.kt:27:3:27:8 | z | VarAccess | file://:0:0:0:0 | | | +| Test.kt:27:7:27:8 | 10 | IntegerLiteral | Test.kt:27:3:27:8 | ...=... | AssignExpr | +| Test.kt:30:3:33:3 | ; | ExprStmt | Test.kt:30:3:33:3 | when ... | WhenExpr | +| Test.kt:30:3:33:3 | when ... | WhenExpr | Test.kt:30:7:30:12 | ... -> ... | WhenBranch | +| Test.kt:30:7:30:7 | x | VarAccess | Test.kt:30:12:30:12 | 0 | IntegerLiteral | +| Test.kt:30:7:30:12 | ... (value equals) ... | ValueEQExpr | Test.kt:30:15:33:3 | { ... } | BlockStmt | +| Test.kt:30:7:30:12 | ... (value equals) ... | ValueEQExpr | Test.kt:35:3:35:8 | ; | ExprStmt | +| Test.kt:30:7:30:12 | ... -> ... | WhenBranch | Test.kt:30:7:30:7 | x | VarAccess | +| Test.kt:30:12:30:12 | 0 | IntegerLiteral | Test.kt:30:7:30:12 | ... (value equals) ... | ValueEQExpr | +| Test.kt:30:15:33:3 | { ... } | BlockStmt | Test.kt:31:4:31:9 | ; | ExprStmt | +| Test.kt:31:4:31:9 | ...=... | AssignExpr | Test.kt:32:4:32:9 | ; | ExprStmt | +| Test.kt:31:4:31:9 | ; | ExprStmt | Test.kt:31:8:31:9 | 60 | LongLiteral | +| Test.kt:31:4:31:9 | y | VarAccess | file://:0:0:0:0 | | | +| Test.kt:31:8:31:9 | 60 | LongLiteral | Test.kt:31:4:31:9 | ...=... | AssignExpr | +| Test.kt:32:4:32:9 | ...=... | AssignExpr | Test.kt:35:3:35:8 | ; | ExprStmt | +| Test.kt:32:4:32:9 | ; | ExprStmt | Test.kt:32:8:32:9 | 10 | IntegerLiteral | +| Test.kt:32:4:32:9 | z | VarAccess | file://:0:0:0:0 | | | +| Test.kt:32:8:32:9 | 10 | IntegerLiteral | Test.kt:32:4:32:9 | ...=... | AssignExpr | +| Test.kt:35:3:35:8 | ...=... | AssignExpr | Test.kt:38:3:41:3 | while (...) | WhileStmt | +| Test.kt:35:3:35:8 | ; | ExprStmt | Test.kt:35:7:35:8 | 20 | IntegerLiteral | +| Test.kt:35:3:35:8 | z | VarAccess | file://:0:0:0:0 | | | +| Test.kt:35:7:35:8 | 20 | IntegerLiteral | Test.kt:35:3:35:8 | ...=... | AssignExpr | +| Test.kt:38:3:41:3 | while (...) | WhileStmt | Test.kt:38:9:38:9 | x | VarAccess | +| Test.kt:38:9:38:9 | x | VarAccess | Test.kt:38:13:38:13 | 0 | IntegerLiteral | +| Test.kt:38:9:38:13 | ... > ... | GTExpr | Test.kt:38:16:41:3 | { ... } | BlockStmt | +| Test.kt:38:9:38:13 | ... > ... | GTExpr | Test.kt:43:3:43:8 | ; | ExprStmt | +| Test.kt:38:13:38:13 | 0 | IntegerLiteral | Test.kt:38:9:38:13 | ... > ... | GTExpr | +| Test.kt:38:16:41:3 | { ... } | BlockStmt | Test.kt:39:4:39:9 | ; | ExprStmt | +| Test.kt:39:4:39:9 | ...=... | AssignExpr | Test.kt:40:4:40:6 | ; | ExprStmt | +| Test.kt:39:4:39:9 | ; | ExprStmt | Test.kt:39:8:39:9 | 10 | LongLiteral | +| Test.kt:39:4:39:9 | y | VarAccess | file://:0:0:0:0 | | | +| Test.kt:39:8:39:9 | 10 | LongLiteral | Test.kt:39:4:39:9 | ...=... | AssignExpr | +| Test.kt:40:4:40:4 | x | VarAccess | Test.kt:40:4:40:6 | | LocalVariableDeclExpr | +| Test.kt:40:4:40:6 | ...=... | AssignExpr | Test.kt:40:4:40:6 | ; | ExprStmt | +| Test.kt:40:4:40:6 | ; | ExprStmt | Test.kt:40:4:40:6 | | StmtExpr | +| Test.kt:40:4:40:6 | ; | ExprStmt | Test.kt:40:4:40:6 | | VarAccess | +| Test.kt:40:4:40:6 | ; | ExprStmt | Test.kt:40:4:40:6 | | VarAccess | +| Test.kt:40:4:40:6 | | StmtExpr | Test.kt:40:4:40:6 | { ... } | BlockStmt | +| Test.kt:40:4:40:6 | | ImplicitCoercionToUnitExpr | Test.kt:38:9:38:9 | x | VarAccess | +| Test.kt:40:4:40:6 | | LocalVariableDeclExpr | Test.kt:40:4:40:6 | ; | ExprStmt | +| Test.kt:40:4:40:6 | | VarAccess | Test.kt:40:4:40:6 | | ImplicitCoercionToUnitExpr | +| Test.kt:40:4:40:6 | | VarAccess | Test.kt:40:4:40:6 | dec(...) | MethodCall | +| Test.kt:40:4:40:6 | Unit | TypeAccess | file://:0:0:0:0 | | | +| Test.kt:40:4:40:6 | dec(...) | MethodCall | Test.kt:40:4:40:6 | ...=... | AssignExpr | +| Test.kt:40:4:40:6 | int | LocalVariableDecl | file://:0:0:0:0 | | | +| Test.kt:40:4:40:6 | var ...; | LocalVariableDeclStmt | Test.kt:40:4:40:4 | x | VarAccess | +| Test.kt:40:4:40:6 | x | VarAccess | file://:0:0:0:0 | | | +| Test.kt:40:4:40:6 | { ... } | BlockStmt | Test.kt:40:4:40:6 | var ...; | LocalVariableDeclStmt | +| Test.kt:43:3:43:8 | ...=... | AssignExpr | Test.kt:73:3:73:8 | ; | ExprStmt | +| Test.kt:43:3:43:8 | ; | ExprStmt | Test.kt:43:7:43:8 | 30 | IntegerLiteral | +| Test.kt:43:3:43:8 | z | VarAccess | file://:0:0:0:0 | | | +| Test.kt:43:7:43:8 | 30 | IntegerLiteral | Test.kt:43:3:43:8 | ...=... | AssignExpr | +| Test.kt:73:3:73:8 | ...=... | AssignExpr | Test.kt:77:3:77:8 | ; | ExprStmt | +| Test.kt:73:3:73:8 | ; | ExprStmt | Test.kt:73:7:73:8 | 50 | IntegerLiteral | +| Test.kt:73:3:73:8 | z | VarAccess | file://:0:0:0:0 | | | +| Test.kt:73:7:73:8 | 50 | IntegerLiteral | Test.kt:73:3:73:8 | ...=... | AssignExpr | +| Test.kt:77:3:77:8 | ...=... | AssignExpr | Test.kt:78:9:78:9 | INSTANCE | VarAccess | +| Test.kt:77:3:77:8 | ; | ExprStmt | Test.kt:77:7:77:8 | 40 | IntegerLiteral | +| Test.kt:77:3:77:8 | w | VarAccess | file://:0:0:0:0 | | | +| Test.kt:77:7:77:8 | 40 | IntegerLiteral | Test.kt:77:3:77:8 | ...=... | AssignExpr | +| Test.kt:78:3:78:8 | return ... | ReturnStmt | Test.kt:4:2:79:2 | test | Method | +| Test.kt:78:9:78:9 | INSTANCE | VarAccess | Test.kt:78:3:78:8 | return ... | ReturnStmt | +| Test.kt:82:1:89:1 | int | TypeAccess | file://:0:0:0:0 | | | +| Test.kt:82:1:89:1 | t1 | Method | file://:0:0:0:0 | | | +| Test.kt:82:8:82:13 | Object | TypeAccess | file://:0:0:0:0 | | | +| Test.kt:82:8:82:13 | o | Parameter | file://:0:0:0:0 | | | +| Test.kt:82:21:89:1 | { ... } | BlockStmt | Test.kt:83:2:88:2 | try ... | TryStmt | +| Test.kt:83:2:88:2 | try ... | TryStmt | Test.kt:83:6:86:2 | { ... } | BlockStmt | +| Test.kt:83:6:86:2 | { ... } | BlockStmt | Test.kt:84:3:84:18 | var ...; | LocalVariableDeclStmt | +| Test.kt:84:3:84:18 | int x | LocalVariableDecl | file://:0:0:0:0 | | | +| Test.kt:84:3:84:18 | var ...; | LocalVariableDeclStmt | Test.kt:84:11:84:11 | o | VarAccess | +| Test.kt:84:3:84:18 | x | LocalVariableDeclExpr | Test.kt:85:10:85:10 | 1 | IntegerLiteral | +| Test.kt:84:11:84:11 | o | VarAccess | Test.kt:84:11:84:18 | (...)... | CastExpr | +| Test.kt:84:11:84:18 | (...)... | CastExpr | Test.kt:84:3:84:18 | x | LocalVariableDeclExpr | +| Test.kt:84:11:84:18 | (...)... | CastExpr | Test.kt:86:4:88:2 | catch (...) | CatchClause | +| Test.kt:84:11:84:18 | int | TypeAccess | file://:0:0:0:0 | | | +| Test.kt:85:3:85:10 | return ... | ReturnStmt | Test.kt:82:1:89:1 | t1 | Method | +| Test.kt:85:10:85:10 | 1 | IntegerLiteral | Test.kt:85:3:85:10 | return ... | ReturnStmt | +| Test.kt:86:4:88:2 | catch (...) | CatchClause | Test.kt:86:11:86:31 | e | LocalVariableDeclExpr | +| Test.kt:86:11:86:31 | ClassCastException | TypeAccess | file://:0:0:0:0 | | | +| Test.kt:86:11:86:31 | ClassCastException e | LocalVariableDecl | file://:0:0:0:0 | | | +| Test.kt:86:11:86:31 | e | LocalVariableDeclExpr | Test.kt:86:34:88:2 | { ... } | BlockStmt | +| Test.kt:86:34:88:2 | { ... } | BlockStmt | Test.kt:87:10:87:10 | 2 | IntegerLiteral | +| Test.kt:87:3:87:10 | return ... | ReturnStmt | Test.kt:82:1:89:1 | t1 | Method | +| Test.kt:87:10:87:10 | 2 | IntegerLiteral | Test.kt:87:3:87:10 | return ... | ReturnStmt | +| Test.kt:91:1:98:1 | int | TypeAccess | file://:0:0:0:0 | | | +| Test.kt:91:1:98:1 | t2 | Method | file://:0:0:0:0 | | | +| Test.kt:91:8:91:14 | Object | TypeAccess | file://:0:0:0:0 | | | +| Test.kt:91:8:91:14 | o | Parameter | file://:0:0:0:0 | | | +| Test.kt:91:22:98:1 | { ... } | BlockStmt | Test.kt:92:2:97:2 | try ... | TryStmt | +| Test.kt:92:2:97:2 | try ... | TryStmt | Test.kt:92:6:95:2 | { ... } | BlockStmt | +| Test.kt:92:6:95:2 | { ... } | BlockStmt | Test.kt:93:3:93:13 | var ...; | LocalVariableDeclStmt | +| Test.kt:93:3:93:13 | Object x | LocalVariableDecl | file://:0:0:0:0 | | | +| Test.kt:93:3:93:13 | var ...; | LocalVariableDeclStmt | Test.kt:93:11:93:11 | o | VarAccess | +| Test.kt:93:3:93:13 | x | LocalVariableDeclExpr | Test.kt:94:10:94:10 | 1 | IntegerLiteral | +| Test.kt:93:11:93:11 | o | VarAccess | Test.kt:93:11:93:13 | ...!! | NotNullExpr | +| Test.kt:93:11:93:13 | ...!! | NotNullExpr | Test.kt:93:3:93:13 | x | LocalVariableDeclExpr | +| Test.kt:93:11:93:13 | ...!! | NotNullExpr | Test.kt:95:4:97:2 | catch (...) | CatchClause | +| Test.kt:94:3:94:10 | return ... | ReturnStmt | Test.kt:91:1:98:1 | t2 | Method | +| Test.kt:94:10:94:10 | 1 | IntegerLiteral | Test.kt:94:3:94:10 | return ... | ReturnStmt | +| Test.kt:95:4:97:2 | catch (...) | CatchClause | Test.kt:95:11:95:33 | e | LocalVariableDeclExpr | +| Test.kt:95:11:95:33 | NullPointerException | TypeAccess | file://:0:0:0:0 | | | +| Test.kt:95:11:95:33 | NullPointerException e | LocalVariableDecl | file://:0:0:0:0 | | | +| Test.kt:95:11:95:33 | e | LocalVariableDeclExpr | Test.kt:95:36:97:2 | { ... } | BlockStmt | +| Test.kt:95:36:97:2 | { ... } | BlockStmt | Test.kt:96:10:96:10 | 2 | IntegerLiteral | +| Test.kt:96:3:96:10 | return ... | ReturnStmt | Test.kt:91:1:98:1 | t2 | Method | +| Test.kt:96:10:96:10 | 2 | IntegerLiteral | Test.kt:96:3:96:10 | return ... | ReturnStmt | +| Test.kt:100:1:110:1 | Unit | TypeAccess | file://:0:0:0:0 | | | +| Test.kt:100:1:110:1 | fn | Method | file://:0:0:0:0 | | | +| Test.kt:100:8:100:13 | Object | TypeAccess | file://:0:0:0:0 | | | +| Test.kt:100:8:100:13 | x | Parameter | file://:0:0:0:0 | | | +| Test.kt:100:16:100:22 | Object | TypeAccess | file://:0:0:0:0 | | | +| Test.kt:100:16:100:22 | y | Parameter | file://:0:0:0:0 | | | +| Test.kt:100:25:110:1 | { ... } | BlockStmt | Test.kt:101:5:103:5 | ; | ExprStmt | +| Test.kt:101:5:103:5 | ; | ExprStmt | Test.kt:101:5:103:5 | when ... | WhenExpr | +| Test.kt:101:5:103:5 | when ... | WhenExpr | Test.kt:101:9:101:30 | ... -> ... | WhenBranch | +| Test.kt:101:9:101:9 | x | VarAccess | Test.kt:101:14:101:17 | null | NullLiteral | +| Test.kt:101:9:101:17 | ... (value equals) ... | ValueEQExpr | Test.kt:101:22:101:22 | y | VarAccess | +| Test.kt:101:9:101:17 | ... (value equals) ... | ValueEQExpr | Test.kt:105:5:109:5 | ; | ExprStmt | +| Test.kt:101:9:101:30 | ... && ... | AndLogicalExpr | Test.kt:101:9:101:9 | x | VarAccess | +| Test.kt:101:9:101:30 | ... -> ... | WhenBranch | Test.kt:101:9:101:30 | ... && ... | AndLogicalExpr | +| Test.kt:101:14:101:17 | null | NullLiteral | Test.kt:101:9:101:17 | ... (value equals) ... | ValueEQExpr | +| Test.kt:101:22:101:22 | y | VarAccess | Test.kt:101:27:101:30 | null | NullLiteral | +| Test.kt:101:22:101:30 | ... (value equals) ... | ValueEQExpr | Test.kt:101:33:103:5 | { ... } | BlockStmt | +| Test.kt:101:22:101:30 | ... (value equals) ... | ValueEQExpr | Test.kt:105:5:109:5 | ; | ExprStmt | +| Test.kt:101:27:101:30 | null | NullLiteral | Test.kt:101:22:101:30 | ... (value equals) ... | ValueEQExpr | +| Test.kt:101:33:103:5 | { ... } | BlockStmt | Test.kt:102:15:102:25 | new Exception(...) | ClassInstanceExpr | +| Test.kt:102:9:102:25 | throw ... | ThrowStmt | Test.kt:100:1:110:1 | fn | Method | +| Test.kt:102:15:102:25 | Exception | TypeAccess | file://:0:0:0:0 | | | +| Test.kt:102:15:102:25 | new Exception(...) | ClassInstanceExpr | Test.kt:102:9:102:25 | throw ... | ThrowStmt | +| Test.kt:105:5:109:5 | ; | ExprStmt | Test.kt:105:5:109:5 | when ... | WhenExpr | +| Test.kt:105:5:109:5 | when ... | WhenExpr | Test.kt:105:9:105:17 | ... -> ... | WhenBranch | +| Test.kt:105:9:105:9 | x | VarAccess | Test.kt:105:14:105:17 | null | NullLiteral | +| Test.kt:105:9:105:17 | ... (value not-equals) ... | ValueNEExpr | Test.kt:105:20:107:5 | { ... } | BlockStmt | +| Test.kt:105:9:105:17 | ... (value not-equals) ... | ValueNEExpr | Test.kt:107:16:107:24 | ... -> ... | WhenBranch | +| Test.kt:105:9:105:17 | ... -> ... | WhenBranch | Test.kt:105:9:105:9 | x | VarAccess | +| Test.kt:105:14:105:17 | null | NullLiteral | Test.kt:105:9:105:17 | ... (value not-equals) ... | ValueNEExpr | +| Test.kt:105:20:107:5 | { ... } | BlockStmt | Test.kt:106:9:106:29 | ; | ExprStmt | +| Test.kt:106:9:106:29 | ; | ExprStmt | Test.kt:106:17:106:28 | "x not null" | StringLiteral | +| Test.kt:106:9:106:29 | ConsoleKt | TypeAccess | file://:0:0:0:0 | | | +| Test.kt:106:9:106:29 | println(...) | MethodCall | Test.kt:100:1:110:1 | fn | Method | +| Test.kt:106:17:106:28 | "x not null" | StringLiteral | Test.kt:106:9:106:29 | println(...) | MethodCall | +| Test.kt:107:16:107:16 | y | VarAccess | Test.kt:107:21:107:24 | null | NullLiteral | +| Test.kt:107:16:107:24 | ... (value not-equals) ... | ValueNEExpr | Test.kt:100:1:110:1 | fn | Method | +| Test.kt:107:16:107:24 | ... (value not-equals) ... | ValueNEExpr | Test.kt:107:27:109:5 | { ... } | BlockStmt | +| Test.kt:107:16:107:24 | ... -> ... | WhenBranch | Test.kt:107:16:107:16 | y | VarAccess | +| Test.kt:107:21:107:24 | null | NullLiteral | Test.kt:107:16:107:24 | ... (value not-equals) ... | ValueNEExpr | +| Test.kt:107:27:109:5 | { ... } | BlockStmt | Test.kt:108:9:108:29 | ; | ExprStmt | +| Test.kt:108:9:108:29 | ; | ExprStmt | Test.kt:108:17:108:28 | "y not null" | StringLiteral | +| Test.kt:108:9:108:29 | ConsoleKt | TypeAccess | file://:0:0:0:0 | | | +| Test.kt:108:9:108:29 | println(...) | MethodCall | Test.kt:100:1:110:1 | fn | Method | +| Test.kt:108:17:108:28 | "y not null" | StringLiteral | Test.kt:108:9:108:29 | println(...) | MethodCall | +| Test.kt:112:1:116:1 | Unit | TypeAccess | file://:0:0:0:0 | | | +| Test.kt:112:1:116:1 | fn | Method | file://:0:0:0:0 | | | +| Test.kt:112:8:112:17 | boolean | TypeAccess | file://:0:0:0:0 | | | +| Test.kt:112:8:112:17 | x | Parameter | file://:0:0:0:0 | | | +| Test.kt:112:20:112:29 | boolean | TypeAccess | file://:0:0:0:0 | | | +| Test.kt:112:20:112:29 | y | Parameter | file://:0:0:0:0 | | | +| Test.kt:112:32:116:1 | { ... } | BlockStmt | Test.kt:113:5:115:5 | ; | ExprStmt | +| Test.kt:113:5:115:5 | ; | ExprStmt | Test.kt:113:5:115:5 | when ... | WhenExpr | +| Test.kt:113:5:115:5 | when ... | WhenExpr | Test.kt:113:9:113:14 | ... -> ... | WhenBranch | +| Test.kt:113:9:113:9 | x | VarAccess | Test.kt:112:1:116:1 | fn | Method | +| Test.kt:113:9:113:9 | x | VarAccess | Test.kt:113:14:113:14 | y | VarAccess | +| Test.kt:113:9:113:14 | ... && ... | AndLogicalExpr | Test.kt:113:9:113:9 | x | VarAccess | +| Test.kt:113:9:113:14 | ... -> ... | WhenBranch | Test.kt:113:9:113:14 | ... && ... | AndLogicalExpr | +| Test.kt:113:14:113:14 | y | VarAccess | Test.kt:112:1:116:1 | fn | Method | +| Test.kt:113:14:113:14 | y | VarAccess | Test.kt:113:17:115:5 | { ... } | BlockStmt | +| Test.kt:113:17:115:5 | { ... } | BlockStmt | Test.kt:112:1:116:1 | fn | Method | +| Test.kt:118:1:124:1 | Unit | TypeAccess | file://:0:0:0:0 | | | +| Test.kt:118:1:124:1 | fn_when | Method | file://:0:0:0:0 | | | +| Test.kt:118:13:118:22 | boolean | TypeAccess | file://:0:0:0:0 | | | +| Test.kt:118:13:118:22 | x | Parameter | file://:0:0:0:0 | | | +| Test.kt:118:25:118:34 | boolean | TypeAccess | file://:0:0:0:0 | | | +| Test.kt:118:25:118:34 | y | Parameter | file://:0:0:0:0 | | | +| Test.kt:118:37:124:1 | { ... } | BlockStmt | Test.kt:119:2:123:12 | ; | ExprStmt | +| Test.kt:119:2:123:12 | ; | ExprStmt | Test.kt:119:2:123:12 | when ... | WhenExpr | +| Test.kt:119:2:123:12 | when ... | WhenExpr | Test.kt:120:3:123:10 | ... -> ... | WhenBranch | +| Test.kt:120:3:123:3 | when ... | WhenExpr | Test.kt:121:4:121:9 | ... -> ... | WhenBranch | +| Test.kt:120:3:123:10 | ... -> ... | WhenBranch | Test.kt:120:3:123:3 | when ... | WhenExpr | +| Test.kt:121:4:121:4 | x | VarAccess | Test.kt:121:9:121:9 | ; | ExprStmt | +| Test.kt:121:4:121:4 | x | VarAccess | Test.kt:122:12:122:16 | ... -> ... | WhenBranch | +| Test.kt:121:4:121:9 | ... -> ... | WhenBranch | Test.kt:121:4:121:4 | x | VarAccess | +| Test.kt:121:9:121:9 | ; | ExprStmt | Test.kt:121:9:121:9 | y | VarAccess | +| Test.kt:121:9:121:9 | y | VarAccess | Test.kt:118:1:124:1 | fn_when | Method | +| Test.kt:121:9:121:9 | y | VarAccess | Test.kt:123:8:123:10 | { ... } | BlockStmt | +| Test.kt:122:12:122:16 | ... -> ... | WhenBranch | Test.kt:122:12:122:16 | true | BooleanLiteral | +| Test.kt:122:12:122:16 | ; | ExprStmt | Test.kt:122:12:122:16 | false | BooleanLiteral | +| Test.kt:122:12:122:16 | false | BooleanLiteral | Test.kt:118:1:124:1 | fn_when | Method | +| Test.kt:122:12:122:16 | true | BooleanLiteral | Test.kt:122:12:122:16 | ; | ExprStmt | +| Test.kt:123:8:123:10 | { ... } | BlockStmt | Test.kt:118:1:124:1 | fn_when | Method | +missingSuccessor diff --git a/java/ql/test-kotlin2/library-tests/controlflow/basic/getASuccessor.ql b/java/ql/test-kotlin2/library-tests/controlflow/basic/getASuccessor.ql new file mode 100644 index 00000000000..eff8c2306e8 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/controlflow/basic/getASuccessor.ql @@ -0,0 +1,54 @@ +import java + +newtype TMaybeControlFlowNode = + TControlFlowNode(ControlFlowNode c) or + TNoControlFlowNode() + +class MaybeControlFlowNode extends TMaybeControlFlowNode { + abstract string toString(); + + abstract Location getLocation(); + + abstract string getPrimaryQlClasses(); +} + +class YesMaybeControlFlowNode extends MaybeControlFlowNode { + ControlFlowNode c; + + YesMaybeControlFlowNode() { this = TControlFlowNode(c) } + + override string toString() { result = c.toString() } + + override Location getLocation() { result = c.getLocation() } + + override string getPrimaryQlClasses() { result = c.getPrimaryQlClasses() } +} + +class NoMaybeControlFlowNode extends MaybeControlFlowNode { + NoMaybeControlFlowNode() { this = TNoControlFlowNode() } + + override string toString() { result = "" } + + override Location getLocation() { result.toString() = "file://:0:0:0:0" } + + override string getPrimaryQlClasses() { result = "" } +} + +MaybeControlFlowNode maybeSuccessor(ControlFlowNode n) { + if exists(n.getASuccessor()) + then result = TControlFlowNode(n.getASuccessor()) + else result = TNoControlFlowNode() +} + +from ControlFlowNode n, MaybeControlFlowNode m +where + m = maybeSuccessor(n) and + n.getFile().(CompilationUnit).fromSource() +select n, n.getPrimaryQlClasses(), m, m.getPrimaryQlClasses() + +query predicate missingSuccessor(Expr n) { + maybeSuccessor(n) instanceof NoMaybeControlFlowNode and + n.getFile().(CompilationUnit).fromSource() and + not n instanceof TypeAccess and + not n instanceof VarWrite +} diff --git a/java/ql/test-kotlin2/library-tests/controlflow/basic/strictDominance.expected b/java/ql/test-kotlin2/library-tests/controlflow/basic/strictDominance.expected new file mode 100644 index 00000000000..39832117f79 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/controlflow/basic/strictDominance.expected @@ -0,0 +1,596 @@ +| Test.kt:3:1:80:1 | super(...) | Test.kt:3:1:80:1 | { ... } | +| Test.kt:3:1:80:1 | { ... } | Test.kt:3:1:80:1 | super(...) | +| Test.kt:3:1:80:1 | { ... } | Test.kt:3:1:80:1 | { ... } | +| Test.kt:4:13:79:2 | { ... } | Test.kt:5:3:5:16 | var ...; | +| Test.kt:4:13:79:2 | { ... } | Test.kt:6:3:6:18 | var ...; | +| Test.kt:4:13:79:2 | { ... } | Test.kt:7:3:7:16 | var ...; | +| Test.kt:4:13:79:2 | { ... } | Test.kt:8:3:8:16 | var ...; | +| Test.kt:4:13:79:2 | { ... } | Test.kt:11:3:16:3 | ; | +| Test.kt:4:13:79:2 | { ... } | Test.kt:11:7:11:11 | ... -> ... | +| Test.kt:4:13:79:2 | { ... } | Test.kt:11:14:14:3 | { ... } | +| Test.kt:4:13:79:2 | { ... } | Test.kt:12:4:12:9 | ; | +| Test.kt:4:13:79:2 | { ... } | Test.kt:13:4:13:9 | ; | +| Test.kt:4:13:79:2 | { ... } | Test.kt:14:10:16:3 | ... -> ... | +| Test.kt:4:13:79:2 | { ... } | Test.kt:14:10:16:3 | { ... } | +| Test.kt:4:13:79:2 | { ... } | Test.kt:15:4:15:9 | ; | +| Test.kt:4:13:79:2 | { ... } | Test.kt:18:3:18:7 | ; | +| Test.kt:4:13:79:2 | { ... } | Test.kt:21:3:24:9 | ; | +| Test.kt:4:13:79:2 | { ... } | Test.kt:21:6:21:10 | ... -> ... | +| Test.kt:4:13:79:2 | { ... } | Test.kt:22:4:22:9 | ; | +| Test.kt:4:13:79:2 | { ... } | Test.kt:22:4:22:9 | { ... } | +| Test.kt:4:13:79:2 | { ... } | Test.kt:24:4:24:9 | ... -> ... | +| Test.kt:4:13:79:2 | { ... } | Test.kt:24:4:24:9 | return ... | +| Test.kt:4:13:79:2 | { ... } | Test.kt:27:3:27:8 | ; | +| Test.kt:4:13:79:2 | { ... } | Test.kt:30:3:33:3 | ; | +| Test.kt:4:13:79:2 | { ... } | Test.kt:30:7:30:12 | ... -> ... | +| Test.kt:4:13:79:2 | { ... } | Test.kt:30:15:33:3 | { ... } | +| Test.kt:4:13:79:2 | { ... } | Test.kt:31:4:31:9 | ; | +| Test.kt:4:13:79:2 | { ... } | Test.kt:32:4:32:9 | ; | +| Test.kt:4:13:79:2 | { ... } | Test.kt:35:3:35:8 | ; | +| Test.kt:4:13:79:2 | { ... } | Test.kt:38:3:41:3 | while (...) | +| Test.kt:4:13:79:2 | { ... } | Test.kt:38:16:41:3 | { ... } | +| Test.kt:4:13:79:2 | { ... } | Test.kt:39:4:39:9 | ; | +| Test.kt:4:13:79:2 | { ... } | Test.kt:40:4:40:6 | ; | +| Test.kt:4:13:79:2 | { ... } | Test.kt:40:4:40:6 | ; | +| Test.kt:4:13:79:2 | { ... } | Test.kt:40:4:40:6 | ; | +| Test.kt:4:13:79:2 | { ... } | Test.kt:40:4:40:6 | var ...; | +| Test.kt:4:13:79:2 | { ... } | Test.kt:40:4:40:6 | { ... } | +| Test.kt:4:13:79:2 | { ... } | Test.kt:43:3:43:8 | ; | +| Test.kt:4:13:79:2 | { ... } | Test.kt:73:3:73:8 | ; | +| Test.kt:4:13:79:2 | { ... } | Test.kt:77:3:77:8 | ; | +| Test.kt:4:13:79:2 | { ... } | Test.kt:78:3:78:8 | return ... | +| Test.kt:5:3:5:16 | var ...; | Test.kt:6:3:6:18 | var ...; | +| Test.kt:5:3:5:16 | var ...; | Test.kt:7:3:7:16 | var ...; | +| Test.kt:5:3:5:16 | var ...; | Test.kt:8:3:8:16 | var ...; | +| Test.kt:5:3:5:16 | var ...; | Test.kt:11:3:16:3 | ; | +| Test.kt:5:3:5:16 | var ...; | Test.kt:11:7:11:11 | ... -> ... | +| Test.kt:5:3:5:16 | var ...; | Test.kt:11:14:14:3 | { ... } | +| Test.kt:5:3:5:16 | var ...; | Test.kt:12:4:12:9 | ; | +| Test.kt:5:3:5:16 | var ...; | Test.kt:13:4:13:9 | ; | +| Test.kt:5:3:5:16 | var ...; | Test.kt:14:10:16:3 | ... -> ... | +| Test.kt:5:3:5:16 | var ...; | Test.kt:14:10:16:3 | { ... } | +| Test.kt:5:3:5:16 | var ...; | Test.kt:15:4:15:9 | ; | +| Test.kt:5:3:5:16 | var ...; | Test.kt:18:3:18:7 | ; | +| Test.kt:5:3:5:16 | var ...; | Test.kt:21:3:24:9 | ; | +| Test.kt:5:3:5:16 | var ...; | Test.kt:21:6:21:10 | ... -> ... | +| Test.kt:5:3:5:16 | var ...; | Test.kt:22:4:22:9 | ; | +| Test.kt:5:3:5:16 | var ...; | Test.kt:22:4:22:9 | { ... } | +| Test.kt:5:3:5:16 | var ...; | Test.kt:24:4:24:9 | ... -> ... | +| Test.kt:5:3:5:16 | var ...; | Test.kt:24:4:24:9 | return ... | +| Test.kt:5:3:5:16 | var ...; | Test.kt:27:3:27:8 | ; | +| Test.kt:5:3:5:16 | var ...; | Test.kt:30:3:33:3 | ; | +| Test.kt:5:3:5:16 | var ...; | Test.kt:30:7:30:12 | ... -> ... | +| Test.kt:5:3:5:16 | var ...; | Test.kt:30:15:33:3 | { ... } | +| Test.kt:5:3:5:16 | var ...; | Test.kt:31:4:31:9 | ; | +| Test.kt:5:3:5:16 | var ...; | Test.kt:32:4:32:9 | ; | +| Test.kt:5:3:5:16 | var ...; | Test.kt:35:3:35:8 | ; | +| Test.kt:5:3:5:16 | var ...; | Test.kt:38:3:41:3 | while (...) | +| Test.kt:5:3:5:16 | var ...; | Test.kt:38:16:41:3 | { ... } | +| Test.kt:5:3:5:16 | var ...; | Test.kt:39:4:39:9 | ; | +| Test.kt:5:3:5:16 | var ...; | Test.kt:40:4:40:6 | ; | +| Test.kt:5:3:5:16 | var ...; | Test.kt:40:4:40:6 | ; | +| Test.kt:5:3:5:16 | var ...; | Test.kt:40:4:40:6 | ; | +| Test.kt:5:3:5:16 | var ...; | Test.kt:40:4:40:6 | var ...; | +| Test.kt:5:3:5:16 | var ...; | Test.kt:40:4:40:6 | { ... } | +| Test.kt:5:3:5:16 | var ...; | Test.kt:43:3:43:8 | ; | +| Test.kt:5:3:5:16 | var ...; | Test.kt:73:3:73:8 | ; | +| Test.kt:5:3:5:16 | var ...; | Test.kt:77:3:77:8 | ; | +| Test.kt:5:3:5:16 | var ...; | Test.kt:78:3:78:8 | return ... | +| Test.kt:6:3:6:18 | var ...; | Test.kt:7:3:7:16 | var ...; | +| Test.kt:6:3:6:18 | var ...; | Test.kt:8:3:8:16 | var ...; | +| Test.kt:6:3:6:18 | var ...; | Test.kt:11:3:16:3 | ; | +| Test.kt:6:3:6:18 | var ...; | Test.kt:11:7:11:11 | ... -> ... | +| Test.kt:6:3:6:18 | var ...; | Test.kt:11:14:14:3 | { ... } | +| Test.kt:6:3:6:18 | var ...; | Test.kt:12:4:12:9 | ; | +| Test.kt:6:3:6:18 | var ...; | Test.kt:13:4:13:9 | ; | +| Test.kt:6:3:6:18 | var ...; | Test.kt:14:10:16:3 | ... -> ... | +| Test.kt:6:3:6:18 | var ...; | Test.kt:14:10:16:3 | { ... } | +| Test.kt:6:3:6:18 | var ...; | Test.kt:15:4:15:9 | ; | +| Test.kt:6:3:6:18 | var ...; | Test.kt:18:3:18:7 | ; | +| Test.kt:6:3:6:18 | var ...; | Test.kt:21:3:24:9 | ; | +| Test.kt:6:3:6:18 | var ...; | Test.kt:21:6:21:10 | ... -> ... | +| Test.kt:6:3:6:18 | var ...; | Test.kt:22:4:22:9 | ; | +| Test.kt:6:3:6:18 | var ...; | Test.kt:22:4:22:9 | { ... } | +| Test.kt:6:3:6:18 | var ...; | Test.kt:24:4:24:9 | ... -> ... | +| Test.kt:6:3:6:18 | var ...; | Test.kt:24:4:24:9 | return ... | +| Test.kt:6:3:6:18 | var ...; | Test.kt:27:3:27:8 | ; | +| Test.kt:6:3:6:18 | var ...; | Test.kt:30:3:33:3 | ; | +| Test.kt:6:3:6:18 | var ...; | Test.kt:30:7:30:12 | ... -> ... | +| Test.kt:6:3:6:18 | var ...; | Test.kt:30:15:33:3 | { ... } | +| Test.kt:6:3:6:18 | var ...; | Test.kt:31:4:31:9 | ; | +| Test.kt:6:3:6:18 | var ...; | Test.kt:32:4:32:9 | ; | +| Test.kt:6:3:6:18 | var ...; | Test.kt:35:3:35:8 | ; | +| Test.kt:6:3:6:18 | var ...; | Test.kt:38:3:41:3 | while (...) | +| Test.kt:6:3:6:18 | var ...; | Test.kt:38:16:41:3 | { ... } | +| Test.kt:6:3:6:18 | var ...; | Test.kt:39:4:39:9 | ; | +| Test.kt:6:3:6:18 | var ...; | Test.kt:40:4:40:6 | ; | +| Test.kt:6:3:6:18 | var ...; | Test.kt:40:4:40:6 | ; | +| Test.kt:6:3:6:18 | var ...; | Test.kt:40:4:40:6 | ; | +| Test.kt:6:3:6:18 | var ...; | Test.kt:40:4:40:6 | var ...; | +| Test.kt:6:3:6:18 | var ...; | Test.kt:40:4:40:6 | { ... } | +| Test.kt:6:3:6:18 | var ...; | Test.kt:43:3:43:8 | ; | +| Test.kt:6:3:6:18 | var ...; | Test.kt:73:3:73:8 | ; | +| Test.kt:6:3:6:18 | var ...; | Test.kt:77:3:77:8 | ; | +| Test.kt:6:3:6:18 | var ...; | Test.kt:78:3:78:8 | return ... | +| Test.kt:7:3:7:16 | var ...; | Test.kt:8:3:8:16 | var ...; | +| Test.kt:7:3:7:16 | var ...; | Test.kt:11:3:16:3 | ; | +| Test.kt:7:3:7:16 | var ...; | Test.kt:11:7:11:11 | ... -> ... | +| Test.kt:7:3:7:16 | var ...; | Test.kt:11:14:14:3 | { ... } | +| Test.kt:7:3:7:16 | var ...; | Test.kt:12:4:12:9 | ; | +| Test.kt:7:3:7:16 | var ...; | Test.kt:13:4:13:9 | ; | +| Test.kt:7:3:7:16 | var ...; | Test.kt:14:10:16:3 | ... -> ... | +| Test.kt:7:3:7:16 | var ...; | Test.kt:14:10:16:3 | { ... } | +| Test.kt:7:3:7:16 | var ...; | Test.kt:15:4:15:9 | ; | +| Test.kt:7:3:7:16 | var ...; | Test.kt:18:3:18:7 | ; | +| Test.kt:7:3:7:16 | var ...; | Test.kt:21:3:24:9 | ; | +| Test.kt:7:3:7:16 | var ...; | Test.kt:21:6:21:10 | ... -> ... | +| Test.kt:7:3:7:16 | var ...; | Test.kt:22:4:22:9 | ; | +| Test.kt:7:3:7:16 | var ...; | Test.kt:22:4:22:9 | { ... } | +| Test.kt:7:3:7:16 | var ...; | Test.kt:24:4:24:9 | ... -> ... | +| Test.kt:7:3:7:16 | var ...; | Test.kt:24:4:24:9 | return ... | +| Test.kt:7:3:7:16 | var ...; | Test.kt:27:3:27:8 | ; | +| Test.kt:7:3:7:16 | var ...; | Test.kt:30:3:33:3 | ; | +| Test.kt:7:3:7:16 | var ...; | Test.kt:30:7:30:12 | ... -> ... | +| Test.kt:7:3:7:16 | var ...; | Test.kt:30:15:33:3 | { ... } | +| Test.kt:7:3:7:16 | var ...; | Test.kt:31:4:31:9 | ; | +| Test.kt:7:3:7:16 | var ...; | Test.kt:32:4:32:9 | ; | +| Test.kt:7:3:7:16 | var ...; | Test.kt:35:3:35:8 | ; | +| Test.kt:7:3:7:16 | var ...; | Test.kt:38:3:41:3 | while (...) | +| Test.kt:7:3:7:16 | var ...; | Test.kt:38:16:41:3 | { ... } | +| Test.kt:7:3:7:16 | var ...; | Test.kt:39:4:39:9 | ; | +| Test.kt:7:3:7:16 | var ...; | Test.kt:40:4:40:6 | ; | +| Test.kt:7:3:7:16 | var ...; | Test.kt:40:4:40:6 | ; | +| Test.kt:7:3:7:16 | var ...; | Test.kt:40:4:40:6 | ; | +| Test.kt:7:3:7:16 | var ...; | Test.kt:40:4:40:6 | var ...; | +| Test.kt:7:3:7:16 | var ...; | Test.kt:40:4:40:6 | { ... } | +| Test.kt:7:3:7:16 | var ...; | Test.kt:43:3:43:8 | ; | +| Test.kt:7:3:7:16 | var ...; | Test.kt:73:3:73:8 | ; | +| Test.kt:7:3:7:16 | var ...; | Test.kt:77:3:77:8 | ; | +| Test.kt:7:3:7:16 | var ...; | Test.kt:78:3:78:8 | return ... | +| Test.kt:8:3:8:16 | var ...; | Test.kt:11:3:16:3 | ; | +| Test.kt:8:3:8:16 | var ...; | Test.kt:11:7:11:11 | ... -> ... | +| Test.kt:8:3:8:16 | var ...; | Test.kt:11:14:14:3 | { ... } | +| Test.kt:8:3:8:16 | var ...; | Test.kt:12:4:12:9 | ; | +| Test.kt:8:3:8:16 | var ...; | Test.kt:13:4:13:9 | ; | +| Test.kt:8:3:8:16 | var ...; | Test.kt:14:10:16:3 | ... -> ... | +| Test.kt:8:3:8:16 | var ...; | Test.kt:14:10:16:3 | { ... } | +| Test.kt:8:3:8:16 | var ...; | Test.kt:15:4:15:9 | ; | +| Test.kt:8:3:8:16 | var ...; | Test.kt:18:3:18:7 | ; | +| Test.kt:8:3:8:16 | var ...; | Test.kt:21:3:24:9 | ; | +| Test.kt:8:3:8:16 | var ...; | Test.kt:21:6:21:10 | ... -> ... | +| Test.kt:8:3:8:16 | var ...; | Test.kt:22:4:22:9 | ; | +| Test.kt:8:3:8:16 | var ...; | Test.kt:22:4:22:9 | { ... } | +| Test.kt:8:3:8:16 | var ...; | Test.kt:24:4:24:9 | ... -> ... | +| Test.kt:8:3:8:16 | var ...; | Test.kt:24:4:24:9 | return ... | +| Test.kt:8:3:8:16 | var ...; | Test.kt:27:3:27:8 | ; | +| Test.kt:8:3:8:16 | var ...; | Test.kt:30:3:33:3 | ; | +| Test.kt:8:3:8:16 | var ...; | Test.kt:30:7:30:12 | ... -> ... | +| Test.kt:8:3:8:16 | var ...; | Test.kt:30:15:33:3 | { ... } | +| Test.kt:8:3:8:16 | var ...; | Test.kt:31:4:31:9 | ; | +| Test.kt:8:3:8:16 | var ...; | Test.kt:32:4:32:9 | ; | +| Test.kt:8:3:8:16 | var ...; | Test.kt:35:3:35:8 | ; | +| Test.kt:8:3:8:16 | var ...; | Test.kt:38:3:41:3 | while (...) | +| Test.kt:8:3:8:16 | var ...; | Test.kt:38:16:41:3 | { ... } | +| Test.kt:8:3:8:16 | var ...; | Test.kt:39:4:39:9 | ; | +| Test.kt:8:3:8:16 | var ...; | Test.kt:40:4:40:6 | ; | +| Test.kt:8:3:8:16 | var ...; | Test.kt:40:4:40:6 | ; | +| Test.kt:8:3:8:16 | var ...; | Test.kt:40:4:40:6 | ; | +| Test.kt:8:3:8:16 | var ...; | Test.kt:40:4:40:6 | var ...; | +| Test.kt:8:3:8:16 | var ...; | Test.kt:40:4:40:6 | { ... } | +| Test.kt:8:3:8:16 | var ...; | Test.kt:43:3:43:8 | ; | +| Test.kt:8:3:8:16 | var ...; | Test.kt:73:3:73:8 | ; | +| Test.kt:8:3:8:16 | var ...; | Test.kt:77:3:77:8 | ; | +| Test.kt:8:3:8:16 | var ...; | Test.kt:78:3:78:8 | return ... | +| Test.kt:11:3:16:3 | ; | Test.kt:11:7:11:11 | ... -> ... | +| Test.kt:11:3:16:3 | ; | Test.kt:11:14:14:3 | { ... } | +| Test.kt:11:3:16:3 | ; | Test.kt:12:4:12:9 | ; | +| Test.kt:11:3:16:3 | ; | Test.kt:13:4:13:9 | ; | +| Test.kt:11:3:16:3 | ; | Test.kt:14:10:16:3 | ... -> ... | +| Test.kt:11:3:16:3 | ; | Test.kt:14:10:16:3 | { ... } | +| Test.kt:11:3:16:3 | ; | Test.kt:15:4:15:9 | ; | +| Test.kt:11:3:16:3 | ; | Test.kt:18:3:18:7 | ; | +| Test.kt:11:3:16:3 | ; | Test.kt:21:3:24:9 | ; | +| Test.kt:11:3:16:3 | ; | Test.kt:21:6:21:10 | ... -> ... | +| Test.kt:11:3:16:3 | ; | Test.kt:22:4:22:9 | ; | +| Test.kt:11:3:16:3 | ; | Test.kt:22:4:22:9 | { ... } | +| Test.kt:11:3:16:3 | ; | Test.kt:24:4:24:9 | ... -> ... | +| Test.kt:11:3:16:3 | ; | Test.kt:24:4:24:9 | return ... | +| Test.kt:11:3:16:3 | ; | Test.kt:27:3:27:8 | ; | +| Test.kt:11:3:16:3 | ; | Test.kt:30:3:33:3 | ; | +| Test.kt:11:3:16:3 | ; | Test.kt:30:7:30:12 | ... -> ... | +| Test.kt:11:3:16:3 | ; | Test.kt:30:15:33:3 | { ... } | +| Test.kt:11:3:16:3 | ; | Test.kt:31:4:31:9 | ; | +| Test.kt:11:3:16:3 | ; | Test.kt:32:4:32:9 | ; | +| Test.kt:11:3:16:3 | ; | Test.kt:35:3:35:8 | ; | +| Test.kt:11:3:16:3 | ; | Test.kt:38:3:41:3 | while (...) | +| Test.kt:11:3:16:3 | ; | Test.kt:38:16:41:3 | { ... } | +| Test.kt:11:3:16:3 | ; | Test.kt:39:4:39:9 | ; | +| Test.kt:11:3:16:3 | ; | Test.kt:40:4:40:6 | ; | +| Test.kt:11:3:16:3 | ; | Test.kt:40:4:40:6 | ; | +| Test.kt:11:3:16:3 | ; | Test.kt:40:4:40:6 | ; | +| Test.kt:11:3:16:3 | ; | Test.kt:40:4:40:6 | var ...; | +| Test.kt:11:3:16:3 | ; | Test.kt:40:4:40:6 | { ... } | +| Test.kt:11:3:16:3 | ; | Test.kt:43:3:43:8 | ; | +| Test.kt:11:3:16:3 | ; | Test.kt:73:3:73:8 | ; | +| Test.kt:11:3:16:3 | ; | Test.kt:77:3:77:8 | ; | +| Test.kt:11:3:16:3 | ; | Test.kt:78:3:78:8 | return ... | +| Test.kt:11:7:11:11 | ... -> ... | Test.kt:11:14:14:3 | { ... } | +| Test.kt:11:7:11:11 | ... -> ... | Test.kt:12:4:12:9 | ; | +| Test.kt:11:7:11:11 | ... -> ... | Test.kt:13:4:13:9 | ; | +| Test.kt:11:7:11:11 | ... -> ... | Test.kt:14:10:16:3 | ... -> ... | +| Test.kt:11:7:11:11 | ... -> ... | Test.kt:14:10:16:3 | { ... } | +| Test.kt:11:7:11:11 | ... -> ... | Test.kt:15:4:15:9 | ; | +| Test.kt:11:7:11:11 | ... -> ... | Test.kt:18:3:18:7 | ; | +| Test.kt:11:7:11:11 | ... -> ... | Test.kt:21:3:24:9 | ; | +| Test.kt:11:7:11:11 | ... -> ... | Test.kt:21:6:21:10 | ... -> ... | +| Test.kt:11:7:11:11 | ... -> ... | Test.kt:22:4:22:9 | ; | +| Test.kt:11:7:11:11 | ... -> ... | Test.kt:22:4:22:9 | { ... } | +| Test.kt:11:7:11:11 | ... -> ... | Test.kt:24:4:24:9 | ... -> ... | +| Test.kt:11:7:11:11 | ... -> ... | Test.kt:24:4:24:9 | return ... | +| Test.kt:11:7:11:11 | ... -> ... | Test.kt:27:3:27:8 | ; | +| Test.kt:11:7:11:11 | ... -> ... | Test.kt:30:3:33:3 | ; | +| Test.kt:11:7:11:11 | ... -> ... | Test.kt:30:7:30:12 | ... -> ... | +| Test.kt:11:7:11:11 | ... -> ... | Test.kt:30:15:33:3 | { ... } | +| Test.kt:11:7:11:11 | ... -> ... | Test.kt:31:4:31:9 | ; | +| Test.kt:11:7:11:11 | ... -> ... | Test.kt:32:4:32:9 | ; | +| Test.kt:11:7:11:11 | ... -> ... | Test.kt:35:3:35:8 | ; | +| Test.kt:11:7:11:11 | ... -> ... | Test.kt:38:3:41:3 | while (...) | +| Test.kt:11:7:11:11 | ... -> ... | Test.kt:38:16:41:3 | { ... } | +| Test.kt:11:7:11:11 | ... -> ... | Test.kt:39:4:39:9 | ; | +| Test.kt:11:7:11:11 | ... -> ... | Test.kt:40:4:40:6 | ; | +| Test.kt:11:7:11:11 | ... -> ... | Test.kt:40:4:40:6 | ; | +| Test.kt:11:7:11:11 | ... -> ... | Test.kt:40:4:40:6 | ; | +| Test.kt:11:7:11:11 | ... -> ... | Test.kt:40:4:40:6 | var ...; | +| Test.kt:11:7:11:11 | ... -> ... | Test.kt:40:4:40:6 | { ... } | +| Test.kt:11:7:11:11 | ... -> ... | Test.kt:43:3:43:8 | ; | +| Test.kt:11:7:11:11 | ... -> ... | Test.kt:73:3:73:8 | ; | +| Test.kt:11:7:11:11 | ... -> ... | Test.kt:77:3:77:8 | ; | +| Test.kt:11:7:11:11 | ... -> ... | Test.kt:78:3:78:8 | return ... | +| Test.kt:11:14:14:3 | { ... } | Test.kt:12:4:12:9 | ; | +| Test.kt:11:14:14:3 | { ... } | Test.kt:13:4:13:9 | ; | +| Test.kt:12:4:12:9 | ; | Test.kt:13:4:13:9 | ; | +| Test.kt:14:10:16:3 | ... -> ... | Test.kt:14:10:16:3 | { ... } | +| Test.kt:14:10:16:3 | ... -> ... | Test.kt:15:4:15:9 | ; | +| Test.kt:14:10:16:3 | { ... } | Test.kt:15:4:15:9 | ; | +| Test.kt:18:3:18:7 | ; | Test.kt:21:3:24:9 | ; | +| Test.kt:18:3:18:7 | ; | Test.kt:21:6:21:10 | ... -> ... | +| Test.kt:18:3:18:7 | ; | Test.kt:22:4:22:9 | ; | +| Test.kt:18:3:18:7 | ; | Test.kt:22:4:22:9 | { ... } | +| Test.kt:18:3:18:7 | ; | Test.kt:24:4:24:9 | ... -> ... | +| Test.kt:18:3:18:7 | ; | Test.kt:24:4:24:9 | return ... | +| Test.kt:18:3:18:7 | ; | Test.kt:27:3:27:8 | ; | +| Test.kt:18:3:18:7 | ; | Test.kt:30:3:33:3 | ; | +| Test.kt:18:3:18:7 | ; | Test.kt:30:7:30:12 | ... -> ... | +| Test.kt:18:3:18:7 | ; | Test.kt:30:15:33:3 | { ... } | +| Test.kt:18:3:18:7 | ; | Test.kt:31:4:31:9 | ; | +| Test.kt:18:3:18:7 | ; | Test.kt:32:4:32:9 | ; | +| Test.kt:18:3:18:7 | ; | Test.kt:35:3:35:8 | ; | +| Test.kt:18:3:18:7 | ; | Test.kt:38:3:41:3 | while (...) | +| Test.kt:18:3:18:7 | ; | Test.kt:38:16:41:3 | { ... } | +| Test.kt:18:3:18:7 | ; | Test.kt:39:4:39:9 | ; | +| Test.kt:18:3:18:7 | ; | Test.kt:40:4:40:6 | ; | +| Test.kt:18:3:18:7 | ; | Test.kt:40:4:40:6 | ; | +| Test.kt:18:3:18:7 | ; | Test.kt:40:4:40:6 | ; | +| Test.kt:18:3:18:7 | ; | Test.kt:40:4:40:6 | var ...; | +| Test.kt:18:3:18:7 | ; | Test.kt:40:4:40:6 | { ... } | +| Test.kt:18:3:18:7 | ; | Test.kt:43:3:43:8 | ; | +| Test.kt:18:3:18:7 | ; | Test.kt:73:3:73:8 | ; | +| Test.kt:18:3:18:7 | ; | Test.kt:77:3:77:8 | ; | +| Test.kt:18:3:18:7 | ; | Test.kt:78:3:78:8 | return ... | +| Test.kt:21:3:24:9 | ; | Test.kt:21:6:21:10 | ... -> ... | +| Test.kt:21:3:24:9 | ; | Test.kt:22:4:22:9 | ; | +| Test.kt:21:3:24:9 | ; | Test.kt:22:4:22:9 | { ... } | +| Test.kt:21:3:24:9 | ; | Test.kt:24:4:24:9 | ... -> ... | +| Test.kt:21:3:24:9 | ; | Test.kt:24:4:24:9 | return ... | +| Test.kt:21:3:24:9 | ; | Test.kt:27:3:27:8 | ; | +| Test.kt:21:3:24:9 | ; | Test.kt:30:3:33:3 | ; | +| Test.kt:21:3:24:9 | ; | Test.kt:30:7:30:12 | ... -> ... | +| Test.kt:21:3:24:9 | ; | Test.kt:30:15:33:3 | { ... } | +| Test.kt:21:3:24:9 | ; | Test.kt:31:4:31:9 | ; | +| Test.kt:21:3:24:9 | ; | Test.kt:32:4:32:9 | ; | +| Test.kt:21:3:24:9 | ; | Test.kt:35:3:35:8 | ; | +| Test.kt:21:3:24:9 | ; | Test.kt:38:3:41:3 | while (...) | +| Test.kt:21:3:24:9 | ; | Test.kt:38:16:41:3 | { ... } | +| Test.kt:21:3:24:9 | ; | Test.kt:39:4:39:9 | ; | +| Test.kt:21:3:24:9 | ; | Test.kt:40:4:40:6 | ; | +| Test.kt:21:3:24:9 | ; | Test.kt:40:4:40:6 | ; | +| Test.kt:21:3:24:9 | ; | Test.kt:40:4:40:6 | ; | +| Test.kt:21:3:24:9 | ; | Test.kt:40:4:40:6 | var ...; | +| Test.kt:21:3:24:9 | ; | Test.kt:40:4:40:6 | { ... } | +| Test.kt:21:3:24:9 | ; | Test.kt:43:3:43:8 | ; | +| Test.kt:21:3:24:9 | ; | Test.kt:73:3:73:8 | ; | +| Test.kt:21:3:24:9 | ; | Test.kt:77:3:77:8 | ; | +| Test.kt:21:3:24:9 | ; | Test.kt:78:3:78:8 | return ... | +| Test.kt:21:6:21:10 | ... -> ... | Test.kt:22:4:22:9 | ; | +| Test.kt:21:6:21:10 | ... -> ... | Test.kt:22:4:22:9 | { ... } | +| Test.kt:21:6:21:10 | ... -> ... | Test.kt:24:4:24:9 | ... -> ... | +| Test.kt:21:6:21:10 | ... -> ... | Test.kt:24:4:24:9 | return ... | +| Test.kt:21:6:21:10 | ... -> ... | Test.kt:27:3:27:8 | ; | +| Test.kt:21:6:21:10 | ... -> ... | Test.kt:30:3:33:3 | ; | +| Test.kt:21:6:21:10 | ... -> ... | Test.kt:30:7:30:12 | ... -> ... | +| Test.kt:21:6:21:10 | ... -> ... | Test.kt:30:15:33:3 | { ... } | +| Test.kt:21:6:21:10 | ... -> ... | Test.kt:31:4:31:9 | ; | +| Test.kt:21:6:21:10 | ... -> ... | Test.kt:32:4:32:9 | ; | +| Test.kt:21:6:21:10 | ... -> ... | Test.kt:35:3:35:8 | ; | +| Test.kt:21:6:21:10 | ... -> ... | Test.kt:38:3:41:3 | while (...) | +| Test.kt:21:6:21:10 | ... -> ... | Test.kt:38:16:41:3 | { ... } | +| Test.kt:21:6:21:10 | ... -> ... | Test.kt:39:4:39:9 | ; | +| Test.kt:21:6:21:10 | ... -> ... | Test.kt:40:4:40:6 | ; | +| Test.kt:21:6:21:10 | ... -> ... | Test.kt:40:4:40:6 | ; | +| Test.kt:21:6:21:10 | ... -> ... | Test.kt:40:4:40:6 | ; | +| Test.kt:21:6:21:10 | ... -> ... | Test.kt:40:4:40:6 | var ...; | +| Test.kt:21:6:21:10 | ... -> ... | Test.kt:40:4:40:6 | { ... } | +| Test.kt:21:6:21:10 | ... -> ... | Test.kt:43:3:43:8 | ; | +| Test.kt:21:6:21:10 | ... -> ... | Test.kt:73:3:73:8 | ; | +| Test.kt:21:6:21:10 | ... -> ... | Test.kt:77:3:77:8 | ; | +| Test.kt:21:6:21:10 | ... -> ... | Test.kt:78:3:78:8 | return ... | +| Test.kt:22:4:22:9 | ; | Test.kt:27:3:27:8 | ; | +| Test.kt:22:4:22:9 | ; | Test.kt:30:3:33:3 | ; | +| Test.kt:22:4:22:9 | ; | Test.kt:30:7:30:12 | ... -> ... | +| Test.kt:22:4:22:9 | ; | Test.kt:30:15:33:3 | { ... } | +| Test.kt:22:4:22:9 | ; | Test.kt:31:4:31:9 | ; | +| Test.kt:22:4:22:9 | ; | Test.kt:32:4:32:9 | ; | +| Test.kt:22:4:22:9 | ; | Test.kt:35:3:35:8 | ; | +| Test.kt:22:4:22:9 | ; | Test.kt:38:3:41:3 | while (...) | +| Test.kt:22:4:22:9 | ; | Test.kt:38:16:41:3 | { ... } | +| Test.kt:22:4:22:9 | ; | Test.kt:39:4:39:9 | ; | +| Test.kt:22:4:22:9 | ; | Test.kt:40:4:40:6 | ; | +| Test.kt:22:4:22:9 | ; | Test.kt:40:4:40:6 | ; | +| Test.kt:22:4:22:9 | ; | Test.kt:40:4:40:6 | ; | +| Test.kt:22:4:22:9 | ; | Test.kt:40:4:40:6 | var ...; | +| Test.kt:22:4:22:9 | ; | Test.kt:40:4:40:6 | { ... } | +| Test.kt:22:4:22:9 | ; | Test.kt:43:3:43:8 | ; | +| Test.kt:22:4:22:9 | ; | Test.kt:73:3:73:8 | ; | +| Test.kt:22:4:22:9 | ; | Test.kt:77:3:77:8 | ; | +| Test.kt:22:4:22:9 | ; | Test.kt:78:3:78:8 | return ... | +| Test.kt:22:4:22:9 | { ... } | Test.kt:22:4:22:9 | ; | +| Test.kt:22:4:22:9 | { ... } | Test.kt:27:3:27:8 | ; | +| Test.kt:22:4:22:9 | { ... } | Test.kt:30:3:33:3 | ; | +| Test.kt:22:4:22:9 | { ... } | Test.kt:30:7:30:12 | ... -> ... | +| Test.kt:22:4:22:9 | { ... } | Test.kt:30:15:33:3 | { ... } | +| Test.kt:22:4:22:9 | { ... } | Test.kt:31:4:31:9 | ; | +| Test.kt:22:4:22:9 | { ... } | Test.kt:32:4:32:9 | ; | +| Test.kt:22:4:22:9 | { ... } | Test.kt:35:3:35:8 | ; | +| Test.kt:22:4:22:9 | { ... } | Test.kt:38:3:41:3 | while (...) | +| Test.kt:22:4:22:9 | { ... } | Test.kt:38:16:41:3 | { ... } | +| Test.kt:22:4:22:9 | { ... } | Test.kt:39:4:39:9 | ; | +| Test.kt:22:4:22:9 | { ... } | Test.kt:40:4:40:6 | ; | +| Test.kt:22:4:22:9 | { ... } | Test.kt:40:4:40:6 | ; | +| Test.kt:22:4:22:9 | { ... } | Test.kt:40:4:40:6 | ; | +| Test.kt:22:4:22:9 | { ... } | Test.kt:40:4:40:6 | var ...; | +| Test.kt:22:4:22:9 | { ... } | Test.kt:40:4:40:6 | { ... } | +| Test.kt:22:4:22:9 | { ... } | Test.kt:43:3:43:8 | ; | +| Test.kt:22:4:22:9 | { ... } | Test.kt:73:3:73:8 | ; | +| Test.kt:22:4:22:9 | { ... } | Test.kt:77:3:77:8 | ; | +| Test.kt:22:4:22:9 | { ... } | Test.kt:78:3:78:8 | return ... | +| Test.kt:24:4:24:9 | ... -> ... | Test.kt:24:4:24:9 | return ... | +| Test.kt:27:3:27:8 | ; | Test.kt:30:3:33:3 | ; | +| Test.kt:27:3:27:8 | ; | Test.kt:30:7:30:12 | ... -> ... | +| Test.kt:27:3:27:8 | ; | Test.kt:30:15:33:3 | { ... } | +| Test.kt:27:3:27:8 | ; | Test.kt:31:4:31:9 | ; | +| Test.kt:27:3:27:8 | ; | Test.kt:32:4:32:9 | ; | +| Test.kt:27:3:27:8 | ; | Test.kt:35:3:35:8 | ; | +| Test.kt:27:3:27:8 | ; | Test.kt:38:3:41:3 | while (...) | +| Test.kt:27:3:27:8 | ; | Test.kt:38:16:41:3 | { ... } | +| Test.kt:27:3:27:8 | ; | Test.kt:39:4:39:9 | ; | +| Test.kt:27:3:27:8 | ; | Test.kt:40:4:40:6 | ; | +| Test.kt:27:3:27:8 | ; | Test.kt:40:4:40:6 | ; | +| Test.kt:27:3:27:8 | ; | Test.kt:40:4:40:6 | ; | +| Test.kt:27:3:27:8 | ; | Test.kt:40:4:40:6 | var ...; | +| Test.kt:27:3:27:8 | ; | Test.kt:40:4:40:6 | { ... } | +| Test.kt:27:3:27:8 | ; | Test.kt:43:3:43:8 | ; | +| Test.kt:27:3:27:8 | ; | Test.kt:73:3:73:8 | ; | +| Test.kt:27:3:27:8 | ; | Test.kt:77:3:77:8 | ; | +| Test.kt:27:3:27:8 | ; | Test.kt:78:3:78:8 | return ... | +| Test.kt:30:3:33:3 | ; | Test.kt:30:7:30:12 | ... -> ... | +| Test.kt:30:3:33:3 | ; | Test.kt:30:15:33:3 | { ... } | +| Test.kt:30:3:33:3 | ; | Test.kt:31:4:31:9 | ; | +| Test.kt:30:3:33:3 | ; | Test.kt:32:4:32:9 | ; | +| Test.kt:30:3:33:3 | ; | Test.kt:35:3:35:8 | ; | +| Test.kt:30:3:33:3 | ; | Test.kt:38:3:41:3 | while (...) | +| Test.kt:30:3:33:3 | ; | Test.kt:38:16:41:3 | { ... } | +| Test.kt:30:3:33:3 | ; | Test.kt:39:4:39:9 | ; | +| Test.kt:30:3:33:3 | ; | Test.kt:40:4:40:6 | ; | +| Test.kt:30:3:33:3 | ; | Test.kt:40:4:40:6 | ; | +| Test.kt:30:3:33:3 | ; | Test.kt:40:4:40:6 | ; | +| Test.kt:30:3:33:3 | ; | Test.kt:40:4:40:6 | var ...; | +| Test.kt:30:3:33:3 | ; | Test.kt:40:4:40:6 | { ... } | +| Test.kt:30:3:33:3 | ; | Test.kt:43:3:43:8 | ; | +| Test.kt:30:3:33:3 | ; | Test.kt:73:3:73:8 | ; | +| Test.kt:30:3:33:3 | ; | Test.kt:77:3:77:8 | ; | +| Test.kt:30:3:33:3 | ; | Test.kt:78:3:78:8 | return ... | +| Test.kt:30:7:30:12 | ... -> ... | Test.kt:30:15:33:3 | { ... } | +| Test.kt:30:7:30:12 | ... -> ... | Test.kt:31:4:31:9 | ; | +| Test.kt:30:7:30:12 | ... -> ... | Test.kt:32:4:32:9 | ; | +| Test.kt:30:7:30:12 | ... -> ... | Test.kt:35:3:35:8 | ; | +| Test.kt:30:7:30:12 | ... -> ... | Test.kt:38:3:41:3 | while (...) | +| Test.kt:30:7:30:12 | ... -> ... | Test.kt:38:16:41:3 | { ... } | +| Test.kt:30:7:30:12 | ... -> ... | Test.kt:39:4:39:9 | ; | +| Test.kt:30:7:30:12 | ... -> ... | Test.kt:40:4:40:6 | ; | +| Test.kt:30:7:30:12 | ... -> ... | Test.kt:40:4:40:6 | ; | +| Test.kt:30:7:30:12 | ... -> ... | Test.kt:40:4:40:6 | ; | +| Test.kt:30:7:30:12 | ... -> ... | Test.kt:40:4:40:6 | var ...; | +| Test.kt:30:7:30:12 | ... -> ... | Test.kt:40:4:40:6 | { ... } | +| Test.kt:30:7:30:12 | ... -> ... | Test.kt:43:3:43:8 | ; | +| Test.kt:30:7:30:12 | ... -> ... | Test.kt:73:3:73:8 | ; | +| Test.kt:30:7:30:12 | ... -> ... | Test.kt:77:3:77:8 | ; | +| Test.kt:30:7:30:12 | ... -> ... | Test.kt:78:3:78:8 | return ... | +| Test.kt:30:15:33:3 | { ... } | Test.kt:31:4:31:9 | ; | +| Test.kt:30:15:33:3 | { ... } | Test.kt:32:4:32:9 | ; | +| Test.kt:31:4:31:9 | ; | Test.kt:32:4:32:9 | ; | +| Test.kt:35:3:35:8 | ; | Test.kt:38:3:41:3 | while (...) | +| Test.kt:35:3:35:8 | ; | Test.kt:38:16:41:3 | { ... } | +| Test.kt:35:3:35:8 | ; | Test.kt:39:4:39:9 | ; | +| Test.kt:35:3:35:8 | ; | Test.kt:40:4:40:6 | ; | +| Test.kt:35:3:35:8 | ; | Test.kt:40:4:40:6 | ; | +| Test.kt:35:3:35:8 | ; | Test.kt:40:4:40:6 | ; | +| Test.kt:35:3:35:8 | ; | Test.kt:40:4:40:6 | var ...; | +| Test.kt:35:3:35:8 | ; | Test.kt:40:4:40:6 | { ... } | +| Test.kt:35:3:35:8 | ; | Test.kt:43:3:43:8 | ; | +| Test.kt:35:3:35:8 | ; | Test.kt:73:3:73:8 | ; | +| Test.kt:35:3:35:8 | ; | Test.kt:77:3:77:8 | ; | +| Test.kt:35:3:35:8 | ; | Test.kt:78:3:78:8 | return ... | +| Test.kt:38:3:41:3 | while (...) | Test.kt:38:16:41:3 | { ... } | +| Test.kt:38:3:41:3 | while (...) | Test.kt:39:4:39:9 | ; | +| Test.kt:38:3:41:3 | while (...) | Test.kt:40:4:40:6 | ; | +| Test.kt:38:3:41:3 | while (...) | Test.kt:40:4:40:6 | ; | +| Test.kt:38:3:41:3 | while (...) | Test.kt:40:4:40:6 | ; | +| Test.kt:38:3:41:3 | while (...) | Test.kt:40:4:40:6 | var ...; | +| Test.kt:38:3:41:3 | while (...) | Test.kt:40:4:40:6 | { ... } | +| Test.kt:38:3:41:3 | while (...) | Test.kt:43:3:43:8 | ; | +| Test.kt:38:3:41:3 | while (...) | Test.kt:73:3:73:8 | ; | +| Test.kt:38:3:41:3 | while (...) | Test.kt:77:3:77:8 | ; | +| Test.kt:38:3:41:3 | while (...) | Test.kt:78:3:78:8 | return ... | +| Test.kt:38:16:41:3 | { ... } | Test.kt:39:4:39:9 | ; | +| Test.kt:38:16:41:3 | { ... } | Test.kt:40:4:40:6 | ; | +| Test.kt:38:16:41:3 | { ... } | Test.kt:40:4:40:6 | ; | +| Test.kt:38:16:41:3 | { ... } | Test.kt:40:4:40:6 | ; | +| Test.kt:38:16:41:3 | { ... } | Test.kt:40:4:40:6 | var ...; | +| Test.kt:38:16:41:3 | { ... } | Test.kt:40:4:40:6 | { ... } | +| Test.kt:39:4:39:9 | ; | Test.kt:40:4:40:6 | ; | +| Test.kt:39:4:39:9 | ; | Test.kt:40:4:40:6 | ; | +| Test.kt:39:4:39:9 | ; | Test.kt:40:4:40:6 | ; | +| Test.kt:39:4:39:9 | ; | Test.kt:40:4:40:6 | var ...; | +| Test.kt:39:4:39:9 | ; | Test.kt:40:4:40:6 | { ... } | +| Test.kt:40:4:40:6 | ; | Test.kt:40:4:40:6 | ; | +| Test.kt:40:4:40:6 | ; | Test.kt:40:4:40:6 | ; | +| Test.kt:40:4:40:6 | ; | Test.kt:40:4:40:6 | ; | +| Test.kt:40:4:40:6 | ; | Test.kt:40:4:40:6 | var ...; | +| Test.kt:40:4:40:6 | ; | Test.kt:40:4:40:6 | { ... } | +| Test.kt:40:4:40:6 | var ...; | Test.kt:40:4:40:6 | ; | +| Test.kt:40:4:40:6 | var ...; | Test.kt:40:4:40:6 | ; | +| Test.kt:40:4:40:6 | { ... } | Test.kt:40:4:40:6 | ; | +| Test.kt:40:4:40:6 | { ... } | Test.kt:40:4:40:6 | ; | +| Test.kt:40:4:40:6 | { ... } | Test.kt:40:4:40:6 | var ...; | +| Test.kt:43:3:43:8 | ; | Test.kt:73:3:73:8 | ; | +| Test.kt:43:3:43:8 | ; | Test.kt:77:3:77:8 | ; | +| Test.kt:43:3:43:8 | ; | Test.kt:78:3:78:8 | return ... | +| Test.kt:73:3:73:8 | ; | Test.kt:77:3:77:8 | ; | +| Test.kt:73:3:73:8 | ; | Test.kt:78:3:78:8 | return ... | +| Test.kt:77:3:77:8 | ; | Test.kt:78:3:78:8 | return ... | +| Test.kt:82:21:89:1 | { ... } | Test.kt:83:2:88:2 | try ... | +| Test.kt:82:21:89:1 | { ... } | Test.kt:83:6:86:2 | { ... } | +| Test.kt:82:21:89:1 | { ... } | Test.kt:84:3:84:18 | var ...; | +| Test.kt:82:21:89:1 | { ... } | Test.kt:85:3:85:10 | return ... | +| Test.kt:82:21:89:1 | { ... } | Test.kt:86:4:88:2 | catch (...) | +| Test.kt:82:21:89:1 | { ... } | Test.kt:86:34:88:2 | { ... } | +| Test.kt:82:21:89:1 | { ... } | Test.kt:87:3:87:10 | return ... | +| Test.kt:83:2:88:2 | try ... | Test.kt:83:6:86:2 | { ... } | +| Test.kt:83:2:88:2 | try ... | Test.kt:84:3:84:18 | var ...; | +| Test.kt:83:2:88:2 | try ... | Test.kt:85:3:85:10 | return ... | +| Test.kt:83:2:88:2 | try ... | Test.kt:86:4:88:2 | catch (...) | +| Test.kt:83:2:88:2 | try ... | Test.kt:86:34:88:2 | { ... } | +| Test.kt:83:2:88:2 | try ... | Test.kt:87:3:87:10 | return ... | +| Test.kt:83:6:86:2 | { ... } | Test.kt:84:3:84:18 | var ...; | +| Test.kt:83:6:86:2 | { ... } | Test.kt:85:3:85:10 | return ... | +| Test.kt:83:6:86:2 | { ... } | Test.kt:86:4:88:2 | catch (...) | +| Test.kt:83:6:86:2 | { ... } | Test.kt:86:34:88:2 | { ... } | +| Test.kt:83:6:86:2 | { ... } | Test.kt:87:3:87:10 | return ... | +| Test.kt:84:3:84:18 | var ...; | Test.kt:85:3:85:10 | return ... | +| Test.kt:84:3:84:18 | var ...; | Test.kt:86:4:88:2 | catch (...) | +| Test.kt:84:3:84:18 | var ...; | Test.kt:86:34:88:2 | { ... } | +| Test.kt:84:3:84:18 | var ...; | Test.kt:87:3:87:10 | return ... | +| Test.kt:86:4:88:2 | catch (...) | Test.kt:86:34:88:2 | { ... } | +| Test.kt:86:4:88:2 | catch (...) | Test.kt:87:3:87:10 | return ... | +| Test.kt:86:34:88:2 | { ... } | Test.kt:87:3:87:10 | return ... | +| Test.kt:91:22:98:1 | { ... } | Test.kt:92:2:97:2 | try ... | +| Test.kt:91:22:98:1 | { ... } | Test.kt:92:6:95:2 | { ... } | +| Test.kt:91:22:98:1 | { ... } | Test.kt:93:3:93:13 | var ...; | +| Test.kt:91:22:98:1 | { ... } | Test.kt:94:3:94:10 | return ... | +| Test.kt:91:22:98:1 | { ... } | Test.kt:95:4:97:2 | catch (...) | +| Test.kt:91:22:98:1 | { ... } | Test.kt:95:36:97:2 | { ... } | +| Test.kt:91:22:98:1 | { ... } | Test.kt:96:3:96:10 | return ... | +| Test.kt:92:2:97:2 | try ... | Test.kt:92:6:95:2 | { ... } | +| Test.kt:92:2:97:2 | try ... | Test.kt:93:3:93:13 | var ...; | +| Test.kt:92:2:97:2 | try ... | Test.kt:94:3:94:10 | return ... | +| Test.kt:92:2:97:2 | try ... | Test.kt:95:4:97:2 | catch (...) | +| Test.kt:92:2:97:2 | try ... | Test.kt:95:36:97:2 | { ... } | +| Test.kt:92:2:97:2 | try ... | Test.kt:96:3:96:10 | return ... | +| Test.kt:92:6:95:2 | { ... } | Test.kt:93:3:93:13 | var ...; | +| Test.kt:92:6:95:2 | { ... } | Test.kt:94:3:94:10 | return ... | +| Test.kt:92:6:95:2 | { ... } | Test.kt:95:4:97:2 | catch (...) | +| Test.kt:92:6:95:2 | { ... } | Test.kt:95:36:97:2 | { ... } | +| Test.kt:92:6:95:2 | { ... } | Test.kt:96:3:96:10 | return ... | +| Test.kt:93:3:93:13 | var ...; | Test.kt:94:3:94:10 | return ... | +| Test.kt:93:3:93:13 | var ...; | Test.kt:95:4:97:2 | catch (...) | +| Test.kt:93:3:93:13 | var ...; | Test.kt:95:36:97:2 | { ... } | +| Test.kt:93:3:93:13 | var ...; | Test.kt:96:3:96:10 | return ... | +| Test.kt:95:4:97:2 | catch (...) | Test.kt:95:36:97:2 | { ... } | +| Test.kt:95:4:97:2 | catch (...) | Test.kt:96:3:96:10 | return ... | +| Test.kt:95:36:97:2 | { ... } | Test.kt:96:3:96:10 | return ... | +| Test.kt:100:25:110:1 | { ... } | Test.kt:101:5:103:5 | ; | +| Test.kt:100:25:110:1 | { ... } | Test.kt:101:9:101:30 | ... -> ... | +| Test.kt:100:25:110:1 | { ... } | Test.kt:101:33:103:5 | { ... } | +| Test.kt:100:25:110:1 | { ... } | Test.kt:102:9:102:25 | throw ... | +| Test.kt:100:25:110:1 | { ... } | Test.kt:105:5:109:5 | ; | +| Test.kt:100:25:110:1 | { ... } | Test.kt:105:9:105:17 | ... -> ... | +| Test.kt:100:25:110:1 | { ... } | Test.kt:105:20:107:5 | { ... } | +| Test.kt:100:25:110:1 | { ... } | Test.kt:106:9:106:29 | ; | +| Test.kt:100:25:110:1 | { ... } | Test.kt:107:16:107:24 | ... -> ... | +| Test.kt:100:25:110:1 | { ... } | Test.kt:107:27:109:5 | { ... } | +| Test.kt:100:25:110:1 | { ... } | Test.kt:108:9:108:29 | ; | +| Test.kt:101:5:103:5 | ; | Test.kt:101:9:101:30 | ... -> ... | +| Test.kt:101:5:103:5 | ; | Test.kt:101:33:103:5 | { ... } | +| Test.kt:101:5:103:5 | ; | Test.kt:102:9:102:25 | throw ... | +| Test.kt:101:5:103:5 | ; | Test.kt:105:5:109:5 | ; | +| Test.kt:101:5:103:5 | ; | Test.kt:105:9:105:17 | ... -> ... | +| Test.kt:101:5:103:5 | ; | Test.kt:105:20:107:5 | { ... } | +| Test.kt:101:5:103:5 | ; | Test.kt:106:9:106:29 | ; | +| Test.kt:101:5:103:5 | ; | Test.kt:107:16:107:24 | ... -> ... | +| Test.kt:101:5:103:5 | ; | Test.kt:107:27:109:5 | { ... } | +| Test.kt:101:5:103:5 | ; | Test.kt:108:9:108:29 | ; | +| Test.kt:101:9:101:30 | ... -> ... | Test.kt:101:33:103:5 | { ... } | +| Test.kt:101:9:101:30 | ... -> ... | Test.kt:102:9:102:25 | throw ... | +| Test.kt:101:9:101:30 | ... -> ... | Test.kt:105:5:109:5 | ; | +| Test.kt:101:9:101:30 | ... -> ... | Test.kt:105:9:105:17 | ... -> ... | +| Test.kt:101:9:101:30 | ... -> ... | Test.kt:105:20:107:5 | { ... } | +| Test.kt:101:9:101:30 | ... -> ... | Test.kt:106:9:106:29 | ; | +| Test.kt:101:9:101:30 | ... -> ... | Test.kt:107:16:107:24 | ... -> ... | +| Test.kt:101:9:101:30 | ... -> ... | Test.kt:107:27:109:5 | { ... } | +| Test.kt:101:9:101:30 | ... -> ... | Test.kt:108:9:108:29 | ; | +| Test.kt:101:33:103:5 | { ... } | Test.kt:102:9:102:25 | throw ... | +| Test.kt:105:5:109:5 | ; | Test.kt:105:9:105:17 | ... -> ... | +| Test.kt:105:5:109:5 | ; | Test.kt:105:20:107:5 | { ... } | +| Test.kt:105:5:109:5 | ; | Test.kt:106:9:106:29 | ; | +| Test.kt:105:5:109:5 | ; | Test.kt:107:16:107:24 | ... -> ... | +| Test.kt:105:5:109:5 | ; | Test.kt:107:27:109:5 | { ... } | +| Test.kt:105:5:109:5 | ; | Test.kt:108:9:108:29 | ; | +| Test.kt:105:9:105:17 | ... -> ... | Test.kt:105:20:107:5 | { ... } | +| Test.kt:105:9:105:17 | ... -> ... | Test.kt:106:9:106:29 | ; | +| Test.kt:105:9:105:17 | ... -> ... | Test.kt:107:16:107:24 | ... -> ... | +| Test.kt:105:9:105:17 | ... -> ... | Test.kt:107:27:109:5 | { ... } | +| Test.kt:105:9:105:17 | ... -> ... | Test.kt:108:9:108:29 | ; | +| Test.kt:105:20:107:5 | { ... } | Test.kt:106:9:106:29 | ; | +| Test.kt:107:16:107:24 | ... -> ... | Test.kt:107:27:109:5 | { ... } | +| Test.kt:107:16:107:24 | ... -> ... | Test.kt:108:9:108:29 | ; | +| Test.kt:107:27:109:5 | { ... } | Test.kt:108:9:108:29 | ; | +| Test.kt:112:32:116:1 | { ... } | Test.kt:113:5:115:5 | ; | +| Test.kt:112:32:116:1 | { ... } | Test.kt:113:9:113:14 | ... -> ... | +| Test.kt:112:32:116:1 | { ... } | Test.kt:113:17:115:5 | { ... } | +| Test.kt:113:5:115:5 | ; | Test.kt:113:9:113:14 | ... -> ... | +| Test.kt:113:5:115:5 | ; | Test.kt:113:17:115:5 | { ... } | +| Test.kt:113:9:113:14 | ... -> ... | Test.kt:113:17:115:5 | { ... } | +| Test.kt:118:37:124:1 | { ... } | Test.kt:119:2:123:12 | ; | +| Test.kt:118:37:124:1 | { ... } | Test.kt:120:3:123:10 | ... -> ... | +| Test.kt:118:37:124:1 | { ... } | Test.kt:121:4:121:9 | ... -> ... | +| Test.kt:118:37:124:1 | { ... } | Test.kt:121:9:121:9 | ; | +| Test.kt:118:37:124:1 | { ... } | Test.kt:122:12:122:16 | ... -> ... | +| Test.kt:118:37:124:1 | { ... } | Test.kt:122:12:122:16 | ; | +| Test.kt:118:37:124:1 | { ... } | Test.kt:123:8:123:10 | { ... } | +| Test.kt:119:2:123:12 | ; | Test.kt:120:3:123:10 | ... -> ... | +| Test.kt:119:2:123:12 | ; | Test.kt:121:4:121:9 | ... -> ... | +| Test.kt:119:2:123:12 | ; | Test.kt:121:9:121:9 | ; | +| Test.kt:119:2:123:12 | ; | Test.kt:122:12:122:16 | ... -> ... | +| Test.kt:119:2:123:12 | ; | Test.kt:122:12:122:16 | ; | +| Test.kt:119:2:123:12 | ; | Test.kt:123:8:123:10 | { ... } | +| Test.kt:120:3:123:10 | ... -> ... | Test.kt:121:4:121:9 | ... -> ... | +| Test.kt:120:3:123:10 | ... -> ... | Test.kt:121:9:121:9 | ; | +| Test.kt:120:3:123:10 | ... -> ... | Test.kt:122:12:122:16 | ... -> ... | +| Test.kt:120:3:123:10 | ... -> ... | Test.kt:122:12:122:16 | ; | +| Test.kt:120:3:123:10 | ... -> ... | Test.kt:123:8:123:10 | { ... } | +| Test.kt:121:4:121:9 | ... -> ... | Test.kt:121:9:121:9 | ; | +| Test.kt:121:4:121:9 | ... -> ... | Test.kt:122:12:122:16 | ... -> ... | +| Test.kt:121:4:121:9 | ... -> ... | Test.kt:122:12:122:16 | ; | +| Test.kt:121:4:121:9 | ... -> ... | Test.kt:123:8:123:10 | { ... } | +| Test.kt:121:9:121:9 | ; | Test.kt:123:8:123:10 | { ... } | +| Test.kt:122:12:122:16 | ... -> ... | Test.kt:122:12:122:16 | ; | diff --git a/java/ql/test-kotlin2/library-tests/controlflow/basic/strictDominance.ql b/java/ql/test-kotlin2/library-tests/controlflow/basic/strictDominance.ql new file mode 100644 index 00000000000..2d366a4f372 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/controlflow/basic/strictDominance.ql @@ -0,0 +1,6 @@ +import default +import semmle.code.java.controlflow.Dominance + +from Stmt pre, Stmt post +where strictlyDominates(pre, post) +select pre, post diff --git a/java/ql/test-kotlin2/library-tests/controlflow/basic/strictPostDominance.expected b/java/ql/test-kotlin2/library-tests/controlflow/basic/strictPostDominance.expected new file mode 100644 index 00000000000..5cc9401a0ed --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/controlflow/basic/strictPostDominance.expected @@ -0,0 +1,233 @@ +| Test.kt:3:1:80:1 | super(...) | Test.kt:3:1:80:1 | { ... } | +| Test.kt:3:1:80:1 | { ... } | Test.kt:3:1:80:1 | super(...) | +| Test.kt:3:1:80:1 | { ... } | Test.kt:3:1:80:1 | { ... } | +| Test.kt:5:3:5:16 | var ...; | Test.kt:4:13:79:2 | { ... } | +| Test.kt:6:3:6:18 | var ...; | Test.kt:4:13:79:2 | { ... } | +| Test.kt:6:3:6:18 | var ...; | Test.kt:5:3:5:16 | var ...; | +| Test.kt:7:3:7:16 | var ...; | Test.kt:4:13:79:2 | { ... } | +| Test.kt:7:3:7:16 | var ...; | Test.kt:5:3:5:16 | var ...; | +| Test.kt:7:3:7:16 | var ...; | Test.kt:6:3:6:18 | var ...; | +| Test.kt:8:3:8:16 | var ...; | Test.kt:4:13:79:2 | { ... } | +| Test.kt:8:3:8:16 | var ...; | Test.kt:5:3:5:16 | var ...; | +| Test.kt:8:3:8:16 | var ...; | Test.kt:6:3:6:18 | var ...; | +| Test.kt:8:3:8:16 | var ...; | Test.kt:7:3:7:16 | var ...; | +| Test.kt:11:3:16:3 | ; | Test.kt:4:13:79:2 | { ... } | +| Test.kt:11:3:16:3 | ; | Test.kt:5:3:5:16 | var ...; | +| Test.kt:11:3:16:3 | ; | Test.kt:6:3:6:18 | var ...; | +| Test.kt:11:3:16:3 | ; | Test.kt:7:3:7:16 | var ...; | +| Test.kt:11:3:16:3 | ; | Test.kt:8:3:8:16 | var ...; | +| Test.kt:11:7:11:11 | ... -> ... | Test.kt:4:13:79:2 | { ... } | +| Test.kt:11:7:11:11 | ... -> ... | Test.kt:5:3:5:16 | var ...; | +| Test.kt:11:7:11:11 | ... -> ... | Test.kt:6:3:6:18 | var ...; | +| Test.kt:11:7:11:11 | ... -> ... | Test.kt:7:3:7:16 | var ...; | +| Test.kt:11:7:11:11 | ... -> ... | Test.kt:8:3:8:16 | var ...; | +| Test.kt:11:7:11:11 | ... -> ... | Test.kt:11:3:16:3 | ; | +| Test.kt:12:4:12:9 | ; | Test.kt:11:14:14:3 | { ... } | +| Test.kt:13:4:13:9 | ; | Test.kt:11:14:14:3 | { ... } | +| Test.kt:13:4:13:9 | ; | Test.kt:12:4:12:9 | ; | +| Test.kt:14:10:16:3 | { ... } | Test.kt:14:10:16:3 | ... -> ... | +| Test.kt:15:4:15:9 | ; | Test.kt:14:10:16:3 | ... -> ... | +| Test.kt:15:4:15:9 | ; | Test.kt:14:10:16:3 | { ... } | +| Test.kt:18:3:18:7 | ; | Test.kt:4:13:79:2 | { ... } | +| Test.kt:18:3:18:7 | ; | Test.kt:5:3:5:16 | var ...; | +| Test.kt:18:3:18:7 | ; | Test.kt:6:3:6:18 | var ...; | +| Test.kt:18:3:18:7 | ; | Test.kt:7:3:7:16 | var ...; | +| Test.kt:18:3:18:7 | ; | Test.kt:8:3:8:16 | var ...; | +| Test.kt:18:3:18:7 | ; | Test.kt:11:3:16:3 | ; | +| Test.kt:18:3:18:7 | ; | Test.kt:11:7:11:11 | ... -> ... | +| Test.kt:18:3:18:7 | ; | Test.kt:11:14:14:3 | { ... } | +| Test.kt:18:3:18:7 | ; | Test.kt:12:4:12:9 | ; | +| Test.kt:18:3:18:7 | ; | Test.kt:13:4:13:9 | ; | +| Test.kt:18:3:18:7 | ; | Test.kt:14:10:16:3 | ... -> ... | +| Test.kt:18:3:18:7 | ; | Test.kt:14:10:16:3 | { ... } | +| Test.kt:18:3:18:7 | ; | Test.kt:15:4:15:9 | ; | +| Test.kt:21:3:24:9 | ; | Test.kt:4:13:79:2 | { ... } | +| Test.kt:21:3:24:9 | ; | Test.kt:5:3:5:16 | var ...; | +| Test.kt:21:3:24:9 | ; | Test.kt:6:3:6:18 | var ...; | +| Test.kt:21:3:24:9 | ; | Test.kt:7:3:7:16 | var ...; | +| Test.kt:21:3:24:9 | ; | Test.kt:8:3:8:16 | var ...; | +| Test.kt:21:3:24:9 | ; | Test.kt:11:3:16:3 | ; | +| Test.kt:21:3:24:9 | ; | Test.kt:11:7:11:11 | ... -> ... | +| Test.kt:21:3:24:9 | ; | Test.kt:11:14:14:3 | { ... } | +| Test.kt:21:3:24:9 | ; | Test.kt:12:4:12:9 | ; | +| Test.kt:21:3:24:9 | ; | Test.kt:13:4:13:9 | ; | +| Test.kt:21:3:24:9 | ; | Test.kt:14:10:16:3 | ... -> ... | +| Test.kt:21:3:24:9 | ; | Test.kt:14:10:16:3 | { ... } | +| Test.kt:21:3:24:9 | ; | Test.kt:15:4:15:9 | ; | +| Test.kt:21:3:24:9 | ; | Test.kt:18:3:18:7 | ; | +| Test.kt:21:6:21:10 | ... -> ... | Test.kt:4:13:79:2 | { ... } | +| Test.kt:21:6:21:10 | ... -> ... | Test.kt:5:3:5:16 | var ...; | +| Test.kt:21:6:21:10 | ... -> ... | Test.kt:6:3:6:18 | var ...; | +| Test.kt:21:6:21:10 | ... -> ... | Test.kt:7:3:7:16 | var ...; | +| Test.kt:21:6:21:10 | ... -> ... | Test.kt:8:3:8:16 | var ...; | +| Test.kt:21:6:21:10 | ... -> ... | Test.kt:11:3:16:3 | ; | +| Test.kt:21:6:21:10 | ... -> ... | Test.kt:11:7:11:11 | ... -> ... | +| Test.kt:21:6:21:10 | ... -> ... | Test.kt:11:14:14:3 | { ... } | +| Test.kt:21:6:21:10 | ... -> ... | Test.kt:12:4:12:9 | ; | +| Test.kt:21:6:21:10 | ... -> ... | Test.kt:13:4:13:9 | ; | +| Test.kt:21:6:21:10 | ... -> ... | Test.kt:14:10:16:3 | ... -> ... | +| Test.kt:21:6:21:10 | ... -> ... | Test.kt:14:10:16:3 | { ... } | +| Test.kt:21:6:21:10 | ... -> ... | Test.kt:15:4:15:9 | ; | +| Test.kt:21:6:21:10 | ... -> ... | Test.kt:18:3:18:7 | ; | +| Test.kt:21:6:21:10 | ... -> ... | Test.kt:21:3:24:9 | ; | +| Test.kt:22:4:22:9 | ; | Test.kt:22:4:22:9 | { ... } | +| Test.kt:24:4:24:9 | return ... | Test.kt:24:4:24:9 | ... -> ... | +| Test.kt:27:3:27:8 | ; | Test.kt:22:4:22:9 | ; | +| Test.kt:27:3:27:8 | ; | Test.kt:22:4:22:9 | { ... } | +| Test.kt:30:3:33:3 | ; | Test.kt:22:4:22:9 | ; | +| Test.kt:30:3:33:3 | ; | Test.kt:22:4:22:9 | { ... } | +| Test.kt:30:3:33:3 | ; | Test.kt:27:3:27:8 | ; | +| Test.kt:30:7:30:12 | ... -> ... | Test.kt:22:4:22:9 | ; | +| Test.kt:30:7:30:12 | ... -> ... | Test.kt:22:4:22:9 | { ... } | +| Test.kt:30:7:30:12 | ... -> ... | Test.kt:27:3:27:8 | ; | +| Test.kt:30:7:30:12 | ... -> ... | Test.kt:30:3:33:3 | ; | +| Test.kt:31:4:31:9 | ; | Test.kt:30:15:33:3 | { ... } | +| Test.kt:32:4:32:9 | ; | Test.kt:30:15:33:3 | { ... } | +| Test.kt:32:4:32:9 | ; | Test.kt:31:4:31:9 | ; | +| Test.kt:35:3:35:8 | ; | Test.kt:22:4:22:9 | ; | +| Test.kt:35:3:35:8 | ; | Test.kt:22:4:22:9 | { ... } | +| Test.kt:35:3:35:8 | ; | Test.kt:27:3:27:8 | ; | +| Test.kt:35:3:35:8 | ; | Test.kt:30:3:33:3 | ; | +| Test.kt:35:3:35:8 | ; | Test.kt:30:7:30:12 | ... -> ... | +| Test.kt:35:3:35:8 | ; | Test.kt:30:15:33:3 | { ... } | +| Test.kt:35:3:35:8 | ; | Test.kt:31:4:31:9 | ; | +| Test.kt:35:3:35:8 | ; | Test.kt:32:4:32:9 | ; | +| Test.kt:38:3:41:3 | while (...) | Test.kt:22:4:22:9 | ; | +| Test.kt:38:3:41:3 | while (...) | Test.kt:22:4:22:9 | { ... } | +| Test.kt:38:3:41:3 | while (...) | Test.kt:27:3:27:8 | ; | +| Test.kt:38:3:41:3 | while (...) | Test.kt:30:3:33:3 | ; | +| Test.kt:38:3:41:3 | while (...) | Test.kt:30:7:30:12 | ... -> ... | +| Test.kt:38:3:41:3 | while (...) | Test.kt:30:15:33:3 | { ... } | +| Test.kt:38:3:41:3 | while (...) | Test.kt:31:4:31:9 | ; | +| Test.kt:38:3:41:3 | while (...) | Test.kt:32:4:32:9 | ; | +| Test.kt:38:3:41:3 | while (...) | Test.kt:35:3:35:8 | ; | +| Test.kt:39:4:39:9 | ; | Test.kt:38:16:41:3 | { ... } | +| Test.kt:40:4:40:6 | ; | Test.kt:38:16:41:3 | { ... } | +| Test.kt:40:4:40:6 | ; | Test.kt:38:16:41:3 | { ... } | +| Test.kt:40:4:40:6 | ; | Test.kt:38:16:41:3 | { ... } | +| Test.kt:40:4:40:6 | ; | Test.kt:39:4:39:9 | ; | +| Test.kt:40:4:40:6 | ; | Test.kt:39:4:39:9 | ; | +| Test.kt:40:4:40:6 | ; | Test.kt:39:4:39:9 | ; | +| Test.kt:40:4:40:6 | ; | Test.kt:40:4:40:6 | ; | +| Test.kt:40:4:40:6 | ; | Test.kt:40:4:40:6 | ; | +| Test.kt:40:4:40:6 | ; | Test.kt:40:4:40:6 | ; | +| Test.kt:40:4:40:6 | ; | Test.kt:40:4:40:6 | var ...; | +| Test.kt:40:4:40:6 | ; | Test.kt:40:4:40:6 | var ...; | +| Test.kt:40:4:40:6 | ; | Test.kt:40:4:40:6 | { ... } | +| Test.kt:40:4:40:6 | ; | Test.kt:40:4:40:6 | { ... } | +| Test.kt:40:4:40:6 | var ...; | Test.kt:38:16:41:3 | { ... } | +| Test.kt:40:4:40:6 | var ...; | Test.kt:39:4:39:9 | ; | +| Test.kt:40:4:40:6 | var ...; | Test.kt:40:4:40:6 | ; | +| Test.kt:40:4:40:6 | var ...; | Test.kt:40:4:40:6 | { ... } | +| Test.kt:40:4:40:6 | { ... } | Test.kt:38:16:41:3 | { ... } | +| Test.kt:40:4:40:6 | { ... } | Test.kt:39:4:39:9 | ; | +| Test.kt:40:4:40:6 | { ... } | Test.kt:40:4:40:6 | ; | +| Test.kt:43:3:43:8 | ; | Test.kt:22:4:22:9 | ; | +| Test.kt:43:3:43:8 | ; | Test.kt:22:4:22:9 | { ... } | +| Test.kt:43:3:43:8 | ; | Test.kt:27:3:27:8 | ; | +| Test.kt:43:3:43:8 | ; | Test.kt:30:3:33:3 | ; | +| Test.kt:43:3:43:8 | ; | Test.kt:30:7:30:12 | ... -> ... | +| Test.kt:43:3:43:8 | ; | Test.kt:30:15:33:3 | { ... } | +| Test.kt:43:3:43:8 | ; | Test.kt:31:4:31:9 | ; | +| Test.kt:43:3:43:8 | ; | Test.kt:32:4:32:9 | ; | +| Test.kt:43:3:43:8 | ; | Test.kt:35:3:35:8 | ; | +| Test.kt:43:3:43:8 | ; | Test.kt:38:3:41:3 | while (...) | +| Test.kt:43:3:43:8 | ; | Test.kt:38:16:41:3 | { ... } | +| Test.kt:43:3:43:8 | ; | Test.kt:39:4:39:9 | ; | +| Test.kt:43:3:43:8 | ; | Test.kt:40:4:40:6 | ; | +| Test.kt:43:3:43:8 | ; | Test.kt:40:4:40:6 | ; | +| Test.kt:43:3:43:8 | ; | Test.kt:40:4:40:6 | ; | +| Test.kt:43:3:43:8 | ; | Test.kt:40:4:40:6 | var ...; | +| Test.kt:43:3:43:8 | ; | Test.kt:40:4:40:6 | { ... } | +| Test.kt:73:3:73:8 | ; | Test.kt:22:4:22:9 | ; | +| Test.kt:73:3:73:8 | ; | Test.kt:22:4:22:9 | { ... } | +| Test.kt:73:3:73:8 | ; | Test.kt:27:3:27:8 | ; | +| Test.kt:73:3:73:8 | ; | Test.kt:30:3:33:3 | ; | +| Test.kt:73:3:73:8 | ; | Test.kt:30:7:30:12 | ... -> ... | +| Test.kt:73:3:73:8 | ; | Test.kt:30:15:33:3 | { ... } | +| Test.kt:73:3:73:8 | ; | Test.kt:31:4:31:9 | ; | +| Test.kt:73:3:73:8 | ; | Test.kt:32:4:32:9 | ; | +| Test.kt:73:3:73:8 | ; | Test.kt:35:3:35:8 | ; | +| Test.kt:73:3:73:8 | ; | Test.kt:38:3:41:3 | while (...) | +| Test.kt:73:3:73:8 | ; | Test.kt:38:16:41:3 | { ... } | +| Test.kt:73:3:73:8 | ; | Test.kt:39:4:39:9 | ; | +| Test.kt:73:3:73:8 | ; | Test.kt:40:4:40:6 | ; | +| Test.kt:73:3:73:8 | ; | Test.kt:40:4:40:6 | ; | +| Test.kt:73:3:73:8 | ; | Test.kt:40:4:40:6 | ; | +| Test.kt:73:3:73:8 | ; | Test.kt:40:4:40:6 | var ...; | +| Test.kt:73:3:73:8 | ; | Test.kt:40:4:40:6 | { ... } | +| Test.kt:73:3:73:8 | ; | Test.kt:43:3:43:8 | ; | +| Test.kt:77:3:77:8 | ; | Test.kt:22:4:22:9 | ; | +| Test.kt:77:3:77:8 | ; | Test.kt:22:4:22:9 | { ... } | +| Test.kt:77:3:77:8 | ; | Test.kt:27:3:27:8 | ; | +| Test.kt:77:3:77:8 | ; | Test.kt:30:3:33:3 | ; | +| Test.kt:77:3:77:8 | ; | Test.kt:30:7:30:12 | ... -> ... | +| Test.kt:77:3:77:8 | ; | Test.kt:30:15:33:3 | { ... } | +| Test.kt:77:3:77:8 | ; | Test.kt:31:4:31:9 | ; | +| Test.kt:77:3:77:8 | ; | Test.kt:32:4:32:9 | ; | +| Test.kt:77:3:77:8 | ; | Test.kt:35:3:35:8 | ; | +| Test.kt:77:3:77:8 | ; | Test.kt:38:3:41:3 | while (...) | +| Test.kt:77:3:77:8 | ; | Test.kt:38:16:41:3 | { ... } | +| Test.kt:77:3:77:8 | ; | Test.kt:39:4:39:9 | ; | +| Test.kt:77:3:77:8 | ; | Test.kt:40:4:40:6 | ; | +| Test.kt:77:3:77:8 | ; | Test.kt:40:4:40:6 | ; | +| Test.kt:77:3:77:8 | ; | Test.kt:40:4:40:6 | ; | +| Test.kt:77:3:77:8 | ; | Test.kt:40:4:40:6 | var ...; | +| Test.kt:77:3:77:8 | ; | Test.kt:40:4:40:6 | { ... } | +| Test.kt:77:3:77:8 | ; | Test.kt:43:3:43:8 | ; | +| Test.kt:77:3:77:8 | ; | Test.kt:73:3:73:8 | ; | +| Test.kt:78:3:78:8 | return ... | Test.kt:22:4:22:9 | ; | +| Test.kt:78:3:78:8 | return ... | Test.kt:22:4:22:9 | { ... } | +| Test.kt:78:3:78:8 | return ... | Test.kt:27:3:27:8 | ; | +| Test.kt:78:3:78:8 | return ... | Test.kt:30:3:33:3 | ; | +| Test.kt:78:3:78:8 | return ... | Test.kt:30:7:30:12 | ... -> ... | +| Test.kt:78:3:78:8 | return ... | Test.kt:30:15:33:3 | { ... } | +| Test.kt:78:3:78:8 | return ... | Test.kt:31:4:31:9 | ; | +| Test.kt:78:3:78:8 | return ... | Test.kt:32:4:32:9 | ; | +| Test.kt:78:3:78:8 | return ... | Test.kt:35:3:35:8 | ; | +| Test.kt:78:3:78:8 | return ... | Test.kt:38:3:41:3 | while (...) | +| Test.kt:78:3:78:8 | return ... | Test.kt:38:16:41:3 | { ... } | +| Test.kt:78:3:78:8 | return ... | Test.kt:39:4:39:9 | ; | +| Test.kt:78:3:78:8 | return ... | Test.kt:40:4:40:6 | ; | +| Test.kt:78:3:78:8 | return ... | Test.kt:40:4:40:6 | ; | +| Test.kt:78:3:78:8 | return ... | Test.kt:40:4:40:6 | ; | +| Test.kt:78:3:78:8 | return ... | Test.kt:40:4:40:6 | var ...; | +| Test.kt:78:3:78:8 | return ... | Test.kt:40:4:40:6 | { ... } | +| Test.kt:78:3:78:8 | return ... | Test.kt:43:3:43:8 | ; | +| Test.kt:78:3:78:8 | return ... | Test.kt:73:3:73:8 | ; | +| Test.kt:78:3:78:8 | return ... | Test.kt:77:3:77:8 | ; | +| Test.kt:83:2:88:2 | try ... | Test.kt:82:21:89:1 | { ... } | +| Test.kt:83:6:86:2 | { ... } | Test.kt:82:21:89:1 | { ... } | +| Test.kt:83:6:86:2 | { ... } | Test.kt:83:2:88:2 | try ... | +| Test.kt:84:3:84:18 | var ...; | Test.kt:82:21:89:1 | { ... } | +| Test.kt:84:3:84:18 | var ...; | Test.kt:83:2:88:2 | try ... | +| Test.kt:84:3:84:18 | var ...; | Test.kt:83:6:86:2 | { ... } | +| Test.kt:86:34:88:2 | { ... } | Test.kt:86:4:88:2 | catch (...) | +| Test.kt:87:3:87:10 | return ... | Test.kt:86:4:88:2 | catch (...) | +| Test.kt:87:3:87:10 | return ... | Test.kt:86:34:88:2 | { ... } | +| Test.kt:92:2:97:2 | try ... | Test.kt:91:22:98:1 | { ... } | +| Test.kt:92:6:95:2 | { ... } | Test.kt:91:22:98:1 | { ... } | +| Test.kt:92:6:95:2 | { ... } | Test.kt:92:2:97:2 | try ... | +| Test.kt:93:3:93:13 | var ...; | Test.kt:91:22:98:1 | { ... } | +| Test.kt:93:3:93:13 | var ...; | Test.kt:92:2:97:2 | try ... | +| Test.kt:93:3:93:13 | var ...; | Test.kt:92:6:95:2 | { ... } | +| Test.kt:95:36:97:2 | { ... } | Test.kt:95:4:97:2 | catch (...) | +| Test.kt:96:3:96:10 | return ... | Test.kt:95:4:97:2 | catch (...) | +| Test.kt:96:3:96:10 | return ... | Test.kt:95:36:97:2 | { ... } | +| Test.kt:101:5:103:5 | ; | Test.kt:100:25:110:1 | { ... } | +| Test.kt:101:9:101:30 | ... -> ... | Test.kt:100:25:110:1 | { ... } | +| Test.kt:101:9:101:30 | ... -> ... | Test.kt:101:5:103:5 | ; | +| Test.kt:102:9:102:25 | throw ... | Test.kt:101:33:103:5 | { ... } | +| Test.kt:105:9:105:17 | ... -> ... | Test.kt:105:5:109:5 | ; | +| Test.kt:106:9:106:29 | ; | Test.kt:105:20:107:5 | { ... } | +| Test.kt:108:9:108:29 | ; | Test.kt:107:27:109:5 | { ... } | +| Test.kt:113:5:115:5 | ; | Test.kt:112:32:116:1 | { ... } | +| Test.kt:113:9:113:14 | ... -> ... | Test.kt:112:32:116:1 | { ... } | +| Test.kt:113:9:113:14 | ... -> ... | Test.kt:113:5:115:5 | ; | +| Test.kt:119:2:123:12 | ; | Test.kt:118:37:124:1 | { ... } | +| Test.kt:120:3:123:10 | ... -> ... | Test.kt:118:37:124:1 | { ... } | +| Test.kt:120:3:123:10 | ... -> ... | Test.kt:119:2:123:12 | ; | +| Test.kt:121:4:121:9 | ... -> ... | Test.kt:118:37:124:1 | { ... } | +| Test.kt:121:4:121:9 | ... -> ... | Test.kt:119:2:123:12 | ; | +| Test.kt:121:4:121:9 | ... -> ... | Test.kt:120:3:123:10 | ... -> ... | +| Test.kt:122:12:122:16 | ; | Test.kt:122:12:122:16 | ... -> ... | diff --git a/java/ql/test-kotlin2/library-tests/controlflow/basic/strictPostDominance.ql b/java/ql/test-kotlin2/library-tests/controlflow/basic/strictPostDominance.ql new file mode 100644 index 00000000000..9948718fc83 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/controlflow/basic/strictPostDominance.ql @@ -0,0 +1,6 @@ +import default +import semmle.code.java.controlflow.Dominance + +from Stmt pre, Stmt post +where strictlyPostDominates(post, pre) +select post, pre diff --git a/java/ql/test-kotlin2/library-tests/controlflow/dominance/Test.kt b/java/ql/test-kotlin2/library-tests/controlflow/dominance/Test.kt new file mode 100644 index 00000000000..8b7b79a86b9 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/controlflow/dominance/Test.kt @@ -0,0 +1,102 @@ +class Test { + fun test(px: Int, pw: Int, pz: Int): Int { + var x = px + var w = pw + var z = pz + + var j: Int + var y: Long = 50 + + // if-else, multiple statements in block + if (x > 0) { + y = 20 + z = 10 + } else { + y = 30 + } + + z = (x + y) as Int + + // if-else with return in one branch + if (x < 0) + y = 40 + else + return z + + // this is not the start of a BB due to the return + z = 10 + + // single-branch if-else + if (x == 0) { + y = 60 + z = 10 + } + + z += x + + // while loop + while (x > 0) { + y = 10 + x-- + } + + z += y as Int + +/* +TODO + // for loop + for (j = 0; j < 10; j++) { + y = 0; + w = 10; + } + + z += w; + + // nested control flow + for (j = 0; j < 10; j++) { + y = 30; + if (z > 0) + if (y > 0) { + w = 0; + break; + } else { + w = 20; + } + else { + w = 10; + continue; + } + x = 0; + } +*/ + + z += x + y + w + + // nested control-flow + + w = 40 + return w + } + + fun test2(a: Int): Int { + /* Some more complex flow control */ + var b: Int + var c: Int + c = 0 + while(true) { + b = 10 + if (a > 100) { + c = 10 + b = c + } + if (a == 10) + break + if (a == 20) + return c + } + return b + } + +} + +// Diagnostic Matches: % Couldn't find a Java equivalent function to kotlin.Int.dec in java.lang.Integer ...while extracting a call () at %Test.kt:40:4:40:6% diff --git a/java/ql/test-kotlin2/library-tests/controlflow/dominance/Test2.kt b/java/ql/test-kotlin2/library-tests/controlflow/dominance/Test2.kt new file mode 100644 index 00000000000..21ff0bcc084 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/controlflow/dominance/Test2.kt @@ -0,0 +1,39 @@ +import java.math.* + +class MyExn: Throwable() {} + +public class Test2 { + @Throws(Throwable::class) + fun f() {} + + @Throws(Throwable::class) + fun g(b: Boolean) { + while (b) { + if (b) { + } else { + try { + f() + } catch (e: MyExn) {} + ; + } + } + } + + fun t(x: Int) { + if (x < 0) { + return + } + var y = x + while(y >= 0) { + if (y > 10) { + try { + val n: BigInteger = BigInteger( "wrong" ); + } catch (e: NumberFormatException) { // unchecked exception + } + } + y-- + } + } +} + +// Diagnostic Matches: % Couldn't find a Java equivalent function to kotlin.Int.dec in java.lang.Integer ...while extracting a call () at %Test2.kt:34:4:34:6% diff --git a/java/ql/test-kotlin2/library-tests/controlflow/dominance/dominanceBad.expected b/java/ql/test-kotlin2/library-tests/controlflow/dominance/dominanceBad.expected new file mode 100644 index 00000000000..e69de29bb2d diff --git a/java/ql/test-kotlin2/library-tests/controlflow/dominance/dominanceBad.ql b/java/ql/test-kotlin2/library-tests/controlflow/dominance/dominanceBad.ql new file mode 100644 index 00000000000..26d33d9d07b --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/controlflow/dominance/dominanceBad.ql @@ -0,0 +1,9 @@ +import java +import semmle.code.java.controlflow.Dominance + +from IfStmt i, BlockStmt b +where + b = i.getThen() and + dominates(i.getThen(), b) and + dominates(i.getElse(), b) +select i, b diff --git a/java/ql/test-kotlin2/library-tests/controlflow/dominance/dominanceWrong.expected b/java/ql/test-kotlin2/library-tests/controlflow/dominance/dominanceWrong.expected new file mode 100644 index 00000000000..e69de29bb2d diff --git a/java/ql/test-kotlin2/library-tests/controlflow/dominance/dominanceWrong.ql b/java/ql/test-kotlin2/library-tests/controlflow/dominance/dominanceWrong.ql new file mode 100644 index 00000000000..298e0752ee4 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/controlflow/dominance/dominanceWrong.ql @@ -0,0 +1,21 @@ +import java +import semmle.code.java.controlflow.Dominance + +/** + * Represents a path from `entry` to `node` that doesn't go through `dom`. If + * `entry` is the entry node for the CFG then this shows that `dom` does not + * dominate `node`. + */ +predicate dominanceCounterExample(ControlFlowNode entry, ControlFlowNode dom, ControlFlowNode node) { + node = entry + or + exists(ControlFlowNode mid | + dominanceCounterExample(entry, dom, mid) and mid != dom and mid.getASuccessor() = node + ) +} + +from Callable c, ControlFlowNode dom, ControlFlowNode node +where + (strictlyDominates(dom, node) or bbStrictlyDominates(dom, node)) and + dominanceCounterExample(c.getBody(), dom, node) +select c, dom, node diff --git a/java/ql/test-kotlin2/library-tests/controlflow/dominance/dominatedByStart.expected b/java/ql/test-kotlin2/library-tests/controlflow/dominance/dominatedByStart.expected new file mode 100644 index 00000000000..e69de29bb2d diff --git a/java/ql/test-kotlin2/library-tests/controlflow/dominance/dominatedByStart.ql b/java/ql/test-kotlin2/library-tests/controlflow/dominance/dominatedByStart.ql new file mode 100644 index 00000000000..b5bdf688996 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/controlflow/dominance/dominatedByStart.ql @@ -0,0 +1,16 @@ +// All nodes should be dominated by their associated start node +import default +import semmle.code.java.controlflow.Dominance + +ControlFlowNode reachableIn(Method func) { + result = func.getBody() or + result = reachableIn(func).getASuccessor() +} + +from Method func, ControlFlowNode entry, ControlFlowNode node +where + func.getBody() = entry and + reachableIn(func) = node and + entry != node and + not strictlyDominates(func.getBody(), node) +select func, node diff --git a/java/ql/test-kotlin2/library-tests/controlflow/dominance/dominator.expected b/java/ql/test-kotlin2/library-tests/controlflow/dominance/dominator.expected new file mode 100644 index 00000000000..69cb545eefa --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/controlflow/dominance/dominator.expected @@ -0,0 +1,158 @@ +| Test.kt:2:43:79:2 | { ... } | Test.kt:3:9:3:18 | var ...; | +| Test.kt:3:9:3:18 | var ...; | Test.kt:3:17:3:18 | px | +| Test.kt:3:9:3:18 | x | Test.kt:4:9:4:18 | var ...; | +| Test.kt:3:17:3:18 | px | Test.kt:3:9:3:18 | x | +| Test.kt:4:9:4:18 | var ...; | Test.kt:4:17:4:18 | pw | +| Test.kt:4:9:4:18 | w | Test.kt:5:9:5:18 | var ...; | +| Test.kt:4:17:4:18 | pw | Test.kt:4:9:4:18 | w | +| Test.kt:5:9:5:18 | var ...; | Test.kt:5:17:5:18 | pz | +| Test.kt:5:9:5:18 | z | Test.kt:7:3:7:12 | var ...; | +| Test.kt:5:17:5:18 | pz | Test.kt:5:9:5:18 | z | +| Test.kt:7:3:7:12 | j | Test.kt:8:3:8:18 | var ...; | +| Test.kt:7:3:7:12 | var ...; | Test.kt:7:3:7:12 | j | +| Test.kt:8:3:8:18 | var ...; | Test.kt:8:17:8:18 | 50 | +| Test.kt:8:3:8:18 | y | Test.kt:11:3:16:3 | ; | +| Test.kt:8:17:8:18 | 50 | Test.kt:8:3:8:18 | y | +| Test.kt:11:3:16:3 | ; | Test.kt:11:3:16:3 | when ... | +| Test.kt:11:3:16:3 | when ... | Test.kt:11:7:11:11 | ... -> ... | +| Test.kt:11:7:11:7 | x | Test.kt:11:11:11:11 | 0 | +| Test.kt:11:7:11:11 | ... -> ... | Test.kt:11:7:11:7 | x | +| Test.kt:11:7:11:11 | ... > ... | Test.kt:11:14:14:3 | { ... } | +| Test.kt:11:7:11:11 | ... > ... | Test.kt:14:10:16:3 | ... -> ... | +| Test.kt:11:7:11:11 | ... > ... | Test.kt:18:3:18:20 | ; | +| Test.kt:11:11:11:11 | 0 | Test.kt:11:7:11:11 | ... > ... | +| Test.kt:11:14:14:3 | { ... } | Test.kt:12:4:12:9 | ; | +| Test.kt:12:4:12:9 | ...=... | Test.kt:13:4:13:9 | ; | +| Test.kt:12:4:12:9 | ; | Test.kt:12:8:12:9 | 20 | +| Test.kt:12:8:12:9 | 20 | Test.kt:12:4:12:9 | ...=... | +| Test.kt:13:4:13:9 | ; | Test.kt:13:8:13:9 | 10 | +| Test.kt:13:8:13:9 | 10 | Test.kt:13:4:13:9 | ...=... | +| Test.kt:14:10:16:3 | ... -> ... | Test.kt:14:10:16:3 | true | +| Test.kt:14:10:16:3 | true | Test.kt:14:10:16:3 | { ... } | +| Test.kt:14:10:16:3 | { ... } | Test.kt:15:4:15:9 | ; | +| Test.kt:15:4:15:9 | ; | Test.kt:15:8:15:9 | 30 | +| Test.kt:15:8:15:9 | 30 | Test.kt:15:4:15:9 | ...=... | +| Test.kt:18:3:18:20 | ...=... | Test.kt:21:3:24:11 | ; | +| Test.kt:18:3:18:20 | ; | Test.kt:18:8:18:8 | x | +| Test.kt:18:7:18:20 | (...)... | Test.kt:18:3:18:20 | ...=... | +| Test.kt:18:8:18:8 | x | Test.kt:18:12:18:12 | y | +| Test.kt:18:8:18:12 | ... + ... | Test.kt:18:7:18:20 | (...)... | +| Test.kt:18:12:18:12 | y | Test.kt:18:8:18:12 | ... + ... | +| Test.kt:21:3:24:11 | ; | Test.kt:21:3:24:11 | when ... | +| Test.kt:21:3:24:11 | when ... | Test.kt:21:7:21:11 | ... -> ... | +| Test.kt:21:7:21:7 | x | Test.kt:21:11:21:11 | 0 | +| Test.kt:21:7:21:11 | ... -> ... | Test.kt:21:7:21:7 | x | +| Test.kt:21:7:21:11 | ... < ... | Test.kt:2:2:79:2 | test | +| Test.kt:21:7:21:11 | ... < ... | Test.kt:22:4:22:9 | { ... } | +| Test.kt:21:7:21:11 | ... < ... | Test.kt:24:4:24:11 | ... -> ... | +| Test.kt:21:11:21:11 | 0 | Test.kt:21:7:21:11 | ... < ... | +| Test.kt:22:4:22:9 | ...=... | Test.kt:27:3:27:8 | ; | +| Test.kt:22:4:22:9 | ; | Test.kt:22:8:22:9 | 40 | +| Test.kt:22:4:22:9 | { ... } | Test.kt:22:4:22:9 | ; | +| Test.kt:22:8:22:9 | 40 | Test.kt:22:4:22:9 | ...=... | +| Test.kt:24:4:24:11 | ... -> ... | Test.kt:24:4:24:11 | true | +| Test.kt:24:4:24:11 | true | Test.kt:24:11:24:11 | z | +| Test.kt:24:11:24:11 | z | Test.kt:24:4:24:11 | return ... | +| Test.kt:27:3:27:8 | ...=... | Test.kt:30:3:33:3 | ; | +| Test.kt:27:3:27:8 | ; | Test.kt:27:7:27:8 | 10 | +| Test.kt:27:7:27:8 | 10 | Test.kt:27:3:27:8 | ...=... | +| Test.kt:30:3:33:3 | ; | Test.kt:30:3:33:3 | when ... | +| Test.kt:30:3:33:3 | when ... | Test.kt:30:7:30:12 | ... -> ... | +| Test.kt:30:7:30:7 | x | Test.kt:30:12:30:12 | 0 | +| Test.kt:30:7:30:12 | ... (value equals) ... | Test.kt:30:15:33:3 | { ... } | +| Test.kt:30:7:30:12 | ... (value equals) ... | Test.kt:35:3:35:8 | ; | +| Test.kt:30:7:30:12 | ... -> ... | Test.kt:30:7:30:7 | x | +| Test.kt:30:12:30:12 | 0 | Test.kt:30:7:30:12 | ... (value equals) ... | +| Test.kt:30:15:33:3 | { ... } | Test.kt:31:4:31:9 | ; | +| Test.kt:31:4:31:9 | ...=... | Test.kt:32:4:32:9 | ; | +| Test.kt:31:4:31:9 | ; | Test.kt:31:8:31:9 | 60 | +| Test.kt:31:8:31:9 | 60 | Test.kt:31:4:31:9 | ...=... | +| Test.kt:32:4:32:9 | ; | Test.kt:32:8:32:9 | 10 | +| Test.kt:32:8:32:9 | 10 | Test.kt:32:4:32:9 | ...=... | +| Test.kt:35:3:35:8 | ...+=... | Test.kt:38:3:41:3 | while (...) | +| Test.kt:35:3:35:8 | ; | Test.kt:35:3:35:8 | z | +| Test.kt:35:3:35:8 | z | Test.kt:35:8:35:8 | x | +| Test.kt:35:8:35:8 | x | Test.kt:35:3:35:8 | ...+=... | +| Test.kt:38:3:41:3 | while (...) | Test.kt:38:10:38:10 | x | +| Test.kt:38:10:38:10 | x | Test.kt:38:14:38:14 | 0 | +| Test.kt:38:10:38:14 | ... > ... | Test.kt:38:17:41:3 | { ... } | +| Test.kt:38:10:38:14 | ... > ... | Test.kt:43:3:43:15 | ; | +| Test.kt:38:14:38:14 | 0 | Test.kt:38:10:38:14 | ... > ... | +| Test.kt:38:17:41:3 | { ... } | Test.kt:39:4:39:9 | ; | +| Test.kt:39:4:39:9 | ...=... | Test.kt:40:4:40:6 | ; | +| Test.kt:39:4:39:9 | ; | Test.kt:39:8:39:9 | 10 | +| Test.kt:39:8:39:9 | 10 | Test.kt:39:4:39:9 | ...=... | +| Test.kt:40:4:40:4 | x | Test.kt:40:4:40:6 | | +| Test.kt:40:4:40:6 | ...=... | Test.kt:40:4:40:6 | ; | +| Test.kt:40:4:40:6 | ; | Test.kt:40:4:40:6 | | +| Test.kt:40:4:40:6 | ; | Test.kt:40:4:40:6 | | +| Test.kt:40:4:40:6 | ; | Test.kt:40:4:40:6 | | +| Test.kt:40:4:40:6 | | Test.kt:40:4:40:6 | { ... } | +| Test.kt:40:4:40:6 | | Test.kt:40:4:40:6 | ; | +| Test.kt:40:4:40:6 | | Test.kt:40:4:40:6 | | +| Test.kt:40:4:40:6 | | Test.kt:40:4:40:6 | dec(...) | +| Test.kt:40:4:40:6 | dec(...) | Test.kt:40:4:40:6 | ...=... | +| Test.kt:40:4:40:6 | var ...; | Test.kt:40:4:40:4 | x | +| Test.kt:40:4:40:6 | { ... } | Test.kt:40:4:40:6 | var ...; | +| Test.kt:43:3:43:15 | ...+=... | Test.kt:73:3:73:16 | ; | +| Test.kt:43:3:43:15 | ; | Test.kt:43:3:43:15 | z | +| Test.kt:43:3:43:15 | z | Test.kt:43:8:43:8 | y | +| Test.kt:43:8:43:8 | y | Test.kt:43:8:43:15 | (...)... | +| Test.kt:43:8:43:15 | (...)... | Test.kt:43:3:43:15 | ...+=... | +| Test.kt:73:3:73:16 | ...+=... | Test.kt:77:3:77:8 | ; | +| Test.kt:73:3:73:16 | ; | Test.kt:73:3:73:16 | z | +| Test.kt:73:3:73:16 | z | Test.kt:73:8:73:8 | x | +| Test.kt:73:8:73:8 | x | Test.kt:73:12:73:12 | y | +| Test.kt:73:8:73:12 | ... + ... | Test.kt:73:16:73:16 | w | +| Test.kt:73:8:73:16 | ... + ... | Test.kt:73:3:73:16 | ...+=... | +| Test.kt:73:12:73:12 | | Test.kt:73:8:73:12 | ... + ... | +| Test.kt:73:12:73:12 | y | Test.kt:73:12:73:12 | | +| Test.kt:73:16:73:16 | w | Test.kt:73:8:73:16 | ... + ... | +| Test.kt:77:3:77:8 | ...=... | Test.kt:78:10:78:10 | w | +| Test.kt:77:3:77:8 | ; | Test.kt:77:7:77:8 | 40 | +| Test.kt:77:7:77:8 | 40 | Test.kt:77:3:77:8 | ...=... | +| Test.kt:78:10:78:10 | w | Test.kt:78:3:78:10 | return ... | +| Test.kt:81:25:98:2 | { ... } | Test.kt:83:3:83:12 | var ...; | +| Test.kt:83:3:83:12 | b | Test.kt:84:3:84:12 | var ...; | +| Test.kt:83:3:83:12 | var ...; | Test.kt:83:3:83:12 | b | +| Test.kt:84:3:84:12 | c | Test.kt:85:3:85:7 | ; | +| Test.kt:84:3:84:12 | var ...; | Test.kt:84:3:84:12 | c | +| Test.kt:85:3:85:7 | ...=... | Test.kt:86:3:96:3 | while (...) | +| Test.kt:85:3:85:7 | ; | Test.kt:85:7:85:7 | 0 | +| Test.kt:85:7:85:7 | 0 | Test.kt:85:3:85:7 | ...=... | +| Test.kt:86:3:96:3 | while (...) | Test.kt:86:9:86:12 | true | +| Test.kt:86:9:86:12 | true | Test.kt:86:15:96:3 | { ... } | +| Test.kt:86:15:96:3 | { ... } | Test.kt:87:4:87:9 | ; | +| Test.kt:87:4:87:9 | ...=... | Test.kt:88:4:91:4 | ; | +| Test.kt:87:4:87:9 | ; | Test.kt:87:8:87:9 | 10 | +| Test.kt:87:8:87:9 | 10 | Test.kt:87:4:87:9 | ...=... | +| Test.kt:88:4:91:4 | ; | Test.kt:88:4:91:4 | when ... | +| Test.kt:88:4:91:4 | when ... | Test.kt:88:8:88:14 | ... -> ... | +| Test.kt:88:8:88:8 | a | Test.kt:88:12:88:14 | 100 | +| Test.kt:88:8:88:14 | ... -> ... | Test.kt:88:8:88:8 | a | +| Test.kt:88:8:88:14 | ... > ... | Test.kt:88:17:91:4 | { ... } | +| Test.kt:88:8:88:14 | ... > ... | Test.kt:92:4:93:9 | ; | +| Test.kt:88:12:88:14 | 100 | Test.kt:88:8:88:14 | ... > ... | +| Test.kt:88:17:91:4 | { ... } | Test.kt:89:5:89:10 | ; | +| Test.kt:89:5:89:10 | ...=... | Test.kt:90:5:90:9 | ; | +| Test.kt:89:5:89:10 | ; | Test.kt:89:9:89:10 | 10 | +| Test.kt:89:9:89:10 | 10 | Test.kt:89:5:89:10 | ...=... | +| Test.kt:90:5:90:9 | ; | Test.kt:90:9:90:9 | c | +| Test.kt:90:9:90:9 | c | Test.kt:90:5:90:9 | ...=... | +| Test.kt:92:4:93:9 | ; | Test.kt:92:4:93:9 | when ... | +| Test.kt:92:4:93:9 | when ... | Test.kt:92:8:92:14 | ... -> ... | +| Test.kt:92:8:92:8 | a | Test.kt:92:13:92:14 | 10 | +| Test.kt:92:8:92:14 | ... (value equals) ... | Test.kt:81:2:98:2 | test2 | +| Test.kt:92:8:92:14 | ... (value equals) ... | Test.kt:93:5:93:9 | break | +| Test.kt:92:8:92:14 | ... (value equals) ... | Test.kt:94:4:95:12 | ; | +| Test.kt:92:8:92:14 | ... -> ... | Test.kt:92:8:92:8 | a | +| Test.kt:92:13:92:14 | 10 | Test.kt:92:8:92:14 | ... (value equals) ... | +| Test.kt:93:5:93:9 | break | Test.kt:97:10:97:10 | b | +| Test.kt:94:4:95:12 | ; | Test.kt:94:4:95:12 | when ... | +| Test.kt:94:4:95:12 | when ... | Test.kt:94:8:94:14 | ... -> ... | +| Test.kt:94:8:94:8 | a | Test.kt:94:13:94:14 | 20 | +| Test.kt:94:8:94:14 | ... (value equals) ... | Test.kt:95:12:95:12 | c | +| Test.kt:94:8:94:14 | ... -> ... | Test.kt:94:8:94:8 | a | +| Test.kt:94:13:94:14 | 20 | Test.kt:94:8:94:14 | ... (value equals) ... | +| Test.kt:95:12:95:12 | c | Test.kt:95:5:95:12 | return ... | +| Test.kt:97:10:97:10 | b | Test.kt:97:3:97:10 | return ... | diff --git a/java/ql/test-kotlin2/library-tests/controlflow/dominance/dominator.ql b/java/ql/test-kotlin2/library-tests/controlflow/dominance/dominator.ql new file mode 100644 index 00000000000..701640bf720 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/controlflow/dominance/dominator.ql @@ -0,0 +1,9 @@ +import default +import semmle.code.java.controlflow.Dominance + +from Method func, ControlFlowNode dominator, ControlFlowNode node +where + iDominates(dominator, node) and + dominator.getEnclosingStmt().getEnclosingCallable() = func and + func.getDeclaringType().hasName("Test") +select dominator, node diff --git a/java/ql/test-kotlin2/library-tests/controlflow/dominance/dominatorExists.expected b/java/ql/test-kotlin2/library-tests/controlflow/dominance/dominatorExists.expected new file mode 100644 index 00000000000..e69de29bb2d diff --git a/java/ql/test-kotlin2/library-tests/controlflow/dominance/dominatorExists.ql b/java/ql/test-kotlin2/library-tests/controlflow/dominance/dominatorExists.ql new file mode 100644 index 00000000000..34469a686b1 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/controlflow/dominance/dominatorExists.ql @@ -0,0 +1,16 @@ +// Every reachable node has a dominator +import default +import semmle.code.java.controlflow.Dominance + +/** transitive dominance */ +ControlFlowNode reachableIn(Method func) { + result = func.getBody() or + result = reachableIn(func).getASuccessor() +} + +from Method func, ControlFlowNode node +where + node = reachableIn(func) and + node != func.getBody() and + not iDominates(_, node) +select func, node diff --git a/java/ql/test-kotlin2/library-tests/controlflow/dominance/dominatorUnique.expected b/java/ql/test-kotlin2/library-tests/controlflow/dominance/dominatorUnique.expected new file mode 100644 index 00000000000..e69de29bb2d diff --git a/java/ql/test-kotlin2/library-tests/controlflow/dominance/dominatorUnique.ql b/java/ql/test-kotlin2/library-tests/controlflow/dominance/dominatorUnique.ql new file mode 100644 index 00000000000..eaf75ab7bfa --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/controlflow/dominance/dominatorUnique.ql @@ -0,0 +1,11 @@ +// Every reachable node has a dominator +import default +import semmle.code.java.controlflow.Dominance + +from Method func, ControlFlowNode dom1, ControlFlowNode dom2, ControlFlowNode node +where + iDominates(dom1, node) and + iDominates(dom2, node) and + dom1 != dom2 and + func = node.getEnclosingStmt().getEnclosingCallable() +select func, node, dom1, dom2 diff --git a/java/ql/test-kotlin2/library-tests/controlflow/paths/A.kt b/java/ql/test-kotlin2/library-tests/controlflow/paths/A.kt new file mode 100644 index 00000000000..ce9dfae8407 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/controlflow/paths/A.kt @@ -0,0 +1,49 @@ +public class A { + fun action() { } + + fun always_dom1() { + action() + } + + fun always_dom2(b: Boolean) { + if (b) { } else { } + action() + } + + fun always_path(b: Boolean) { + if (b) { + action() + } else { + action() + } + } + + fun always_w_call(b1: Boolean, b2: Boolean) { + if (b1) { + action() + } else if (b2) { + always_dom2(b1) + } else { + always_path(b2) + } + } + + fun not_always_none() { + } + + fun not_always_one(b: Boolean) { + if (b) { + action() + } + } + + fun not_always_two(b1: Boolean, b2: Boolean) { + if (b1) { + if (b2) { + action() + } else { + action() + } + } + } +} diff --git a/java/ql/test-kotlin2/library-tests/controlflow/paths/paths.expected b/java/ql/test-kotlin2/library-tests/controlflow/paths/paths.expected new file mode 100644 index 00000000000..c3a7d69fa85 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/controlflow/paths/paths.expected @@ -0,0 +1,4 @@ +| A.kt:4:3:6:3 | always_dom1 | +| A.kt:8:3:11:3 | always_dom2 | +| A.kt:13:3:19:3 | always_path | +| A.kt:21:3:29:3 | always_w_call | diff --git a/java/ql/test-kotlin2/library-tests/controlflow/paths/paths.ql b/java/ql/test-kotlin2/library-tests/controlflow/paths/paths.ql new file mode 100644 index 00000000000..389c46a48f5 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/controlflow/paths/paths.ql @@ -0,0 +1,14 @@ +import java +import semmle.code.java.controlflow.Paths + +class PathTestConf extends ActionConfiguration { + PathTestConf() { this = "PathTestConf" } + + override predicate isAction(ControlFlowNode node) { + node.(MethodCall).getMethod().hasName("action") + } +} + +from Callable c, PathTestConf conf +where conf.callableAlwaysPerformsAction(c) +select c diff --git a/java/ql/test-kotlin2/library-tests/controlflow/plot/.gitignore b/java/ql/test-kotlin2/library-tests/controlflow/plot/.gitignore new file mode 100644 index 00000000000..a35ed75fb37 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/controlflow/plot/.gitignore @@ -0,0 +1 @@ +outdir/ \ No newline at end of file diff --git a/java/ql/test-kotlin2/library-tests/controlflow/plot/nodeGraph.expected b/java/ql/test-kotlin2/library-tests/controlflow/plot/nodeGraph.expected new file mode 100644 index 00000000000..e69de29bb2d diff --git a/java/ql/test-kotlin2/library-tests/controlflow/plot/nodeGraph.ql b/java/ql/test-kotlin2/library-tests/controlflow/plot/nodeGraph.ql new file mode 100644 index 00000000000..db643a498cb --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/controlflow/plot/nodeGraph.ql @@ -0,0 +1,47 @@ +/** + * @id test-plot-cfg + * @kind graph + */ + +import java + +class RelevantNode extends ControlFlowNode { + RelevantNode() { this.getLocation().getFile().isSourceFile() } +} + +query predicate nodes(RelevantNode n, string attr, string val) { + attr = "semmle.order" and + val = + any(int i | + n = + rank[i](RelevantNode p, Location l | + l = p.getLocation() + | + p + order by + l.getFile().getBaseName(), l.getFile().getAbsolutePath(), l.getStartLine(), + l.getStartColumn(), l.getEndLine(), l.getEndColumn(), p.toString() + ) + ).toString() +} + +query predicate edges(RelevantNode pred, RelevantNode succ, string attr, string val) { + attr = "semmle.label" and + succ = pred.getASuccessor() and + val = "" + or + attr = "semmle.order" and + val = + any(int i | + succ = + rank[i](RelevantNode s, Location l | + s = pred.getASuccessor() and + l = s.getLocation() + | + s + order by + l.getFile().getBaseName(), l.getFile().getAbsolutePath(), l.getStartLine(), + l.getStartColumn(), l.getEndLine(), l.getEndColumn() + ) + ).toString() +} diff --git a/java/ql/test-kotlin2/library-tests/controlflow/plot/plot.sh b/java/ql/test-kotlin2/library-tests/controlflow/plot/plot.sh new file mode 100755 index 00000000000..39f68ecb3e4 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/controlflow/plot/plot.sh @@ -0,0 +1,3 @@ +codeql database analyze ../basic/basic.testproj --format=dot nodeGraph.ql --output=outdir --rerun +dot -Tpdf -O outdir/test-plot-cfg.dot +open outdir/test-plot-cfg.dot.pdf \ No newline at end of file diff --git a/java/ql/test-kotlin2/library-tests/coroutines/coroutine_user.kt b/java/ql/test-kotlin2/library-tests/coroutines/coroutine_user.kt new file mode 100644 index 00000000000..7f84ebb1d29 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/coroutines/coroutine_user.kt @@ -0,0 +1,3 @@ +import kotlin.coroutines.SuspendFunction0 + +fun f(x: SuspendFunction0) {} diff --git a/java/ql/test-kotlin2/library-tests/coroutines/test.expected b/java/ql/test-kotlin2/library-tests/coroutines/test.expected new file mode 100644 index 00000000000..52fbf1ab185 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/coroutines/test.expected @@ -0,0 +1 @@ +| coroutine_user.kt:3:1:3:37 | f | SuspendFunction0 | diff --git a/java/ql/test-kotlin2/library-tests/coroutines/test.ql b/java/ql/test-kotlin2/library-tests/coroutines/test.ql new file mode 100644 index 00000000000..190547691aa --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/coroutines/test.ql @@ -0,0 +1,5 @@ +import java + +from Callable c +where c.fromSource() +select c, c.getAParamType().toString() diff --git a/java/ql/test-kotlin2/library-tests/data-classes/PrintAst.expected b/java/ql/test-kotlin2/library-tests/data-classes/PrintAst.expected new file mode 100644 index 00000000000..f884671c094 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/data-classes/PrintAst.expected @@ -0,0 +1,196 @@ +dc.kt: +# 0| [CompilationUnit] dc +# 1| 1: [Class] ProtoMapValue +# 0| 1: [Method] component1 +# 0| 3: [TypeAccess] byte[] +# 0| 5: [BlockStmt] { ... } +# 0| 0: [ReturnStmt] return ... +# 0| 0: [VarAccess] this.bytes +# 0| -1: [ThisAccess] this +# 0| 2: [Method] component2 +# 0| 3: [TypeAccess] String[] +# 0| 0: [TypeAccess] String +# 0| 5: [BlockStmt] { ... } +# 0| 0: [ReturnStmt] return ... +# 0| 0: [VarAccess] this.strs +# 0| -1: [ThisAccess] this +# 0| 3: [Method] copy +# 0| 3: [TypeAccess] ProtoMapValue +#-----| 4: (Parameters) +# 1| 0: [Parameter] bytes +# 1| 0: [TypeAccess] byte[] +# 1| 1: [Parameter] strs +# 1| 0: [TypeAccess] String[] +# 1| 0: [TypeAccess] String +# 0| 5: [BlockStmt] { ... } +# 0| 0: [ReturnStmt] return ... +# 0| 0: [ClassInstanceExpr] new ProtoMapValue(...) +# 0| -3: [TypeAccess] ProtoMapValue +# 0| 0: [VarAccess] bytes +# 0| 1: [VarAccess] strs +# 0| 4: [Method] copy$default +# 0| 3: [TypeAccess] ProtoMapValue +#-----| 4: (Parameters) +# 0| 0: [Parameter] p0 +# 0| 0: [TypeAccess] ProtoMapValue +# 0| 1: [Parameter] p1 +# 0| 0: [TypeAccess] byte[] +# 0| 2: [Parameter] p2 +# 0| 0: [TypeAccess] String[] +# 0| 3: [Parameter] p3 +# 0| 0: [TypeAccess] int +# 0| 4: [Parameter] p4 +# 0| 0: [TypeAccess] Object +# 0| 5: [BlockStmt] { ... } +# 0| 0: [IfStmt] if (...) +# 0| 0: [EQExpr] ... == ... +# 0| 0: [AndBitwiseExpr] ... & ... +# 0| 0: [IntegerLiteral] 1 +# 0| 1: [VarAccess] p3 +# 0| 1: [IntegerLiteral] 0 +# 0| 1: [ExprStmt] ; +# 0| 0: [AssignExpr] ...=... +# 0| 0: [VarAccess] p1 +# 0| 1: [VarAccess] p0.bytes +# 0| -1: [VarAccess] p0 +# 0| 1: [IfStmt] if (...) +# 0| 0: [EQExpr] ... == ... +# 0| 0: [AndBitwiseExpr] ... & ... +# 0| 0: [IntegerLiteral] 2 +# 0| 1: [VarAccess] p3 +# 0| 1: [IntegerLiteral] 0 +# 0| 1: [ExprStmt] ; +# 0| 0: [AssignExpr] ...=... +# 0| 0: [VarAccess] p2 +# 0| 1: [VarAccess] p0.strs +# 0| -1: [VarAccess] p0 +# 0| 2: [ReturnStmt] return ... +# 0| 0: [MethodCall] copy(...) +# 0| -1: [VarAccess] p0 +# 0| 0: [VarAccess] p1 +# 0| 1: [VarAccess] p2 +# 0| 5: [Method] equals +# 0| 3: [TypeAccess] boolean +#-----| 4: (Parameters) +# 0| 0: [Parameter] other +# 0| 0: [TypeAccess] Object +# 0| 5: [BlockStmt] { ... } +# 0| 0: [ExprStmt] ; +# 0| 0: [WhenExpr] when ... +# 0| 0: [WhenBranch] ... -> ... +# 0| 0: [EQExpr] ... == ... +# 0| 0: [ThisAccess] this +# 0| 1: [VarAccess] other +# 0| 1: [ReturnStmt] return ... +# 0| 0: [BooleanLiteral] true +# 0| 1: [ExprStmt] ; +# 0| 0: [WhenExpr] when ... +# 0| 0: [WhenBranch] ... -> ... +# 0| 0: [NotInstanceOfExpr] ... !is ... +# 0| 0: [VarAccess] other +# 0| 1: [TypeAccess] ProtoMapValue +# 0| 1: [ReturnStmt] return ... +# 0| 0: [BooleanLiteral] false +# 0| 2: [LocalVariableDeclStmt] var ...; +# 0| 1: [LocalVariableDeclExpr] tmp0_other_with_cast +# 0| 0: [CastExpr] (...)... +# 0| 0: [TypeAccess] ProtoMapValue +# 0| 1: [VarAccess] other +# 0| 3: [ExprStmt] ; +# 0| 0: [WhenExpr] when ... +# 0| 0: [WhenBranch] ... -> ... +# 0| 0: [ValueNEExpr] ... (value not-equals) ... +# 0| 0: [VarAccess] this.bytes +# 0| -1: [ThisAccess] this +# 0| 1: [VarAccess] tmp0_other_with_cast.bytes +# 0| -1: [VarAccess] tmp0_other_with_cast +# 0| 1: [ReturnStmt] return ... +# 0| 0: [BooleanLiteral] false +# 0| 4: [ExprStmt] ; +# 0| 0: [WhenExpr] when ... +# 0| 0: [WhenBranch] ... -> ... +# 0| 0: [ValueNEExpr] ... (value not-equals) ... +# 0| 0: [VarAccess] this.strs +# 0| -1: [ThisAccess] this +# 0| 1: [VarAccess] tmp0_other_with_cast.strs +# 0| -1: [VarAccess] tmp0_other_with_cast +# 0| 1: [ReturnStmt] return ... +# 0| 0: [BooleanLiteral] false +# 0| 5: [ReturnStmt] return ... +# 0| 0: [BooleanLiteral] true +# 0| 6: [Method] hashCode +# 0| 3: [TypeAccess] int +# 0| 5: [BlockStmt] { ... } +# 0| 0: [LocalVariableDeclStmt] var ...; +# 0| 1: [LocalVariableDeclExpr] result +# 0| 0: [MethodCall] hashCode(...) +# 0| -1: [TypeAccess] Arrays +# 0| 0: [VarAccess] this.bytes +# 0| -1: [ThisAccess] this +# 0| 1: [ExprStmt] ; +# 0| 0: [AssignExpr] ...=... +# 0| 0: [VarAccess] result +# 0| 1: [AddExpr] ... + ... +# 0| 0: [MulExpr] ... * ... +# 0| 0: [VarAccess] result +# 0| 1: [IntegerLiteral] 31 +# 0| 1: [MethodCall] hashCode(...) +# 0| -1: [TypeAccess] Arrays +# 0| 0: [VarAccess] this.strs +# 0| -1: [ThisAccess] this +# 0| 2: [ReturnStmt] return ... +# 0| 0: [VarAccess] result +# 0| 7: [Method] toString +# 0| 3: [TypeAccess] String +# 0| 5: [BlockStmt] { ... } +# 0| 0: [ReturnStmt] return ... +# 0| 0: [StringTemplateExpr] "..." +# 0| 0: [StringLiteral] "ProtoMapValue(" +# 0| 1: [StringLiteral] "bytes=" +# 0| 2: [MethodCall] toString(...) +# 0| -1: [TypeAccess] Arrays +# 0| 0: [VarAccess] this.bytes +# 0| -1: [ThisAccess] this +# 0| 3: [StringLiteral] ", " +# 0| 4: [StringLiteral] "strs=" +# 0| 5: [MethodCall] toString(...) +# 0| -1: [TypeAccess] Arrays +# 0| 0: [VarAccess] this.strs +# 0| -1: [ThisAccess] this +# 0| 6: [StringLiteral] ")" +# 1| 8: [Constructor] ProtoMapValue +#-----| 4: (Parameters) +# 1| 0: [Parameter] bytes +# 1| 0: [TypeAccess] byte[] +# 1| 1: [Parameter] strs +# 1| 0: [TypeAccess] String[] +# 1| 0: [TypeAccess] String +# 1| 5: [BlockStmt] { ... } +# 1| 0: [SuperConstructorInvocationStmt] super(...) +# 1| 1: [BlockStmt] { ... } +# 1| 0: [ExprStmt] ; +# 1| 0: [KtInitializerAssignExpr] ...=... +# 1| 0: [VarAccess] bytes +# 1| 1: [ExprStmt] ; +# 1| 0: [KtInitializerAssignExpr] ...=... +# 1| 0: [VarAccess] strs +# 1| 9: [FieldDeclaration] byte[] bytes; +# 1| -1: [TypeAccess] byte[] +# 1| 0: [VarAccess] bytes +# 1| 10: [Method] getBytes +# 1| 3: [TypeAccess] byte[] +# 1| 5: [BlockStmt] { ... } +# 1| 0: [ReturnStmt] return ... +# 1| 0: [VarAccess] this.bytes +# 1| -1: [ThisAccess] this +# 1| 11: [FieldDeclaration] String[] strs; +# 1| -1: [TypeAccess] String[] +# 1| 0: [TypeAccess] String +# 1| 0: [VarAccess] strs +# 1| 12: [Method] getStrs +# 1| 3: [TypeAccess] String[] +# 1| 0: [TypeAccess] String +# 1| 5: [BlockStmt] { ... } +# 1| 0: [ReturnStmt] return ... +# 1| 0: [VarAccess] this.strs +# 1| -1: [ThisAccess] this diff --git a/java/ql/test-kotlin2/library-tests/data-classes/PrintAst.qlref b/java/ql/test-kotlin2/library-tests/data-classes/PrintAst.qlref new file mode 100644 index 00000000000..c7fd5faf239 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/data-classes/PrintAst.qlref @@ -0,0 +1 @@ +semmle/code/java/PrintAst.ql \ No newline at end of file diff --git a/java/ql/test-kotlin2/library-tests/data-classes/callees.expected b/java/ql/test-kotlin2/library-tests/data-classes/callees.expected new file mode 100644 index 00000000000..f16c4ffb435 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/data-classes/callees.expected @@ -0,0 +1,7 @@ +| dc.kt:0:0:0:0 | copy(...) | ProtoMapValue.copy | +| dc.kt:0:0:0:0 | hashCode(...) | java.util.Arrays.hashCode | +| dc.kt:0:0:0:0 | hashCode(...) | java.util.Arrays.hashCode | +| dc.kt:0:0:0:0 | new ProtoMapValue(...) | ProtoMapValue.ProtoMapValue | +| dc.kt:0:0:0:0 | toString(...) | java.util.Arrays.toString | +| dc.kt:0:0:0:0 | toString(...) | java.util.Arrays.toString | +| dc.kt:1:1:1:71 | super(...) | java.lang.Object.Object | diff --git a/java/ql/test-kotlin2/library-tests/data-classes/callees.ql b/java/ql/test-kotlin2/library-tests/data-classes/callees.ql new file mode 100644 index 00000000000..f310f317686 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/data-classes/callees.ql @@ -0,0 +1,5 @@ +import java + +from Call c +where c.getEnclosingCallable().fromSource() +select c, c.getCallee().getQualifiedName() diff --git a/java/ql/test-kotlin2/library-tests/data-classes/data_classes.expected b/java/ql/test-kotlin2/library-tests/data-classes/data_classes.expected new file mode 100644 index 00000000000..83ca5b96184 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/data-classes/data_classes.expected @@ -0,0 +1 @@ +| dc.kt:1:1:1:71 | ProtoMapValue | diff --git a/java/ql/test-kotlin2/library-tests/data-classes/data_classes.ql b/java/ql/test-kotlin2/library-tests/data-classes/data_classes.ql new file mode 100644 index 00000000000..f42d9f76602 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/data-classes/data_classes.ql @@ -0,0 +1,5 @@ +import java + +from DataClass c +where c.fromSource() +select c diff --git a/java/ql/test-kotlin2/library-tests/data-classes/dc.kt b/java/ql/test-kotlin2/library-tests/data-classes/dc.kt new file mode 100644 index 00000000000..0958139f0ab --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/data-classes/dc.kt @@ -0,0 +1 @@ +data class ProtoMapValue(val bytes: ByteArray, val strs: Array) diff --git a/java/ql/test-kotlin2/library-tests/dataflow/extensionMethod/test.expected b/java/ql/test-kotlin2/library-tests/dataflow/extensionMethod/test.expected new file mode 100644 index 00000000000..c6a11136b21 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/dataflow/extensionMethod/test.expected @@ -0,0 +1,6 @@ +| test.kt:20:29:20:31 | new C(...) | test.kt:23:14:23:28 | self1(...) | +| test.kt:20:29:20:31 | new C(...) | test.kt:26:14:26:28 | self2(...) | +| test.kt:20:29:20:31 | new C(...) | test.kt:29:14:29:29 | fn1(...) | +| test.kt:20:29:20:31 | new C(...) | test.kt:32:14:32:29 | fn2(...) | +| test.kt:20:29:20:31 | new C(...) | test.kt:35:14:35:31 | call1(...) | +| test.kt:20:29:20:31 | new C(...) | test.kt:38:14:38:28 | call2(...) | diff --git a/java/ql/test-kotlin2/library-tests/dataflow/extensionMethod/test.kt b/java/ql/test-kotlin2/library-tests/dataflow/extensionMethod/test.kt new file mode 100644 index 00000000000..ff4404a41c7 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/dataflow/extensionMethod/test.kt @@ -0,0 +1,40 @@ +class C { + fun self1() = this + fun fn1(o: C) = o + + fun Int.fn3(o: C) = o + fun Int.fn4() = this@C + + fun call1(o: C) = 1.fn3(o) + fun call2() = 1.fn4() +} + +fun C.self2() = this +fun C.fn2(o: C) = o + +class Test { + fun taint(t: T) = t + fun sink(a: Any) {} + + fun test(s1: String) { + val tainted = taint(C()) + + sink(C().self1()) + sink(tainted.self1()) + + sink(C().self2()) + sink(tainted.self2()) + + sink(C().fn1(C())) + sink(C().fn1(tainted)) + + sink(C().fn2(C())) + sink(C().fn2(tainted)) + + sink(C().call1(C())) + sink(C().call1(tainted)) + + sink(C().call2()) + sink(tainted.call2()) + } +} diff --git a/java/ql/test-kotlin2/library-tests/dataflow/extensionMethod/test.ql b/java/ql/test-kotlin2/library-tests/dataflow/extensionMethod/test.ql new file mode 100644 index 00000000000..269d55bd3e7 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/dataflow/extensionMethod/test.ql @@ -0,0 +1,16 @@ +import java +import semmle.code.java.dataflow.TaintTracking + +module Config implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node n) { + n.asExpr().(Argument).getCall().getCallee().hasName("taint") + } + + predicate isSink(DataFlow::Node n) { n.asExpr().(Argument).getCall().getCallee().hasName("sink") } +} + +module Flow = TaintTracking::Global; + +from DataFlow::Node src, DataFlow::Node sink +where Flow::flow(src, sink) +select src, sink diff --git a/java/ql/test-kotlin2/library-tests/dataflow/foreach/C1.java b/java/ql/test-kotlin2/library-tests/dataflow/foreach/C1.java new file mode 100644 index 00000000000..164f9bd1795 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/dataflow/foreach/C1.java @@ -0,0 +1,22 @@ +public final class C1 { + public final String taint(String t) { + return t; + } + + public final void sink(Object a) { + } + + public final void test() { + String[] l = new String[]{this.taint("a"), ""}; + this.sink(l); + this.sink(l[0]); + + for(int i = 0; i < l.length; i++) { + this.sink(l[i]); + } + + for (String s : l) { + this.sink(s); + } + } +} diff --git a/java/ql/test-kotlin2/library-tests/dataflow/foreach/C2.kt b/java/ql/test-kotlin2/library-tests/dataflow/foreach/C2.kt new file mode 100644 index 00000000000..7a98abaa110 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/dataflow/foreach/C2.kt @@ -0,0 +1,18 @@ +class C2 { + fun taint(t: String): String { + return t + } + + fun sink(a: Any?) {} + fun test() { + val l = arrayOf(taint("a"), "") + sink(l) + sink(l[0]) + for (i in l.indices) { + sink(l[i]) + } + for (s in l) { + sink(s) + } + } +} diff --git a/java/ql/test-kotlin2/library-tests/dataflow/foreach/test.expected b/java/ql/test-kotlin2/library-tests/dataflow/foreach/test.expected new file mode 100644 index 00000000000..7c7b382a9ad --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/dataflow/foreach/test.expected @@ -0,0 +1,8 @@ +| C1.java:10:44:10:46 | "a" | C1.java:11:17:11:17 | l | +| C1.java:10:44:10:46 | "a" | C1.java:12:17:12:20 | ...[...] | +| C1.java:10:44:10:46 | "a" | C1.java:15:20:15:23 | ...[...] | +| C1.java:10:44:10:46 | "a" | C1.java:19:20:19:20 | s | +| C2.kt:8:32:8:32 | "a" | C2.kt:9:14:9:14 | l | +| C2.kt:8:32:8:32 | "a" | C2.kt:10:14:10:17 | ...[...] | +| C2.kt:8:32:8:32 | "a" | C2.kt:12:18:12:21 | ...[...] | +| C2.kt:8:32:8:32 | "a" | C2.kt:15:18:15:18 | s | diff --git a/java/ql/test-kotlin2/library-tests/dataflow/foreach/test.ql b/java/ql/test-kotlin2/library-tests/dataflow/foreach/test.ql new file mode 100644 index 00000000000..269d55bd3e7 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/dataflow/foreach/test.ql @@ -0,0 +1,16 @@ +import java +import semmle.code.java.dataflow.TaintTracking + +module Config implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node n) { + n.asExpr().(Argument).getCall().getCallee().hasName("taint") + } + + predicate isSink(DataFlow::Node n) { n.asExpr().(Argument).getCall().getCallee().hasName("sink") } +} + +module Flow = TaintTracking::Global; + +from DataFlow::Node src, DataFlow::Node sink +where Flow::flow(src, sink) +select src, sink diff --git a/java/ql/test-kotlin2/library-tests/dataflow/func/coroutine_async_await.kt b/java/ql/test-kotlin2/library-tests/dataflow/func/coroutine_async_await.kt new file mode 100644 index 00000000000..c396533dee5 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/dataflow/func/coroutine_async_await.kt @@ -0,0 +1,8 @@ +import kotlinx.coroutines.* + +suspend fun fn() { + GlobalScope.launch { + val x: Deferred = async { Helper.taint() } + Helper.sink(x.await()) // TODO: not found + } +} diff --git a/java/ql/test-kotlin2/library-tests/dataflow/func/functionReference.kt b/java/ql/test-kotlin2/library-tests/dataflow/func/functionReference.kt new file mode 100644 index 00000000000..47dcbbf347a --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/dataflow/func/functionReference.kt @@ -0,0 +1,22 @@ +class FunctionReference { + + fun fn1(s: String) = s + + suspend fun test() { + fun fn2(s: String) = s + + Helper.sink(Processor().process(this::fn1, Helper.taint())) + Helper.sink(Processor().processSusp(this::fn1Susp, Helper.taint())) + Helper.sink(Processor().process(FunctionReference::fn1, this, Helper.taint())) + Helper.sink(Processor().process(this::fn1, Helper.notaint())) + Helper.sink(Processor().process(::fn2, Helper.taint())) + Helper.sink(Processor().process(::fn2, Helper.notaint())) + + Helper.sink(Processor().process(this::prop)) + } + + val prop: String + get() = Helper.taint() + + suspend fun fn1Susp(s: String) = s +} diff --git a/java/ql/test-kotlin2/library-tests/dataflow/func/kotlinx_coroutines_stubs.kt b/java/ql/test-kotlin2/library-tests/dataflow/func/kotlinx_coroutines_stubs.kt new file mode 100644 index 00000000000..3ef2c70d363 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/dataflow/func/kotlinx_coroutines_stubs.kt @@ -0,0 +1,35 @@ +/** + * Stubs for `kotlinx.coroutines` + */ + +@file:JvmName("BuildersKt") // Required for `async` + +package kotlinx.coroutines + +public interface CoroutineScope +public interface CoroutineContext +public enum class CoroutineStart { DEFAULT } +public interface Job +public interface Deferred : Job { + public suspend fun await(): T +} + +public object GlobalScope : CoroutineScope + +public fun CoroutineScope.launch( + context: CoroutineContext = null!!, + start: CoroutineStart = CoroutineStart.DEFAULT, + block: suspend CoroutineScope.() -> Unit +): Job { + return null!! +} + +public fun CoroutineScope.async( + context: CoroutineContext = null!!, + start: CoroutineStart = CoroutineStart.DEFAULT, + block: suspend CoroutineScope.() -> T +): Deferred { + return null!! +} + +// Diagnostic Matches: % Couldn't get owner of KDoc. The comment is extracted without an owner. ...while extracting a file (kotlinx_coroutines_stubs.kt) at %kotlinx_coroutines_stubs.kt:1:1:36:0% diff --git a/java/ql/test-kotlin2/library-tests/dataflow/func/lambda.kt b/java/ql/test-kotlin2/library-tests/dataflow/func/lambda.kt new file mode 100644 index 00000000000..fd57df63e51 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/dataflow/func/lambda.kt @@ -0,0 +1,33 @@ +class Lambda { + suspend fun test() { + Helper.sink(Processor().process({ it: String -> Helper.notaint() }, "")) + Helper.sink(Processor().process({ it: String -> Helper.taint() }, "")) + Helper.sink(Processor().processSusp({ it: String -> Helper.taint() }, "")) + Helper.sink(Processor().process({ i -> i }, Helper.taint())) + Helper.sink(Processor().process(fun (i: String) = i, Helper.taint())) + + Helper.sink(Processor().processExt({ i -> i }, Helper.taint(), Helper.notaint())) + Helper.sink(Processor().processExt({ i -> i }, Helper.notaint(), Helper.taint())) + Helper.sink(Processor().processExt({ i -> this }, Helper.taint(), Helper.notaint())) + Helper.sink(Processor().processExt({ i -> this }, Helper.notaint(), Helper.taint())) + + Helper.sink(Processor().process({ i0,i1,i2,i3,i4,i5,i6,i7,i8,i9,i10,i11,i12,i13,i14,i15,i16,i17,i18,i19,i20,i21,i22,i23 -> i0 }, Helper.taint(), Helper.notaint())) + Helper.sink(Processor().process({ i0,i1,i2,i3,i4,i5,i6,i7,i8,i9,i10,i11,i12,i13,i14,i15,i16,i17,i18,i19,i20,i21,i22,i23 -> i0 }, Helper.notaint(), Helper.taint())) // False positive + } +} + +class ManualBigLambda { + fun invoke(s0: String, s1: String): String { + return s0 + } + fun invoke(a: Array): String { + return invoke(a[0] as String, a[1] as String) + } + + fun call() { + Helper.sink(invoke(Helper.taint(), Helper.notaint())) + Helper.sink(invoke(Helper.notaint(), Helper.taint())) + Helper.sink(invoke(arrayOf(Helper.taint(), Helper.notaint()))) + Helper.sink(invoke(arrayOf(Helper.notaint(), Helper.taint()))) // False positive + } +} diff --git a/java/ql/test-kotlin2/library-tests/dataflow/func/localFunction.kt b/java/ql/test-kotlin2/library-tests/dataflow/func/localFunction.kt new file mode 100644 index 00000000000..655fd3a9e3a --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/dataflow/func/localFunction.kt @@ -0,0 +1,15 @@ +class LocalFunction { + suspend fun test() { + fun fn1() = Helper.taint() + fun fn2(s: String) = s + + Helper.sink(fn1()) + Helper.sink(fn2(Helper.taint())) + + suspend fun fn3() = Helper.taint() + suspend fun fn4(s: String) = s + + Helper.sink(fn3()) + Helper.sink(fn4(Helper.taint())) + } +} diff --git a/java/ql/test-kotlin2/library-tests/dataflow/func/samConversion.kt b/java/ql/test-kotlin2/library-tests/dataflow/func/samConversion.kt new file mode 100644 index 00000000000..1f49f17837c --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/dataflow/func/samConversion.kt @@ -0,0 +1,23 @@ +fun interface Predicate { + fun go(s: String): String +} + +fun interface PredicateSusp { + suspend fun go(s: String): String +} + +class SamConversion { + suspend fun test() { + val p1 = Predicate { Helper.taint() } + val p2 = Predicate { it -> it } + + Helper.sink(p1.go("")) + Helper.sink(p2.go(Helper.taint())) + + val p3 = PredicateSusp { Helper.taint() } + val p4 = PredicateSusp { it -> it } + + Helper.sink(p3.go("")) + Helper.sink(p4.go(Helper.taint())) + } +} diff --git a/java/ql/test-kotlin2/library-tests/dataflow/func/test.expected b/java/ql/test-kotlin2/library-tests/dataflow/func/test.expected new file mode 100644 index 00000000000..a9cf4d0620f --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/dataflow/func/test.expected @@ -0,0 +1,22 @@ +| functionReference.kt:8:52:8:65 | taint(...) | functionReference.kt:8:21:8:66 | process(...) | +| functionReference.kt:10:71:10:84 | taint(...) | functionReference.kt:10:21:10:85 | process(...) | +| functionReference.kt:12:48:12:61 | taint(...) | functionReference.kt:12:21:12:62 | process(...) | +| functionReference.kt:19:17:19:30 | taint(...) | functionReference.kt:15:21:15:51 | process(...) | +| lambda.kt:4:57:4:70 | taint(...) | lambda.kt:4:21:4:77 | process(...) | +| lambda.kt:6:53:6:66 | taint(...) | lambda.kt:6:21:6:67 | process(...) | +| lambda.kt:7:62:7:75 | taint(...) | lambda.kt:7:21:7:76 | process(...) | +| lambda.kt:10:74:10:87 | taint(...) | lambda.kt:10:21:10:88 | processExt(...) | +| lambda.kt:11:59:11:72 | taint(...) | lambda.kt:11:21:11:91 | processExt(...) | +| lambda.kt:14:138:14:151 | taint(...) | lambda.kt:14:21:14:170 | process(...) | +| lambda.kt:15:156:15:169 | taint(...) | lambda.kt:15:21:15:170 | process(...) | +| lambda.kt:28:28:28:41 | taint(...) | lambda.kt:28:21:28:60 | invoke(...) | +| lambda.kt:30:36:30:49 | taint(...) | lambda.kt:30:21:30:69 | invoke(...) | +| lambda.kt:31:54:31:67 | taint(...) | lambda.kt:31:21:31:69 | invoke(...) | +| localFunction.kt:3:21:3:34 | taint(...) | localFunction.kt:6:21:6:25 | fn1(...) | +| localFunction.kt:7:25:7:38 | taint(...) | localFunction.kt:7:21:7:39 | fn2(...) | +| localFunction.kt:9:29:9:42 | taint(...) | localFunction.kt:12:21:12:25 | fn3(...) | +| localFunction.kt:13:25:13:38 | taint(...) | localFunction.kt:13:21:13:39 | fn4(...) | +| samConversion.kt:11:30:11:43 | taint(...) | samConversion.kt:14:21:14:29 | go(...) | +| samConversion.kt:15:27:15:40 | taint(...) | samConversion.kt:15:21:15:41 | go(...) | +| samConversion.kt:17:34:17:47 | taint(...) | samConversion.kt:20:21:20:29 | go(...) | +| samConversion.kt:21:27:21:40 | taint(...) | samConversion.kt:21:21:21:41 | go(...) | diff --git a/java/ql/test-kotlin2/library-tests/dataflow/func/test.ql b/java/ql/test-kotlin2/library-tests/dataflow/func/test.ql new file mode 100644 index 00000000000..a9e9032fbb5 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/dataflow/func/test.ql @@ -0,0 +1,14 @@ +import java +import semmle.code.java.dataflow.TaintTracking + +module Config implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node n) { n.asExpr().(MethodCall).getMethod().hasName("taint") } + + predicate isSink(DataFlow::Node n) { n.asExpr().(Argument).getCall().getCallee().hasName("sink") } +} + +module Flow = TaintTracking::Global; + +from DataFlow::Node src, DataFlow::Node sink +where Flow::flow(src, sink) +select src, sink diff --git a/java/ql/test-kotlin2/library-tests/dataflow/func/util.kt b/java/ql/test-kotlin2/library-tests/dataflow/func/util.kt new file mode 100644 index 00000000000..aaf507e8aaf --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/dataflow/func/util.kt @@ -0,0 +1,35 @@ +class Processor { + fun process(f: () -> R1) : R1 { + return f() + } + + fun process(f: (T) -> R2, arg: T) : R2 { + return f(arg) + } + + suspend fun processSusp(f: suspend (T) -> R2, arg: T) : R2 { + return f(arg) + } + + fun process(f: (T0, T1) -> R3, arg0: T0, arg1: T1) : R3 { + return f(arg0, arg1) + } + + fun process( + f: (T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T) -> R4, + a: T, b: T) : R4 { + return f(a,b,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a) + } + + fun processExt(f: T.(T) -> R5, ext: T, arg: T) : R5 { + return ext.f(arg) + } +} + +class Helper { + companion object { + fun taint(): String = "taint" + fun notaint(): String = "notaint" + fun sink(a: Any?) { } + } +} diff --git a/java/ql/test-kotlin2/library-tests/dataflow/notnullexpr/NotNullExpr.kt b/java/ql/test-kotlin2/library-tests/dataflow/notnullexpr/NotNullExpr.kt new file mode 100644 index 00000000000..89f444d6496 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/dataflow/notnullexpr/NotNullExpr.kt @@ -0,0 +1,14 @@ +class NotNullExpr { + fun taint() = Uri() + + fun sink(s: String) { } + + fun bad() { + val s0 = taint() + sink(s0!!.getQueryParameter()) + } +} + +class Uri { + fun getQueryParameter() = "tainted" +} diff --git a/java/ql/test-kotlin2/library-tests/dataflow/notnullexpr/test.expected b/java/ql/test-kotlin2/library-tests/dataflow/notnullexpr/test.expected new file mode 100644 index 00000000000..d2a154f6b0a --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/dataflow/notnullexpr/test.expected @@ -0,0 +1 @@ +| NotNullExpr.kt:7:14:7:20 | taint(...) | NotNullExpr.kt:8:10:8:33 | getQueryParameter(...) | diff --git a/java/ql/test-kotlin2/library-tests/dataflow/notnullexpr/test.ext.yml b/java/ql/test-kotlin2/library-tests/dataflow/notnullexpr/test.ext.yml new file mode 100644 index 00000000000..700f3f51e6f --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/dataflow/notnullexpr/test.ext.yml @@ -0,0 +1,6 @@ +extensions: + - addsTo: + pack: codeql/java-all + extensible: summaryModel + data: + - ["", "Uri", False, "getQueryParameter", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] diff --git a/java/ql/test-kotlin2/library-tests/dataflow/notnullexpr/test.ql b/java/ql/test-kotlin2/library-tests/dataflow/notnullexpr/test.ql new file mode 100644 index 00000000000..a9e9032fbb5 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/dataflow/notnullexpr/test.ql @@ -0,0 +1,14 @@ +import java +import semmle.code.java.dataflow.TaintTracking + +module Config implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node n) { n.asExpr().(MethodCall).getMethod().hasName("taint") } + + predicate isSink(DataFlow::Node n) { n.asExpr().(Argument).getCall().getCallee().hasName("sink") } +} + +module Flow = TaintTracking::Global; + +from DataFlow::Node src, DataFlow::Node sink +where Flow::flow(src, sink) +select src, sink diff --git a/java/ql/test-kotlin2/library-tests/dataflow/stmtexpr/StmtExpr.kt b/java/ql/test-kotlin2/library-tests/dataflow/stmtexpr/StmtExpr.kt new file mode 100644 index 00000000000..6fe4742ff93 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/dataflow/stmtexpr/StmtExpr.kt @@ -0,0 +1,16 @@ +class StmtExpr { + fun test() { + val t = object : Source { + override fun a() { + } + } + sink(t) // $ hasValueFlow + } + + fun sink(t : Source) {} + +} + +interface Source { + fun a() +} \ No newline at end of file diff --git a/java/ql/test-kotlin2/library-tests/dataflow/stmtexpr/test.expected b/java/ql/test-kotlin2/library-tests/dataflow/stmtexpr/test.expected new file mode 100644 index 00000000000..f3e75a4522a --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/dataflow/stmtexpr/test.expected @@ -0,0 +1 @@ +| StmtExpr.kt:3:17:6:9 | new (...) | StmtExpr.kt:7:14:7:14 | t | diff --git a/java/ql/test-kotlin2/library-tests/dataflow/stmtexpr/test.ql b/java/ql/test-kotlin2/library-tests/dataflow/stmtexpr/test.ql new file mode 100644 index 00000000000..c0420a73fd6 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/dataflow/stmtexpr/test.ql @@ -0,0 +1,16 @@ +import java +import semmle.code.java.dataflow.DataFlow + +module Config implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node n) { + n.asExpr().(ClassInstanceExpr).getType().(RefType).getASupertype*().hasName("Source") + } + + predicate isSink(DataFlow::Node n) { n.asExpr().(Argument).getCall().getCallee().hasName("sink") } +} + +module Flow = DataFlow::Global; + +from DataFlow::Node src, DataFlow::Node sink +where Flow::flow(src, sink) +select src, sink diff --git a/java/ql/test-kotlin2/library-tests/dataflow/summaries/apply.expected b/java/ql/test-kotlin2/library-tests/dataflow/summaries/apply.expected new file mode 100644 index 00000000000..62e8d2b0ff5 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/dataflow/summaries/apply.expected @@ -0,0 +1,2 @@ +| apply.kt:6:9:6:41 | apply(...) | +| apply.kt:7:14:7:40 | apply(...) | diff --git a/java/ql/test-kotlin2/library-tests/dataflow/summaries/apply.kt b/java/ql/test-kotlin2/library-tests/dataflow/summaries/apply.kt new file mode 100644 index 00000000000..8d5373d081f --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/dataflow/summaries/apply.kt @@ -0,0 +1,9 @@ +class ApplyFlowTest { + fun taint(t: T) = t + fun sink(s: String) { } + + fun test(input: String) { + taint(input).apply { sink(this) } // $ hasValueFlow + sink(taint(input).apply { this }) // $ hasValueFlow + } +} diff --git a/java/ql/test-kotlin2/library-tests/dataflow/summaries/apply.ql b/java/ql/test-kotlin2/library-tests/dataflow/summaries/apply.ql new file mode 100644 index 00000000000..540cea703f0 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/dataflow/summaries/apply.ql @@ -0,0 +1,5 @@ +import java +import semmle.code.java.frameworks.kotlin.Kotlin + +from KotlinApply a +select a diff --git a/java/ql/test-kotlin2/library-tests/dataflow/summaries/list.kt b/java/ql/test-kotlin2/library-tests/dataflow/summaries/list.kt new file mode 100644 index 00000000000..31353295182 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/dataflow/summaries/list.kt @@ -0,0 +1,20 @@ +class ListFlowTest { + fun taint(t: T) = t + fun sink(a: Any) {} + + fun test(l: MutableList) { + l[0] = taint("a") + sink(l) // $ hasTaintFlow=a + sink(l[0]) // $ hasValueFlow=a + for (s in l) { + sink(s) // $ hasValueFlow=a + } + + val a = arrayOf(taint("b"), "c") + sink(a) // $ hasTaintFlow=b + sink(a[0]) // $ hasValueFlow=b + for (s in a) { + sink(s) // $ hasValueFlow=b + } + } +} diff --git a/java/ql/test-kotlin2/library-tests/dataflow/summaries/test.expected b/java/ql/test-kotlin2/library-tests/dataflow/summaries/test.expected new file mode 100644 index 00000000000..f566914ba89 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/dataflow/summaries/test.expected @@ -0,0 +1,5 @@ +| test.kt:28:14:28:21 | getSecond(...) | Unexpected result: hasTaintFlow=a | +| test.kt:35:14:35:27 | component1(...) | Unexpected result: hasTaintFlow=d | +| test.kt:41:14:41:22 | getSecond(...) | Unexpected result: hasTaintFlow=e | +| test.kt:53:14:53:24 | getDuration(...) | Unexpected result: hasTaintFlow=f | +| test.kt:58:14:58:29 | component2(...) | Unexpected result: hasTaintFlow=g | diff --git a/java/ql/test-kotlin2/library-tests/dataflow/summaries/test.kt b/java/ql/test-kotlin2/library-tests/dataflow/summaries/test.kt new file mode 100644 index 00000000000..6b41ab26557 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/dataflow/summaries/test.kt @@ -0,0 +1,75 @@ +import kotlin.time.Duration +import kotlin.time.ExperimentalTime +import kotlin.time.TimedValue + +class Test { + fun taint(t: T) = t + fun sink(a: Any) {} + + @OptIn(ExperimentalTime::class) + fun test(b: ByteArray, + f: kotlin.io.FileTreeWalk, + c1: CharArray, + c2: CharArray, + c3: CharArray,) { + + sink(taint(b).copyOf()) // $ hasTaintFlow + sink(taint(f).maxDepth(1)) // $ hasTaintFlow + + val sb = StringBuilder() + sink(sb.insertRange(0, taint(c1), 0, 0)) // $ hasTaintFlow + sink(sb) // $ hasTaintFlow + + sink(taint(c2) + c3) // $ hasTaintFlow + + val p = Pair(taint("a"), "") + sink(p) // $ hasTaintFlow=a + sink(p.component1()) // $ hasTaintFlow=a + sink(p.second) + + sink(taint("b").capitalize()) // $ hasTaintFlow=b + sink(taint("c").replaceFirstChar { _ -> 'x' }) // $ hasTaintFlow=c + + val t = Triple("", taint("d"), "") + sink(t) // $ hasTaintFlow=d + sink(t.component1()) + sink(t.second) // $ hasTaintFlow=d + + val p1 = taint("e") to "" + sink(p1) // $ hasTaintFlow=e + sink(p1.component1()) // $ hasTaintFlow=e + sink(p1.second) + + val l = p.toList() + sink(l) // $ hasTaintFlow=a + sink(l[0]) // $ hasTaintFlow=a + for (s in l) { + sink(s) // $ hasTaintFlow=a + } + + val tv = TimedValue(taint("f"), Duration.parse("")) + sink(tv) // $ hasTaintFlow=f + sink(tv.component1()) // $ hasTaintFlow=f + sink(tv.duration) + + val mg0 = MatchGroup(taint("g"), IntRange(0, 10)) + sink(mg0) // $ hasTaintFlow=g + sink(mg0.value) // $ hasTaintFlow=g + sink(mg0.component2()) + + val iv = IndexedValue(5, taint("h")) + sink(iv) // $ hasTaintFlow=h + sink(iv.index) + sink(iv.component2()) // $ hasTaintFlow=h + + val strings = arrayOf("", taint("i")) + sink(strings.withIndex()) // $ hasTaintFlow=i + sink(strings.withIndex().toList()) // $ hasTaintFlow=i + sink(strings.withIndex().toList()[0].value) // $ hasTaintFlow=i + sink(strings.withIndex().toList()[0].index) + for (x in strings.withIndex()) { + sink(x.value) // $ hasTaintFlow=i + sink(x.index) + } + } +} \ No newline at end of file diff --git a/java/ql/test-kotlin2/library-tests/dataflow/summaries/test.ql b/java/ql/test-kotlin2/library-tests/dataflow/summaries/test.ql new file mode 100644 index 00000000000..aca87429a3a --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/dataflow/summaries/test.ql @@ -0,0 +1,3 @@ +import java +import TestUtilities.InlineFlowTest +import DefaultFlowTest diff --git a/java/ql/test-kotlin2/library-tests/dataflow/summaries/use.kt b/java/ql/test-kotlin2/library-tests/dataflow/summaries/use.kt new file mode 100644 index 00000000000..07beffd2be2 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/dataflow/summaries/use.kt @@ -0,0 +1,11 @@ +import java.io.Closeable + +class UseFlowTest { + fun taint(t: T) = t + fun sink(s: Closeable) { } + + fun test(input: Closeable) { + taint(input).use { it -> sink(it) } // $ hasValueFlow + sink(taint(input).use { it }) // $ hasValueFlow + } +} diff --git a/java/ql/test-kotlin2/library-tests/dataflow/summaries/with.kt b/java/ql/test-kotlin2/library-tests/dataflow/summaries/with.kt new file mode 100644 index 00000000000..d495f95c854 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/dataflow/summaries/with.kt @@ -0,0 +1,9 @@ +class WithFlowTest { + fun taint(t: T) = t + fun sink(s: String) { } + + fun test(input: String) { + with(taint(input)) { sink(this) } // $ hasValueFlow + sink(with(taint(input)) { this }) // $ hasValueFlow + } +} diff --git a/java/ql/test-kotlin2/library-tests/dataflow/taint/StringTemplate.kt b/java/ql/test-kotlin2/library-tests/dataflow/taint/StringTemplate.kt new file mode 100644 index 00000000000..5a65e5081cb --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/dataflow/taint/StringTemplate.kt @@ -0,0 +1,11 @@ +class StringTemplateTests { + fun taint() = "tainted" + + fun sink(s: String) { } + + fun bad() { + val s0 = taint() + val s1 = "test $s0" + sink(s1) + } +} diff --git a/java/ql/test-kotlin2/library-tests/dataflow/taint/test.expected b/java/ql/test-kotlin2/library-tests/dataflow/taint/test.expected new file mode 100644 index 00000000000..5b2dd366bad --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/dataflow/taint/test.expected @@ -0,0 +1 @@ +| StringTemplate.kt:7:14:7:20 | taint(...) | StringTemplate.kt:9:10:9:11 | s1 | diff --git a/java/ql/test-kotlin2/library-tests/dataflow/taint/test.ql b/java/ql/test-kotlin2/library-tests/dataflow/taint/test.ql new file mode 100644 index 00000000000..a9e9032fbb5 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/dataflow/taint/test.ql @@ -0,0 +1,14 @@ +import java +import semmle.code.java.dataflow.TaintTracking + +module Config implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node n) { n.asExpr().(MethodCall).getMethod().hasName("taint") } + + predicate isSink(DataFlow::Node n) { n.asExpr().(Argument).getCall().getCallee().hasName("sink") } +} + +module Flow = TaintTracking::Global; + +from DataFlow::Node src, DataFlow::Node sink +where Flow::flow(src, sink) +select src, sink diff --git a/java/ql/test-kotlin2/library-tests/dataflow/whenexpr/WhenExpr.kt b/java/ql/test-kotlin2/library-tests/dataflow/whenexpr/WhenExpr.kt new file mode 100644 index 00000000000..595299bc45b --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/dataflow/whenexpr/WhenExpr.kt @@ -0,0 +1,14 @@ +class WhenExpr { + fun taint() = Uri() + + fun sink(s: String?) { } + + fun bad(b: Boolean) { + val s0 = if (b) taint() else null + sink(s0?.getQueryParameter()) + } +} + +class Uri { + fun getQueryParameter() = "tainted" +} diff --git a/java/ql/test-kotlin2/library-tests/dataflow/whenexpr/test.expected b/java/ql/test-kotlin2/library-tests/dataflow/whenexpr/test.expected new file mode 100644 index 00000000000..1ab2f8d67d8 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/dataflow/whenexpr/test.expected @@ -0,0 +1 @@ +| WhenExpr.kt:7:21:7:27 | taint(...) | WhenExpr.kt:8:14:8:32 | | diff --git a/java/ql/test-kotlin2/library-tests/dataflow/whenexpr/test.ext.yml b/java/ql/test-kotlin2/library-tests/dataflow/whenexpr/test.ext.yml new file mode 100644 index 00000000000..700f3f51e6f --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/dataflow/whenexpr/test.ext.yml @@ -0,0 +1,6 @@ +extensions: + - addsTo: + pack: codeql/java-all + extensible: summaryModel + data: + - ["", "Uri", False, "getQueryParameter", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] diff --git a/java/ql/test-kotlin2/library-tests/dataflow/whenexpr/test.ql b/java/ql/test-kotlin2/library-tests/dataflow/whenexpr/test.ql new file mode 100644 index 00000000000..a9e9032fbb5 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/dataflow/whenexpr/test.ql @@ -0,0 +1,14 @@ +import java +import semmle.code.java.dataflow.TaintTracking + +module Config implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node n) { n.asExpr().(MethodCall).getMethod().hasName("taint") } + + predicate isSink(DataFlow::Node n) { n.asExpr().(Argument).getCall().getCallee().hasName("sink") } +} + +module Flow = TaintTracking::Global; + +from DataFlow::Node src, DataFlow::Node sink +where Flow::flow(src, sink) +select src, sink diff --git a/java/ql/test-kotlin2/library-tests/declaration-stack/Test.kt b/java/ql/test-kotlin2/library-tests/declaration-stack/Test.kt new file mode 100644 index 00000000000..129a35c0a29 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/declaration-stack/Test.kt @@ -0,0 +1,5 @@ +abstract class Base(func:() -> Unit = {}) { } + +class Derived : Base({ + data class Dc(val foo: String) +}) diff --git a/java/ql/test-kotlin2/library-tests/declaration-stack/test.expected b/java/ql/test-kotlin2/library-tests/declaration-stack/test.expected new file mode 100644 index 00000000000..e69de29bb2d diff --git a/java/ql/test-kotlin2/library-tests/declaration-stack/test.ql b/java/ql/test-kotlin2/library-tests/declaration-stack/test.ql new file mode 100644 index 00000000000..7762d11c8f7 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/declaration-stack/test.ql @@ -0,0 +1,5 @@ +import java +import semmle.code.java.Diagnostics + +from Diagnostic d +select d diff --git a/java/ql/test-kotlin2/library-tests/empty/Empty.kt b/java/ql/test-kotlin2/library-tests/empty/Empty.kt new file mode 100644 index 00000000000..e69de29bb2d diff --git a/java/ql/test-kotlin2/library-tests/empty/elements.expected b/java/ql/test-kotlin2/library-tests/empty/elements.expected new file mode 100644 index 00000000000..d4bd7ad82ce --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/empty/elements.expected @@ -0,0 +1,2 @@ +| Empty.kt:0:0:0:0 | Empty | CompilationUnit | +| file://:0:0:0:0 | | Package | diff --git a/java/ql/test-kotlin2/library-tests/empty/elements.ql b/java/ql/test-kotlin2/library-tests/empty/elements.ql new file mode 100644 index 00000000000..3b6a6e1b982 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/empty/elements.ql @@ -0,0 +1,4 @@ +import java + +from Element e +select e, e.getPrimaryQlClasses() diff --git a/java/ql/test-kotlin2/library-tests/enum/enumUser.kt b/java/ql/test-kotlin2/library-tests/enum/enumUser.kt new file mode 100644 index 00000000000..c684d2d1998 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/enum/enumUser.kt @@ -0,0 +1,3 @@ +fun usesEnum(e: Enum<*>) = e.ordinal.toString() + e.name + +enum class E { A, B, C } diff --git a/java/ql/test-kotlin2/library-tests/enum/test.expected b/java/ql/test-kotlin2/library-tests/enum/test.expected new file mode 100644 index 00000000000..b8be8ed4152 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/enum/test.expected @@ -0,0 +1,37 @@ +#select +| addAll | +| addRange | +| allOf | +| asIterator | +| clone | +| compareTo | +| complement | +| complementOf | +| copyOf | +| describeConstable | +| equals | +| finalize | +| forEach | +| getDeclaringClass | +| hasMoreElements | +| hashCode | +| name | +| nextElement | +| noneOf | +| of | +| ordinal | +| parallelStream | +| range | +| resolveConstantDesc | +| spliterator | +| stream | +| toArray | +| toString | +| typeCheck | +| usesEnum | +| valueOf | +| writeReplace | +enumConstants +| enumUser.kt:3:16:3:17 | A | +| enumUser.kt:3:19:3:20 | B | +| enumUser.kt:3:22:3:22 | C | diff --git a/java/ql/test-kotlin2/library-tests/enum/test.ql b/java/ql/test-kotlin2/library-tests/enum/test.ql new file mode 100644 index 00000000000..8d83314e5c3 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/enum/test.ql @@ -0,0 +1,7 @@ +import java + +from Method m +where m.getDeclaringType().getName().matches("Enum%") +select m.getName() + +query predicate enumConstants(EnumConstant ec) { ec.fromSource() } diff --git a/java/ql/test-kotlin2/library-tests/exprs/PrintAst.expected b/java/ql/test-kotlin2/library-tests/exprs/PrintAst.expected new file mode 100644 index 00000000000..41f235c1efd --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/exprs/PrintAst.expected @@ -0,0 +1,7071 @@ +delegatedProperties.kt: +# 0| [CompilationUnit] delegatedProperties +# 0| 1: [Class] DelegatedPropertiesKt +# 60| 2: [Method] getTopLevelInt +# 60| 3: [TypeAccess] int +# 60| 5: [BlockStmt] { ... } +# 60| 0: [ReturnStmt] return ... +# 60| 0: [VarAccess] DelegatedPropertiesKt.topLevelInt +# 60| -1: [TypeAccess] DelegatedPropertiesKt +# 60| 3: [FieldDeclaration] int topLevelInt; +# 60| -1: [TypeAccess] int +# 60| 0: [IntegerLiteral] 0 +# 60| 4: [Method] setTopLevelInt +# 60| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 60| 0: [Parameter] +# 60| 0: [TypeAccess] int +# 60| 5: [BlockStmt] { ... } +# 60| 0: [ExprStmt] ; +# 60| 0: [AssignExpr] ...=... +# 60| 0: [VarAccess] DelegatedPropertiesKt.topLevelInt +# 60| -1: [TypeAccess] DelegatedPropertiesKt +# 60| 1: [VarAccess] +# 87| 5: [FieldDeclaration] KMutableProperty0 extDelegated$delegateMyClass; +# 87| -1: [TypeAccess] KMutableProperty0 +# 87| 0: [TypeAccess] Integer +# 87| 0: [PropertyRefExpr] ...::... +# 87| -4: [AnonymousClass] new KMutableProperty0(...) { ... } +# 87| 1: [Constructor] +# 87| 5: [BlockStmt] { ... } +# 87| 0: [SuperConstructorInvocationStmt] super(...) +# 87| 2: [Method] get +# 87| 5: [BlockStmt] { ... } +# 87| 0: [ReturnStmt] return ... +# 87| 0: [MethodCall] getTopLevelInt(...) +# 87| -1: [TypeAccess] DelegatedPropertiesKt +# 87| 3: [Method] invoke +# 87| 5: [BlockStmt] { ... } +# 87| 0: [ReturnStmt] return ... +# 87| 0: [MethodCall] get(...) +# 87| -1: [ThisAccess] this +# 87| 4: [Method] set +#-----| 4: (Parameters) +# 87| 0: [Parameter] a0 +# 87| 5: [BlockStmt] { ... } +# 87| 0: [ReturnStmt] return ... +# 87| 0: [MethodCall] setTopLevelInt(...) +# 87| -1: [TypeAccess] DelegatedPropertiesKt +# 87| 0: [VarAccess] a0 +# 87| -3: [TypeAccess] KMutableProperty0 +# 87| 0: [TypeAccess] Integer +# 87| 6: [ExtensionMethod] getExtDelegated +# 87| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 87| 0: [Parameter] +# 87| 0: [TypeAccess] MyClass +# 87| 5: [BlockStmt] { ... } +# 87| 0: [ReturnStmt] return ... +# 87| 0: [MethodCall] getValue(...) +# 87| -2: [TypeAccess] Integer +# 87| -1: [TypeAccess] PropertyReferenceDelegatesKt +# 87| 0: [VarAccess] DelegatedPropertiesKt.extDelegated$delegateMyClass +# 87| -1: [TypeAccess] DelegatedPropertiesKt +# 1| 1: [ExtensionReceiverAccess] this +# 87| 2: [PropertyRefExpr] ...::... +# 87| -4: [AnonymousClass] new KMutableProperty1(...) { ... } +# 87| 1: [Constructor] +# 87| 5: [BlockStmt] { ... } +# 87| 0: [SuperConstructorInvocationStmt] super(...) +# 87| 2: [Method] get +#-----| 4: (Parameters) +# 87| 0: [Parameter] a0 +# 87| 5: [BlockStmt] { ... } +# 87| 0: [ReturnStmt] return ... +# 87| 0: [MethodCall] getExtDelegated(...) +# 87| -1: [TypeAccess] DelegatedPropertiesKt +# 87| 0: [VarAccess] a0 +# 87| 3: [Method] invoke +#-----| 4: (Parameters) +# 87| 0: [Parameter] a0 +# 87| 5: [BlockStmt] { ... } +# 87| 0: [ReturnStmt] return ... +# 87| 0: [MethodCall] get(...) +# 87| -1: [ThisAccess] this +# 87| 0: [VarAccess] a0 +# 87| 4: [Method] set +#-----| 4: (Parameters) +# 87| 0: [Parameter] a0 +# 87| 1: [Parameter] a1 +# 87| 5: [BlockStmt] { ... } +# 87| 0: [ReturnStmt] return ... +# 87| 0: [MethodCall] setExtDelegated(...) +# 87| -1: [TypeAccess] DelegatedPropertiesKt +# 87| 0: [VarAccess] a0 +# 87| 1: [VarAccess] a1 +# 87| -3: [TypeAccess] KMutableProperty1 +# 87| 0: [TypeAccess] MyClass +# 87| 1: [TypeAccess] Integer +# 87| 7: [ExtensionMethod] setExtDelegated +# 87| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 87| 0: [Parameter] +# 87| 0: [TypeAccess] MyClass +# 87| 1: [Parameter] +# 87| 0: [TypeAccess] int +# 87| 5: [BlockStmt] { ... } +# 87| 0: [ReturnStmt] return ... +# 87| 0: [MethodCall] setValue(...) +# 87| -2: [TypeAccess] Integer +# 87| -1: [TypeAccess] PropertyReferenceDelegatesKt +# 87| 0: [VarAccess] DelegatedPropertiesKt.extDelegated$delegateMyClass +# 87| -1: [TypeAccess] DelegatedPropertiesKt +# 1| 1: [ExtensionReceiverAccess] this +# 87| 2: [PropertyRefExpr] ...::... +# 87| -4: [AnonymousClass] new KMutableProperty1(...) { ... } +# 87| 1: [Constructor] +# 87| 5: [BlockStmt] { ... } +# 87| 0: [SuperConstructorInvocationStmt] super(...) +# 87| 2: [Method] get +#-----| 4: (Parameters) +# 87| 0: [Parameter] a0 +# 87| 5: [BlockStmt] { ... } +# 87| 0: [ReturnStmt] return ... +# 87| 0: [MethodCall] getExtDelegated(...) +# 87| -1: [TypeAccess] DelegatedPropertiesKt +# 87| 0: [VarAccess] a0 +# 87| 3: [Method] invoke +#-----| 4: (Parameters) +# 87| 0: [Parameter] a0 +# 87| 5: [BlockStmt] { ... } +# 87| 0: [ReturnStmt] return ... +# 87| 0: [MethodCall] get(...) +# 87| -1: [ThisAccess] this +# 87| 0: [VarAccess] a0 +# 87| 4: [Method] set +#-----| 4: (Parameters) +# 87| 0: [Parameter] a0 +# 87| 1: [Parameter] a1 +# 87| 5: [BlockStmt] { ... } +# 87| 0: [ReturnStmt] return ... +# 87| 0: [MethodCall] setExtDelegated(...) +# 87| -1: [TypeAccess] DelegatedPropertiesKt +# 87| 0: [VarAccess] a0 +# 87| 1: [VarAccess] a1 +# 87| -3: [TypeAccess] KMutableProperty1 +# 87| 0: [TypeAccess] MyClass +# 87| 1: [TypeAccess] Integer +# 87| 3: [VarAccess] +# 4| 2: [Class] ClassProp1 +# 4| 1: [Constructor] ClassProp1 +# 4| 5: [BlockStmt] { ... } +# 4| 0: [SuperConstructorInvocationStmt] super(...) +# 4| 1: [BlockStmt] { ... } +# 5| 2: [Method] fn +# 5| 3: [TypeAccess] Unit +# 5| 5: [BlockStmt] { ... } +# 6| 0: [BlockStmt] { ... } +# 6| 0: [LocalVariableDeclStmt] var ...; +# 6| 1: [LocalVariableDeclExpr] prop1$delegate +# 6| 0: [MethodCall] lazy(...) +# 6| -2: [TypeAccess] Integer +# 6| -1: [TypeAccess] LazyKt +# 6| 0: [LambdaExpr] ...->... +# 6| -4: [AnonymousClass] new Function0(...) { ... } +# 6| 1: [Constructor] +# 6| 5: [BlockStmt] { ... } +# 6| 0: [SuperConstructorInvocationStmt] super(...) +# 6| 2: [Method] invoke +# 6| 3: [TypeAccess] int +# 7| 5: [BlockStmt] { ... } +# 7| 0: [ExprStmt] ; +# 7| 0: [MethodCall] println(...) +# 7| -1: [TypeAccess] ConsoleKt +# 7| 0: [StringLiteral] "init" +# 8| 1: [ReturnStmt] return ... +# 8| 0: [IntegerLiteral] 5 +# 6| -3: [TypeAccess] Function0 +# 6| 0: [TypeAccess] Integer +# 6| 1: [LocalTypeDeclStmt] class ... +# 6| 0: [LocalClass] +# 6| 1: [Constructor] +# 6| 5: [BlockStmt] { ... } +# 6| 0: [SuperConstructorInvocationStmt] super(...) +# 6| 2: [Method] +# 6| 3: [TypeAccess] int +# 6| 5: [BlockStmt] { ... } +# 6| 0: [ReturnStmt] return ... +# 6| 0: [MethodCall] getValue(...) +# 6| -2: [TypeAccess] Integer +# 6| -1: [TypeAccess] LazyKt +# 6| 0: [VarAccess] prop1$delegate +# 0| 1: [NullLiteral] null +# 6| 2: [PropertyRefExpr] ...::... +# 6| -4: [AnonymousClass] new KProperty0(...) { ... } +# 6| 1: [Constructor] +# 6| 5: [BlockStmt] { ... } +# 6| 0: [SuperConstructorInvocationStmt] super(...) +# 6| 2: [Method] get +# 6| 5: [BlockStmt] { ... } +# 6| 0: [ReturnStmt] return ... +# 6| 0: [MethodCall] (...) +# 6| -1: [ClassInstanceExpr] new (...) +# 6| -3: [TypeAccess] Object +# 6| 3: [Method] invoke +# 6| 5: [BlockStmt] { ... } +# 6| 0: [ReturnStmt] return ... +# 6| 0: [MethodCall] get(...) +# 6| -1: [ThisAccess] this +# 6| -3: [TypeAccess] KProperty0 +# 6| 0: [TypeAccess] Integer +# 10| 1: [ExprStmt] ; +# 10| 0: [MethodCall] println(...) +# 10| -1: [TypeAccess] ConsoleKt +# 10| 0: [MethodCall] (...) +# 10| -1: [ClassInstanceExpr] new (...) +# 10| -3: [TypeAccess] Object +# 11| 2: [ExprStmt] ; +# 11| 0: [MethodCall] println(...) +# 11| -1: [TypeAccess] ConsoleKt +# 11| 0: [MethodCall] (...) +# 11| -1: [ClassInstanceExpr] new (...) +# 11| -3: [TypeAccess] Object +# 15| 3: [Class] Resource +# 15| 1: [Constructor] Resource +# 15| 5: [BlockStmt] { ... } +# 15| 0: [SuperConstructorInvocationStmt] super(...) +# 15| 1: [BlockStmt] { ... } +# 17| 4: [Class] Owner +# 17| 1: [Constructor] Owner +# 17| 5: [BlockStmt] { ... } +# 17| 0: [SuperConstructorInvocationStmt] super(...) +# 17| 1: [BlockStmt] { ... } +# 42| 0: [ExprStmt] ; +# 42| 0: [KtInitializerAssignExpr] ...=... +# 42| 0: [VarAccess] varResource0$delegate +# 18| 2: [Method] fn +# 18| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 18| 0: [Parameter] map +# 18| 0: [TypeAccess] Map +# 18| 0: [TypeAccess] String +# 18| 1: [WildcardTypeAccess] ? ... +# 18| 0: [TypeAccess] Object +# 18| 5: [BlockStmt] { ... } +# 19| 0: [BlockStmt] { ... } +# 19| 0: [LocalVariableDeclStmt] var ...; +# 19| 1: [LocalVariableDeclExpr] varResource1$delegate +# 19| 0: [ClassInstanceExpr] new ResourceDelegate(...) +# 19| -3: [TypeAccess] ResourceDelegate +# 19| 1: [LocalTypeDeclStmt] class ... +# 19| 0: [LocalClass] +# 19| 1: [Constructor] +# 19| 5: [BlockStmt] { ... } +# 19| 0: [SuperConstructorInvocationStmt] super(...) +# 19| 2: [Method] +# 19| 3: [TypeAccess] int +# 19| 5: [BlockStmt] { ... } +# 19| 0: [ReturnStmt] return ... +# 19| 0: [MethodCall] getValue(...) +# 19| -1: [VarAccess] varResource1$delegate +# 0| 0: [NullLiteral] null +# 19| 1: [PropertyRefExpr] ...::... +# 19| -4: [AnonymousClass] new KMutableProperty0(...) { ... } +# 19| 1: [Constructor] +# 19| 5: [BlockStmt] { ... } +# 19| 0: [SuperConstructorInvocationStmt] super(...) +# 19| 2: [Method] get +# 19| 5: [BlockStmt] { ... } +# 19| 0: [ReturnStmt] return ... +# 19| 0: [MethodCall] (...) +# 19| -1: [ClassInstanceExpr] new (...) +# 19| -3: [TypeAccess] Object +# 19| 3: [Method] invoke +# 19| 5: [BlockStmt] { ... } +# 19| 0: [ReturnStmt] return ... +# 19| 0: [MethodCall] get(...) +# 19| -1: [ThisAccess] this +# 19| 4: [Method] set +#-----| 4: (Parameters) +# 19| 0: [Parameter] a0 +# 19| 5: [BlockStmt] { ... } +# 19| 0: [ReturnStmt] return ... +# 19| 0: [MethodCall] (...) +# 19| -1: [ClassInstanceExpr] new (...) +# 19| -3: [TypeAccess] Object +# 19| 0: [VarAccess] a0 +# 19| -3: [TypeAccess] KMutableProperty0 +# 19| 0: [TypeAccess] Integer +# 19| 2: [LocalTypeDeclStmt] class ... +# 19| 0: [LocalClass] +# 19| 1: [Constructor] +# 19| 5: [BlockStmt] { ... } +# 19| 0: [SuperConstructorInvocationStmt] super(...) +# 19| 2: [Method] +# 19| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 19| 0: [Parameter] value +# 19| 0: [TypeAccess] int +# 19| 5: [BlockStmt] { ... } +# 19| 0: [ReturnStmt] return ... +# 19| 0: [MethodCall] setValue(...) +# 19| -1: [VarAccess] varResource1$delegate +# 0| 0: [NullLiteral] null +# 19| 1: [PropertyRefExpr] ...::... +# 19| -4: [AnonymousClass] new KMutableProperty0(...) { ... } +# 19| 1: [Constructor] +# 19| 5: [BlockStmt] { ... } +# 19| 0: [SuperConstructorInvocationStmt] super(...) +# 19| 2: [Method] get +# 19| 5: [BlockStmt] { ... } +# 19| 0: [ReturnStmt] return ... +# 19| 0: [MethodCall] (...) +# 19| -1: [ClassInstanceExpr] new (...) +# 19| -3: [TypeAccess] Object +# 19| 3: [Method] invoke +# 19| 5: [BlockStmt] { ... } +# 19| 0: [ReturnStmt] return ... +# 19| 0: [MethodCall] get(...) +# 19| -1: [ThisAccess] this +# 19| 4: [Method] set +#-----| 4: (Parameters) +# 19| 0: [Parameter] a0 +# 19| 5: [BlockStmt] { ... } +# 19| 0: [ReturnStmt] return ... +# 19| 0: [MethodCall] (...) +# 19| -1: [ClassInstanceExpr] new (...) +# 19| -3: [TypeAccess] Object +# 19| 0: [VarAccess] a0 +# 19| -3: [TypeAccess] KMutableProperty0 +# 19| 0: [TypeAccess] Integer +# 19| 2: [VarAccess] value +# 20| 1: [ExprStmt] ; +# 20| 0: [MethodCall] println(...) +# 20| -1: [TypeAccess] ConsoleKt +# 20| 0: [MethodCall] (...) +# 20| -1: [ClassInstanceExpr] new (...) +# 20| -3: [TypeAccess] Object +# 21| 2: [ExprStmt] ; +# 21| 0: [MethodCall] (...) +# 21| -1: [ClassInstanceExpr] new (...) +# 21| -3: [TypeAccess] Object +# 21| 0: [IntegerLiteral] 2 +# 23| 3: [BlockStmt] { ... } +# 23| 0: [LocalVariableDeclStmt] var ...; +# 23| 1: [LocalVariableDeclExpr] name$delegate +# 23| 0: [VarAccess] map +# 23| 1: [LocalTypeDeclStmt] class ... +# 23| 0: [LocalClass] +# 23| 1: [Constructor] +# 23| 5: [BlockStmt] { ... } +# 23| 0: [SuperConstructorInvocationStmt] super(...) +# 23| 2: [Method] +# 23| 3: [TypeAccess] String +# 23| 5: [BlockStmt] { ... } +# 23| 0: [ReturnStmt] return ... +# 23| 0: [MethodCall] getValue(...) +# 23| -3: [TypeAccess] String +# 23| -2: [TypeAccess] Object +# 23| -1: [TypeAccess] MapAccessorsKt +# 23| 0: [VarAccess] name$delegate +# 0| 1: [NullLiteral] null +# 23| 2: [PropertyRefExpr] ...::... +# 23| -4: [AnonymousClass] new KProperty0(...) { ... } +# 23| 1: [Constructor] +# 23| 5: [BlockStmt] { ... } +# 23| 0: [SuperConstructorInvocationStmt] super(...) +# 23| 2: [Method] get +# 23| 5: [BlockStmt] { ... } +# 23| 0: [ReturnStmt] return ... +# 23| 0: [MethodCall] (...) +# 23| -1: [ClassInstanceExpr] new (...) +# 23| -3: [TypeAccess] Object +# 23| 3: [Method] invoke +# 23| 5: [BlockStmt] { ... } +# 23| 0: [ReturnStmt] return ... +# 23| 0: [MethodCall] get(...) +# 23| -1: [ThisAccess] this +# 23| -3: [TypeAccess] KProperty0 +# 23| 0: [TypeAccess] String +# 25| 4: [LocalTypeDeclStmt] class ... +# 25| 0: [LocalClass] +# 25| 1: [Constructor] +# 25| 5: [BlockStmt] { ... } +# 25| 0: [SuperConstructorInvocationStmt] super(...) +# 25| 2: [Method] resourceDelegate +# 25| 3: [TypeAccess] ReadWriteProperty +# 25| 0: [TypeAccess] Object +# 25| 1: [TypeAccess] Integer +# 25| 5: [BlockStmt] { ... } +# 31| 0: [ReturnStmt] return ... +# 25| 0: [StmtExpr] +# 25| 0: [BlockStmt] { ... } +# 25| 0: [LocalTypeDeclStmt] class ... +# 25| 0: [AnonymousClass,LocalClass] new ReadWriteProperty(...) { ... } +# 25| 1: [Constructor] +# 25| 5: [BlockStmt] { ... } +# 25| 0: [SuperConstructorInvocationStmt] super(...) +# 25| 1: [BlockStmt] { ... } +# 26| 0: [ExprStmt] ; +# 26| 0: [KtInitializerAssignExpr] ...=... +# 26| 0: [VarAccess] curValue +# 26| 2: [Method] getCurValue +# 26| 3: [TypeAccess] int +# 26| 5: [BlockStmt] { ... } +# 26| 0: [ReturnStmt] return ... +# 26| 0: [VarAccess] this.curValue +# 26| -1: [ThisAccess] this +# 26| 3: [FieldDeclaration] int curValue; +# 26| -1: [TypeAccess] int +# 26| 0: [IntegerLiteral] 0 +# 26| 4: [Method] setCurValue +# 26| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 26| 0: [Parameter] +# 26| 0: [TypeAccess] int +# 26| 5: [BlockStmt] { ... } +# 26| 0: [ExprStmt] ; +# 26| 0: [AssignExpr] ...=... +# 26| 0: [VarAccess] this.curValue +# 26| -1: [ThisAccess] this +# 26| 1: [VarAccess] +# 27| 5: [Method] getValue +# 27| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 27| 0: [Parameter] thisRef +# 27| 0: [TypeAccess] Object +# 27| 1: [Parameter] property +# 27| 0: [TypeAccess] KProperty +# 27| 0: [WildcardTypeAccess] ? ... +# 27| 5: [BlockStmt] { ... } +# 27| 0: [ReturnStmt] return ... +# 27| 0: [MethodCall] getCurValue(...) +# 27| -1: [ThisAccess] this +# 28| 6: [Method] setValue +# 28| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 28| 0: [Parameter] thisRef +# 28| 0: [TypeAccess] Object +# 28| 1: [Parameter] property +# 28| 0: [TypeAccess] KProperty +# 28| 0: [WildcardTypeAccess] ? ... +# 28| 2: [Parameter] value +# 28| 0: [TypeAccess] int +# 28| 5: [BlockStmt] { ... } +# 29| 0: [ExprStmt] ; +# 29| 0: [MethodCall] setCurValue(...) +# 29| -1: [ThisAccess] this +# 29| 0: [VarAccess] value +# 25| 1: [ExprStmt] ; +# 25| 0: [ClassInstanceExpr] new (...) +# 25| -3: [TypeAccess] ReadWriteProperty +# 33| 5: [BlockStmt] { ... } +# 33| 0: [LocalVariableDeclStmt] var ...; +# 33| 1: [LocalVariableDeclExpr] readOnly$delegate +# 33| 0: [MethodCall] resourceDelegate(...) +# 33| -1: [ClassInstanceExpr] new (...) +# 33| -3: [TypeAccess] Object +# 33| 1: [LocalTypeDeclStmt] class ... +# 33| 0: [LocalClass] +# 33| 1: [Constructor] +# 33| 5: [BlockStmt] { ... } +# 33| 0: [SuperConstructorInvocationStmt] super(...) +# 33| 2: [Method] +# 33| 3: [TypeAccess] int +# 33| 5: [BlockStmt] { ... } +# 33| 0: [ReturnStmt] return ... +# 33| 0: [MethodCall] getValue(...) +# 33| -1: [VarAccess] readOnly$delegate +# 0| 0: [NullLiteral] null +# 33| 1: [PropertyRefExpr] ...::... +# 33| -4: [AnonymousClass] new KProperty0(...) { ... } +# 33| 1: [Constructor] +# 33| 5: [BlockStmt] { ... } +# 33| 0: [SuperConstructorInvocationStmt] super(...) +# 33| 2: [Method] get +# 33| 5: [BlockStmt] { ... } +# 33| 0: [ReturnStmt] return ... +# 33| 0: [MethodCall] (...) +# 33| -1: [ClassInstanceExpr] new (...) +# 33| -3: [TypeAccess] Object +# 33| 3: [Method] invoke +# 33| 5: [BlockStmt] { ... } +# 33| 0: [ReturnStmt] return ... +# 33| 0: [MethodCall] get(...) +# 33| -1: [ThisAccess] this +# 33| -3: [TypeAccess] KProperty0 +# 33| 0: [TypeAccess] Integer +# 34| 6: [BlockStmt] { ... } +# 34| 0: [LocalVariableDeclStmt] var ...; +# 34| 1: [LocalVariableDeclExpr] readWrite$delegate +# 34| 0: [MethodCall] resourceDelegate(...) +# 34| -1: [ClassInstanceExpr] new (...) +# 34| -3: [TypeAccess] Object +# 34| 1: [LocalTypeDeclStmt] class ... +# 34| 0: [LocalClass] +# 34| 1: [Constructor] +# 34| 5: [BlockStmt] { ... } +# 34| 0: [SuperConstructorInvocationStmt] super(...) +# 34| 2: [Method] +# 34| 3: [TypeAccess] int +# 34| 5: [BlockStmt] { ... } +# 34| 0: [ReturnStmt] return ... +# 34| 0: [MethodCall] getValue(...) +# 34| -1: [VarAccess] readWrite$delegate +# 0| 0: [NullLiteral] null +# 34| 1: [PropertyRefExpr] ...::... +# 34| -4: [AnonymousClass] new KMutableProperty0(...) { ... } +# 34| 1: [Constructor] +# 34| 5: [BlockStmt] { ... } +# 34| 0: [SuperConstructorInvocationStmt] super(...) +# 34| 2: [Method] get +# 34| 5: [BlockStmt] { ... } +# 34| 0: [ReturnStmt] return ... +# 34| 0: [MethodCall] (...) +# 34| -1: [ClassInstanceExpr] new (...) +# 34| -3: [TypeAccess] Object +# 34| 3: [Method] invoke +# 34| 5: [BlockStmt] { ... } +# 34| 0: [ReturnStmt] return ... +# 34| 0: [MethodCall] get(...) +# 34| -1: [ThisAccess] this +# 34| 4: [Method] set +#-----| 4: (Parameters) +# 34| 0: [Parameter] a0 +# 34| 5: [BlockStmt] { ... } +# 34| 0: [ReturnStmt] return ... +# 34| 0: [MethodCall] (...) +# 34| -1: [ClassInstanceExpr] new (...) +# 34| -3: [TypeAccess] Object +# 34| 0: [VarAccess] a0 +# 34| -3: [TypeAccess] KMutableProperty0 +# 34| 0: [TypeAccess] Integer +# 34| 2: [LocalTypeDeclStmt] class ... +# 34| 0: [LocalClass] +# 34| 1: [Constructor] +# 34| 5: [BlockStmt] { ... } +# 34| 0: [SuperConstructorInvocationStmt] super(...) +# 34| 2: [Method] +# 34| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 34| 0: [Parameter] value +# 34| 0: [TypeAccess] int +# 34| 5: [BlockStmt] { ... } +# 34| 0: [ReturnStmt] return ... +# 34| 0: [MethodCall] setValue(...) +# 34| -1: [VarAccess] readWrite$delegate +# 0| 0: [NullLiteral] null +# 34| 1: [PropertyRefExpr] ...::... +# 34| -4: [AnonymousClass] new KMutableProperty0(...) { ... } +# 34| 1: [Constructor] +# 34| 5: [BlockStmt] { ... } +# 34| 0: [SuperConstructorInvocationStmt] super(...) +# 34| 2: [Method] get +# 34| 5: [BlockStmt] { ... } +# 34| 0: [ReturnStmt] return ... +# 34| 0: [MethodCall] (...) +# 34| -1: [ClassInstanceExpr] new (...) +# 34| -3: [TypeAccess] Object +# 34| 3: [Method] invoke +# 34| 5: [BlockStmt] { ... } +# 34| 0: [ReturnStmt] return ... +# 34| 0: [MethodCall] get(...) +# 34| -1: [ThisAccess] this +# 34| 4: [Method] set +#-----| 4: (Parameters) +# 34| 0: [Parameter] a0 +# 34| 5: [BlockStmt] { ... } +# 34| 0: [ReturnStmt] return ... +# 34| 0: [MethodCall] (...) +# 34| -1: [ClassInstanceExpr] new (...) +# 34| -3: [TypeAccess] Object +# 34| 0: [VarAccess] a0 +# 34| -3: [TypeAccess] KMutableProperty0 +# 34| 0: [TypeAccess] Integer +# 34| 2: [VarAccess] value +# 36| 7: [ExprStmt] ; +# 36| 0: [MethodCall] println(...) +# 36| -1: [TypeAccess] ConsoleKt +# 36| 0: [MethodCall] getVarResource0(...) +# 36| -1: [ThisAccess] this +# 37| 8: [ExprStmt] ; +# 37| 0: [MethodCall] setVarResource0(...) +# 37| -1: [ThisAccess] this +# 37| 0: [IntegerLiteral] 3 +# 39| 9: [BlockStmt] { ... } +# 39| 0: [LocalVariableDeclStmt] var ...; +# 39| 1: [LocalVariableDeclExpr] varResource2$delegate +# 39| 0: [MethodCall] provideDelegate(...) +# 39| -1: [ClassInstanceExpr] new DelegateProvider(...) +# 39| -3: [TypeAccess] DelegateProvider +# 1| 0: [NullLiteral] null +# 39| 1: [PropertyRefExpr] ...::... +# 39| -4: [AnonymousClass] new KProperty0(...) { ... } +# 39| 1: [Constructor] +# 39| 5: [BlockStmt] { ... } +# 39| 0: [SuperConstructorInvocationStmt] super(...) +# 39| 2: [Method] get +# 39| 5: [BlockStmt] { ... } +# 39| 0: [ReturnStmt] return ... +# 39| 0: [MethodCall] (...) +# 39| -1: [ClassInstanceExpr] new (...) +# 39| -3: [TypeAccess] Object +# 39| 3: [Method] invoke +# 39| 5: [BlockStmt] { ... } +# 39| 0: [ReturnStmt] return ... +# 39| 0: [MethodCall] get(...) +# 39| -1: [ThisAccess] this +# 39| -3: [TypeAccess] KProperty0 +# 39| 0: [TypeAccess] Integer +# 39| 1: [LocalTypeDeclStmt] class ... +# 39| 0: [LocalClass] +# 39| 1: [Constructor] +# 39| 5: [BlockStmt] { ... } +# 39| 0: [SuperConstructorInvocationStmt] super(...) +# 39| 2: [Method] +# 39| 3: [TypeAccess] int +# 39| 5: [BlockStmt] { ... } +# 39| 0: [ReturnStmt] return ... +# 39| 0: [MethodCall] getValue(...) +# 39| -1: [VarAccess] varResource2$delegate +# 0| 0: [NullLiteral] null +# 39| 1: [PropertyRefExpr] ...::... +# 39| -4: [AnonymousClass] new KProperty0(...) { ... } +# 39| 1: [Constructor] +# 39| 5: [BlockStmt] { ... } +# 39| 0: [SuperConstructorInvocationStmt] super(...) +# 39| 2: [Method] get +# 39| 5: [BlockStmt] { ... } +# 39| 0: [ReturnStmt] return ... +# 39| 0: [MethodCall] (...) +# 39| -1: [ClassInstanceExpr] new (...) +# 39| -3: [TypeAccess] Object +# 39| 3: [Method] invoke +# 39| 5: [BlockStmt] { ... } +# 39| 0: [ReturnStmt] return ... +# 39| 0: [MethodCall] get(...) +# 39| -1: [ThisAccess] this +# 39| -3: [TypeAccess] KProperty0 +# 39| 0: [TypeAccess] Integer +# 42| 3: [FieldDeclaration] ResourceDelegate varResource0$delegate; +# 42| -1: [TypeAccess] ResourceDelegate +# 42| 0: [ClassInstanceExpr] new ResourceDelegate(...) +# 42| -3: [TypeAccess] ResourceDelegate +# 42| 4: [Method] getVarResource0 +# 42| 3: [TypeAccess] int +# 42| 5: [BlockStmt] { ... } +# 42| 0: [ReturnStmt] return ... +# 42| 0: [MethodCall] getValue(...) +# 42| -1: [VarAccess] this.varResource0$delegate +# 42| -1: [ThisAccess] this +# 1| 0: [ThisAccess] this +# 42| 1: [PropertyRefExpr] ...::... +# 42| -4: [AnonymousClass] new KMutableProperty1(...) { ... } +# 42| 1: [Constructor] +# 42| 5: [BlockStmt] { ... } +# 42| 0: [SuperConstructorInvocationStmt] super(...) +# 42| 2: [Method] get +#-----| 4: (Parameters) +# 42| 0: [Parameter] a0 +# 42| 5: [BlockStmt] { ... } +# 42| 0: [ReturnStmt] return ... +# 42| 0: [MethodCall] getVarResource0(...) +# 42| -1: [VarAccess] a0 +# 42| 3: [Method] invoke +#-----| 4: (Parameters) +# 42| 0: [Parameter] a0 +# 42| 5: [BlockStmt] { ... } +# 42| 0: [ReturnStmt] return ... +# 42| 0: [MethodCall] get(...) +# 42| -1: [ThisAccess] this +# 42| 0: [VarAccess] a0 +# 42| 4: [Method] set +#-----| 4: (Parameters) +# 42| 0: [Parameter] a0 +# 42| 1: [Parameter] a1 +# 42| 5: [BlockStmt] { ... } +# 42| 0: [ReturnStmt] return ... +# 42| 0: [MethodCall] setVarResource0(...) +# 42| -1: [VarAccess] a0 +# 42| 0: [VarAccess] a1 +# 42| -3: [TypeAccess] KMutableProperty1 +# 42| 0: [TypeAccess] Owner +# 42| 1: [TypeAccess] Integer +# 42| 5: [Method] setVarResource0 +# 42| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 42| 0: [Parameter] +# 42| 0: [TypeAccess] int +# 42| 5: [BlockStmt] { ... } +# 42| 0: [ReturnStmt] return ... +# 42| 0: [MethodCall] setValue(...) +# 42| -1: [VarAccess] this.varResource0$delegate +# 42| -1: [ThisAccess] this +# 1| 0: [ThisAccess] this +# 42| 1: [PropertyRefExpr] ...::... +# 42| -4: [AnonymousClass] new KMutableProperty1(...) { ... } +# 42| 1: [Constructor] +# 42| 5: [BlockStmt] { ... } +# 42| 0: [SuperConstructorInvocationStmt] super(...) +# 42| 2: [Method] get +#-----| 4: (Parameters) +# 42| 0: [Parameter] a0 +# 42| 5: [BlockStmt] { ... } +# 42| 0: [ReturnStmt] return ... +# 42| 0: [MethodCall] getVarResource0(...) +# 42| -1: [VarAccess] a0 +# 42| 3: [Method] invoke +#-----| 4: (Parameters) +# 42| 0: [Parameter] a0 +# 42| 5: [BlockStmt] { ... } +# 42| 0: [ReturnStmt] return ... +# 42| 0: [MethodCall] get(...) +# 42| -1: [ThisAccess] this +# 42| 0: [VarAccess] a0 +# 42| 4: [Method] set +#-----| 4: (Parameters) +# 42| 0: [Parameter] a0 +# 42| 1: [Parameter] a1 +# 42| 5: [BlockStmt] { ... } +# 42| 0: [ReturnStmt] return ... +# 42| 0: [MethodCall] setVarResource0(...) +# 42| -1: [VarAccess] a0 +# 42| 0: [VarAccess] a1 +# 42| -3: [TypeAccess] KMutableProperty1 +# 42| 0: [TypeAccess] Owner +# 42| 1: [TypeAccess] Integer +# 42| 2: [VarAccess] +# 45| 5: [Class] ResourceDelegate +# 45| 1: [Constructor] ResourceDelegate +# 45| 5: [BlockStmt] { ... } +# 45| 0: [SuperConstructorInvocationStmt] super(...) +# 45| 1: [BlockStmt] { ... } +# 46| 2: [Method] getValue +# 46| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 46| 0: [Parameter] thisRef +# 46| 0: [TypeAccess] Owner +# 46| 1: [Parameter] property +# 46| 0: [TypeAccess] KProperty +# 46| 0: [WildcardTypeAccess] ? ... +# 46| 5: [BlockStmt] { ... } +# 47| 0: [ReturnStmt] return ... +# 47| 0: [IntegerLiteral] 1 +# 49| 3: [Method] setValue +# 49| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 49| 0: [Parameter] thisRef +# 49| 0: [TypeAccess] Owner +# 49| 1: [Parameter] property +# 49| 0: [TypeAccess] KProperty +# 49| 0: [WildcardTypeAccess] ? ... +# 49| 2: [Parameter] value +# 49| 0: [TypeAccess] Integer +# 49| 5: [BlockStmt] { ... } +# 53| 6: [Class] DelegateProvider +# 53| 1: [Constructor] DelegateProvider +# 53| 5: [BlockStmt] { ... } +# 53| 0: [SuperConstructorInvocationStmt] super(...) +# 53| 1: [BlockStmt] { ... } +# 54| 2: [Method] provideDelegate +# 54| 3: [TypeAccess] ResourceDelegate +#-----| 4: (Parameters) +# 54| 0: [Parameter] thisRef +# 54| 0: [TypeAccess] Owner +# 54| 1: [Parameter] prop +# 54| 0: [TypeAccess] KProperty +# 54| 0: [WildcardTypeAccess] ? ... +# 54| 5: [BlockStmt] { ... } +# 56| 0: [ReturnStmt] return ... +# 56| 0: [ClassInstanceExpr] new ResourceDelegate(...) +# 56| -3: [TypeAccess] ResourceDelegate +# 62| 7: [Class] ClassWithDelegate +# 62| 1: [Constructor] ClassWithDelegate +#-----| 4: (Parameters) +# 62| 0: [Parameter] anotherClassInt +# 62| 0: [TypeAccess] int +# 62| 5: [BlockStmt] { ... } +# 62| 0: [SuperConstructorInvocationStmt] super(...) +# 62| 1: [BlockStmt] { ... } +# 62| 0: [ExprStmt] ; +# 62| 0: [KtInitializerAssignExpr] ...=... +# 62| 0: [VarAccess] anotherClassInt +# 62| 2: [Method] getAnotherClassInt +# 62| 3: [TypeAccess] int +# 62| 5: [BlockStmt] { ... } +# 62| 0: [ReturnStmt] return ... +# 62| 0: [VarAccess] this.anotherClassInt +# 62| -1: [ThisAccess] this +# 62| 3: [FieldDeclaration] int anotherClassInt; +# 62| -1: [TypeAccess] int +# 62| 0: [VarAccess] anotherClassInt +# 63| 8: [Class] Base +# 63| 1: [Constructor] Base +#-----| 4: (Parameters) +# 63| 0: [Parameter] baseClassInt +# 63| 0: [TypeAccess] int +# 63| 5: [BlockStmt] { ... } +# 63| 0: [SuperConstructorInvocationStmt] super(...) +# 63| 1: [BlockStmt] { ... } +# 63| 0: [ExprStmt] ; +# 63| 0: [KtInitializerAssignExpr] ...=... +# 63| 0: [VarAccess] baseClassInt +# 63| 2: [Method] getBaseClassInt +# 63| 3: [TypeAccess] int +# 63| 5: [BlockStmt] { ... } +# 63| 0: [ReturnStmt] return ... +# 63| 0: [VarAccess] this.baseClassInt +# 63| -1: [ThisAccess] this +# 63| 3: [FieldDeclaration] int baseClassInt; +# 63| -1: [TypeAccess] int +# 63| 0: [VarAccess] baseClassInt +# 65| 9: [Class] MyClass +# 65| 1: [Constructor] MyClass +#-----| 4: (Parameters) +# 65| 0: [Parameter] memberInt +# 65| 0: [TypeAccess] int +# 65| 1: [Parameter] anotherClassInstance +# 65| 0: [TypeAccess] ClassWithDelegate +# 65| 5: [BlockStmt] { ... } +# 65| 0: [SuperConstructorInvocationStmt] super(...) +# 65| 0: [VarAccess] memberInt +# 65| 1: [BlockStmt] { ... } +# 65| 0: [ExprStmt] ; +# 65| 0: [KtInitializerAssignExpr] ...=... +# 65| 0: [VarAccess] memberInt +# 65| 1: [ExprStmt] ; +# 65| 0: [KtInitializerAssignExpr] ...=... +# 65| 0: [VarAccess] anotherClassInstance +# 66| 2: [ExprStmt] ; +# 66| 0: [KtInitializerAssignExpr] ...=... +# 66| 0: [VarAccess] delegatedToMember1$delegate +# 67| 3: [ExprStmt] ; +# 67| 0: [KtInitializerAssignExpr] ...=... +# 67| 0: [VarAccess] delegatedToMember2$delegate +# 69| 4: [ExprStmt] ; +# 69| 0: [KtInitializerAssignExpr] ...=... +# 69| 0: [VarAccess] delegatedToExtMember1$delegate +# 70| 5: [ExprStmt] ; +# 70| 0: [KtInitializerAssignExpr] ...=... +# 70| 0: [VarAccess] delegatedToExtMember2$delegate +# 72| 6: [ExprStmt] ; +# 72| 0: [KtInitializerAssignExpr] ...=... +# 72| 0: [VarAccess] delegatedToBaseClass1$delegate +# 73| 7: [ExprStmt] ; +# 73| 0: [KtInitializerAssignExpr] ...=... +# 73| 0: [VarAccess] delegatedToBaseClass2$delegate +# 75| 8: [ExprStmt] ; +# 75| 0: [KtInitializerAssignExpr] ...=... +# 75| 0: [VarAccess] delegatedToAnotherClass1$delegate +# 77| 9: [ExprStmt] ; +# 77| 0: [KtInitializerAssignExpr] ...=... +# 77| 0: [VarAccess] delegatedToTopLevel$delegate +# 79| 10: [ExprStmt] ; +# 79| 0: [KtInitializerAssignExpr] ...=... +# 79| 0: [VarAccess] max$delegate +# 65| 2: [Method] getMemberInt +# 65| 3: [TypeAccess] int +# 65| 5: [BlockStmt] { ... } +# 65| 0: [ReturnStmt] return ... +# 65| 0: [VarAccess] this.memberInt +# 65| -1: [ThisAccess] this +# 65| 3: [FieldDeclaration] int memberInt; +# 65| -1: [TypeAccess] int +# 65| 0: [VarAccess] memberInt +# 65| 4: [Method] setMemberInt +# 65| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 65| 0: [Parameter] +# 65| 0: [TypeAccess] int +# 65| 5: [BlockStmt] { ... } +# 65| 0: [ExprStmt] ; +# 65| 0: [AssignExpr] ...=... +# 65| 0: [VarAccess] this.memberInt +# 65| -1: [ThisAccess] this +# 65| 1: [VarAccess] +# 65| 5: [FieldDeclaration] ClassWithDelegate anotherClassInstance; +# 65| -1: [TypeAccess] ClassWithDelegate +# 65| 0: [VarAccess] anotherClassInstance +# 65| 6: [Method] getAnotherClassInstance +# 65| 3: [TypeAccess] ClassWithDelegate +# 65| 5: [BlockStmt] { ... } +# 65| 0: [ReturnStmt] return ... +# 65| 0: [VarAccess] this.anotherClassInstance +# 65| -1: [ThisAccess] this +# 66| 7: [FieldDeclaration] KMutableProperty0 delegatedToMember1$delegate; +# 66| -1: [TypeAccess] KMutableProperty0 +# 66| 0: [TypeAccess] Integer +# 66| 0: [PropertyRefExpr] ...::... +# 66| -4: [AnonymousClass] new KMutableProperty0(...) { ... } +# 66| 1: [Constructor] +#-----| 4: (Parameters) +# 66| 0: [Parameter] +# 66| 5: [BlockStmt] { ... } +# 66| 0: [SuperConstructorInvocationStmt] super(...) +# 66| 1: [ExprStmt] ; +# 66| 0: [AssignExpr] ...=... +# 66| 0: [VarAccess] this. +# 66| -1: [ThisAccess] this +# 66| 1: [VarAccess] +# 66| 2: [FieldDeclaration] MyClass ; +# 66| -1: [TypeAccess] MyClass +# 66| 3: [Method] get +# 66| 5: [BlockStmt] { ... } +# 66| 0: [ReturnStmt] return ... +# 66| 0: [MethodCall] getMemberInt(...) +# 66| -1: [VarAccess] this. +# 66| -1: [ThisAccess] this +# 66| 4: [Method] invoke +# 66| 5: [BlockStmt] { ... } +# 66| 0: [ReturnStmt] return ... +# 66| 0: [MethodCall] get(...) +# 66| -1: [ThisAccess] this +# 66| 5: [Method] set +#-----| 4: (Parameters) +# 66| 0: [Parameter] a0 +# 66| 5: [BlockStmt] { ... } +# 66| 0: [ReturnStmt] return ... +# 66| 0: [MethodCall] setMemberInt(...) +# 66| -1: [VarAccess] this. +# 66| -1: [ThisAccess] this +# 66| 0: [VarAccess] a0 +# 66| -3: [TypeAccess] KMutableProperty0 +# 66| 0: [TypeAccess] Integer +# 66| 0: [ThisAccess] MyClass.this +# 66| 0: [TypeAccess] MyClass +# 66| 8: [Method] getDelegatedToMember1 +# 66| 3: [TypeAccess] int +# 66| 5: [BlockStmt] { ... } +# 66| 0: [ReturnStmt] return ... +# 66| 0: [MethodCall] getValue(...) +# 66| -2: [TypeAccess] Integer +# 66| -1: [TypeAccess] PropertyReferenceDelegatesKt +# 66| 0: [VarAccess] this.delegatedToMember1$delegate +# 66| -1: [ThisAccess] this +# 1| 1: [ThisAccess] this +# 66| 2: [PropertyRefExpr] ...::... +# 66| -4: [AnonymousClass] new KMutableProperty1(...) { ... } +# 66| 1: [Constructor] +# 66| 5: [BlockStmt] { ... } +# 66| 0: [SuperConstructorInvocationStmt] super(...) +# 66| 2: [Method] get +#-----| 4: (Parameters) +# 66| 0: [Parameter] a0 +# 66| 5: [BlockStmt] { ... } +# 66| 0: [ReturnStmt] return ... +# 66| 0: [MethodCall] getDelegatedToMember1(...) +# 66| -1: [VarAccess] a0 +# 66| 3: [Method] invoke +#-----| 4: (Parameters) +# 66| 0: [Parameter] a0 +# 66| 5: [BlockStmt] { ... } +# 66| 0: [ReturnStmt] return ... +# 66| 0: [MethodCall] get(...) +# 66| -1: [ThisAccess] this +# 66| 0: [VarAccess] a0 +# 66| 4: [Method] set +#-----| 4: (Parameters) +# 66| 0: [Parameter] a0 +# 66| 1: [Parameter] a1 +# 66| 5: [BlockStmt] { ... } +# 66| 0: [ReturnStmt] return ... +# 66| 0: [MethodCall] setDelegatedToMember1(...) +# 66| -1: [VarAccess] a0 +# 66| 0: [VarAccess] a1 +# 66| -3: [TypeAccess] KMutableProperty1 +# 66| 0: [TypeAccess] MyClass +# 66| 1: [TypeAccess] Integer +# 66| 9: [Method] setDelegatedToMember1 +# 66| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 66| 0: [Parameter] +# 66| 0: [TypeAccess] int +# 66| 5: [BlockStmt] { ... } +# 66| 0: [ReturnStmt] return ... +# 66| 0: [MethodCall] setValue(...) +# 66| -2: [TypeAccess] Integer +# 66| -1: [TypeAccess] PropertyReferenceDelegatesKt +# 66| 0: [VarAccess] this.delegatedToMember1$delegate +# 66| -1: [ThisAccess] this +# 1| 1: [ThisAccess] this +# 66| 2: [PropertyRefExpr] ...::... +# 66| -4: [AnonymousClass] new KMutableProperty1(...) { ... } +# 66| 1: [Constructor] +# 66| 5: [BlockStmt] { ... } +# 66| 0: [SuperConstructorInvocationStmt] super(...) +# 66| 2: [Method] get +#-----| 4: (Parameters) +# 66| 0: [Parameter] a0 +# 66| 5: [BlockStmt] { ... } +# 66| 0: [ReturnStmt] return ... +# 66| 0: [MethodCall] getDelegatedToMember1(...) +# 66| -1: [VarAccess] a0 +# 66| 3: [Method] invoke +#-----| 4: (Parameters) +# 66| 0: [Parameter] a0 +# 66| 5: [BlockStmt] { ... } +# 66| 0: [ReturnStmt] return ... +# 66| 0: [MethodCall] get(...) +# 66| -1: [ThisAccess] this +# 66| 0: [VarAccess] a0 +# 66| 4: [Method] set +#-----| 4: (Parameters) +# 66| 0: [Parameter] a0 +# 66| 1: [Parameter] a1 +# 66| 5: [BlockStmt] { ... } +# 66| 0: [ReturnStmt] return ... +# 66| 0: [MethodCall] setDelegatedToMember1(...) +# 66| -1: [VarAccess] a0 +# 66| 0: [VarAccess] a1 +# 66| -3: [TypeAccess] KMutableProperty1 +# 66| 0: [TypeAccess] MyClass +# 66| 1: [TypeAccess] Integer +# 66| 3: [VarAccess] +# 67| 10: [FieldDeclaration] KMutableProperty1 delegatedToMember2$delegate; +# 67| -1: [TypeAccess] KMutableProperty1 +# 67| 0: [TypeAccess] MyClass +# 67| 1: [TypeAccess] Integer +# 67| 0: [PropertyRefExpr] ...::... +# 67| -4: [AnonymousClass] new KMutableProperty1(...) { ... } +# 67| 1: [Constructor] +# 67| 5: [BlockStmt] { ... } +# 67| 0: [SuperConstructorInvocationStmt] super(...) +# 67| 2: [Method] get +#-----| 4: (Parameters) +# 67| 0: [Parameter] a0 +# 67| 5: [BlockStmt] { ... } +# 67| 0: [ReturnStmt] return ... +# 67| 0: [MethodCall] getMemberInt(...) +# 67| -1: [VarAccess] a0 +# 67| 3: [Method] invoke +#-----| 4: (Parameters) +# 67| 0: [Parameter] a0 +# 67| 5: [BlockStmt] { ... } +# 67| 0: [ReturnStmt] return ... +# 67| 0: [MethodCall] get(...) +# 67| -1: [ThisAccess] this +# 67| 0: [VarAccess] a0 +# 67| 4: [Method] set +#-----| 4: (Parameters) +# 67| 0: [Parameter] a0 +# 67| 1: [Parameter] a1 +# 67| 5: [BlockStmt] { ... } +# 67| 0: [ReturnStmt] return ... +# 67| 0: [MethodCall] setMemberInt(...) +# 67| -1: [VarAccess] a0 +# 67| 0: [VarAccess] a1 +# 67| -3: [TypeAccess] KMutableProperty1 +# 67| 0: [TypeAccess] MyClass +# 67| 1: [TypeAccess] Integer +# 67| 11: [Method] getDelegatedToMember2 +# 67| 3: [TypeAccess] int +# 67| 5: [BlockStmt] { ... } +# 67| 0: [ReturnStmt] return ... +# 67| 0: [MethodCall] getValue(...) +# 67| -3: [TypeAccess] Integer +# 67| -2: [TypeAccess] MyClass +# 67| -1: [TypeAccess] PropertyReferenceDelegatesKt +# 67| 0: [VarAccess] this.delegatedToMember2$delegate +# 67| -1: [ThisAccess] this +# 1| 1: [ThisAccess] this +# 67| 2: [PropertyRefExpr] ...::... +# 67| -4: [AnonymousClass] new KMutableProperty1(...) { ... } +# 67| 1: [Constructor] +# 67| 5: [BlockStmt] { ... } +# 67| 0: [SuperConstructorInvocationStmt] super(...) +# 67| 2: [Method] get +#-----| 4: (Parameters) +# 67| 0: [Parameter] a0 +# 67| 5: [BlockStmt] { ... } +# 67| 0: [ReturnStmt] return ... +# 67| 0: [MethodCall] getDelegatedToMember2(...) +# 67| -1: [VarAccess] a0 +# 67| 3: [Method] invoke +#-----| 4: (Parameters) +# 67| 0: [Parameter] a0 +# 67| 5: [BlockStmt] { ... } +# 67| 0: [ReturnStmt] return ... +# 67| 0: [MethodCall] get(...) +# 67| -1: [ThisAccess] this +# 67| 0: [VarAccess] a0 +# 67| 4: [Method] set +#-----| 4: (Parameters) +# 67| 0: [Parameter] a0 +# 67| 1: [Parameter] a1 +# 67| 5: [BlockStmt] { ... } +# 67| 0: [ReturnStmt] return ... +# 67| 0: [MethodCall] setDelegatedToMember2(...) +# 67| -1: [VarAccess] a0 +# 67| 0: [VarAccess] a1 +# 67| -3: [TypeAccess] KMutableProperty1 +# 67| 0: [TypeAccess] MyClass +# 67| 1: [TypeAccess] Integer +# 67| 12: [Method] setDelegatedToMember2 +# 67| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 67| 0: [Parameter] +# 67| 0: [TypeAccess] int +# 67| 5: [BlockStmt] { ... } +# 67| 0: [ReturnStmt] return ... +# 67| 0: [MethodCall] setValue(...) +# 67| -3: [TypeAccess] Integer +# 67| -2: [TypeAccess] MyClass +# 67| -1: [TypeAccess] PropertyReferenceDelegatesKt +# 67| 0: [VarAccess] this.delegatedToMember2$delegate +# 67| -1: [ThisAccess] this +# 1| 1: [ThisAccess] this +# 67| 2: [PropertyRefExpr] ...::... +# 67| -4: [AnonymousClass] new KMutableProperty1(...) { ... } +# 67| 1: [Constructor] +# 67| 5: [BlockStmt] { ... } +# 67| 0: [SuperConstructorInvocationStmt] super(...) +# 67| 2: [Method] get +#-----| 4: (Parameters) +# 67| 0: [Parameter] a0 +# 67| 5: [BlockStmt] { ... } +# 67| 0: [ReturnStmt] return ... +# 67| 0: [MethodCall] getDelegatedToMember2(...) +# 67| -1: [VarAccess] a0 +# 67| 3: [Method] invoke +#-----| 4: (Parameters) +# 67| 0: [Parameter] a0 +# 67| 5: [BlockStmt] { ... } +# 67| 0: [ReturnStmt] return ... +# 67| 0: [MethodCall] get(...) +# 67| -1: [ThisAccess] this +# 67| 0: [VarAccess] a0 +# 67| 4: [Method] set +#-----| 4: (Parameters) +# 67| 0: [Parameter] a0 +# 67| 1: [Parameter] a1 +# 67| 5: [BlockStmt] { ... } +# 67| 0: [ReturnStmt] return ... +# 67| 0: [MethodCall] setDelegatedToMember2(...) +# 67| -1: [VarAccess] a0 +# 67| 0: [VarAccess] a1 +# 67| -3: [TypeAccess] KMutableProperty1 +# 67| 0: [TypeAccess] MyClass +# 67| 1: [TypeAccess] Integer +# 67| 3: [VarAccess] +# 69| 13: [FieldDeclaration] KMutableProperty0 delegatedToExtMember1$delegate; +# 69| -1: [TypeAccess] KMutableProperty0 +# 69| 0: [TypeAccess] Integer +# 69| 0: [PropertyRefExpr] ...::... +# 69| -4: [AnonymousClass] new KMutableProperty0(...) { ... } +# 69| 1: [Constructor] +#-----| 4: (Parameters) +# 69| 0: [Parameter] +# 69| 5: [BlockStmt] { ... } +# 69| 0: [SuperConstructorInvocationStmt] super(...) +# 69| 1: [ExprStmt] ; +# 69| 0: [AssignExpr] ...=... +# 69| 0: [VarAccess] this. +# 69| -1: [ThisAccess] this +# 69| 1: [VarAccess] +# 69| 2: [FieldDeclaration] MyClass ; +# 69| -1: [TypeAccess] MyClass +# 69| 3: [Method] get +# 69| 5: [BlockStmt] { ... } +# 69| 0: [ReturnStmt] return ... +# 69| 0: [MethodCall] getExtDelegated(...) +# 69| -1: [TypeAccess] DelegatedPropertiesKt +# 69| 0: [VarAccess] this. +# 69| -1: [ThisAccess] this +# 69| 4: [Method] invoke +# 69| 5: [BlockStmt] { ... } +# 69| 0: [ReturnStmt] return ... +# 69| 0: [MethodCall] get(...) +# 69| -1: [ThisAccess] this +# 69| 5: [Method] set +#-----| 4: (Parameters) +# 69| 0: [Parameter] a0 +# 69| 5: [BlockStmt] { ... } +# 69| 0: [ReturnStmt] return ... +# 69| 0: [MethodCall] setExtDelegated(...) +# 69| -1: [TypeAccess] DelegatedPropertiesKt +# 69| 0: [VarAccess] this. +# 69| -1: [ThisAccess] this +# 69| 1: [VarAccess] a0 +# 69| -3: [TypeAccess] KMutableProperty0 +# 69| 0: [TypeAccess] Integer +# 69| 0: [ThisAccess] MyClass.this +# 69| 0: [TypeAccess] MyClass +# 69| 14: [Method] getDelegatedToExtMember1 +# 69| 3: [TypeAccess] int +# 69| 5: [BlockStmt] { ... } +# 69| 0: [ReturnStmt] return ... +# 69| 0: [MethodCall] getValue(...) +# 69| -2: [TypeAccess] Integer +# 69| -1: [TypeAccess] PropertyReferenceDelegatesKt +# 69| 0: [VarAccess] this.delegatedToExtMember1$delegate +# 69| -1: [ThisAccess] this +# 1| 1: [ThisAccess] this +# 69| 2: [PropertyRefExpr] ...::... +# 69| -4: [AnonymousClass] new KMutableProperty1(...) { ... } +# 69| 1: [Constructor] +# 69| 5: [BlockStmt] { ... } +# 69| 0: [SuperConstructorInvocationStmt] super(...) +# 69| 2: [Method] get +#-----| 4: (Parameters) +# 69| 0: [Parameter] a0 +# 69| 5: [BlockStmt] { ... } +# 69| 0: [ReturnStmt] return ... +# 69| 0: [MethodCall] getDelegatedToExtMember1(...) +# 69| -1: [VarAccess] a0 +# 69| 3: [Method] invoke +#-----| 4: (Parameters) +# 69| 0: [Parameter] a0 +# 69| 5: [BlockStmt] { ... } +# 69| 0: [ReturnStmt] return ... +# 69| 0: [MethodCall] get(...) +# 69| -1: [ThisAccess] this +# 69| 0: [VarAccess] a0 +# 69| 4: [Method] set +#-----| 4: (Parameters) +# 69| 0: [Parameter] a0 +# 69| 1: [Parameter] a1 +# 69| 5: [BlockStmt] { ... } +# 69| 0: [ReturnStmt] return ... +# 69| 0: [MethodCall] setDelegatedToExtMember1(...) +# 69| -1: [VarAccess] a0 +# 69| 0: [VarAccess] a1 +# 69| -3: [TypeAccess] KMutableProperty1 +# 69| 0: [TypeAccess] MyClass +# 69| 1: [TypeAccess] Integer +# 69| 15: [Method] setDelegatedToExtMember1 +# 69| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 69| 0: [Parameter] +# 69| 0: [TypeAccess] int +# 69| 5: [BlockStmt] { ... } +# 69| 0: [ReturnStmt] return ... +# 69| 0: [MethodCall] setValue(...) +# 69| -2: [TypeAccess] Integer +# 69| -1: [TypeAccess] PropertyReferenceDelegatesKt +# 69| 0: [VarAccess] this.delegatedToExtMember1$delegate +# 69| -1: [ThisAccess] this +# 1| 1: [ThisAccess] this +# 69| 2: [PropertyRefExpr] ...::... +# 69| -4: [AnonymousClass] new KMutableProperty1(...) { ... } +# 69| 1: [Constructor] +# 69| 5: [BlockStmt] { ... } +# 69| 0: [SuperConstructorInvocationStmt] super(...) +# 69| 2: [Method] get +#-----| 4: (Parameters) +# 69| 0: [Parameter] a0 +# 69| 5: [BlockStmt] { ... } +# 69| 0: [ReturnStmt] return ... +# 69| 0: [MethodCall] getDelegatedToExtMember1(...) +# 69| -1: [VarAccess] a0 +# 69| 3: [Method] invoke +#-----| 4: (Parameters) +# 69| 0: [Parameter] a0 +# 69| 5: [BlockStmt] { ... } +# 69| 0: [ReturnStmt] return ... +# 69| 0: [MethodCall] get(...) +# 69| -1: [ThisAccess] this +# 69| 0: [VarAccess] a0 +# 69| 4: [Method] set +#-----| 4: (Parameters) +# 69| 0: [Parameter] a0 +# 69| 1: [Parameter] a1 +# 69| 5: [BlockStmt] { ... } +# 69| 0: [ReturnStmt] return ... +# 69| 0: [MethodCall] setDelegatedToExtMember1(...) +# 69| -1: [VarAccess] a0 +# 69| 0: [VarAccess] a1 +# 69| -3: [TypeAccess] KMutableProperty1 +# 69| 0: [TypeAccess] MyClass +# 69| 1: [TypeAccess] Integer +# 69| 3: [VarAccess] +# 70| 16: [FieldDeclaration] KMutableProperty1 delegatedToExtMember2$delegate; +# 70| -1: [TypeAccess] KMutableProperty1 +# 70| 0: [TypeAccess] MyClass +# 70| 1: [TypeAccess] Integer +# 70| 0: [PropertyRefExpr] ...::... +# 70| -4: [AnonymousClass] new KMutableProperty1(...) { ... } +# 70| 1: [Constructor] +# 70| 5: [BlockStmt] { ... } +# 70| 0: [SuperConstructorInvocationStmt] super(...) +# 70| 2: [Method] get +#-----| 4: (Parameters) +# 70| 0: [Parameter] a0 +# 70| 5: [BlockStmt] { ... } +# 70| 0: [ReturnStmt] return ... +# 70| 0: [MethodCall] getExtDelegated(...) +# 70| -1: [TypeAccess] DelegatedPropertiesKt +# 70| 0: [VarAccess] a0 +# 70| 3: [Method] invoke +#-----| 4: (Parameters) +# 70| 0: [Parameter] a0 +# 70| 5: [BlockStmt] { ... } +# 70| 0: [ReturnStmt] return ... +# 70| 0: [MethodCall] get(...) +# 70| -1: [ThisAccess] this +# 70| 0: [VarAccess] a0 +# 70| 4: [Method] set +#-----| 4: (Parameters) +# 70| 0: [Parameter] a0 +# 70| 1: [Parameter] a1 +# 70| 5: [BlockStmt] { ... } +# 70| 0: [ReturnStmt] return ... +# 70| 0: [MethodCall] setExtDelegated(...) +# 70| -1: [TypeAccess] DelegatedPropertiesKt +# 70| 0: [VarAccess] a0 +# 70| 1: [VarAccess] a1 +# 70| -3: [TypeAccess] KMutableProperty1 +# 70| 0: [TypeAccess] MyClass +# 70| 1: [TypeAccess] Integer +# 70| 17: [Method] getDelegatedToExtMember2 +# 70| 3: [TypeAccess] int +# 70| 5: [BlockStmt] { ... } +# 70| 0: [ReturnStmt] return ... +# 70| 0: [MethodCall] getValue(...) +# 70| -3: [TypeAccess] Integer +# 70| -2: [TypeAccess] MyClass +# 70| -1: [TypeAccess] PropertyReferenceDelegatesKt +# 70| 0: [VarAccess] this.delegatedToExtMember2$delegate +# 70| -1: [ThisAccess] this +# 1| 1: [ThisAccess] this +# 70| 2: [PropertyRefExpr] ...::... +# 70| -4: [AnonymousClass] new KMutableProperty1(...) { ... } +# 70| 1: [Constructor] +# 70| 5: [BlockStmt] { ... } +# 70| 0: [SuperConstructorInvocationStmt] super(...) +# 70| 2: [Method] get +#-----| 4: (Parameters) +# 70| 0: [Parameter] a0 +# 70| 5: [BlockStmt] { ... } +# 70| 0: [ReturnStmt] return ... +# 70| 0: [MethodCall] getDelegatedToExtMember2(...) +# 70| -1: [VarAccess] a0 +# 70| 3: [Method] invoke +#-----| 4: (Parameters) +# 70| 0: [Parameter] a0 +# 70| 5: [BlockStmt] { ... } +# 70| 0: [ReturnStmt] return ... +# 70| 0: [MethodCall] get(...) +# 70| -1: [ThisAccess] this +# 70| 0: [VarAccess] a0 +# 70| 4: [Method] set +#-----| 4: (Parameters) +# 70| 0: [Parameter] a0 +# 70| 1: [Parameter] a1 +# 70| 5: [BlockStmt] { ... } +# 70| 0: [ReturnStmt] return ... +# 70| 0: [MethodCall] setDelegatedToExtMember2(...) +# 70| -1: [VarAccess] a0 +# 70| 0: [VarAccess] a1 +# 70| -3: [TypeAccess] KMutableProperty1 +# 70| 0: [TypeAccess] MyClass +# 70| 1: [TypeAccess] Integer +# 70| 18: [Method] setDelegatedToExtMember2 +# 70| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 70| 0: [Parameter] +# 70| 0: [TypeAccess] int +# 70| 5: [BlockStmt] { ... } +# 70| 0: [ReturnStmt] return ... +# 70| 0: [MethodCall] setValue(...) +# 70| -3: [TypeAccess] Integer +# 70| -2: [TypeAccess] MyClass +# 70| -1: [TypeAccess] PropertyReferenceDelegatesKt +# 70| 0: [VarAccess] this.delegatedToExtMember2$delegate +# 70| -1: [ThisAccess] this +# 1| 1: [ThisAccess] this +# 70| 2: [PropertyRefExpr] ...::... +# 70| -4: [AnonymousClass] new KMutableProperty1(...) { ... } +# 70| 1: [Constructor] +# 70| 5: [BlockStmt] { ... } +# 70| 0: [SuperConstructorInvocationStmt] super(...) +# 70| 2: [Method] get +#-----| 4: (Parameters) +# 70| 0: [Parameter] a0 +# 70| 5: [BlockStmt] { ... } +# 70| 0: [ReturnStmt] return ... +# 70| 0: [MethodCall] getDelegatedToExtMember2(...) +# 70| -1: [VarAccess] a0 +# 70| 3: [Method] invoke +#-----| 4: (Parameters) +# 70| 0: [Parameter] a0 +# 70| 5: [BlockStmt] { ... } +# 70| 0: [ReturnStmt] return ... +# 70| 0: [MethodCall] get(...) +# 70| -1: [ThisAccess] this +# 70| 0: [VarAccess] a0 +# 70| 4: [Method] set +#-----| 4: (Parameters) +# 70| 0: [Parameter] a0 +# 70| 1: [Parameter] a1 +# 70| 5: [BlockStmt] { ... } +# 70| 0: [ReturnStmt] return ... +# 70| 0: [MethodCall] setDelegatedToExtMember2(...) +# 70| -1: [VarAccess] a0 +# 70| 0: [VarAccess] a1 +# 70| -3: [TypeAccess] KMutableProperty1 +# 70| 0: [TypeAccess] MyClass +# 70| 1: [TypeAccess] Integer +# 70| 3: [VarAccess] +# 72| 19: [FieldDeclaration] KProperty0 delegatedToBaseClass1$delegate; +# 72| -1: [TypeAccess] KProperty0 +# 72| 0: [TypeAccess] Integer +# 72| 0: [PropertyRefExpr] ...::... +# 72| -4: [AnonymousClass] new KProperty0(...) { ... } +# 72| 1: [Constructor] +#-----| 4: (Parameters) +# 72| 0: [Parameter] +# 72| 5: [BlockStmt] { ... } +# 72| 0: [SuperConstructorInvocationStmt] super(...) +# 72| 1: [ExprStmt] ; +# 72| 0: [AssignExpr] ...=... +# 72| 0: [VarAccess] this. +# 72| -1: [ThisAccess] this +# 72| 1: [VarAccess] +# 72| 2: [FieldDeclaration] MyClass ; +# 72| -1: [TypeAccess] MyClass +# 72| 3: [Method] get +# 72| 5: [BlockStmt] { ... } +# 72| 0: [ReturnStmt] return ... +# 72| 0: [MethodCall] getBaseClassInt(...) +# 72| -1: [VarAccess] this. +# 72| -1: [ThisAccess] this +# 72| 4: [Method] invoke +# 72| 5: [BlockStmt] { ... } +# 72| 0: [ReturnStmt] return ... +# 72| 0: [MethodCall] get(...) +# 72| -1: [ThisAccess] this +# 72| -3: [TypeAccess] KProperty0 +# 72| 0: [TypeAccess] Integer +# 72| 0: [ThisAccess] MyClass.this +# 72| 0: [TypeAccess] MyClass +# 72| 20: [Method] getDelegatedToBaseClass1 +# 72| 3: [TypeAccess] int +# 72| 5: [BlockStmt] { ... } +# 72| 0: [ReturnStmt] return ... +# 72| 0: [MethodCall] getValue(...) +# 72| -2: [TypeAccess] Integer +# 72| -1: [TypeAccess] PropertyReferenceDelegatesKt +# 72| 0: [VarAccess] this.delegatedToBaseClass1$delegate +# 72| -1: [ThisAccess] this +# 1| 1: [ThisAccess] this +# 72| 2: [PropertyRefExpr] ...::... +# 72| -4: [AnonymousClass] new KProperty1(...) { ... } +# 72| 1: [Constructor] +# 72| 5: [BlockStmt] { ... } +# 72| 0: [SuperConstructorInvocationStmt] super(...) +# 72| 2: [Method] get +#-----| 4: (Parameters) +# 72| 0: [Parameter] a0 +# 72| 5: [BlockStmt] { ... } +# 72| 0: [ReturnStmt] return ... +# 72| 0: [MethodCall] getDelegatedToBaseClass1(...) +# 72| -1: [VarAccess] a0 +# 72| 3: [Method] invoke +#-----| 4: (Parameters) +# 72| 0: [Parameter] a0 +# 72| 5: [BlockStmt] { ... } +# 72| 0: [ReturnStmt] return ... +# 72| 0: [MethodCall] get(...) +# 72| -1: [ThisAccess] this +# 72| 0: [VarAccess] a0 +# 72| -3: [TypeAccess] KProperty1 +# 72| 0: [TypeAccess] MyClass +# 72| 1: [TypeAccess] Integer +# 73| 21: [FieldDeclaration] KProperty1 delegatedToBaseClass2$delegate; +# 73| -1: [TypeAccess] KProperty1 +# 73| 0: [TypeAccess] Base +# 73| 1: [TypeAccess] Integer +# 73| 0: [PropertyRefExpr] ...::... +# 73| -4: [AnonymousClass] new KProperty1(...) { ... } +# 73| 1: [Constructor] +# 73| 5: [BlockStmt] { ... } +# 73| 0: [SuperConstructorInvocationStmt] super(...) +# 73| 2: [Method] get +#-----| 4: (Parameters) +# 73| 0: [Parameter] a0 +# 73| 5: [BlockStmt] { ... } +# 73| 0: [ReturnStmt] return ... +# 73| 0: [MethodCall] getBaseClassInt(...) +# 73| -1: [VarAccess] a0 +# 73| 3: [Method] invoke +#-----| 4: (Parameters) +# 73| 0: [Parameter] a0 +# 73| 5: [BlockStmt] { ... } +# 73| 0: [ReturnStmt] return ... +# 73| 0: [MethodCall] get(...) +# 73| -1: [ThisAccess] this +# 73| 0: [VarAccess] a0 +# 73| -3: [TypeAccess] KProperty1 +# 73| 0: [TypeAccess] Base +# 73| 1: [TypeAccess] Integer +# 73| 22: [Method] getDelegatedToBaseClass2 +# 73| 3: [TypeAccess] int +# 73| 5: [BlockStmt] { ... } +# 73| 0: [ReturnStmt] return ... +# 73| 0: [MethodCall] getValue(...) +# 73| -3: [TypeAccess] Integer +# 73| -2: [TypeAccess] Base +# 73| -1: [TypeAccess] PropertyReferenceDelegatesKt +# 73| 0: [VarAccess] this.delegatedToBaseClass2$delegate +# 73| -1: [ThisAccess] this +# 1| 1: [ThisAccess] this +# 73| 2: [PropertyRefExpr] ...::... +# 73| -4: [AnonymousClass] new KProperty1(...) { ... } +# 73| 1: [Constructor] +# 73| 5: [BlockStmt] { ... } +# 73| 0: [SuperConstructorInvocationStmt] super(...) +# 73| 2: [Method] get +#-----| 4: (Parameters) +# 73| 0: [Parameter] a0 +# 73| 5: [BlockStmt] { ... } +# 73| 0: [ReturnStmt] return ... +# 73| 0: [MethodCall] getDelegatedToBaseClass2(...) +# 73| -1: [VarAccess] a0 +# 73| 3: [Method] invoke +#-----| 4: (Parameters) +# 73| 0: [Parameter] a0 +# 73| 5: [BlockStmt] { ... } +# 73| 0: [ReturnStmt] return ... +# 73| 0: [MethodCall] get(...) +# 73| -1: [ThisAccess] this +# 73| 0: [VarAccess] a0 +# 73| -3: [TypeAccess] KProperty1 +# 73| 0: [TypeAccess] MyClass +# 73| 1: [TypeAccess] Integer +# 75| 23: [FieldDeclaration] KProperty0 delegatedToAnotherClass1$delegate; +# 75| -1: [TypeAccess] KProperty0 +# 75| 0: [TypeAccess] Integer +# 75| 0: [PropertyRefExpr] ...::... +# 75| -4: [AnonymousClass] new KProperty0(...) { ... } +# 75| 1: [Constructor] +#-----| 4: (Parameters) +# 75| 0: [Parameter] +# 75| 5: [BlockStmt] { ... } +# 75| 0: [SuperConstructorInvocationStmt] super(...) +# 75| 1: [ExprStmt] ; +# 75| 0: [AssignExpr] ...=... +# 75| 0: [VarAccess] this. +# 75| -1: [ThisAccess] this +# 75| 1: [VarAccess] +# 75| 2: [FieldDeclaration] ClassWithDelegate ; +# 75| -1: [TypeAccess] ClassWithDelegate +# 75| 3: [Method] get +# 75| 5: [BlockStmt] { ... } +# 75| 0: [ReturnStmt] return ... +# 75| 0: [MethodCall] getAnotherClassInt(...) +# 75| -1: [VarAccess] this. +# 75| -1: [ThisAccess] this +# 75| 4: [Method] invoke +# 75| 5: [BlockStmt] { ... } +# 75| 0: [ReturnStmt] return ... +# 75| 0: [MethodCall] get(...) +# 75| -1: [ThisAccess] this +# 75| -3: [TypeAccess] KProperty0 +# 75| 0: [TypeAccess] Integer +# 75| 0: [MethodCall] getAnotherClassInstance(...) +# 75| -1: [ThisAccess] MyClass.this +# 75| 0: [TypeAccess] MyClass +# 75| 24: [Method] getDelegatedToAnotherClass1 +# 75| 3: [TypeAccess] int +# 75| 5: [BlockStmt] { ... } +# 75| 0: [ReturnStmt] return ... +# 75| 0: [MethodCall] getValue(...) +# 75| -2: [TypeAccess] Integer +# 75| -1: [TypeAccess] PropertyReferenceDelegatesKt +# 75| 0: [VarAccess] this.delegatedToAnotherClass1$delegate +# 75| -1: [ThisAccess] this +# 1| 1: [ThisAccess] this +# 75| 2: [PropertyRefExpr] ...::... +# 75| -4: [AnonymousClass] new KProperty1(...) { ... } +# 75| 1: [Constructor] +# 75| 5: [BlockStmt] { ... } +# 75| 0: [SuperConstructorInvocationStmt] super(...) +# 75| 2: [Method] get +#-----| 4: (Parameters) +# 75| 0: [Parameter] a0 +# 75| 5: [BlockStmt] { ... } +# 75| 0: [ReturnStmt] return ... +# 75| 0: [MethodCall] getDelegatedToAnotherClass1(...) +# 75| -1: [VarAccess] a0 +# 75| 3: [Method] invoke +#-----| 4: (Parameters) +# 75| 0: [Parameter] a0 +# 75| 5: [BlockStmt] { ... } +# 75| 0: [ReturnStmt] return ... +# 75| 0: [MethodCall] get(...) +# 75| -1: [ThisAccess] this +# 75| 0: [VarAccess] a0 +# 75| -3: [TypeAccess] KProperty1 +# 75| 0: [TypeAccess] MyClass +# 75| 1: [TypeAccess] Integer +# 77| 25: [FieldDeclaration] KMutableProperty0 delegatedToTopLevel$delegate; +# 77| -1: [TypeAccess] KMutableProperty0 +# 77| 0: [TypeAccess] Integer +# 77| 0: [PropertyRefExpr] ...::... +# 77| -4: [AnonymousClass] new KMutableProperty0(...) { ... } +# 77| 1: [Constructor] +# 77| 5: [BlockStmt] { ... } +# 77| 0: [SuperConstructorInvocationStmt] super(...) +# 77| 2: [Method] get +# 77| 5: [BlockStmt] { ... } +# 77| 0: [ReturnStmt] return ... +# 77| 0: [MethodCall] getTopLevelInt(...) +# 77| -1: [TypeAccess] DelegatedPropertiesKt +# 77| 3: [Method] invoke +# 77| 5: [BlockStmt] { ... } +# 77| 0: [ReturnStmt] return ... +# 77| 0: [MethodCall] get(...) +# 77| -1: [ThisAccess] this +# 77| 4: [Method] set +#-----| 4: (Parameters) +# 77| 0: [Parameter] a0 +# 77| 5: [BlockStmt] { ... } +# 77| 0: [ReturnStmt] return ... +# 77| 0: [MethodCall] setTopLevelInt(...) +# 77| -1: [TypeAccess] DelegatedPropertiesKt +# 77| 0: [VarAccess] a0 +# 77| -3: [TypeAccess] KMutableProperty0 +# 77| 0: [TypeAccess] Integer +# 77| 26: [Method] getDelegatedToTopLevel +# 77| 3: [TypeAccess] int +# 77| 5: [BlockStmt] { ... } +# 77| 0: [ReturnStmt] return ... +# 77| 0: [MethodCall] getValue(...) +# 77| -2: [TypeAccess] Integer +# 77| -1: [TypeAccess] PropertyReferenceDelegatesKt +# 77| 0: [VarAccess] this.delegatedToTopLevel$delegate +# 77| -1: [ThisAccess] this +# 1| 1: [ThisAccess] this +# 77| 2: [PropertyRefExpr] ...::... +# 77| -4: [AnonymousClass] new KMutableProperty1(...) { ... } +# 77| 1: [Constructor] +# 77| 5: [BlockStmt] { ... } +# 77| 0: [SuperConstructorInvocationStmt] super(...) +# 77| 2: [Method] get +#-----| 4: (Parameters) +# 77| 0: [Parameter] a0 +# 77| 5: [BlockStmt] { ... } +# 77| 0: [ReturnStmt] return ... +# 77| 0: [MethodCall] getDelegatedToTopLevel(...) +# 77| -1: [VarAccess] a0 +# 77| 3: [Method] invoke +#-----| 4: (Parameters) +# 77| 0: [Parameter] a0 +# 77| 5: [BlockStmt] { ... } +# 77| 0: [ReturnStmt] return ... +# 77| 0: [MethodCall] get(...) +# 77| -1: [ThisAccess] this +# 77| 0: [VarAccess] a0 +# 77| 4: [Method] set +#-----| 4: (Parameters) +# 77| 0: [Parameter] a0 +# 77| 1: [Parameter] a1 +# 77| 5: [BlockStmt] { ... } +# 77| 0: [ReturnStmt] return ... +# 77| 0: [MethodCall] setDelegatedToTopLevel(...) +# 77| -1: [VarAccess] a0 +# 77| 0: [VarAccess] a1 +# 77| -3: [TypeAccess] KMutableProperty1 +# 77| 0: [TypeAccess] MyClass +# 77| 1: [TypeAccess] Integer +# 77| 27: [Method] setDelegatedToTopLevel +# 77| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 77| 0: [Parameter] +# 77| 0: [TypeAccess] int +# 77| 5: [BlockStmt] { ... } +# 77| 0: [ReturnStmt] return ... +# 77| 0: [MethodCall] setValue(...) +# 77| -2: [TypeAccess] Integer +# 77| -1: [TypeAccess] PropertyReferenceDelegatesKt +# 77| 0: [VarAccess] this.delegatedToTopLevel$delegate +# 77| -1: [ThisAccess] this +# 1| 1: [ThisAccess] this +# 77| 2: [PropertyRefExpr] ...::... +# 77| -4: [AnonymousClass] new KMutableProperty1(...) { ... } +# 77| 1: [Constructor] +# 77| 5: [BlockStmt] { ... } +# 77| 0: [SuperConstructorInvocationStmt] super(...) +# 77| 2: [Method] get +#-----| 4: (Parameters) +# 77| 0: [Parameter] a0 +# 77| 5: [BlockStmt] { ... } +# 77| 0: [ReturnStmt] return ... +# 77| 0: [MethodCall] getDelegatedToTopLevel(...) +# 77| -1: [VarAccess] a0 +# 77| 3: [Method] invoke +#-----| 4: (Parameters) +# 77| 0: [Parameter] a0 +# 77| 5: [BlockStmt] { ... } +# 77| 0: [ReturnStmt] return ... +# 77| 0: [MethodCall] get(...) +# 77| -1: [ThisAccess] this +# 77| 0: [VarAccess] a0 +# 77| 4: [Method] set +#-----| 4: (Parameters) +# 77| 0: [Parameter] a0 +# 77| 1: [Parameter] a1 +# 77| 5: [BlockStmt] { ... } +# 77| 0: [ReturnStmt] return ... +# 77| 0: [MethodCall] setDelegatedToTopLevel(...) +# 77| -1: [VarAccess] a0 +# 77| 0: [VarAccess] a1 +# 77| -3: [TypeAccess] KMutableProperty1 +# 77| 0: [TypeAccess] MyClass +# 77| 1: [TypeAccess] Integer +# 77| 3: [VarAccess] +# 79| 28: [FieldDeclaration] KProperty0 max$delegate; +# 79| -1: [TypeAccess] KProperty0 +# 79| 0: [TypeAccess] Integer +# 79| 0: [PropertyRefExpr] ...::... +# 79| -4: [AnonymousClass] new KProperty0(...) { ... } +# 79| 1: [Constructor] +# 79| 5: [BlockStmt] { ... } +# 79| 0: [SuperConstructorInvocationStmt] super(...) +# 79| 2: [Method] get +# 79| 5: [BlockStmt] { ... } +# 79| 0: [ReturnStmt] return ... +# 79| 0: [VarAccess] MAX_VALUE +# 79| 3: [Method] invoke +# 79| 5: [BlockStmt] { ... } +# 79| 0: [ReturnStmt] return ... +# 79| 0: [MethodCall] get(...) +# 79| -1: [ThisAccess] this +# 79| -3: [TypeAccess] KProperty0 +# 79| 0: [TypeAccess] Integer +# 79| 29: [Method] getMax +# 79| 3: [TypeAccess] int +# 79| 5: [BlockStmt] { ... } +# 79| 0: [ReturnStmt] return ... +# 79| 0: [MethodCall] getValue(...) +# 79| -2: [TypeAccess] Integer +# 79| -1: [TypeAccess] PropertyReferenceDelegatesKt +# 79| 0: [VarAccess] this.max$delegate +# 79| -1: [ThisAccess] this +# 1| 1: [ThisAccess] this +# 79| 2: [PropertyRefExpr] ...::... +# 79| -4: [AnonymousClass] new KProperty1(...) { ... } +# 79| 1: [Constructor] +# 79| 5: [BlockStmt] { ... } +# 79| 0: [SuperConstructorInvocationStmt] super(...) +# 79| 2: [Method] get +#-----| 4: (Parameters) +# 79| 0: [Parameter] a0 +# 79| 5: [BlockStmt] { ... } +# 79| 0: [ReturnStmt] return ... +# 79| 0: [MethodCall] getMax(...) +# 79| -1: [VarAccess] a0 +# 79| 3: [Method] invoke +#-----| 4: (Parameters) +# 79| 0: [Parameter] a0 +# 79| 5: [BlockStmt] { ... } +# 79| 0: [ReturnStmt] return ... +# 79| 0: [MethodCall] get(...) +# 79| -1: [ThisAccess] this +# 79| 0: [VarAccess] a0 +# 79| -3: [TypeAccess] KProperty1 +# 79| 0: [TypeAccess] MyClass +# 79| 1: [TypeAccess] Integer +# 81| 30: [Method] fn +# 81| 3: [TypeAccess] Unit +# 81| 5: [BlockStmt] { ... } +# 82| 0: [BlockStmt] { ... } +# 82| 0: [LocalVariableDeclStmt] var ...; +# 82| 1: [LocalVariableDeclExpr] delegatedToMember3$delegate +# 82| 0: [PropertyRefExpr] ...::... +# 82| -4: [AnonymousClass] new KMutableProperty0(...) { ... } +# 82| 1: [Constructor] +#-----| 4: (Parameters) +# 82| 0: [Parameter] +# 82| 5: [BlockStmt] { ... } +# 82| 0: [SuperConstructorInvocationStmt] super(...) +# 82| 1: [ExprStmt] ; +# 82| 0: [AssignExpr] ...=... +# 82| 0: [VarAccess] this. +# 82| -1: [ThisAccess] this +# 82| 1: [VarAccess] +# 82| 2: [FieldDeclaration] MyClass ; +# 82| -1: [TypeAccess] MyClass +# 82| 3: [Method] get +# 82| 5: [BlockStmt] { ... } +# 82| 0: [ReturnStmt] return ... +# 82| 0: [MethodCall] getMemberInt(...) +# 82| -1: [VarAccess] this. +# 82| -1: [ThisAccess] this +# 82| 4: [Method] invoke +# 82| 5: [BlockStmt] { ... } +# 82| 0: [ReturnStmt] return ... +# 82| 0: [MethodCall] get(...) +# 82| -1: [ThisAccess] this +# 82| 5: [Method] set +#-----| 4: (Parameters) +# 82| 0: [Parameter] a0 +# 82| 5: [BlockStmt] { ... } +# 82| 0: [ReturnStmt] return ... +# 82| 0: [MethodCall] setMemberInt(...) +# 82| -1: [VarAccess] this. +# 82| -1: [ThisAccess] this +# 82| 0: [VarAccess] a0 +# 82| -3: [TypeAccess] KMutableProperty0 +# 82| 0: [TypeAccess] Integer +# 82| 0: [ThisAccess] this +# 82| 1: [LocalTypeDeclStmt] class ... +# 82| 0: [LocalClass] +# 82| 1: [Constructor] +# 82| 5: [BlockStmt] { ... } +# 82| 0: [SuperConstructorInvocationStmt] super(...) +# 82| 2: [Method] +# 82| 3: [TypeAccess] int +# 82| 5: [BlockStmt] { ... } +# 82| 0: [ReturnStmt] return ... +# 82| 0: [MethodCall] getValue(...) +# 82| -2: [TypeAccess] Integer +# 82| -1: [TypeAccess] PropertyReferenceDelegatesKt +# 82| 0: [VarAccess] delegatedToMember3$delegate +# 0| 1: [NullLiteral] null +# 82| 2: [PropertyRefExpr] ...::... +# 82| -4: [AnonymousClass] new KMutableProperty0(...) { ... } +# 82| 1: [Constructor] +# 82| 5: [BlockStmt] { ... } +# 82| 0: [SuperConstructorInvocationStmt] super(...) +# 82| 2: [Method] get +# 82| 5: [BlockStmt] { ... } +# 82| 0: [ReturnStmt] return ... +# 82| 0: [MethodCall] (...) +# 82| -1: [ClassInstanceExpr] new (...) +# 82| -3: [TypeAccess] Object +# 82| 3: [Method] invoke +# 82| 5: [BlockStmt] { ... } +# 82| 0: [ReturnStmt] return ... +# 82| 0: [MethodCall] get(...) +# 82| -1: [ThisAccess] this +# 82| 4: [Method] set +#-----| 4: (Parameters) +# 82| 0: [Parameter] a0 +# 82| 5: [BlockStmt] { ... } +# 82| 0: [ReturnStmt] return ... +# 82| 0: [MethodCall] (...) +# 82| -1: [ClassInstanceExpr] new (...) +# 82| -3: [TypeAccess] Object +# 82| 0: [VarAccess] a0 +# 82| -3: [TypeAccess] KMutableProperty0 +# 82| 0: [TypeAccess] Integer +# 82| 2: [LocalTypeDeclStmt] class ... +# 82| 0: [LocalClass] +# 82| 1: [Constructor] +# 82| 5: [BlockStmt] { ... } +# 82| 0: [SuperConstructorInvocationStmt] super(...) +# 82| 2: [Method] +# 82| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 82| 0: [Parameter] value +# 82| 0: [TypeAccess] int +# 82| 5: [BlockStmt] { ... } +# 82| 0: [ReturnStmt] return ... +# 82| 0: [MethodCall] setValue(...) +# 82| -2: [TypeAccess] Integer +# 82| -1: [TypeAccess] PropertyReferenceDelegatesKt +# 82| 0: [VarAccess] delegatedToMember3$delegate +# 0| 1: [NullLiteral] null +# 82| 2: [PropertyRefExpr] ...::... +# 82| -4: [AnonymousClass] new KMutableProperty0(...) { ... } +# 82| 1: [Constructor] +# 82| 5: [BlockStmt] { ... } +# 82| 0: [SuperConstructorInvocationStmt] super(...) +# 82| 2: [Method] get +# 82| 5: [BlockStmt] { ... } +# 82| 0: [ReturnStmt] return ... +# 82| 0: [MethodCall] (...) +# 82| -1: [ClassInstanceExpr] new (...) +# 82| -3: [TypeAccess] Object +# 82| 3: [Method] invoke +# 82| 5: [BlockStmt] { ... } +# 82| 0: [ReturnStmt] return ... +# 82| 0: [MethodCall] get(...) +# 82| -1: [ThisAccess] this +# 82| 4: [Method] set +#-----| 4: (Parameters) +# 82| 0: [Parameter] a0 +# 82| 5: [BlockStmt] { ... } +# 82| 0: [ReturnStmt] return ... +# 82| 0: [MethodCall] (...) +# 82| -1: [ClassInstanceExpr] new (...) +# 82| -3: [TypeAccess] Object +# 82| 0: [VarAccess] a0 +# 82| -3: [TypeAccess] KMutableProperty0 +# 82| 0: [TypeAccess] Integer +# 82| 3: [VarAccess] value +# 83| 1: [ExprStmt] ; +# 83| 0: [MethodCall] fn(...) +# 83| -1: [ThisAccess] this +exprs.kt: +# 0| [CompilationUnit] exprs +# 0| 1: [Class] ExprsKt +# 4| 1: [Method] topLevelMethod +# 4| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 4| 0: [Parameter] x +# 4| 0: [TypeAccess] int +# 4| 1: [Parameter] y +# 4| 0: [TypeAccess] int +# 5| 2: [Parameter] byx +# 5| 0: [TypeAccess] byte +# 5| 3: [Parameter] byy +# 5| 0: [TypeAccess] byte +# 6| 4: [Parameter] sx +# 6| 0: [TypeAccess] short +# 6| 5: [Parameter] sy +# 6| 0: [TypeAccess] short +# 7| 6: [Parameter] lx +# 7| 0: [TypeAccess] long +# 7| 7: [Parameter] ly +# 7| 0: [TypeAccess] long +# 8| 8: [Parameter] dx +# 8| 0: [TypeAccess] double +# 8| 9: [Parameter] dy +# 8| 0: [TypeAccess] double +# 9| 10: [Parameter] fx +# 9| 0: [TypeAccess] float +# 9| 11: [Parameter] fy +# 9| 0: [TypeAccess] float +# 10| 5: [BlockStmt] { ... } +# 11| 0: [LocalVariableDeclStmt] var ...; +# 11| 1: [LocalVariableDeclExpr] i1 +# 11| 0: [IntegerLiteral] 1 +# 12| 1: [LocalVariableDeclStmt] var ...; +# 12| 1: [LocalVariableDeclExpr] i2 +# 12| 0: [AddExpr] ... + ... +# 12| 0: [VarAccess] x +# 12| 1: [VarAccess] y +# 13| 2: [LocalVariableDeclStmt] var ...; +# 13| 1: [LocalVariableDeclExpr] i3 +# 13| 0: [SubExpr] ... - ... +# 13| 0: [VarAccess] x +# 13| 1: [VarAccess] y +# 14| 3: [LocalVariableDeclStmt] var ...; +# 14| 1: [LocalVariableDeclExpr] i4 +# 14| 0: [DivExpr] ... / ... +# 14| 0: [VarAccess] x +# 14| 1: [VarAccess] y +# 15| 4: [LocalVariableDeclStmt] var ...; +# 15| 1: [LocalVariableDeclExpr] i5 +# 15| 0: [RemExpr] ... % ... +# 15| 0: [VarAccess] x +# 15| 1: [VarAccess] y +# 16| 5: [LocalVariableDeclStmt] var ...; +# 16| 1: [LocalVariableDeclExpr] i6 +# 16| 0: [LeftShiftExpr] ... << ... +# 16| 0: [VarAccess] x +# 16| 1: [VarAccess] y +# 17| 6: [LocalVariableDeclStmt] var ...; +# 17| 1: [LocalVariableDeclExpr] i7 +# 17| 0: [RightShiftExpr] ... >> ... +# 17| 0: [VarAccess] x +# 17| 1: [VarAccess] y +# 18| 7: [LocalVariableDeclStmt] var ...; +# 18| 1: [LocalVariableDeclExpr] i8 +# 18| 0: [UnsignedRightShiftExpr] ... >>> ... +# 18| 0: [VarAccess] x +# 18| 1: [VarAccess] y +# 19| 8: [LocalVariableDeclStmt] var ...; +# 19| 1: [LocalVariableDeclExpr] i9 +# 19| 0: [AndBitwiseExpr] ... & ... +# 19| 0: [VarAccess] x +# 19| 1: [VarAccess] y +# 20| 9: [LocalVariableDeclStmt] var ...; +# 20| 1: [LocalVariableDeclExpr] i10 +# 20| 0: [OrBitwiseExpr] ... | ... +# 20| 0: [VarAccess] x +# 20| 1: [VarAccess] y +# 21| 10: [LocalVariableDeclStmt] var ...; +# 21| 1: [LocalVariableDeclExpr] i11 +# 21| 0: [XorBitwiseExpr] ... ^ ... +# 21| 0: [VarAccess] x +# 21| 1: [VarAccess] y +# 22| 11: [LocalVariableDeclStmt] var ...; +# 22| 1: [LocalVariableDeclExpr] i12 +# 22| 0: [BitNotExpr] ~... +# 22| 0: [VarAccess] x +# 23| 12: [LocalVariableDeclStmt] var ...; +# 23| 1: [LocalVariableDeclExpr] i13 +# 23| 0: [ValueEQExpr] ... (value equals) ... +# 23| 0: [VarAccess] x +# 23| 1: [VarAccess] y +# 24| 13: [LocalVariableDeclStmt] var ...; +# 24| 1: [LocalVariableDeclExpr] i14 +# 24| 0: [ValueNEExpr] ... (value not-equals) ... +# 24| 0: [VarAccess] x +# 24| 1: [VarAccess] y +# 25| 14: [LocalVariableDeclStmt] var ...; +# 25| 1: [LocalVariableDeclExpr] i15 +# 25| 0: [LTExpr] ... < ... +# 25| 0: [VarAccess] x +# 25| 1: [VarAccess] y +# 26| 15: [LocalVariableDeclStmt] var ...; +# 26| 1: [LocalVariableDeclExpr] i16 +# 26| 0: [LEExpr] ... <= ... +# 26| 0: [VarAccess] x +# 26| 1: [VarAccess] y +# 27| 16: [LocalVariableDeclStmt] var ...; +# 27| 1: [LocalVariableDeclExpr] i17 +# 27| 0: [GTExpr] ... > ... +# 27| 0: [VarAccess] x +# 27| 1: [VarAccess] y +# 28| 17: [LocalVariableDeclStmt] var ...; +# 28| 1: [LocalVariableDeclExpr] i18 +# 28| 0: [GEExpr] ... >= ... +# 28| 0: [VarAccess] x +# 28| 1: [VarAccess] y +# 29| 18: [LocalVariableDeclStmt] var ...; +# 29| 1: [LocalVariableDeclExpr] i19 +# 29| 0: [EQExpr] ... == ... +# 29| 0: [VarAccess] x +# 29| 1: [VarAccess] y +# 30| 19: [LocalVariableDeclStmt] var ...; +# 30| 1: [LocalVariableDeclExpr] i20 +# 30| 0: [NEExpr] ... != ... +# 30| 0: [VarAccess] x +# 30| 1: [VarAccess] y +# 31| 20: [LocalVariableDeclStmt] var ...; +# 31| 1: [LocalVariableDeclExpr] i21 +# 31| 0: [MethodCall] contains(...) +# 31| -1: [MethodCall] rangeTo(...) +# 31| -1: [VarAccess] x +# 31| 0: [VarAccess] y +# 31| 0: [VarAccess] x +# 32| 21: [LocalVariableDeclStmt] var ...; +# 32| 1: [LocalVariableDeclExpr] i22 +# 32| 0: [LogNotExpr] !... +# 32| 0: [MethodCall] contains(...) +# 32| -1: [MethodCall] rangeTo(...) +# 32| -1: [VarAccess] x +# 32| 0: [VarAccess] y +# 32| 0: [VarAccess] x +# 34| 22: [LocalVariableDeclStmt] var ...; +# 34| 1: [LocalVariableDeclExpr] by1 +# 34| 0: [DoubleLiteral] 1.0 +# 35| 23: [LocalVariableDeclStmt] var ...; +# 35| 1: [LocalVariableDeclExpr] by2 +# 35| 0: [AddExpr] ... + ... +# 35| 0: [VarAccess] byx +# 35| 1: [VarAccess] byy +# 36| 24: [LocalVariableDeclStmt] var ...; +# 36| 1: [LocalVariableDeclExpr] by3 +# 36| 0: [SubExpr] ... - ... +# 36| 0: [VarAccess] byx +# 36| 1: [VarAccess] byy +# 37| 25: [LocalVariableDeclStmt] var ...; +# 37| 1: [LocalVariableDeclExpr] by4 +# 37| 0: [DivExpr] ... / ... +# 37| 0: [VarAccess] byx +# 37| 1: [VarAccess] byy +# 38| 26: [LocalVariableDeclStmt] var ...; +# 38| 1: [LocalVariableDeclExpr] by5 +# 38| 0: [RemExpr] ... % ... +# 38| 0: [VarAccess] byx +# 38| 1: [VarAccess] byy +# 39| 27: [LocalVariableDeclStmt] var ...; +# 39| 1: [LocalVariableDeclExpr] by6 +# 39| 0: [ValueEQExpr] ... (value equals) ... +# 39| 0: [MethodCall] intValue(...) +# 39| -1: [VarAccess] byx +# 39| 1: [MethodCall] intValue(...) +# 39| -1: [VarAccess] byy +# 40| 28: [LocalVariableDeclStmt] var ...; +# 40| 1: [LocalVariableDeclExpr] by7 +# 40| 0: [ValueNEExpr] ... (value not-equals) ... +# 40| 0: [MethodCall] intValue(...) +# 40| -1: [VarAccess] byx +# 40| 1: [MethodCall] intValue(...) +# 40| -1: [VarAccess] byy +# 41| 29: [LocalVariableDeclStmt] var ...; +# 41| 1: [LocalVariableDeclExpr] by8 +# 41| 0: [LTExpr] ... < ... +# 41| 0: [MethodCall] intValue(...) +# 41| -1: [VarAccess] byx +# 41| 1: [MethodCall] intValue(...) +# 41| -1: [VarAccess] byy +# 42| 30: [LocalVariableDeclStmt] var ...; +# 42| 1: [LocalVariableDeclExpr] by9 +# 42| 0: [LEExpr] ... <= ... +# 42| 0: [MethodCall] intValue(...) +# 42| -1: [VarAccess] byx +# 42| 1: [MethodCall] intValue(...) +# 42| -1: [VarAccess] byy +# 43| 31: [LocalVariableDeclStmt] var ...; +# 43| 1: [LocalVariableDeclExpr] by10 +# 43| 0: [GTExpr] ... > ... +# 43| 0: [MethodCall] intValue(...) +# 43| -1: [VarAccess] byx +# 43| 1: [MethodCall] intValue(...) +# 43| -1: [VarAccess] byy +# 44| 32: [LocalVariableDeclStmt] var ...; +# 44| 1: [LocalVariableDeclExpr] by11 +# 44| 0: [GEExpr] ... >= ... +# 44| 0: [MethodCall] intValue(...) +# 44| -1: [VarAccess] byx +# 44| 1: [MethodCall] intValue(...) +# 44| -1: [VarAccess] byy +# 45| 33: [LocalVariableDeclStmt] var ...; +# 45| 1: [LocalVariableDeclExpr] by12 +# 45| 0: [EQExpr] ... == ... +# 45| 0: [VarAccess] byx +# 45| 1: [VarAccess] byy +# 46| 34: [LocalVariableDeclStmt] var ...; +# 46| 1: [LocalVariableDeclExpr] by13 +# 46| 0: [NEExpr] ... != ... +# 46| 0: [VarAccess] byx +# 46| 1: [VarAccess] byy +# 47| 35: [LocalVariableDeclStmt] var ...; +# 47| 1: [LocalVariableDeclExpr] by14 +# 47| 0: [OrBitwiseExpr] ... | ... +# 47| 0: [VarAccess] byx +# 47| 1: [VarAccess] byy +# 48| 36: [LocalVariableDeclStmt] var ...; +# 48| 1: [LocalVariableDeclExpr] by15 +# 48| 0: [AndBitwiseExpr] ... & ... +# 48| 0: [VarAccess] byx +# 48| 1: [VarAccess] byy +# 49| 37: [LocalVariableDeclStmt] var ...; +# 49| 1: [LocalVariableDeclExpr] by16 +# 49| 0: [XorBitwiseExpr] ... ^ ... +# 49| 0: [VarAccess] byx +# 49| 1: [VarAccess] byy +# 51| 38: [LocalVariableDeclStmt] var ...; +# 51| 1: [LocalVariableDeclExpr] s1 +# 51| 0: [DoubleLiteral] 1.0 +# 52| 39: [LocalVariableDeclStmt] var ...; +# 52| 1: [LocalVariableDeclExpr] s2 +# 52| 0: [AddExpr] ... + ... +# 52| 0: [VarAccess] sx +# 52| 1: [VarAccess] sy +# 53| 40: [LocalVariableDeclStmt] var ...; +# 53| 1: [LocalVariableDeclExpr] s3 +# 53| 0: [SubExpr] ... - ... +# 53| 0: [VarAccess] sx +# 53| 1: [VarAccess] sy +# 54| 41: [LocalVariableDeclStmt] var ...; +# 54| 1: [LocalVariableDeclExpr] s4 +# 54| 0: [DivExpr] ... / ... +# 54| 0: [VarAccess] sx +# 54| 1: [VarAccess] sy +# 55| 42: [LocalVariableDeclStmt] var ...; +# 55| 1: [LocalVariableDeclExpr] s5 +# 55| 0: [RemExpr] ... % ... +# 55| 0: [VarAccess] sx +# 55| 1: [VarAccess] sy +# 56| 43: [LocalVariableDeclStmt] var ...; +# 56| 1: [LocalVariableDeclExpr] s6 +# 56| 0: [ValueEQExpr] ... (value equals) ... +# 56| 0: [MethodCall] intValue(...) +# 56| -1: [VarAccess] sx +# 56| 1: [MethodCall] intValue(...) +# 56| -1: [VarAccess] sy +# 57| 44: [LocalVariableDeclStmt] var ...; +# 57| 1: [LocalVariableDeclExpr] s7 +# 57| 0: [ValueNEExpr] ... (value not-equals) ... +# 57| 0: [MethodCall] intValue(...) +# 57| -1: [VarAccess] sx +# 57| 1: [MethodCall] intValue(...) +# 57| -1: [VarAccess] sy +# 58| 45: [LocalVariableDeclStmt] var ...; +# 58| 1: [LocalVariableDeclExpr] s8 +# 58| 0: [LTExpr] ... < ... +# 58| 0: [MethodCall] intValue(...) +# 58| -1: [VarAccess] sx +# 58| 1: [MethodCall] intValue(...) +# 58| -1: [VarAccess] sy +# 59| 46: [LocalVariableDeclStmt] var ...; +# 59| 1: [LocalVariableDeclExpr] s9 +# 59| 0: [LEExpr] ... <= ... +# 59| 0: [MethodCall] intValue(...) +# 59| -1: [VarAccess] sx +# 59| 1: [MethodCall] intValue(...) +# 59| -1: [VarAccess] sy +# 60| 47: [LocalVariableDeclStmt] var ...; +# 60| 1: [LocalVariableDeclExpr] s10 +# 60| 0: [GTExpr] ... > ... +# 60| 0: [MethodCall] intValue(...) +# 60| -1: [VarAccess] sx +# 60| 1: [MethodCall] intValue(...) +# 60| -1: [VarAccess] sy +# 61| 48: [LocalVariableDeclStmt] var ...; +# 61| 1: [LocalVariableDeclExpr] s11 +# 61| 0: [GEExpr] ... >= ... +# 61| 0: [MethodCall] intValue(...) +# 61| -1: [VarAccess] sx +# 61| 1: [MethodCall] intValue(...) +# 61| -1: [VarAccess] sy +# 62| 49: [LocalVariableDeclStmt] var ...; +# 62| 1: [LocalVariableDeclExpr] s12 +# 62| 0: [EQExpr] ... == ... +# 62| 0: [VarAccess] sx +# 62| 1: [VarAccess] sy +# 63| 50: [LocalVariableDeclStmt] var ...; +# 63| 1: [LocalVariableDeclExpr] s13 +# 63| 0: [NEExpr] ... != ... +# 63| 0: [VarAccess] sx +# 63| 1: [VarAccess] sy +# 64| 51: [LocalVariableDeclStmt] var ...; +# 64| 1: [LocalVariableDeclExpr] s14 +# 64| 0: [OrBitwiseExpr] ... | ... +# 64| 0: [VarAccess] sx +# 64| 1: [VarAccess] sy +# 65| 52: [LocalVariableDeclStmt] var ...; +# 65| 1: [LocalVariableDeclExpr] s15 +# 65| 0: [AndBitwiseExpr] ... & ... +# 65| 0: [VarAccess] sx +# 65| 1: [VarAccess] sy +# 66| 53: [LocalVariableDeclStmt] var ...; +# 66| 1: [LocalVariableDeclExpr] s16 +# 66| 0: [XorBitwiseExpr] ... ^ ... +# 66| 0: [VarAccess] sx +# 66| 1: [VarAccess] sy +# 68| 54: [LocalVariableDeclStmt] var ...; +# 68| 1: [LocalVariableDeclExpr] l1 +# 68| 0: [DoubleLiteral] 1.0 +# 69| 55: [LocalVariableDeclStmt] var ...; +# 69| 1: [LocalVariableDeclExpr] l2 +# 69| 0: [AddExpr] ... + ... +# 69| 0: [VarAccess] lx +# 69| 1: [VarAccess] ly +# 70| 56: [LocalVariableDeclStmt] var ...; +# 70| 1: [LocalVariableDeclExpr] l3 +# 70| 0: [SubExpr] ... - ... +# 70| 0: [VarAccess] lx +# 70| 1: [VarAccess] ly +# 71| 57: [LocalVariableDeclStmt] var ...; +# 71| 1: [LocalVariableDeclExpr] l4 +# 71| 0: [DivExpr] ... / ... +# 71| 0: [VarAccess] lx +# 71| 1: [VarAccess] ly +# 72| 58: [LocalVariableDeclStmt] var ...; +# 72| 1: [LocalVariableDeclExpr] l5 +# 72| 0: [RemExpr] ... % ... +# 72| 0: [VarAccess] lx +# 72| 1: [VarAccess] ly +# 73| 59: [LocalVariableDeclStmt] var ...; +# 73| 1: [LocalVariableDeclExpr] l6 +# 73| 0: [LeftShiftExpr] ... << ... +# 73| 0: [VarAccess] lx +# 73| 1: [VarAccess] y +# 74| 60: [LocalVariableDeclStmt] var ...; +# 74| 1: [LocalVariableDeclExpr] l7 +# 74| 0: [RightShiftExpr] ... >> ... +# 74| 0: [VarAccess] lx +# 74| 1: [VarAccess] y +# 75| 61: [LocalVariableDeclStmt] var ...; +# 75| 1: [LocalVariableDeclExpr] l8 +# 75| 0: [UnsignedRightShiftExpr] ... >>> ... +# 75| 0: [VarAccess] lx +# 75| 1: [VarAccess] y +# 76| 62: [LocalVariableDeclStmt] var ...; +# 76| 1: [LocalVariableDeclExpr] l9 +# 76| 0: [AndBitwiseExpr] ... & ... +# 76| 0: [VarAccess] lx +# 76| 1: [VarAccess] ly +# 77| 63: [LocalVariableDeclStmt] var ...; +# 77| 1: [LocalVariableDeclExpr] l10 +# 77| 0: [OrBitwiseExpr] ... | ... +# 77| 0: [VarAccess] lx +# 77| 1: [VarAccess] ly +# 78| 64: [LocalVariableDeclStmt] var ...; +# 78| 1: [LocalVariableDeclExpr] l11 +# 78| 0: [XorBitwiseExpr] ... ^ ... +# 78| 0: [VarAccess] lx +# 78| 1: [VarAccess] ly +# 79| 65: [LocalVariableDeclStmt] var ...; +# 79| 1: [LocalVariableDeclExpr] l12 +# 79| 0: [BitNotExpr] ~... +# 79| 0: [VarAccess] lx +# 80| 66: [LocalVariableDeclStmt] var ...; +# 80| 1: [LocalVariableDeclExpr] l13 +# 80| 0: [ValueEQExpr] ... (value equals) ... +# 80| 0: [VarAccess] lx +# 80| 1: [VarAccess] ly +# 81| 67: [LocalVariableDeclStmt] var ...; +# 81| 1: [LocalVariableDeclExpr] l14 +# 81| 0: [ValueNEExpr] ... (value not-equals) ... +# 81| 0: [VarAccess] lx +# 81| 1: [VarAccess] ly +# 82| 68: [LocalVariableDeclStmt] var ...; +# 82| 1: [LocalVariableDeclExpr] l15 +# 82| 0: [LTExpr] ... < ... +# 82| 0: [VarAccess] lx +# 82| 1: [VarAccess] ly +# 83| 69: [LocalVariableDeclStmt] var ...; +# 83| 1: [LocalVariableDeclExpr] l16 +# 83| 0: [LEExpr] ... <= ... +# 83| 0: [VarAccess] lx +# 83| 1: [VarAccess] ly +# 84| 70: [LocalVariableDeclStmt] var ...; +# 84| 1: [LocalVariableDeclExpr] l17 +# 84| 0: [GTExpr] ... > ... +# 84| 0: [VarAccess] lx +# 84| 1: [VarAccess] ly +# 85| 71: [LocalVariableDeclStmt] var ...; +# 85| 1: [LocalVariableDeclExpr] l18 +# 85| 0: [GEExpr] ... >= ... +# 85| 0: [VarAccess] lx +# 85| 1: [VarAccess] ly +# 86| 72: [LocalVariableDeclStmt] var ...; +# 86| 1: [LocalVariableDeclExpr] l19 +# 86| 0: [EQExpr] ... == ... +# 86| 0: [VarAccess] lx +# 86| 1: [VarAccess] ly +# 87| 73: [LocalVariableDeclStmt] var ...; +# 87| 1: [LocalVariableDeclExpr] l20 +# 87| 0: [NEExpr] ... != ... +# 87| 0: [VarAccess] lx +# 87| 1: [VarAccess] ly +# 89| 74: [LocalVariableDeclStmt] var ...; +# 89| 1: [LocalVariableDeclExpr] d1 +# 89| 0: [DoubleLiteral] 1.0 +# 90| 75: [LocalVariableDeclStmt] var ...; +# 90| 1: [LocalVariableDeclExpr] d2 +# 90| 0: [AddExpr] ... + ... +# 90| 0: [VarAccess] dx +# 90| 1: [VarAccess] dy +# 91| 76: [LocalVariableDeclStmt] var ...; +# 91| 1: [LocalVariableDeclExpr] d3 +# 91| 0: [SubExpr] ... - ... +# 91| 0: [VarAccess] dx +# 91| 1: [VarAccess] dy +# 92| 77: [LocalVariableDeclStmt] var ...; +# 92| 1: [LocalVariableDeclExpr] d4 +# 92| 0: [DivExpr] ... / ... +# 92| 0: [VarAccess] dx +# 92| 1: [VarAccess] dy +# 93| 78: [LocalVariableDeclStmt] var ...; +# 93| 1: [LocalVariableDeclExpr] d5 +# 93| 0: [RemExpr] ... % ... +# 93| 0: [VarAccess] dx +# 93| 1: [VarAccess] dy +# 94| 79: [LocalVariableDeclStmt] var ...; +# 94| 1: [LocalVariableDeclExpr] d6 +# 94| 0: [EQExpr] ... == ... +# 94| 0: [VarAccess] dx +# 94| 1: [VarAccess] dy +# 95| 80: [LocalVariableDeclStmt] var ...; +# 95| 1: [LocalVariableDeclExpr] d7 +# 95| 0: [NEExpr] ... != ... +# 95| 0: [VarAccess] dx +# 95| 1: [VarAccess] dy +# 96| 81: [LocalVariableDeclStmt] var ...; +# 96| 1: [LocalVariableDeclExpr] d8 +# 96| 0: [LTExpr] ... < ... +# 96| 0: [VarAccess] dx +# 96| 1: [VarAccess] dy +# 97| 82: [LocalVariableDeclStmt] var ...; +# 97| 1: [LocalVariableDeclExpr] d9 +# 97| 0: [LEExpr] ... <= ... +# 97| 0: [VarAccess] dx +# 97| 1: [VarAccess] dy +# 98| 83: [LocalVariableDeclStmt] var ...; +# 98| 1: [LocalVariableDeclExpr] d10 +# 98| 0: [GTExpr] ... > ... +# 98| 0: [VarAccess] dx +# 98| 1: [VarAccess] dy +# 99| 84: [LocalVariableDeclStmt] var ...; +# 99| 1: [LocalVariableDeclExpr] d11 +# 99| 0: [GEExpr] ... >= ... +# 99| 0: [VarAccess] dx +# 99| 1: [VarAccess] dy +# 100| 85: [LocalVariableDeclStmt] var ...; +# 100| 1: [LocalVariableDeclExpr] d12 +# 100| 0: [EQExpr] ... == ... +# 100| 0: [VarAccess] dx +# 100| 1: [VarAccess] dy +# 101| 86: [LocalVariableDeclStmt] var ...; +# 101| 1: [LocalVariableDeclExpr] d13 +# 101| 0: [NEExpr] ... != ... +# 101| 0: [VarAccess] dx +# 101| 1: [VarAccess] dy +# 103| 87: [LocalVariableDeclStmt] var ...; +# 103| 1: [LocalVariableDeclExpr] f1 +# 103| 0: [DoubleLiteral] 1.0 +# 104| 88: [LocalVariableDeclStmt] var ...; +# 104| 1: [LocalVariableDeclExpr] f2 +# 104| 0: [AddExpr] ... + ... +# 104| 0: [VarAccess] fx +# 104| 1: [VarAccess] fy +# 105| 89: [LocalVariableDeclStmt] var ...; +# 105| 1: [LocalVariableDeclExpr] f3 +# 105| 0: [SubExpr] ... - ... +# 105| 0: [VarAccess] fx +# 105| 1: [VarAccess] fy +# 106| 90: [LocalVariableDeclStmt] var ...; +# 106| 1: [LocalVariableDeclExpr] f4 +# 106| 0: [DivExpr] ... / ... +# 106| 0: [VarAccess] fx +# 106| 1: [VarAccess] fy +# 107| 91: [LocalVariableDeclStmt] var ...; +# 107| 1: [LocalVariableDeclExpr] f5 +# 107| 0: [RemExpr] ... % ... +# 107| 0: [VarAccess] fx +# 107| 1: [VarAccess] fy +# 108| 92: [LocalVariableDeclStmt] var ...; +# 108| 1: [LocalVariableDeclExpr] f6 +# 108| 0: [EQExpr] ... == ... +# 108| 0: [VarAccess] fx +# 108| 1: [VarAccess] fy +# 109| 93: [LocalVariableDeclStmt] var ...; +# 109| 1: [LocalVariableDeclExpr] f7 +# 109| 0: [NEExpr] ... != ... +# 109| 0: [VarAccess] fx +# 109| 1: [VarAccess] fy +# 110| 94: [LocalVariableDeclStmt] var ...; +# 110| 1: [LocalVariableDeclExpr] f8 +# 110| 0: [LTExpr] ... < ... +# 110| 0: [VarAccess] fx +# 110| 1: [VarAccess] fy +# 111| 95: [LocalVariableDeclStmt] var ...; +# 111| 1: [LocalVariableDeclExpr] f9 +# 111| 0: [LEExpr] ... <= ... +# 111| 0: [VarAccess] fx +# 111| 1: [VarAccess] fy +# 112| 96: [LocalVariableDeclStmt] var ...; +# 112| 1: [LocalVariableDeclExpr] f10 +# 112| 0: [GTExpr] ... > ... +# 112| 0: [VarAccess] fx +# 112| 1: [VarAccess] fy +# 113| 97: [LocalVariableDeclStmt] var ...; +# 113| 1: [LocalVariableDeclExpr] f11 +# 113| 0: [GEExpr] ... >= ... +# 113| 0: [VarAccess] fx +# 113| 1: [VarAccess] fy +# 114| 98: [LocalVariableDeclStmt] var ...; +# 114| 1: [LocalVariableDeclExpr] f12 +# 114| 0: [EQExpr] ... == ... +# 114| 0: [VarAccess] fx +# 114| 1: [VarAccess] fy +# 115| 99: [LocalVariableDeclStmt] var ...; +# 115| 1: [LocalVariableDeclExpr] f13 +# 115| 0: [NEExpr] ... != ... +# 115| 0: [VarAccess] fx +# 115| 1: [VarAccess] fy +# 117| 100: [LocalVariableDeclStmt] var ...; +# 117| 1: [LocalVariableDeclExpr] b1 +# 117| 0: [BooleanLiteral] true +# 118| 101: [LocalVariableDeclStmt] var ...; +# 118| 1: [LocalVariableDeclExpr] b2 +# 118| 0: [BooleanLiteral] false +# 119| 102: [LocalVariableDeclStmt] var ...; +# 119| 1: [LocalVariableDeclExpr] b3 +# 119| 0: [AndLogicalExpr] ... && ... +# 119| 0: [VarAccess] b1 +# 119| 1: [VarAccess] b2 +# 120| 103: [LocalVariableDeclStmt] var ...; +# 120| 1: [LocalVariableDeclExpr] b4 +# 120| 0: [OrLogicalExpr] ... || ... +# 120| 0: [VarAccess] b1 +# 120| 1: [VarAccess] b2 +# 121| 104: [LocalVariableDeclStmt] var ...; +# 121| 1: [LocalVariableDeclExpr] b5 +# 121| 0: [LogNotExpr] !... +# 121| 0: [VarAccess] b1 +# 123| 105: [LocalVariableDeclStmt] var ...; +# 123| 1: [LocalVariableDeclExpr] c +# 123| 0: [CharacterLiteral] x +# 124| 106: [LocalVariableDeclStmt] var ...; +# 124| 1: [LocalVariableDeclExpr] str +# 124| 0: [StringLiteral] "string lit" +# 125| 107: [LocalVariableDeclStmt] var ...; +# 125| 1: [LocalVariableDeclExpr] strWithQuote +# 125| 0: [StringLiteral] "string \" lit" +# 126| 108: [LocalVariableDeclStmt] var ...; +# 126| 1: [LocalVariableDeclExpr] b6 +# 126| 0: [InstanceOfExpr] ...instanceof... +# 126| 0: [VarAccess] i1 +# 126| 1: [TypeAccess] int +# 127| 109: [LocalVariableDeclStmt] var ...; +# 127| 1: [LocalVariableDeclExpr] b7 +# 127| 0: [NotInstanceOfExpr] ... !is ... +# 127| 0: [VarAccess] i1 +# 127| 1: [TypeAccess] int +# 128| 110: [LocalVariableDeclStmt] var ...; +# 128| 1: [LocalVariableDeclExpr] b8 +# 128| 0: [CastExpr] (...)... +# 128| 0: [TypeAccess] boolean +# 128| 1: [VarAccess] b7 +# 129| 111: [LocalVariableDeclStmt] var ...; +# 129| 1: [LocalVariableDeclExpr] str1 +# 129| 0: [StringLiteral] "string lit" +# 130| 112: [LocalVariableDeclStmt] var ...; +# 130| 1: [LocalVariableDeclExpr] str2 +# 130| 0: [StringLiteral] "string lit" +# 131| 113: [LocalVariableDeclStmt] var ...; +# 131| 1: [LocalVariableDeclExpr] str3 +# 131| 0: [NullLiteral] null +# 132| 114: [LocalVariableDeclStmt] var ...; +# 132| 1: [LocalVariableDeclExpr] str4 +# 132| 0: [StringTemplateExpr] "..." +# 132| 0: [StringLiteral] "foo " +# 132| 1: [VarAccess] str1 +# 132| 2: [StringLiteral] " bar " +# 132| 3: [VarAccess] str2 +# 132| 4: [StringLiteral] " baz" +# 133| 115: [LocalVariableDeclStmt] var ...; +# 133| 1: [LocalVariableDeclExpr] str5 +# 133| 0: [StringTemplateExpr] "..." +# 133| 0: [StringLiteral] "foo " +# 133| 1: [AddExpr] ... + ... +# 133| 0: [VarAccess] str1 +# 133| 1: [VarAccess] str2 +# 133| 2: [StringLiteral] " bar " +# 133| 3: [MethodCall] stringPlus(...) +# 133| -1: [TypeAccess] Intrinsics +# 133| 0: [VarAccess] str2 +# 133| 1: [VarAccess] str1 +# 133| 4: [StringLiteral] " baz" +# 134| 116: [LocalVariableDeclStmt] var ...; +# 134| 1: [LocalVariableDeclExpr] str6 +# 134| 0: [AddExpr] ... + ... +# 134| 0: [VarAccess] str1 +# 134| 1: [VarAccess] str2 +# 136| 117: [LocalVariableDeclStmt] var ...; +# 136| 1: [LocalVariableDeclExpr] variable +# 136| 0: [IntegerLiteral] 10 +# 137| 118: [WhileStmt] while (...) +# 137| 0: [GTExpr] ... > ... +# 137| 0: [VarAccess] variable +# 137| 1: [IntegerLiteral] 0 +# 137| 1: [BlockStmt] { ... } +# 138| 0: [ExprStmt] ; +# 138| 0: [ImplicitCoercionToUnitExpr] +# 138| 0: [TypeAccess] Unit +# 138| 1: [StmtExpr] +# 138| 0: [BlockStmt] { ... } +# 138| 0: [LocalVariableDeclStmt] var ...; +# 138| 1: [LocalVariableDeclExpr] tmp0 +# 138| 0: [VarAccess] variable +# 138| 1: [ExprStmt] ; +# 138| 0: [AssignExpr] ...=... +# 138| 0: [VarAccess] variable +# 138| 1: [MethodCall] dec(...) +# 138| -1: [VarAccess] tmp0 +# 138| 2: [ExprStmt] ; +# 138| 0: [VarAccess] tmp0 +# 141| 119: [ReturnStmt] return ... +# 141| 0: [AddExpr] ... + ... +# 141| 0: [IntegerLiteral] 123 +# 141| 1: [IntegerLiteral] 456 +# 144| 2: [Method] getClass +# 144| 3: [TypeAccess] Unit +# 144| 5: [BlockStmt] { ... } +# 145| 0: [LocalVariableDeclStmt] var ...; +# 145| 1: [LocalVariableDeclExpr] d +# 145| 0: [ClassExpr] ::class +# 145| 0: [BooleanLiteral] true +# 156| 3: [Method] typeTests +# 156| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 156| 0: [Parameter] x +# 156| 0: [TypeAccess] Root +# 156| 1: [Parameter] y +# 156| 0: [TypeAccess] Subclass1 +# 156| 5: [BlockStmt] { ... } +# 157| 0: [ExprStmt] ; +# 157| 0: [WhenExpr] when ... +# 157| 0: [WhenBranch] ... -> ... +# 157| 0: [InstanceOfExpr] ...instanceof... +# 157| 0: [VarAccess] x +# 157| 1: [TypeAccess] Subclass1 +# 157| 1: [BlockStmt] { ... } +# 158| 0: [LocalVariableDeclStmt] var ...; +# 158| 1: [LocalVariableDeclExpr] x1 +# 158| 0: [ImplicitCastExpr] +# 158| 0: [TypeAccess] Subclass1 +# 158| 1: [VarAccess] x +# 160| 1: [LocalVariableDeclStmt] var ...; +# 160| 1: [LocalVariableDeclExpr] y1 +# 160| 0: [WhenExpr] when ... +# 160| 0: [WhenBranch] ... -> ... +# 160| 0: [InstanceOfExpr] ...instanceof... +# 160| 0: [VarAccess] x +# 160| 1: [TypeAccess] Subclass1 +# 160| 1: [ExprStmt] ; +# 160| 0: [ImplicitCastExpr] +# 160| 0: [TypeAccess] Subclass1 +# 160| 1: [StmtExpr] +# 160| 0: [BlockStmt] { ... } +# 160| 0: [ExprStmt] ; +# 160| 0: [VarAccess] x +# 160| 1: [WhenBranch] ... -> ... +# 160| 0: [BooleanLiteral] true +# 160| 1: [BlockStmt] { ... } +# 160| 0: [ExprStmt] ; +# 160| 0: [VarAccess] y +# 161| 2: [LocalVariableDeclStmt] var ...; +# 161| 1: [LocalVariableDeclExpr] q +# 161| 0: [IntegerLiteral] 1 +# 162| 3: [ExprStmt] ; +# 162| 0: [WhenExpr] when ... +# 162| 0: [WhenBranch] ... -> ... +# 162| 0: [InstanceOfExpr] ...instanceof... +# 162| 0: [VarAccess] x +# 162| 1: [TypeAccess] Subclass1 +# 162| 1: [BlockStmt] { ... } +# 162| 0: [ExprStmt] ; +# 162| 0: [AssignExpr] ...=... +# 162| 0: [VarAccess] q +# 162| 1: [IntegerLiteral] 2 +# 162| 1: [WhenBranch] ... -> ... +# 162| 0: [BooleanLiteral] true +# 162| 1: [BlockStmt] { ... } +# 162| 0: [ExprStmt] ; +# 162| 0: [AssignExpr] ...=... +# 162| 0: [VarAccess] q +# 162| 1: [IntegerLiteral] 3 +# 165| 4: [Method] foo +# 165| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 165| 0: [Parameter] p +# 165| 0: [TypeAccess] Polygon +# 165| 5: [BlockStmt] { ... } +# 166| 0: [LocalVariableDeclStmt] var ...; +# 166| 1: [LocalVariableDeclExpr] r +# 166| 0: [MethodCall] getBounds(...) +# 166| -1: [VarAccess] p +# 167| 1: [ExprStmt] ; +# 167| 0: [WhenExpr] when ... +# 167| 0: [WhenBranch] ... -> ... +# 167| 0: [ValueNEExpr] ... (value not-equals) ... +# 167| 0: [VarAccess] r +# 167| 1: [NullLiteral] null +# 167| 1: [BlockStmt] { ... } +# 168| 0: [LocalVariableDeclStmt] var ...; +# 168| 1: [LocalVariableDeclExpr] r2 +# 168| 0: [ImplicitNotNullExpr] +# 168| 0: [TypeAccess] Rectangle +# 168| 1: [VarAccess] r +# 169| 1: [LocalVariableDeclStmt] var ...; +# 169| 1: [LocalVariableDeclExpr] height +# 169| 0: [VarAccess] r2.height +# 169| -1: [VarAccess] r2 +# 170| 2: [ExprStmt] ; +# 170| 0: [AssignExpr] ...=... +# 170| 0: [VarAccess] r2.height +# 170| -1: [VarAccess] r2 +# 170| 1: [IntegerLiteral] 3 +# 184| 5: [Method] enums +# 184| 3: [TypeAccess] Unit +# 184| 5: [BlockStmt] { ... } +# 185| 0: [LocalVariableDeclStmt] var ...; +# 185| 1: [LocalVariableDeclExpr] south +# 185| 0: [VarAccess] Direction.SOUTH +# 185| -1: [TypeAccess] Direction +# 186| 1: [LocalVariableDeclStmt] var ...; +# 186| 1: [LocalVariableDeclExpr] green +# 186| 0: [VarAccess] Color.GREEN +# 186| -1: [TypeAccess] Color +# 201| 6: [Method] notNullAssertion +# 201| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 201| 0: [Parameter] x +# 201| 0: [TypeAccess] Object +# 201| 5: [BlockStmt] { ... } +# 202| 0: [LocalVariableDeclStmt] var ...; +# 202| 1: [LocalVariableDeclExpr] y +# 202| 0: [NotNullExpr] ...!! +# 202| 0: [VarAccess] x +# 220| 7: [Method] todo +# 220| 3: [TypeAccess] Unit +# 220| 5: [BlockStmt] { ... } +# 221| 0: [ExprStmt] ; +# 221| 0: [MethodCall] TODO(...) +# 221| -1: [TypeAccess] StandardKt +# 225| 8: [Method] fnClassRef +# 225| 3: [TypeAccess] Unit +# 225| 5: [BlockStmt] { ... } +# 226| 0: [LocalVariableDeclStmt] var ...; +# 226| 1: [LocalVariableDeclExpr] x +# 226| 0: [TypeLiteral] SomeClass1.class +# 226| 0: [TypeAccess] SomeClass1 +# 229| 9: [Method] equalityTests +# 229| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 229| 0: [Parameter] notNullPrimitive +# 229| 0: [TypeAccess] int +# 229| 1: [Parameter] nullablePrimitive +# 229| 0: [TypeAccess] Integer +# 229| 2: [Parameter] notNullReftype +# 229| 0: [TypeAccess] String +# 229| 3: [Parameter] nullableReftype +# 229| 0: [TypeAccess] String +# 229| 5: [BlockStmt] { ... } +# 230| 0: [LocalVariableDeclStmt] var ...; +# 230| 1: [LocalVariableDeclExpr] b1 +# 230| 0: [ValueEQExpr] ... (value equals) ... +# 230| 0: [VarAccess] notNullPrimitive +# 230| 1: [VarAccess] notNullPrimitive +# 231| 1: [LocalVariableDeclStmt] var ...; +# 231| 1: [LocalVariableDeclExpr] b2 +# 231| 0: [ValueEQExpr] ... (value equals) ... +# 231| 0: [VarAccess] notNullPrimitive +# 231| 1: [VarAccess] nullablePrimitive +# 232| 2: [LocalVariableDeclStmt] var ...; +# 232| 1: [LocalVariableDeclExpr] b3 +# 232| 0: [ValueEQExpr] ... (value equals) ... +# 232| 0: [VarAccess] nullablePrimitive +# 232| 1: [VarAccess] nullablePrimitive +# 233| 3: [LocalVariableDeclStmt] var ...; +# 233| 1: [LocalVariableDeclExpr] b4 +# 233| 0: [ValueEQExpr] ... (value equals) ... +# 233| 0: [VarAccess] notNullReftype +# 233| 1: [VarAccess] notNullReftype +# 234| 4: [LocalVariableDeclStmt] var ...; +# 234| 1: [LocalVariableDeclExpr] b5 +# 234| 0: [ValueEQExpr] ... (value equals) ... +# 234| 0: [VarAccess] notNullReftype +# 234| 1: [VarAccess] nullableReftype +# 235| 5: [LocalVariableDeclStmt] var ...; +# 235| 1: [LocalVariableDeclExpr] b6 +# 235| 0: [ValueEQExpr] ... (value equals) ... +# 235| 0: [VarAccess] nullableReftype +# 235| 1: [VarAccess] nullableReftype +# 236| 6: [LocalVariableDeclStmt] var ...; +# 236| 1: [LocalVariableDeclExpr] b7 +# 236| 0: [ValueNEExpr] ... (value not-equals) ... +# 236| 0: [VarAccess] notNullPrimitive +# 236| 1: [VarAccess] notNullPrimitive +# 237| 7: [LocalVariableDeclStmt] var ...; +# 237| 1: [LocalVariableDeclExpr] b8 +# 237| 0: [ValueNEExpr] ... (value not-equals) ... +# 237| 0: [VarAccess] notNullPrimitive +# 237| 1: [VarAccess] nullablePrimitive +# 238| 8: [LocalVariableDeclStmt] var ...; +# 238| 1: [LocalVariableDeclExpr] b9 +# 238| 0: [ValueNEExpr] ... (value not-equals) ... +# 238| 0: [VarAccess] nullablePrimitive +# 238| 1: [VarAccess] nullablePrimitive +# 239| 9: [LocalVariableDeclStmt] var ...; +# 239| 1: [LocalVariableDeclExpr] b10 +# 239| 0: [ValueNEExpr] ... (value not-equals) ... +# 239| 0: [VarAccess] notNullReftype +# 239| 1: [VarAccess] notNullReftype +# 240| 10: [LocalVariableDeclStmt] var ...; +# 240| 1: [LocalVariableDeclExpr] b11 +# 240| 0: [ValueNEExpr] ... (value not-equals) ... +# 240| 0: [VarAccess] notNullReftype +# 240| 1: [VarAccess] nullableReftype +# 241| 11: [LocalVariableDeclStmt] var ...; +# 241| 1: [LocalVariableDeclExpr] b12 +# 241| 0: [ValueNEExpr] ... (value not-equals) ... +# 241| 0: [VarAccess] nullableReftype +# 241| 1: [VarAccess] nullableReftype +# 242| 12: [LocalVariableDeclStmt] var ...; +# 242| 1: [LocalVariableDeclExpr] b13 +# 242| 0: [ValueEQExpr] ... (value equals) ... +# 242| 0: [VarAccess] notNullPrimitive +# 242| 1: [NullLiteral] null +# 243| 13: [LocalVariableDeclStmt] var ...; +# 243| 1: [LocalVariableDeclExpr] b14 +# 243| 0: [ValueEQExpr] ... (value equals) ... +# 243| 0: [VarAccess] nullablePrimitive +# 243| 1: [NullLiteral] null +# 244| 14: [LocalVariableDeclStmt] var ...; +# 244| 1: [LocalVariableDeclExpr] b15 +# 244| 0: [ValueEQExpr] ... (value equals) ... +# 244| 0: [VarAccess] notNullReftype +# 244| 1: [NullLiteral] null +# 245| 15: [LocalVariableDeclStmt] var ...; +# 245| 1: [LocalVariableDeclExpr] b16 +# 245| 0: [ValueEQExpr] ... (value equals) ... +# 245| 0: [VarAccess] nullableReftype +# 245| 1: [NullLiteral] null +# 246| 16: [LocalVariableDeclStmt] var ...; +# 246| 1: [LocalVariableDeclExpr] b17 +# 246| 0: [ValueNEExpr] ... (value not-equals) ... +# 246| 0: [VarAccess] notNullPrimitive +# 246| 1: [NullLiteral] null +# 247| 17: [LocalVariableDeclStmt] var ...; +# 247| 1: [LocalVariableDeclExpr] b18 +# 247| 0: [ValueNEExpr] ... (value not-equals) ... +# 247| 0: [VarAccess] nullablePrimitive +# 247| 1: [NullLiteral] null +# 248| 18: [LocalVariableDeclStmt] var ...; +# 248| 1: [LocalVariableDeclExpr] b19 +# 248| 0: [ValueNEExpr] ... (value not-equals) ... +# 248| 0: [VarAccess] notNullReftype +# 248| 1: [NullLiteral] null +# 249| 19: [LocalVariableDeclStmt] var ...; +# 249| 1: [LocalVariableDeclExpr] b20 +# 249| 0: [ValueNEExpr] ... (value not-equals) ... +# 249| 0: [VarAccess] nullableReftype +# 249| 1: [NullLiteral] null +# 252| 10: [Method] mulOperators +# 252| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 252| 0: [Parameter] x +# 252| 0: [TypeAccess] int +# 252| 1: [Parameter] y +# 252| 0: [TypeAccess] int +# 253| 2: [Parameter] byx +# 253| 0: [TypeAccess] byte +# 253| 3: [Parameter] byy +# 253| 0: [TypeAccess] byte +# 254| 4: [Parameter] sx +# 254| 0: [TypeAccess] short +# 254| 5: [Parameter] sy +# 254| 0: [TypeAccess] short +# 255| 6: [Parameter] lx +# 255| 0: [TypeAccess] long +# 255| 7: [Parameter] ly +# 255| 0: [TypeAccess] long +# 256| 8: [Parameter] dx +# 256| 0: [TypeAccess] double +# 256| 9: [Parameter] dy +# 256| 0: [TypeAccess] double +# 257| 10: [Parameter] fx +# 257| 0: [TypeAccess] float +# 257| 11: [Parameter] fy +# 257| 0: [TypeAccess] float +# 257| 5: [BlockStmt] { ... } +# 259| 0: [LocalVariableDeclStmt] var ...; +# 259| 1: [LocalVariableDeclExpr] i +# 259| 0: [MulExpr] ... * ... +# 259| 0: [VarAccess] x +# 259| 1: [VarAccess] y +# 260| 1: [LocalVariableDeclStmt] var ...; +# 260| 1: [LocalVariableDeclExpr] b +# 260| 0: [MulExpr] ... * ... +# 260| 0: [VarAccess] byx +# 260| 1: [VarAccess] byy +# 261| 2: [LocalVariableDeclStmt] var ...; +# 261| 1: [LocalVariableDeclExpr] l +# 261| 0: [MulExpr] ... * ... +# 261| 0: [VarAccess] lx +# 261| 1: [VarAccess] ly +# 262| 3: [LocalVariableDeclStmt] var ...; +# 262| 1: [LocalVariableDeclExpr] d +# 262| 0: [MulExpr] ... * ... +# 262| 0: [VarAccess] dx +# 262| 1: [VarAccess] dy +# 263| 4: [LocalVariableDeclStmt] var ...; +# 263| 1: [LocalVariableDeclExpr] f +# 263| 0: [MulExpr] ... * ... +# 263| 0: [VarAccess] fx +# 263| 1: [VarAccess] fy +# 267| 11: [Method] inPlaceOperators +# 267| 3: [TypeAccess] Unit +# 267| 5: [BlockStmt] { ... } +# 269| 0: [LocalVariableDeclStmt] var ...; +# 269| 1: [LocalVariableDeclExpr] updated +# 269| 0: [IntegerLiteral] 0 +# 270| 1: [ExprStmt] ; +# 270| 0: [AssignAddExpr] ...+=... +# 270| 0: [VarAccess] updated +# 270| 1: [IntegerLiteral] 1 +# 271| 2: [ExprStmt] ; +# 271| 0: [AssignSubExpr] ...-=... +# 271| 0: [VarAccess] updated +# 271| 1: [IntegerLiteral] 1 +# 272| 3: [ExprStmt] ; +# 272| 0: [AssignMulExpr] ...*=... +# 272| 0: [VarAccess] updated +# 272| 1: [IntegerLiteral] 1 +# 273| 4: [ExprStmt] ; +# 273| 0: [AssignDivExpr] .../=... +# 273| 0: [VarAccess] updated +# 273| 1: [IntegerLiteral] 1 +# 274| 5: [ExprStmt] ; +# 274| 0: [AssignRemExpr] ...%=... +# 274| 0: [VarAccess] updated +# 274| 1: [IntegerLiteral] 1 +# 278| 12: [Method] getEnumValues +#-----| 2: (Generic Parameters) +# 278| 0: [TypeVariable] T +# 278| 3: [TypeAccess] T[] +# 278| 0: [TypeAccess] T +# 278| 5: [BlockStmt] { ... } +# 278| 0: [ReturnStmt] return ... +# 278| 0: [ErrorExpr] +# 280| 13: [Method] callToEnumValues +# 280| 3: [TypeAccess] Unit +# 280| 5: [BlockStmt] { ... } +# 281| 0: [ExprStmt] ; +# 281| 0: [ImplicitCoercionToUnitExpr] +# 281| 0: [TypeAccess] Unit +# 281| 1: [MethodCall] values(...) +# 281| -1: [TypeAccess] Color +# 282| 1: [ExprStmt] ; +# 282| 0: [ImplicitCoercionToUnitExpr] +# 282| 0: [TypeAccess] Unit +# 282| 1: [MethodCall] getEnumValues(...) +# 282| -2: [TypeAccess] Color +# 282| -1: [TypeAccess] ExprsKt +# 285| 14: [Method] unaryExprs +# 285| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 285| 0: [Parameter] i +# 285| 0: [TypeAccess] int +# 285| 1: [Parameter] d +# 285| 0: [TypeAccess] double +# 285| 2: [Parameter] b +# 285| 0: [TypeAccess] byte +# 285| 3: [Parameter] s +# 285| 0: [TypeAccess] short +# 285| 4: [Parameter] l +# 285| 0: [TypeAccess] long +# 285| 5: [Parameter] f +# 285| 0: [TypeAccess] float +# 285| 5: [BlockStmt] { ... } +# 286| 0: [ExprStmt] ; +# 286| 0: [ImplicitCoercionToUnitExpr] +# 286| 0: [TypeAccess] Unit +# 286| 1: [MinusExpr] -... +# 286| 0: [VarAccess] i +# 287| 1: [ExprStmt] ; +# 287| 0: [ImplicitCoercionToUnitExpr] +# 287| 0: [TypeAccess] Unit +# 287| 1: [PlusExpr] +... +# 287| 0: [VarAccess] i +# 288| 2: [ExprStmt] ; +# 288| 0: [ImplicitCoercionToUnitExpr] +# 288| 0: [TypeAccess] Unit +# 288| 1: [MinusExpr] -... +# 288| 0: [VarAccess] d +# 289| 3: [ExprStmt] ; +# 289| 0: [ImplicitCoercionToUnitExpr] +# 289| 0: [TypeAccess] Unit +# 289| 1: [PlusExpr] +... +# 289| 0: [VarAccess] d +# 290| 4: [LocalVariableDeclStmt] var ...; +# 290| 1: [LocalVariableDeclExpr] i0 +# 290| 0: [IntegerLiteral] 1 +# 291| 5: [LocalVariableDeclStmt] var ...; +# 291| 1: [LocalVariableDeclExpr] i1 +# 291| 0: [IntegerLiteral] 1 +# 292| 6: [ExprStmt] ; +# 292| 0: [ImplicitCoercionToUnitExpr] +# 292| 0: [TypeAccess] Unit +# 292| 1: [StmtExpr] +# 292| 0: [BlockStmt] { ... } +# 292| 0: [LocalVariableDeclStmt] var ...; +# 292| 1: [LocalVariableDeclExpr] tmp0 +# 292| 0: [VarAccess] i0 +# 292| 1: [ExprStmt] ; +# 292| 0: [AssignExpr] ...=... +# 292| 0: [VarAccess] i0 +# 292| 1: [MethodCall] inc(...) +# 292| -1: [VarAccess] tmp0 +# 292| 2: [ExprStmt] ; +# 292| 0: [VarAccess] tmp0 +# 293| 7: [ExprStmt] ; +# 293| 0: [ImplicitCoercionToUnitExpr] +# 293| 0: [TypeAccess] Unit +# 293| 1: [StmtExpr] +# 293| 0: [BlockStmt] { ... } +# 293| 0: [ExprStmt] ; +# 293| 0: [AssignExpr] ...=... +# 293| 0: [VarAccess] i0 +# 293| 1: [MethodCall] inc(...) +# 293| -1: [VarAccess] i0 +# 293| 1: [ExprStmt] ; +# 293| 0: [VarAccess] i0 +# 294| 8: [ExprStmt] ; +# 294| 0: [ImplicitCoercionToUnitExpr] +# 294| 0: [TypeAccess] Unit +# 294| 1: [StmtExpr] +# 294| 0: [BlockStmt] { ... } +# 294| 0: [LocalVariableDeclStmt] var ...; +# 294| 1: [LocalVariableDeclExpr] tmp1 +# 294| 0: [VarAccess] i0 +# 294| 1: [ExprStmt] ; +# 294| 0: [AssignExpr] ...=... +# 294| 0: [VarAccess] i0 +# 294| 1: [MethodCall] dec(...) +# 294| -1: [VarAccess] tmp1 +# 294| 2: [ExprStmt] ; +# 294| 0: [VarAccess] tmp1 +# 295| 9: [ExprStmt] ; +# 295| 0: [ImplicitCoercionToUnitExpr] +# 295| 0: [TypeAccess] Unit +# 295| 1: [StmtExpr] +# 295| 0: [BlockStmt] { ... } +# 295| 0: [ExprStmt] ; +# 295| 0: [AssignExpr] ...=... +# 295| 0: [VarAccess] i0 +# 295| 1: [MethodCall] dec(...) +# 295| -1: [VarAccess] i0 +# 295| 1: [ExprStmt] ; +# 295| 0: [VarAccess] i0 +# 296| 10: [ExprStmt] ; +# 296| 0: [ImplicitCoercionToUnitExpr] +# 296| 0: [TypeAccess] Unit +# 296| 1: [MethodCall] inc(...) +# 296| -1: [VarAccess] i0 +# 297| 11: [ExprStmt] ; +# 297| 0: [ImplicitCoercionToUnitExpr] +# 297| 0: [TypeAccess] Unit +# 297| 1: [MethodCall] dec(...) +# 297| -1: [VarAccess] i0 +# 298| 12: [ExprStmt] ; +# 298| 0: [ImplicitCoercionToUnitExpr] +# 298| 0: [TypeAccess] Unit +# 298| 1: [MethodCall] inc(...) +# 298| -1: [VarAccess] i1 +# 299| 13: [ExprStmt] ; +# 299| 0: [ImplicitCoercionToUnitExpr] +# 299| 0: [TypeAccess] Unit +# 299| 1: [MethodCall] dec(...) +# 299| -1: [VarAccess] i1 +# 300| 14: [ExprStmt] ; +# 300| 0: [ImplicitCoercionToUnitExpr] +# 300| 0: [TypeAccess] Unit +# 300| 1: [BitNotExpr] ~... +# 300| 0: [VarAccess] i +# 302| 15: [ExprStmt] ; +# 302| 0: [ImplicitCoercionToUnitExpr] +# 302| 0: [TypeAccess] Unit +# 302| 1: [MinusExpr] -... +# 302| 0: [VarAccess] b +# 303| 16: [ExprStmt] ; +# 303| 0: [ImplicitCoercionToUnitExpr] +# 303| 0: [TypeAccess] Unit +# 303| 1: [PlusExpr] +... +# 303| 0: [VarAccess] b +# 304| 17: [LocalVariableDeclStmt] var ...; +# 304| 1: [LocalVariableDeclExpr] b0 +# 304| 0: [IntegerLiteral] 1 +# 305| 18: [LocalVariableDeclStmt] var ...; +# 305| 1: [LocalVariableDeclExpr] b1 +# 305| 0: [IntegerLiteral] 1 +# 306| 19: [ExprStmt] ; +# 306| 0: [ImplicitCoercionToUnitExpr] +# 306| 0: [TypeAccess] Unit +# 306| 1: [StmtExpr] +# 306| 0: [BlockStmt] { ... } +# 306| 0: [LocalVariableDeclStmt] var ...; +# 306| 1: [LocalVariableDeclExpr] tmp2 +# 306| 0: [VarAccess] b0 +# 306| 1: [ExprStmt] ; +# 306| 0: [AssignExpr] ...=... +# 306| 0: [VarAccess] b0 +# 306| 1: [MethodCall] inc(...) +# 306| -1: [VarAccess] tmp2 +# 306| 2: [ExprStmt] ; +# 306| 0: [VarAccess] tmp2 +# 307| 20: [ExprStmt] ; +# 307| 0: [ImplicitCoercionToUnitExpr] +# 307| 0: [TypeAccess] Unit +# 307| 1: [StmtExpr] +# 307| 0: [BlockStmt] { ... } +# 307| 0: [ExprStmt] ; +# 307| 0: [AssignExpr] ...=... +# 307| 0: [VarAccess] b0 +# 307| 1: [MethodCall] inc(...) +# 307| -1: [VarAccess] b0 +# 307| 1: [ExprStmt] ; +# 307| 0: [VarAccess] b0 +# 308| 21: [ExprStmt] ; +# 308| 0: [ImplicitCoercionToUnitExpr] +# 308| 0: [TypeAccess] Unit +# 308| 1: [StmtExpr] +# 308| 0: [BlockStmt] { ... } +# 308| 0: [LocalVariableDeclStmt] var ...; +# 308| 1: [LocalVariableDeclExpr] tmp3 +# 308| 0: [VarAccess] b0 +# 308| 1: [ExprStmt] ; +# 308| 0: [AssignExpr] ...=... +# 308| 0: [VarAccess] b0 +# 308| 1: [MethodCall] dec(...) +# 308| -1: [VarAccess] tmp3 +# 308| 2: [ExprStmt] ; +# 308| 0: [VarAccess] tmp3 +# 309| 22: [ExprStmt] ; +# 309| 0: [ImplicitCoercionToUnitExpr] +# 309| 0: [TypeAccess] Unit +# 309| 1: [StmtExpr] +# 309| 0: [BlockStmt] { ... } +# 309| 0: [ExprStmt] ; +# 309| 0: [AssignExpr] ...=... +# 309| 0: [VarAccess] b0 +# 309| 1: [MethodCall] dec(...) +# 309| -1: [VarAccess] b0 +# 309| 1: [ExprStmt] ; +# 309| 0: [VarAccess] b0 +# 310| 23: [ExprStmt] ; +# 310| 0: [ImplicitCoercionToUnitExpr] +# 310| 0: [TypeAccess] Unit +# 310| 1: [MethodCall] inc(...) +# 310| -1: [VarAccess] b0 +# 311| 24: [ExprStmt] ; +# 311| 0: [ImplicitCoercionToUnitExpr] +# 311| 0: [TypeAccess] Unit +# 311| 1: [MethodCall] dec(...) +# 311| -1: [VarAccess] b0 +# 312| 25: [ExprStmt] ; +# 312| 0: [ImplicitCoercionToUnitExpr] +# 312| 0: [TypeAccess] Unit +# 312| 1: [MethodCall] inc(...) +# 312| -1: [VarAccess] b1 +# 313| 26: [ExprStmt] ; +# 313| 0: [ImplicitCoercionToUnitExpr] +# 313| 0: [TypeAccess] Unit +# 313| 1: [MethodCall] dec(...) +# 313| -1: [VarAccess] b1 +# 314| 27: [ExprStmt] ; +# 314| 0: [ImplicitCoercionToUnitExpr] +# 314| 0: [TypeAccess] Unit +# 314| 1: [BitNotExpr] ~... +# 314| 0: [VarAccess] b +# 316| 28: [ExprStmt] ; +# 316| 0: [ImplicitCoercionToUnitExpr] +# 316| 0: [TypeAccess] Unit +# 316| 1: [MinusExpr] -... +# 316| 0: [VarAccess] s +# 317| 29: [ExprStmt] ; +# 317| 0: [ImplicitCoercionToUnitExpr] +# 317| 0: [TypeAccess] Unit +# 317| 1: [PlusExpr] +... +# 317| 0: [VarAccess] s +# 318| 30: [LocalVariableDeclStmt] var ...; +# 318| 1: [LocalVariableDeclExpr] s0 +# 318| 0: [IntegerLiteral] 1 +# 319| 31: [LocalVariableDeclStmt] var ...; +# 319| 1: [LocalVariableDeclExpr] s1 +# 319| 0: [IntegerLiteral] 1 +# 320| 32: [ExprStmt] ; +# 320| 0: [ImplicitCoercionToUnitExpr] +# 320| 0: [TypeAccess] Unit +# 320| 1: [StmtExpr] +# 320| 0: [BlockStmt] { ... } +# 320| 0: [LocalVariableDeclStmt] var ...; +# 320| 1: [LocalVariableDeclExpr] tmp4 +# 320| 0: [VarAccess] s0 +# 320| 1: [ExprStmt] ; +# 320| 0: [AssignExpr] ...=... +# 320| 0: [VarAccess] s0 +# 320| 1: [MethodCall] inc(...) +# 320| -1: [VarAccess] tmp4 +# 320| 2: [ExprStmt] ; +# 320| 0: [VarAccess] tmp4 +# 321| 33: [ExprStmt] ; +# 321| 0: [ImplicitCoercionToUnitExpr] +# 321| 0: [TypeAccess] Unit +# 321| 1: [StmtExpr] +# 321| 0: [BlockStmt] { ... } +# 321| 0: [ExprStmt] ; +# 321| 0: [AssignExpr] ...=... +# 321| 0: [VarAccess] s0 +# 321| 1: [MethodCall] inc(...) +# 321| -1: [VarAccess] s0 +# 321| 1: [ExprStmt] ; +# 321| 0: [VarAccess] s0 +# 322| 34: [ExprStmt] ; +# 322| 0: [ImplicitCoercionToUnitExpr] +# 322| 0: [TypeAccess] Unit +# 322| 1: [StmtExpr] +# 322| 0: [BlockStmt] { ... } +# 322| 0: [LocalVariableDeclStmt] var ...; +# 322| 1: [LocalVariableDeclExpr] tmp5 +# 322| 0: [VarAccess] s0 +# 322| 1: [ExprStmt] ; +# 322| 0: [AssignExpr] ...=... +# 322| 0: [VarAccess] s0 +# 322| 1: [MethodCall] dec(...) +# 322| -1: [VarAccess] tmp5 +# 322| 2: [ExprStmt] ; +# 322| 0: [VarAccess] tmp5 +# 323| 35: [ExprStmt] ; +# 323| 0: [ImplicitCoercionToUnitExpr] +# 323| 0: [TypeAccess] Unit +# 323| 1: [StmtExpr] +# 323| 0: [BlockStmt] { ... } +# 323| 0: [ExprStmt] ; +# 323| 0: [AssignExpr] ...=... +# 323| 0: [VarAccess] s0 +# 323| 1: [MethodCall] dec(...) +# 323| -1: [VarAccess] s0 +# 323| 1: [ExprStmt] ; +# 323| 0: [VarAccess] s0 +# 324| 36: [ExprStmt] ; +# 324| 0: [ImplicitCoercionToUnitExpr] +# 324| 0: [TypeAccess] Unit +# 324| 1: [MethodCall] inc(...) +# 324| -1: [VarAccess] s0 +# 325| 37: [ExprStmt] ; +# 325| 0: [ImplicitCoercionToUnitExpr] +# 325| 0: [TypeAccess] Unit +# 325| 1: [MethodCall] dec(...) +# 325| -1: [VarAccess] s0 +# 326| 38: [ExprStmt] ; +# 326| 0: [ImplicitCoercionToUnitExpr] +# 326| 0: [TypeAccess] Unit +# 326| 1: [MethodCall] inc(...) +# 326| -1: [VarAccess] s1 +# 327| 39: [ExprStmt] ; +# 327| 0: [ImplicitCoercionToUnitExpr] +# 327| 0: [TypeAccess] Unit +# 327| 1: [MethodCall] dec(...) +# 327| -1: [VarAccess] s1 +# 328| 40: [ExprStmt] ; +# 328| 0: [ImplicitCoercionToUnitExpr] +# 328| 0: [TypeAccess] Unit +# 328| 1: [BitNotExpr] ~... +# 328| 0: [VarAccess] s +# 330| 41: [ExprStmt] ; +# 330| 0: [ImplicitCoercionToUnitExpr] +# 330| 0: [TypeAccess] Unit +# 330| 1: [MinusExpr] -... +# 330| 0: [VarAccess] l +# 331| 42: [ExprStmt] ; +# 331| 0: [ImplicitCoercionToUnitExpr] +# 331| 0: [TypeAccess] Unit +# 331| 1: [PlusExpr] +... +# 331| 0: [VarAccess] l +# 332| 43: [LocalVariableDeclStmt] var ...; +# 332| 1: [LocalVariableDeclExpr] l0 +# 332| 0: [LongLiteral] 1 +# 333| 44: [LocalVariableDeclStmt] var ...; +# 333| 1: [LocalVariableDeclExpr] l1 +# 333| 0: [LongLiteral] 1 +# 334| 45: [ExprStmt] ; +# 334| 0: [ImplicitCoercionToUnitExpr] +# 334| 0: [TypeAccess] Unit +# 334| 1: [StmtExpr] +# 334| 0: [BlockStmt] { ... } +# 334| 0: [LocalVariableDeclStmt] var ...; +# 334| 1: [LocalVariableDeclExpr] tmp6 +# 334| 0: [VarAccess] l0 +# 334| 1: [ExprStmt] ; +# 334| 0: [AssignExpr] ...=... +# 334| 0: [VarAccess] l0 +# 334| 1: [MethodCall] inc(...) +# 334| -1: [VarAccess] tmp6 +# 334| 2: [ExprStmt] ; +# 334| 0: [VarAccess] tmp6 +# 335| 46: [ExprStmt] ; +# 335| 0: [ImplicitCoercionToUnitExpr] +# 335| 0: [TypeAccess] Unit +# 335| 1: [StmtExpr] +# 335| 0: [BlockStmt] { ... } +# 335| 0: [ExprStmt] ; +# 335| 0: [AssignExpr] ...=... +# 335| 0: [VarAccess] l0 +# 335| 1: [MethodCall] inc(...) +# 335| -1: [VarAccess] l0 +# 335| 1: [ExprStmt] ; +# 335| 0: [VarAccess] l0 +# 336| 47: [ExprStmt] ; +# 336| 0: [ImplicitCoercionToUnitExpr] +# 336| 0: [TypeAccess] Unit +# 336| 1: [StmtExpr] +# 336| 0: [BlockStmt] { ... } +# 336| 0: [LocalVariableDeclStmt] var ...; +# 336| 1: [LocalVariableDeclExpr] tmp7 +# 336| 0: [VarAccess] l0 +# 336| 1: [ExprStmt] ; +# 336| 0: [AssignExpr] ...=... +# 336| 0: [VarAccess] l0 +# 336| 1: [MethodCall] dec(...) +# 336| -1: [VarAccess] tmp7 +# 336| 2: [ExprStmt] ; +# 336| 0: [VarAccess] tmp7 +# 337| 48: [ExprStmt] ; +# 337| 0: [ImplicitCoercionToUnitExpr] +# 337| 0: [TypeAccess] Unit +# 337| 1: [StmtExpr] +# 337| 0: [BlockStmt] { ... } +# 337| 0: [ExprStmt] ; +# 337| 0: [AssignExpr] ...=... +# 337| 0: [VarAccess] l0 +# 337| 1: [MethodCall] dec(...) +# 337| -1: [VarAccess] l0 +# 337| 1: [ExprStmt] ; +# 337| 0: [VarAccess] l0 +# 338| 49: [ExprStmt] ; +# 338| 0: [ImplicitCoercionToUnitExpr] +# 338| 0: [TypeAccess] Unit +# 338| 1: [MethodCall] inc(...) +# 338| -1: [VarAccess] l0 +# 339| 50: [ExprStmt] ; +# 339| 0: [ImplicitCoercionToUnitExpr] +# 339| 0: [TypeAccess] Unit +# 339| 1: [MethodCall] dec(...) +# 339| -1: [VarAccess] l0 +# 340| 51: [ExprStmt] ; +# 340| 0: [ImplicitCoercionToUnitExpr] +# 340| 0: [TypeAccess] Unit +# 340| 1: [MethodCall] inc(...) +# 340| -1: [VarAccess] l1 +# 341| 52: [ExprStmt] ; +# 341| 0: [ImplicitCoercionToUnitExpr] +# 341| 0: [TypeAccess] Unit +# 341| 1: [MethodCall] dec(...) +# 341| -1: [VarAccess] l1 +# 342| 53: [ExprStmt] ; +# 342| 0: [ImplicitCoercionToUnitExpr] +# 342| 0: [TypeAccess] Unit +# 342| 1: [BitNotExpr] ~... +# 342| 0: [VarAccess] l +# 344| 54: [ExprStmt] ; +# 344| 0: [ImplicitCoercionToUnitExpr] +# 344| 0: [TypeAccess] Unit +# 344| 1: [PlusExpr] +... +# 344| 0: [VarAccess] f +# 345| 55: [ExprStmt] ; +# 345| 0: [ImplicitCoercionToUnitExpr] +# 345| 0: [TypeAccess] Unit +# 345| 1: [MinusExpr] -... +# 345| 0: [VarAccess] f +# 148| 2: [Class] C +# 148| 1: [Constructor] C +#-----| 4: (Parameters) +# 148| 0: [Parameter] n +# 148| 0: [TypeAccess] int +# 148| 5: [BlockStmt] { ... } +# 148| 0: [SuperConstructorInvocationStmt] super(...) +# 148| 1: [BlockStmt] { ... } +# 148| 0: [ExprStmt] ; +# 148| 0: [KtInitializerAssignExpr] ...=... +# 148| 0: [VarAccess] n +# 148| 2: [Method] getN +# 148| 3: [TypeAccess] int +# 148| 5: [BlockStmt] { ... } +# 148| 0: [ReturnStmt] return ... +# 148| 0: [VarAccess] this.n +# 148| -1: [ThisAccess] this +# 148| 3: [FieldDeclaration] int n; +# 148| -1: [TypeAccess] int +# 148| 0: [VarAccess] n +# 149| 4: [Method] foo +# 149| 3: [TypeAccess] C +# 149| 5: [BlockStmt] { ... } +# 149| 0: [ReturnStmt] return ... +# 149| 0: [ClassInstanceExpr] new C(...) +# 149| -3: [TypeAccess] C +# 149| 0: [IntegerLiteral] 42 +# 152| 3: [Class] Root +# 152| 1: [Constructor] Root +# 152| 5: [BlockStmt] { ... } +# 152| 0: [SuperConstructorInvocationStmt] super(...) +# 152| 1: [BlockStmt] { ... } +# 153| 4: [Class] Subclass1 +# 153| 1: [Constructor] Subclass1 +# 153| 5: [BlockStmt] { ... } +# 153| 0: [SuperConstructorInvocationStmt] super(...) +# 153| 1: [BlockStmt] { ... } +# 154| 5: [Class] Subclass2 +# 154| 1: [Constructor] Subclass2 +# 154| 5: [BlockStmt] { ... } +# 154| 0: [SuperConstructorInvocationStmt] super(...) +# 154| 1: [BlockStmt] { ... } +# 174| 6: [Class] Direction +# 0| 2: [Method] getEntries +# 0| 3: [TypeAccess] EnumEntries +# 0| 0: [TypeAccess] Direction +# 0| 3: [Method] valueOf +# 0| 3: [TypeAccess] Direction +#-----| 4: (Parameters) +# 0| 0: [Parameter] value +# 0| 0: [TypeAccess] String +# 0| 4: [Method] values +# 0| 3: [TypeAccess] Direction[] +# 0| 0: [TypeAccess] Direction +# 174| 5: [Constructor] Direction +# 174| 5: [BlockStmt] { ... } +# 174| 0: [ExprStmt] ; +# 174| 0: [ClassInstanceExpr] new Enum(...) +# 174| -3: [TypeAccess] Enum +# 174| 0: [TypeAccess] Direction +# 174| 0: [NullLiteral] null +# 174| 1: [IntegerLiteral] 0 +# 174| 1: [BlockStmt] { ... } +# 175| 6: [FieldDeclaration] Direction NORTH; +# 175| -1: [TypeAccess] Direction +# 175| 0: [ClassInstanceExpr] new Direction(...) +# 175| -3: [TypeAccess] Direction +# 175| 7: [FieldDeclaration] Direction SOUTH; +# 175| -1: [TypeAccess] Direction +# 175| 0: [ClassInstanceExpr] new Direction(...) +# 175| -3: [TypeAccess] Direction +# 175| 8: [FieldDeclaration] Direction WEST; +# 175| -1: [TypeAccess] Direction +# 175| 0: [ClassInstanceExpr] new Direction(...) +# 175| -3: [TypeAccess] Direction +# 175| 9: [FieldDeclaration] Direction EAST; +# 175| -1: [TypeAccess] Direction +# 175| 0: [ClassInstanceExpr] new Direction(...) +# 175| -3: [TypeAccess] Direction +# 178| 7: [Class] Color +# 0| 2: [Method] getEntries +# 0| 3: [TypeAccess] EnumEntries +# 0| 0: [TypeAccess] Color +# 0| 3: [Method] valueOf +# 0| 3: [TypeAccess] Color +#-----| 4: (Parameters) +# 0| 0: [Parameter] value +# 0| 0: [TypeAccess] String +# 0| 4: [Method] values +# 0| 3: [TypeAccess] Color[] +# 0| 0: [TypeAccess] Color +# 178| 5: [Constructor] Color +#-----| 4: (Parameters) +# 178| 0: [Parameter] rgb +# 178| 0: [TypeAccess] int +# 178| 5: [BlockStmt] { ... } +# 178| 0: [ExprStmt] ; +# 178| 0: [ClassInstanceExpr] new Enum(...) +# 178| -3: [TypeAccess] Enum +# 178| 0: [TypeAccess] Color +# 178| 0: [NullLiteral] null +# 178| 1: [IntegerLiteral] 0 +# 178| 1: [BlockStmt] { ... } +# 178| 0: [ExprStmt] ; +# 178| 0: [KtInitializerAssignExpr] ...=... +# 178| 0: [VarAccess] rgb +# 178| 6: [Method] getRgb +# 178| 3: [TypeAccess] int +# 178| 5: [BlockStmt] { ... } +# 178| 0: [ReturnStmt] return ... +# 178| 0: [VarAccess] this.rgb +# 178| -1: [ThisAccess] this +# 178| 7: [FieldDeclaration] int rgb; +# 178| -1: [TypeAccess] int +# 178| 0: [VarAccess] rgb +# 179| 8: [FieldDeclaration] Color RED; +# 179| -1: [TypeAccess] Color +# 179| 0: [ClassInstanceExpr] new Color(...) +# 179| -3: [TypeAccess] Color +# 179| 0: [IntegerLiteral] 16711680 +# 180| 9: [FieldDeclaration] Color GREEN; +# 180| -1: [TypeAccess] Color +# 180| 0: [ClassInstanceExpr] new Color(...) +# 180| -3: [TypeAccess] Color +# 180| 0: [IntegerLiteral] 65280 +# 181| 10: [FieldDeclaration] Color BLUE; +# 181| -1: [TypeAccess] Color +# 181| 0: [ClassInstanceExpr] new Color(...) +# 181| -3: [TypeAccess] Color +# 181| 0: [IntegerLiteral] 255 +# 189| 8: [Interface] Interface1 +# 191| 9: [Class] Class1 +# 191| 1: [Constructor] Class1 +# 191| 5: [BlockStmt] { ... } +# 191| 0: [SuperConstructorInvocationStmt] super(...) +# 191| 1: [BlockStmt] { ... } +# 192| 0: [ExprStmt] ; +# 192| 0: [KtInitializerAssignExpr] ...=... +# 192| 0: [VarAccess] a1 +# 192| 2: [Method] getA1 +# 192| 3: [TypeAccess] int +# 192| 5: [BlockStmt] { ... } +# 192| 0: [ReturnStmt] return ... +# 192| 0: [VarAccess] this.a1 +# 192| -1: [ThisAccess] this +# 192| 3: [FieldDeclaration] int a1; +# 192| -1: [TypeAccess] int +# 192| 0: [IntegerLiteral] 1 +# 193| 4: [Method] getObject +# 193| 3: [TypeAccess] Object +# 193| 5: [BlockStmt] { ... } +# 194| 0: [LocalVariableDeclStmt] var ...; +# 194| 1: [LocalVariableDeclExpr] a2 +# 194| 0: [IntegerLiteral] 2 +# 195| 1: [ReturnStmt] return ... +# 195| 0: [StmtExpr] +# 195| 0: [BlockStmt] { ... } +# 195| 0: [LocalTypeDeclStmt] class ... +# 195| 0: [AnonymousClass,LocalClass] new Interface1(...) { ... } +# 195| 1: [Constructor] +# 195| 5: [BlockStmt] { ... } +# 195| 0: [SuperConstructorInvocationStmt] super(...) +# 195| 1: [BlockStmt] { ... } +# 196| 0: [ExprStmt] ; +# 196| 0: [KtInitializerAssignExpr] ...=... +# 196| 0: [VarAccess] a3 +# 196| 2: [FieldDeclaration] String a3; +# 196| -1: [TypeAccess] String +# 196| 0: [MethodCall] toString(...) +# 196| -1: [AddExpr] ... + ... +# 196| 0: [MethodCall] getA1(...) +# 196| -1: [ThisAccess] this +# 196| 1: [VarAccess] a2 +# 196| 3: [Method] getA3 +# 196| 3: [TypeAccess] String +# 196| 5: [BlockStmt] { ... } +# 196| 0: [ReturnStmt] return ... +# 196| 0: [VarAccess] this.a3 +# 196| -1: [ThisAccess] this +# 195| 1: [ExprStmt] ; +# 195| 0: [ClassInstanceExpr] new (...) +# 195| -3: [TypeAccess] Interface1 +# 205| 10: [Class] Class2 +# 205| 1: [Constructor] Class2 +# 205| 5: [BlockStmt] { ... } +# 205| 0: [SuperConstructorInvocationStmt] super(...) +# 205| 1: [BlockStmt] { ... } +# 206| 2: [Method] x +# 206| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 206| 0: [Parameter] aa +# 206| 0: [TypeAccess] Object +# 206| 1: [Parameter] s +# 206| 0: [TypeAccess] String +# 206| 5: [BlockStmt] { ... } +# 208| 0: [LocalVariableDeclStmt] var ...; +# 208| 1: [LocalVariableDeclExpr] a +# 208| 0: [MethodCall] valueOf(...) +# 208| -1: [TypeAccess] String +# 208| 0: [VarAccess] aa +# 209| 1: [LocalVariableDeclStmt] var ...; +# 209| 1: [LocalVariableDeclExpr] b0 +# 209| 0: [MethodCall] stringPlus(...) +# 209| -1: [TypeAccess] Intrinsics +# 209| 0: [VarAccess] s +# 209| 1: [IntegerLiteral] 5 +# 210| 2: [LocalVariableDeclStmt] var ...; +# 210| 1: [LocalVariableDeclExpr] b1 +# 210| 0: [MethodCall] stringPlus(...) +# 210| -1: [TypeAccess] Intrinsics +# 210| 0: [VarAccess] s +# 210| 1: [IntegerLiteral] 5 +# 211| 3: [LocalVariableDeclStmt] var ...; +# 211| 1: [LocalVariableDeclExpr] b2 +# 211| 0: [AddExpr] ... + ... +# 211| 0: [NotNullExpr] ...!! +# 211| 0: [VarAccess] s +# 211| 1: [IntegerLiteral] 5 +# 212| 4: [LocalVariableDeclStmt] var ...; +# 212| 1: [LocalVariableDeclExpr] b3 +# 212| 0: [AddExpr] ... + ... +# 212| 0: [NotNullExpr] ...!! +# 212| 0: [VarAccess] s +# 212| 1: [IntegerLiteral] 5 +# 213| 5: [LocalVariableDeclStmt] var ...; +# 213| 1: [LocalVariableDeclExpr] c0 +# 213| 0: [MethodCall] values(...) +# 213| -1: [TypeAccess] Color +# 214| 6: [LocalVariableDeclStmt] var ...; +# 214| 1: [LocalVariableDeclExpr] c1 +# 214| 0: [MethodCall] values(...) +# 214| -1: [TypeAccess] Color +# 215| 7: [LocalVariableDeclStmt] var ...; +# 215| 1: [LocalVariableDeclExpr] d0 +# 215| 0: [MethodCall] valueOf(...) +# 215| -1: [TypeAccess] Color +# 215| 0: [StringLiteral] "GREEN" +# 216| 8: [LocalVariableDeclStmt] var ...; +# 216| 1: [LocalVariableDeclExpr] d1 +# 216| 0: [MethodCall] valueOf(...) +# 216| -1: [TypeAccess] Color +# 216| 0: [StringLiteral] "GREEN" +# 224| 11: [Class] SomeClass1 +# 224| 1: [Constructor] SomeClass1 +# 224| 5: [BlockStmt] { ... } +# 224| 0: [SuperConstructorInvocationStmt] super(...) +# 224| 1: [BlockStmt] { ... } +funcExprs.kt: +# 0| [CompilationUnit] funcExprs +# 0| 1: [Class] FuncExprsKt +# 1| 1: [Method] functionExpression0a +# 1| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 1| 0: [Parameter] f +# 1| 0: [TypeAccess] Function0 +# 1| 0: [TypeAccess] Integer +# 1| 5: [BlockStmt] { ... } +# 1| 0: [ExprStmt] ; +# 1| 0: [ImplicitCoercionToUnitExpr] +# 1| 0: [TypeAccess] Unit +# 1| 1: [MethodCall] invoke(...) +# 1| -1: [VarAccess] f +# 2| 2: [Method] functionExpression0b +# 2| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 2| 0: [Parameter] f +# 2| 0: [TypeAccess] Function0 +# 2| 0: [WildcardTypeAccess] ? ... +# 2| 0: [TypeAccess] Object +# 2| 5: [BlockStmt] { ... } +# 2| 0: [ExprStmt] ; +# 2| 0: [ImplicitCoercionToUnitExpr] +# 2| 0: [TypeAccess] Unit +# 2| 1: [MethodCall] invoke(...) +# 2| -1: [VarAccess] f +# 3| 3: [Method] functionExpression0c +# 3| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 3| 0: [Parameter] f +# 3| 0: [TypeAccess] Function0 +# 3| 0: [WildcardTypeAccess] ? ... +# 3| 0: [TypeAccess] Object +# 3| 5: [BlockStmt] { ... } +# 3| 0: [ExprStmt] ; +# 3| 0: [ImplicitCoercionToUnitExpr] +# 3| 0: [TypeAccess] Unit +# 3| 1: [MethodCall] invoke(...) +# 3| -1: [VarAccess] f +# 4| 4: [Method] functionExpression1a +# 4| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 4| 0: [Parameter] x +# 4| 0: [TypeAccess] int +# 4| 1: [Parameter] f +# 4| 0: [TypeAccess] Function1 +# 4| 0: [WildcardTypeAccess] ? ... +# 4| 1: [TypeAccess] Integer +# 4| 1: [TypeAccess] Integer +# 4| 5: [BlockStmt] { ... } +# 4| 0: [ExprStmt] ; +# 4| 0: [ImplicitCoercionToUnitExpr] +# 4| 0: [TypeAccess] Unit +# 4| 1: [MethodCall] invoke(...) +# 4| -1: [VarAccess] f +# 4| 0: [VarAccess] x +# 5| 5: [Method] functionExpression1b +# 5| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 5| 0: [Parameter] x +# 5| 0: [TypeAccess] int +# 5| 1: [Parameter] f +# 5| 0: [TypeAccess] Function1 +# 5| 0: [TypeAccess] Object +# 5| 1: [WildcardTypeAccess] ? ... +# 5| 0: [TypeAccess] Object +# 5| 5: [BlockStmt] { ... } +# 5| 0: [ExprStmt] ; +# 5| 0: [ImplicitCoercionToUnitExpr] +# 5| 0: [TypeAccess] Unit +# 5| 1: [MethodCall] invoke(...) +# 5| -1: [VarAccess] f +# 5| 0: [VarAccess] x +# 6| 6: [Method] functionExpression1c +# 6| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 6| 0: [Parameter] x +# 6| 0: [TypeAccess] int +# 6| 1: [Parameter] f +# 6| 0: [TypeAccess] Function2 +# 6| 0: [WildcardTypeAccess] ? ... +# 6| 1: [TypeAccess] FuncRef +# 6| 1: [WildcardTypeAccess] ? ... +# 6| 1: [TypeAccess] Integer +# 6| 2: [TypeAccess] Integer +# 6| 5: [BlockStmt] { ... } +# 6| 0: [ExprStmt] ; +# 6| 0: [ImplicitCoercionToUnitExpr] +# 6| 0: [TypeAccess] Unit +# 6| 1: [MethodCall] invoke(...) +# 6| -1: [VarAccess] f +# 6| 0: [ClassInstanceExpr] new FuncRef(...) +# 6| -3: [TypeAccess] FuncRef +# 6| 1: [VarAccess] x +# 7| 7: [Method] functionExpression2 +# 7| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 7| 0: [Parameter] x +# 7| 0: [TypeAccess] int +# 7| 1: [Parameter] f +# 7| 0: [TypeAccess] Function2 +# 7| 0: [WildcardTypeAccess] ? ... +# 7| 1: [TypeAccess] Integer +# 7| 1: [WildcardTypeAccess] ? ... +# 7| 1: [TypeAccess] Integer +# 7| 2: [TypeAccess] Integer +# 7| 5: [BlockStmt] { ... } +# 7| 0: [ExprStmt] ; +# 7| 0: [ImplicitCoercionToUnitExpr] +# 7| 0: [TypeAccess] Unit +# 7| 1: [MethodCall] invoke(...) +# 7| -1: [VarAccess] f +# 7| 0: [VarAccess] x +# 7| 1: [VarAccess] x +# 8| 8: [Method] functionExpression3 +# 8| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 8| 0: [Parameter] x +# 8| 0: [TypeAccess] int +# 8| 1: [Parameter] f +# 8| 0: [TypeAccess] Function2 +# 8| 0: [WildcardTypeAccess] ? ... +# 8| 1: [TypeAccess] Integer +# 8| 1: [WildcardTypeAccess] ? ... +# 8| 1: [TypeAccess] Integer +# 8| 2: [TypeAccess] Integer +# 8| 5: [BlockStmt] { ... } +# 8| 0: [ExprStmt] ; +# 8| 0: [ImplicitCoercionToUnitExpr] +# 8| 0: [TypeAccess] Unit +# 8| 1: [MethodCall] invoke(...) +# 8| -1: [VarAccess] f +# 8| 0: [VarAccess] x +# 8| 1: [VarAccess] x +# 9| 9: [Method] functionExpression4 +# 9| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 9| 0: [Parameter] x +# 9| 0: [TypeAccess] int +# 9| 1: [Parameter] f +# 9| 0: [TypeAccess] Function1> +# 9| 0: [WildcardTypeAccess] ? ... +# 9| 1: [TypeAccess] Integer +# 9| 1: [WildcardTypeAccess] ? ... +# 9| 0: [TypeAccess] Function1 +# 9| 0: [WildcardTypeAccess] ? ... +# 9| 1: [TypeAccess] Integer +# 9| 1: [TypeAccess] Double +# 9| 5: [BlockStmt] { ... } +# 9| 0: [ExprStmt] ; +# 9| 0: [ImplicitCoercionToUnitExpr] +# 9| 0: [TypeAccess] Unit +# 9| 1: [MethodCall] invoke(...) +# 9| -1: [MethodCall] invoke(...) +# 9| -1: [VarAccess] f +# 9| 0: [VarAccess] x +# 9| 0: [VarAccess] x +# 11| 10: [Method] functionExpression22 +# 11| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 11| 0: [Parameter] x +# 11| 0: [TypeAccess] int +# 11| 1: [Parameter] f +# 11| 0: [TypeAccess] Function22 +# 11| 0: [WildcardTypeAccess] ? ... +# 11| 1: [TypeAccess] Integer +# 11| 1: [WildcardTypeAccess] ? ... +# 11| 1: [TypeAccess] Integer +# 11| 2: [WildcardTypeAccess] ? ... +# 11| 1: [TypeAccess] Integer +# 11| 3: [WildcardTypeAccess] ? ... +# 11| 1: [TypeAccess] Integer +# 11| 4: [WildcardTypeAccess] ? ... +# 11| 1: [TypeAccess] Integer +# 11| 5: [WildcardTypeAccess] ? ... +# 11| 1: [TypeAccess] Integer +# 11| 6: [WildcardTypeAccess] ? ... +# 11| 1: [TypeAccess] Integer +# 11| 7: [WildcardTypeAccess] ? ... +# 11| 1: [TypeAccess] Integer +# 11| 8: [WildcardTypeAccess] ? ... +# 11| 1: [TypeAccess] Integer +# 11| 9: [WildcardTypeAccess] ? ... +# 11| 1: [TypeAccess] Integer +# 11| 10: [WildcardTypeAccess] ? ... +# 11| 1: [TypeAccess] Integer +# 11| 11: [WildcardTypeAccess] ? ... +# 11| 1: [TypeAccess] Integer +# 11| 12: [WildcardTypeAccess] ? ... +# 11| 1: [TypeAccess] Integer +# 11| 13: [WildcardTypeAccess] ? ... +# 11| 1: [TypeAccess] Integer +# 11| 14: [WildcardTypeAccess] ? ... +# 11| 1: [TypeAccess] Integer +# 11| 15: [WildcardTypeAccess] ? ... +# 11| 1: [TypeAccess] Integer +# 11| 16: [WildcardTypeAccess] ? ... +# 11| 1: [TypeAccess] Integer +# 11| 17: [WildcardTypeAccess] ? ... +# 11| 1: [TypeAccess] Integer +# 11| 18: [WildcardTypeAccess] ? ... +# 11| 1: [TypeAccess] Integer +# 11| 19: [WildcardTypeAccess] ? ... +# 11| 1: [TypeAccess] Integer +# 11| 20: [WildcardTypeAccess] ? ... +# 11| 1: [TypeAccess] Integer +# 11| 21: [WildcardTypeAccess] ? ... +# 11| 1: [TypeAccess] Integer +# 11| 22: [TypeAccess] Unit +# 11| 5: [BlockStmt] { ... } +# 12| 0: [ExprStmt] ; +# 12| 0: [MethodCall] invoke(...) +# 12| -1: [VarAccess] f +# 12| 0: [VarAccess] x +# 12| 1: [VarAccess] x +# 12| 2: [VarAccess] x +# 12| 3: [VarAccess] x +# 12| 4: [VarAccess] x +# 12| 5: [VarAccess] x +# 12| 6: [VarAccess] x +# 12| 7: [VarAccess] x +# 12| 8: [VarAccess] x +# 12| 9: [VarAccess] x +# 12| 10: [VarAccess] x +# 12| 11: [VarAccess] x +# 12| 12: [VarAccess] x +# 12| 13: [VarAccess] x +# 12| 14: [VarAccess] x +# 12| 15: [VarAccess] x +# 12| 16: [VarAccess] x +# 12| 17: [VarAccess] x +# 12| 18: [VarAccess] x +# 12| 19: [VarAccess] x +# 12| 20: [VarAccess] x +# 12| 21: [VarAccess] x +# 14| 11: [Method] functionExpression23 +# 14| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 14| 0: [Parameter] x +# 14| 0: [TypeAccess] int +# 14| 1: [Parameter] f +# 14| 0: [TypeAccess] FunctionN +# 14| 0: [WildcardTypeAccess] ? ... +# 14| 1: [TypeAccess] Integer +# 14| 1: [WildcardTypeAccess] ? ... +# 14| 1: [TypeAccess] Integer +# 14| 2: [WildcardTypeAccess] ? ... +# 14| 1: [TypeAccess] Integer +# 14| 3: [WildcardTypeAccess] ? ... +# 14| 1: [TypeAccess] Integer +# 14| 4: [WildcardTypeAccess] ? ... +# 14| 1: [TypeAccess] Integer +# 14| 5: [WildcardTypeAccess] ? ... +# 14| 1: [TypeAccess] Integer +# 14| 6: [WildcardTypeAccess] ? ... +# 14| 1: [TypeAccess] Integer +# 14| 7: [WildcardTypeAccess] ? ... +# 14| 1: [TypeAccess] Integer +# 14| 8: [WildcardTypeAccess] ? ... +# 14| 1: [TypeAccess] Integer +# 14| 9: [WildcardTypeAccess] ? ... +# 14| 1: [TypeAccess] Integer +# 14| 10: [WildcardTypeAccess] ? ... +# 14| 1: [TypeAccess] Integer +# 14| 11: [WildcardTypeAccess] ? ... +# 14| 1: [TypeAccess] Integer +# 14| 12: [WildcardTypeAccess] ? ... +# 14| 1: [TypeAccess] Integer +# 14| 13: [WildcardTypeAccess] ? ... +# 14| 1: [TypeAccess] Integer +# 14| 14: [WildcardTypeAccess] ? ... +# 14| 1: [TypeAccess] Integer +# 14| 15: [WildcardTypeAccess] ? ... +# 14| 1: [TypeAccess] Integer +# 14| 16: [WildcardTypeAccess] ? ... +# 14| 1: [TypeAccess] Integer +# 14| 17: [WildcardTypeAccess] ? ... +# 14| 1: [TypeAccess] Integer +# 14| 18: [WildcardTypeAccess] ? ... +# 14| 1: [TypeAccess] Integer +# 14| 19: [WildcardTypeAccess] ? ... +# 14| 1: [TypeAccess] Integer +# 14| 20: [WildcardTypeAccess] ? ... +# 14| 1: [TypeAccess] Integer +# 14| 21: [WildcardTypeAccess] ? ... +# 14| 1: [TypeAccess] Integer +# 14| 22: [WildcardTypeAccess] ? ... +# 14| 1: [TypeAccess] Integer +# 14| 23: [TypeAccess] String +# 14| 5: [BlockStmt] { ... } +# 15| 0: [ExprStmt] ; +# 15| 0: [ImplicitCoercionToUnitExpr] +# 15| 0: [TypeAccess] Unit +# 15| 1: [MethodCall] invoke(...) +# 15| -1: [VarAccess] f +# 15| 0: [ArrayCreationExpr] new Object[] +# 15| -2: [ArrayInit] {...} +# 15| 0: [VarAccess] x +# 15| 1: [VarAccess] x +# 15| 2: [VarAccess] x +# 15| 3: [VarAccess] x +# 15| 4: [VarAccess] x +# 15| 5: [VarAccess] x +# 15| 6: [VarAccess] x +# 15| 7: [VarAccess] x +# 15| 8: [VarAccess] x +# 15| 9: [VarAccess] x +# 15| 10: [VarAccess] x +# 15| 11: [VarAccess] x +# 15| 12: [VarAccess] x +# 15| 13: [VarAccess] x +# 15| 14: [VarAccess] x +# 15| 15: [VarAccess] x +# 15| 16: [VarAccess] x +# 15| 17: [VarAccess] x +# 15| 18: [VarAccess] x +# 15| 19: [VarAccess] x +# 15| 20: [VarAccess] x +# 15| 21: [VarAccess] x +# 15| 22: [VarAccess] x +# 15| -1: [TypeAccess] Object +# 15| 0: [IntegerLiteral] 23 +# 17| 12: [Method] functionExpression23c +# 17| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 17| 0: [Parameter] x +# 17| 0: [TypeAccess] int +# 17| 1: [Parameter] f +# 17| 0: [TypeAccess] FunctionN +# 17| 0: [WildcardTypeAccess] ? ... +# 17| 1: [TypeAccess] FuncRef +# 17| 1: [WildcardTypeAccess] ? ... +# 17| 1: [TypeAccess] Integer +# 17| 2: [WildcardTypeAccess] ? ... +# 17| 1: [TypeAccess] Integer +# 17| 3: [WildcardTypeAccess] ? ... +# 17| 1: [TypeAccess] Integer +# 17| 4: [WildcardTypeAccess] ? ... +# 17| 1: [TypeAccess] Integer +# 17| 5: [WildcardTypeAccess] ? ... +# 17| 1: [TypeAccess] Integer +# 17| 6: [WildcardTypeAccess] ? ... +# 17| 1: [TypeAccess] Integer +# 17| 7: [WildcardTypeAccess] ? ... +# 17| 1: [TypeAccess] Integer +# 17| 8: [WildcardTypeAccess] ? ... +# 17| 1: [TypeAccess] Integer +# 17| 9: [WildcardTypeAccess] ? ... +# 17| 1: [TypeAccess] Integer +# 17| 10: [WildcardTypeAccess] ? ... +# 17| 1: [TypeAccess] Integer +# 17| 11: [WildcardTypeAccess] ? ... +# 17| 1: [TypeAccess] Integer +# 17| 12: [WildcardTypeAccess] ? ... +# 17| 1: [TypeAccess] Integer +# 17| 13: [WildcardTypeAccess] ? ... +# 17| 1: [TypeAccess] Integer +# 17| 14: [WildcardTypeAccess] ? ... +# 17| 1: [TypeAccess] Integer +# 17| 15: [WildcardTypeAccess] ? ... +# 17| 1: [TypeAccess] Integer +# 17| 16: [WildcardTypeAccess] ? ... +# 17| 1: [TypeAccess] Integer +# 17| 17: [WildcardTypeAccess] ? ... +# 17| 1: [TypeAccess] Integer +# 17| 18: [WildcardTypeAccess] ? ... +# 17| 1: [TypeAccess] Integer +# 17| 19: [WildcardTypeAccess] ? ... +# 17| 1: [TypeAccess] Integer +# 17| 20: [WildcardTypeAccess] ? ... +# 17| 1: [TypeAccess] Integer +# 17| 21: [WildcardTypeAccess] ? ... +# 17| 1: [TypeAccess] Integer +# 17| 22: [WildcardTypeAccess] ? ... +# 17| 1: [TypeAccess] Integer +# 17| 23: [WildcardTypeAccess] ? ... +# 17| 1: [TypeAccess] Integer +# 17| 24: [TypeAccess] String +# 17| 5: [BlockStmt] { ... } +# 18| 0: [ExprStmt] ; +# 18| 0: [ImplicitCoercionToUnitExpr] +# 18| 0: [TypeAccess] Unit +# 18| 1: [MethodCall] invoke(...) +# 18| -1: [VarAccess] f +# 18| 0: [ArrayCreationExpr] new Object[] +# 18| -2: [ArrayInit] {...} +# 18| 0: [ClassInstanceExpr] new FuncRef(...) +# 18| -3: [TypeAccess] FuncRef +# 18| 1: [VarAccess] x +# 18| 2: [VarAccess] x +# 18| 3: [VarAccess] x +# 18| 4: [VarAccess] x +# 18| 5: [VarAccess] x +# 18| 6: [VarAccess] x +# 18| 7: [VarAccess] x +# 18| 8: [VarAccess] x +# 18| 9: [VarAccess] x +# 18| 10: [VarAccess] x +# 18| 11: [VarAccess] x +# 18| 12: [VarAccess] x +# 18| 13: [VarAccess] x +# 18| 14: [VarAccess] x +# 18| 15: [VarAccess] x +# 18| 16: [VarAccess] x +# 18| 17: [VarAccess] x +# 18| 18: [VarAccess] x +# 18| 19: [VarAccess] x +# 18| 20: [VarAccess] x +# 18| 21: [VarAccess] x +# 18| 22: [VarAccess] x +# 18| 23: [VarAccess] x +# 18| -1: [TypeAccess] Object +# 18| 0: [IntegerLiteral] 24 +# 21| 13: [Method] call +# 21| 3: [TypeAccess] Unit +# 21| 5: [BlockStmt] { ... } +# 22| 0: [ExprStmt] ; +# 22| 0: [MethodCall] functionExpression0a(...) +# 22| -1: [TypeAccess] FuncExprsKt +# 22| 0: [LambdaExpr] ...->... +# 22| -4: [AnonymousClass] new Function0(...) { ... } +# 22| 1: [Constructor] +# 22| 5: [BlockStmt] { ... } +# 22| 0: [SuperConstructorInvocationStmt] super(...) +# 22| 2: [Method] invoke +# 22| 3: [TypeAccess] int +# 22| 5: [BlockStmt] { ... } +# 22| 0: [ReturnStmt] return ... +# 22| 0: [IntegerLiteral] 5 +# 22| -3: [TypeAccess] Function0 +# 22| 0: [TypeAccess] Integer +# 23| 1: [ExprStmt] ; +# 23| 0: [MethodCall] functionExpression0b(...) +# 23| -1: [TypeAccess] FuncExprsKt +# 23| 0: [LambdaExpr] ...->... +# 23| -4: [AnonymousClass] new Function0(...) { ... } +# 23| 1: [Constructor] +# 23| 5: [BlockStmt] { ... } +# 23| 0: [SuperConstructorInvocationStmt] super(...) +# 23| 2: [Method] invoke +# 23| 3: [TypeAccess] Object +# 23| 5: [BlockStmt] { ... } +# 23| 0: [ReturnStmt] return ... +# 23| 0: [IntegerLiteral] 5 +# 23| -3: [TypeAccess] Function0 +# 23| 0: [TypeAccess] Object +# 24| 2: [ExprStmt] ; +# 24| 0: [MethodCall] functionExpression0c(...) +# 24| -1: [TypeAccess] FuncExprsKt +# 24| 0: [LambdaExpr] ...->... +# 24| -4: [AnonymousClass] new Function0(...) { ... } +# 24| 1: [Constructor] +# 24| 5: [BlockStmt] { ... } +# 24| 0: [SuperConstructorInvocationStmt] super(...) +# 24| 2: [Method] invoke +# 24| 3: [TypeAccess] Object +# 24| 5: [BlockStmt] { ... } +# 24| 0: [ReturnStmt] return ... +# 24| 0: [IntegerLiteral] 5 +# 24| -3: [TypeAccess] Function0 +# 24| 0: [TypeAccess] Object +# 25| 3: [ExprStmt] ; +# 25| 0: [MethodCall] functionExpression1a(...) +# 25| -1: [TypeAccess] FuncExprsKt +# 25| 0: [IntegerLiteral] 5 +# 25| 1: [LambdaExpr] ...->... +# 25| -4: [AnonymousClass] new Function1(...) { ... } +# 25| 1: [Constructor] +# 25| 5: [BlockStmt] { ... } +# 25| 0: [SuperConstructorInvocationStmt] super(...) +# 25| 2: [Method] invoke +# 25| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 25| 0: [Parameter] a +# 25| 0: [TypeAccess] int +# 25| 5: [BlockStmt] { ... } +# 25| 0: [ReturnStmt] return ... +# 25| 0: [IntegerLiteral] 5 +# 25| -3: [TypeAccess] Function1 +# 25| 0: [TypeAccess] Integer +# 25| 1: [TypeAccess] Integer +# 26| 4: [ExprStmt] ; +# 26| 0: [MethodCall] functionExpression1a(...) +# 26| -1: [TypeAccess] FuncExprsKt +# 26| 0: [IntegerLiteral] 5 +# 26| 1: [LambdaExpr] ...->... +# 26| -4: [AnonymousClass] new Function1(...) { ... } +# 26| 1: [Constructor] +# 26| 5: [BlockStmt] { ... } +# 26| 0: [SuperConstructorInvocationStmt] super(...) +# 26| 2: [Method] invoke +# 26| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 26| 0: [Parameter] it +# 26| 0: [TypeAccess] int +# 26| 5: [BlockStmt] { ... } +# 26| 0: [ReturnStmt] return ... +# 26| 0: [VarAccess] it +# 26| -3: [TypeAccess] Function1 +# 26| 0: [TypeAccess] Integer +# 26| 1: [TypeAccess] Integer +# 27| 5: [ExprStmt] ; +# 27| 0: [MethodCall] functionExpression1a(...) +# 27| -1: [TypeAccess] FuncExprsKt +# 27| 0: [IntegerLiteral] 5 +# 27| 1: [LambdaExpr] ...->... +# 27| -4: [AnonymousClass] new Function1(...) { ... } +# 27| 1: [Constructor] +# 27| 5: [BlockStmt] { ... } +# 27| 0: [SuperConstructorInvocationStmt] super(...) +# 27| 2: [Method] invoke +# 27| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 27| 0: [Parameter] p0 +# 27| 0: [TypeAccess] int +# 27| 5: [BlockStmt] { ... } +# 27| 0: [ReturnStmt] return ... +# 27| 0: [IntegerLiteral] 5 +# 27| -3: [TypeAccess] Function1 +# 27| 0: [TypeAccess] Integer +# 27| 1: [TypeAccess] Integer +# 28| 6: [ExprStmt] ; +# 28| 0: [MethodCall] functionExpression1a(...) +# 28| -1: [TypeAccess] FuncExprsKt +# 28| 0: [IntegerLiteral] 5 +# 28| 1: [ClassInstanceExpr] new MyLambda(...) +# 28| -3: [TypeAccess] MyLambda +# 29| 7: [ExprStmt] ; +# 29| 0: [MethodCall] functionExpression1b(...) +# 29| -1: [TypeAccess] FuncExprsKt +# 29| 0: [IntegerLiteral] 5 +# 29| 1: [LambdaExpr] ...->... +# 29| -4: [AnonymousClass] new Function1(...) { ... } +# 29| 1: [Constructor] +# 29| 5: [BlockStmt] { ... } +# 29| 0: [SuperConstructorInvocationStmt] super(...) +# 29| 2: [Method] invoke +# 29| 3: [TypeAccess] Object +#-----| 4: (Parameters) +# 29| 0: [Parameter] a +# 29| 0: [TypeAccess] Object +# 29| 5: [BlockStmt] { ... } +# 29| 0: [ReturnStmt] return ... +# 29| 0: [VarAccess] a +# 29| -3: [TypeAccess] Function1 +# 29| 0: [TypeAccess] Object +# 29| 1: [TypeAccess] Object +# 30| 8: [ExprStmt] ; +# 30| 0: [MethodCall] functionExpression2(...) +# 30| -1: [TypeAccess] FuncExprsKt +# 30| 0: [IntegerLiteral] 5 +# 30| 1: [LambdaExpr] ...->... +# 30| -4: [AnonymousClass] new Function2(...) { ... } +# 30| 1: [Constructor] +# 30| 5: [BlockStmt] { ... } +# 30| 0: [SuperConstructorInvocationStmt] super(...) +# 30| 2: [Method] invoke +# 30| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 30| 0: [Parameter] p0 +# 30| 0: [TypeAccess] int +# 30| 1: [Parameter] p1 +# 30| 0: [TypeAccess] int +# 30| 5: [BlockStmt] { ... } +# 30| 0: [ReturnStmt] return ... +# 30| 0: [IntegerLiteral] 5 +# 30| -3: [TypeAccess] Function2 +# 30| 0: [TypeAccess] Integer +# 30| 1: [TypeAccess] Integer +# 30| 2: [TypeAccess] Integer +# 31| 9: [ExprStmt] ; +# 31| 0: [MethodCall] functionExpression2(...) +# 31| -1: [TypeAccess] FuncExprsKt +# 31| 0: [IntegerLiteral] 5 +# 31| 1: [LambdaExpr] ...->... +# 31| -4: [AnonymousClass] new Function2(...) { ... } +# 31| 1: [Constructor] +# 31| 5: [BlockStmt] { ... } +# 31| 0: [SuperConstructorInvocationStmt] super(...) +# 31| 2: [Method] invoke +# 31| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 31| 0: [Parameter] p0 +# 31| 0: [TypeAccess] int +# 31| 1: [Parameter] p1 +# 31| 0: [TypeAccess] int +# 31| 5: [BlockStmt] { ... } +# 31| 0: [ReturnStmt] return ... +# 31| 0: [IntegerLiteral] 5 +# 31| -3: [TypeAccess] Function2 +# 31| 0: [TypeAccess] Integer +# 31| 1: [TypeAccess] Integer +# 31| 2: [TypeAccess] Integer +# 32| 10: [ExprStmt] ; +# 32| 0: [MethodCall] functionExpression3(...) +# 32| -1: [TypeAccess] FuncExprsKt +# 32| 0: [IntegerLiteral] 5 +# 32| 1: [LambdaExpr] ...->... +# 32| -4: [AnonymousClass] new Function2(...) { ... } +# 32| 1: [Constructor] +# 32| 5: [BlockStmt] { ... } +# 32| 0: [SuperConstructorInvocationStmt] super(...) +# 32| 2: [ExtensionMethod] invoke +# 32| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 32| 0: [Parameter] $this$functionExpression3 +# 32| 0: [TypeAccess] int +# 32| 1: [Parameter] a +# 32| 0: [TypeAccess] int +# 32| 5: [BlockStmt] { ... } +# 32| 0: [ReturnStmt] return ... +# 32| 0: [AddExpr] ... + ... +# 32| 0: [ExtensionReceiverAccess] this +# 32| 1: [VarAccess] a +# 32| -3: [TypeAccess] Function2 +# 32| 0: [TypeAccess] Integer +# 32| 1: [TypeAccess] Integer +# 32| 2: [TypeAccess] Integer +# 33| 11: [ExprStmt] ; +# 33| 0: [MethodCall] functionExpression4(...) +# 33| -1: [TypeAccess] FuncExprsKt +# 33| 0: [IntegerLiteral] 5 +# 33| 1: [LambdaExpr] ...->... +# 33| -4: [AnonymousClass] new Function1>(...) { ... } +# 33| 1: [Constructor] +# 33| 5: [BlockStmt] { ... } +# 33| 0: [SuperConstructorInvocationStmt] super(...) +# 33| 2: [Method] invoke +# 33| 3: [TypeAccess] Function1 +# 33| 0: [TypeAccess] Integer +# 33| 1: [TypeAccess] Double +#-----| 4: (Parameters) +# 33| 0: [Parameter] a +# 33| 0: [TypeAccess] int +# 33| 5: [BlockStmt] { ... } +# 33| 0: [ReturnStmt] return ... +# 33| 0: [LambdaExpr] ...->... +# 33| -4: [AnonymousClass] new Function1(...) { ... } +# 33| 1: [Constructor] +# 33| 5: [BlockStmt] { ... } +# 33| 0: [SuperConstructorInvocationStmt] super(...) +# 33| 2: [Method] invoke +# 33| 3: [TypeAccess] double +#-----| 4: (Parameters) +# 33| 0: [Parameter] b +# 33| 0: [TypeAccess] int +# 33| 5: [BlockStmt] { ... } +# 33| 0: [ReturnStmt] return ... +# 33| 0: [DoubleLiteral] 5.0 +# 33| -3: [TypeAccess] Function1 +# 33| 0: [TypeAccess] Integer +# 33| 1: [TypeAccess] Double +# 33| -3: [TypeAccess] Function1> +# 33| 0: [TypeAccess] Integer +# 33| 1: [TypeAccess] Function1 +# 33| 0: [TypeAccess] Integer +# 33| 1: [TypeAccess] Double +# 35| 12: [ExprStmt] ; +# 35| 0: [MethodCall] functionExpression22(...) +# 35| -1: [TypeAccess] FuncExprsKt +# 35| 0: [IntegerLiteral] 5 +# 35| 1: [LambdaExpr] ...->... +# 35| -4: [AnonymousClass] new Function22(...) { ... } +# 35| 1: [Constructor] +# 35| 5: [BlockStmt] { ... } +# 35| 0: [SuperConstructorInvocationStmt] super(...) +# 35| 2: [Method] invoke +# 35| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 35| 0: [Parameter] a0 +# 35| 0: [TypeAccess] int +# 35| 1: [Parameter] a1 +# 35| 0: [TypeAccess] int +# 35| 2: [Parameter] a2 +# 35| 0: [TypeAccess] int +# 35| 3: [Parameter] a3 +# 35| 0: [TypeAccess] int +# 35| 4: [Parameter] a4 +# 35| 0: [TypeAccess] int +# 35| 5: [Parameter] a5 +# 35| 0: [TypeAccess] int +# 35| 6: [Parameter] a6 +# 35| 0: [TypeAccess] int +# 35| 7: [Parameter] a7 +# 35| 0: [TypeAccess] int +# 35| 8: [Parameter] a8 +# 35| 0: [TypeAccess] int +# 35| 9: [Parameter] a9 +# 35| 0: [TypeAccess] int +# 35| 10: [Parameter] a10 +# 35| 0: [TypeAccess] int +# 35| 11: [Parameter] a11 +# 35| 0: [TypeAccess] int +# 35| 12: [Parameter] a12 +# 35| 0: [TypeAccess] int +# 35| 13: [Parameter] a13 +# 35| 0: [TypeAccess] int +# 35| 14: [Parameter] a14 +# 35| 0: [TypeAccess] int +# 35| 15: [Parameter] a15 +# 35| 0: [TypeAccess] int +# 35| 16: [Parameter] a16 +# 35| 0: [TypeAccess] int +# 35| 17: [Parameter] a17 +# 35| 0: [TypeAccess] int +# 35| 18: [Parameter] a18 +# 35| 0: [TypeAccess] int +# 35| 19: [Parameter] a19 +# 35| 0: [TypeAccess] int +# 35| 20: [Parameter] a20 +# 35| 0: [TypeAccess] int +# 35| 21: [Parameter] a21 +# 35| 0: [TypeAccess] int +# 35| 5: [BlockStmt] { ... } +# 35| 0: [ExprStmt] ; +# 35| 0: [ImplicitCoercionToUnitExpr] +# 35| 0: [TypeAccess] Unit +# 35| 1: [IntegerLiteral] 5 +# 35| -3: [TypeAccess] Function22 +# 35| 0: [TypeAccess] Integer +# 35| 1: [TypeAccess] Integer +# 35| 2: [TypeAccess] Integer +# 35| 3: [TypeAccess] Integer +# 35| 4: [TypeAccess] Integer +# 35| 5: [TypeAccess] Integer +# 35| 6: [TypeAccess] Integer +# 35| 7: [TypeAccess] Integer +# 35| 8: [TypeAccess] Integer +# 35| 9: [TypeAccess] Integer +# 35| 10: [TypeAccess] Integer +# 35| 11: [TypeAccess] Integer +# 35| 12: [TypeAccess] Integer +# 35| 13: [TypeAccess] Integer +# 35| 14: [TypeAccess] Integer +# 35| 15: [TypeAccess] Integer +# 35| 16: [TypeAccess] Integer +# 35| 17: [TypeAccess] Integer +# 35| 18: [TypeAccess] Integer +# 35| 19: [TypeAccess] Integer +# 35| 20: [TypeAccess] Integer +# 35| 21: [TypeAccess] Integer +# 35| 22: [TypeAccess] Unit +# 36| 13: [ExprStmt] ; +# 36| 0: [MethodCall] functionExpression23(...) +# 36| -1: [TypeAccess] FuncExprsKt +# 36| 0: [IntegerLiteral] 5 +# 36| 1: [LambdaExpr] ...->... +# 36| -4: [AnonymousClass] new FunctionN(...) { ... } +# 36| 1: [Constructor] +# 36| 5: [BlockStmt] { ... } +# 36| 0: [SuperConstructorInvocationStmt] super(...) +# 36| 2: [Method] invoke +#-----| 4: (Parameters) +# 36| 0: [Parameter] a0 +# 36| 5: [BlockStmt] { ... } +# 36| 0: [ReturnStmt] return ... +# 36| 0: [MethodCall] invoke(...) +# 36| -1: [ThisAccess] this +# 36| 0: [CastExpr] (...)... +# 36| 0: [TypeAccess] int +# 36| 1: [ArrayAccess] ...[...] +# 36| 0: [VarAccess] a0 +# 36| 1: [IntegerLiteral] 0 +# 36| 1: [CastExpr] (...)... +# 36| 0: [TypeAccess] int +# 36| 1: [ArrayAccess] ...[...] +# 36| 0: [VarAccess] a0 +# 36| 1: [IntegerLiteral] 1 +# 36| 2: [CastExpr] (...)... +# 36| 0: [TypeAccess] int +# 36| 1: [ArrayAccess] ...[...] +# 36| 0: [VarAccess] a0 +# 36| 1: [IntegerLiteral] 2 +# 36| 3: [CastExpr] (...)... +# 36| 0: [TypeAccess] int +# 36| 1: [ArrayAccess] ...[...] +# 36| 0: [VarAccess] a0 +# 36| 1: [IntegerLiteral] 3 +# 36| 4: [CastExpr] (...)... +# 36| 0: [TypeAccess] int +# 36| 1: [ArrayAccess] ...[...] +# 36| 0: [VarAccess] a0 +# 36| 1: [IntegerLiteral] 4 +# 36| 5: [CastExpr] (...)... +# 36| 0: [TypeAccess] int +# 36| 1: [ArrayAccess] ...[...] +# 36| 0: [VarAccess] a0 +# 36| 1: [IntegerLiteral] 5 +# 36| 6: [CastExpr] (...)... +# 36| 0: [TypeAccess] int +# 36| 1: [ArrayAccess] ...[...] +# 36| 0: [VarAccess] a0 +# 36| 1: [IntegerLiteral] 6 +# 36| 7: [CastExpr] (...)... +# 36| 0: [TypeAccess] int +# 36| 1: [ArrayAccess] ...[...] +# 36| 0: [VarAccess] a0 +# 36| 1: [IntegerLiteral] 7 +# 36| 8: [CastExpr] (...)... +# 36| 0: [TypeAccess] int +# 36| 1: [ArrayAccess] ...[...] +# 36| 0: [VarAccess] a0 +# 36| 1: [IntegerLiteral] 8 +# 36| 9: [CastExpr] (...)... +# 36| 0: [TypeAccess] int +# 36| 1: [ArrayAccess] ...[...] +# 36| 0: [VarAccess] a0 +# 36| 1: [IntegerLiteral] 9 +# 36| 10: [CastExpr] (...)... +# 36| 0: [TypeAccess] int +# 36| 1: [ArrayAccess] ...[...] +# 36| 0: [VarAccess] a0 +# 36| 1: [IntegerLiteral] 10 +# 36| 11: [CastExpr] (...)... +# 36| 0: [TypeAccess] int +# 36| 1: [ArrayAccess] ...[...] +# 36| 0: [VarAccess] a0 +# 36| 1: [IntegerLiteral] 11 +# 36| 12: [CastExpr] (...)... +# 36| 0: [TypeAccess] int +# 36| 1: [ArrayAccess] ...[...] +# 36| 0: [VarAccess] a0 +# 36| 1: [IntegerLiteral] 12 +# 36| 13: [CastExpr] (...)... +# 36| 0: [TypeAccess] int +# 36| 1: [ArrayAccess] ...[...] +# 36| 0: [VarAccess] a0 +# 36| 1: [IntegerLiteral] 13 +# 36| 14: [CastExpr] (...)... +# 36| 0: [TypeAccess] int +# 36| 1: [ArrayAccess] ...[...] +# 36| 0: [VarAccess] a0 +# 36| 1: [IntegerLiteral] 14 +# 36| 15: [CastExpr] (...)... +# 36| 0: [TypeAccess] int +# 36| 1: [ArrayAccess] ...[...] +# 36| 0: [VarAccess] a0 +# 36| 1: [IntegerLiteral] 15 +# 36| 16: [CastExpr] (...)... +# 36| 0: [TypeAccess] int +# 36| 1: [ArrayAccess] ...[...] +# 36| 0: [VarAccess] a0 +# 36| 1: [IntegerLiteral] 16 +# 36| 17: [CastExpr] (...)... +# 36| 0: [TypeAccess] int +# 36| 1: [ArrayAccess] ...[...] +# 36| 0: [VarAccess] a0 +# 36| 1: [IntegerLiteral] 17 +# 36| 18: [CastExpr] (...)... +# 36| 0: [TypeAccess] int +# 36| 1: [ArrayAccess] ...[...] +# 36| 0: [VarAccess] a0 +# 36| 1: [IntegerLiteral] 18 +# 36| 19: [CastExpr] (...)... +# 36| 0: [TypeAccess] int +# 36| 1: [ArrayAccess] ...[...] +# 36| 0: [VarAccess] a0 +# 36| 1: [IntegerLiteral] 19 +# 36| 20: [CastExpr] (...)... +# 36| 0: [TypeAccess] int +# 36| 1: [ArrayAccess] ...[...] +# 36| 0: [VarAccess] a0 +# 36| 1: [IntegerLiteral] 20 +# 36| 21: [CastExpr] (...)... +# 36| 0: [TypeAccess] int +# 36| 1: [ArrayAccess] ...[...] +# 36| 0: [VarAccess] a0 +# 36| 1: [IntegerLiteral] 21 +# 36| 22: [CastExpr] (...)... +# 36| 0: [TypeAccess] int +# 36| 1: [ArrayAccess] ...[...] +# 36| 0: [VarAccess] a0 +# 36| 1: [IntegerLiteral] 22 +# 36| 3: [Method] invoke +# 36| 3: [TypeAccess] String +#-----| 4: (Parameters) +# 36| 0: [Parameter] a0 +# 36| 0: [TypeAccess] int +# 36| 1: [Parameter] a1 +# 36| 0: [TypeAccess] int +# 36| 2: [Parameter] a2 +# 36| 0: [TypeAccess] int +# 36| 3: [Parameter] a3 +# 36| 0: [TypeAccess] int +# 36| 4: [Parameter] a4 +# 36| 0: [TypeAccess] int +# 36| 5: [Parameter] a5 +# 36| 0: [TypeAccess] int +# 36| 6: [Parameter] a6 +# 36| 0: [TypeAccess] int +# 36| 7: [Parameter] a7 +# 36| 0: [TypeAccess] int +# 36| 8: [Parameter] a8 +# 36| 0: [TypeAccess] int +# 36| 9: [Parameter] a9 +# 36| 0: [TypeAccess] int +# 36| 10: [Parameter] a10 +# 36| 0: [TypeAccess] int +# 36| 11: [Parameter] a11 +# 36| 0: [TypeAccess] int +# 36| 12: [Parameter] a12 +# 36| 0: [TypeAccess] int +# 36| 13: [Parameter] a13 +# 36| 0: [TypeAccess] int +# 36| 14: [Parameter] a14 +# 36| 0: [TypeAccess] int +# 36| 15: [Parameter] a15 +# 36| 0: [TypeAccess] int +# 36| 16: [Parameter] a16 +# 36| 0: [TypeAccess] int +# 36| 17: [Parameter] a17 +# 36| 0: [TypeAccess] int +# 36| 18: [Parameter] a18 +# 36| 0: [TypeAccess] int +# 36| 19: [Parameter] a19 +# 36| 0: [TypeAccess] int +# 36| 20: [Parameter] a20 +# 36| 0: [TypeAccess] int +# 36| 21: [Parameter] a21 +# 36| 0: [TypeAccess] int +# 36| 22: [Parameter] a22 +# 36| 0: [TypeAccess] int +# 36| 5: [BlockStmt] { ... } +# 36| 0: [ReturnStmt] return ... +# 36| 0: [StringLiteral] "" +# 36| -3: [TypeAccess] FunctionN +# 36| 0: [TypeAccess] String +# 38| 14: [ExprStmt] ; +# 38| 0: [MethodCall] functionExpression0a(...) +# 38| -1: [TypeAccess] FuncExprsKt +# 38| 0: [MemberRefExpr] ...::... +# 38| -4: [AnonymousClass] new Function0(...) { ... } +# 38| 1: [Constructor] +#-----| 4: (Parameters) +# 38| 0: [Parameter] +# 38| 5: [BlockStmt] { ... } +# 38| 0: [SuperConstructorInvocationStmt] super(...) +# 38| 0: [IntegerLiteral] 0 +# 38| 1: [ExprStmt] ; +# 38| 0: [AssignExpr] ...=... +# 38| 0: [VarAccess] this. +# 38| -1: [ThisAccess] this +# 38| 1: [VarAccess] +# 38| 2: [FieldDeclaration] FuncRef ; +# 38| -1: [TypeAccess] FuncRef +# 38| 3: [Method] invoke +# 38| 5: [BlockStmt] { ... } +# 38| 0: [ReturnStmt] return ... +# 38| 0: [MethodCall] f0(...) +# 38| -1: [VarAccess] this. +# 38| -1: [ThisAccess] this +# 38| -3: [TypeAccess] Function0 +# 38| 0: [TypeAccess] Integer +# 38| 0: [ClassInstanceExpr] new FuncRef(...) +# 38| -3: [TypeAccess] FuncRef +# 39| 15: [ExprStmt] ; +# 39| 0: [MethodCall] functionExpression0a(...) +# 39| -1: [TypeAccess] FuncExprsKt +# 39| 0: [MemberRefExpr] ...::... +# 39| -4: [AnonymousClass] new Function0(...) { ... } +# 39| 1: [Constructor] +#-----| 4: (Parameters) +# 39| 0: [Parameter] +# 39| 5: [BlockStmt] { ... } +# 39| 0: [SuperConstructorInvocationStmt] super(...) +# 39| 0: [IntegerLiteral] 0 +# 39| 1: [ExprStmt] ; +# 39| 0: [AssignExpr] ...=... +# 39| 0: [VarAccess] this. +# 39| -1: [ThisAccess] this +# 39| 1: [VarAccess] +# 39| 2: [FieldDeclaration] Companion ; +# 39| -1: [TypeAccess] Companion +# 39| 3: [Method] invoke +# 39| 5: [BlockStmt] { ... } +# 39| 0: [ReturnStmt] return ... +# 39| 0: [MethodCall] f0(...) +# 39| -1: [VarAccess] this. +# 39| -1: [ThisAccess] this +# 39| -3: [TypeAccess] Function0 +# 39| 0: [TypeAccess] Integer +# 39| 0: [VarAccess] Companion +# 40| 16: [ExprStmt] ; +# 40| 0: [MethodCall] functionExpression1a(...) +# 40| -1: [TypeAccess] FuncExprsKt +# 40| 0: [IntegerLiteral] 5 +# 40| 1: [MemberRefExpr] ...::... +# 40| -4: [AnonymousClass] new Function1(...) { ... } +# 40| 1: [Constructor] +#-----| 4: (Parameters) +# 40| 0: [Parameter] +# 40| 5: [BlockStmt] { ... } +# 40| 0: [SuperConstructorInvocationStmt] super(...) +# 40| 0: [IntegerLiteral] 1 +# 40| 1: [ExprStmt] ; +# 40| 0: [AssignExpr] ...=... +# 40| 0: [VarAccess] this. +# 40| -1: [ThisAccess] this +# 40| 1: [VarAccess] +# 40| 2: [FieldDeclaration] FuncRef ; +# 40| -1: [TypeAccess] FuncRef +# 40| 3: [Method] invoke +#-----| 4: (Parameters) +# 40| 0: [Parameter] a0 +# 40| 5: [BlockStmt] { ... } +# 40| 0: [ReturnStmt] return ... +# 40| 0: [MethodCall] f1(...) +# 40| -1: [VarAccess] this. +# 40| -1: [ThisAccess] this +# 40| 0: [VarAccess] a0 +# 40| -3: [TypeAccess] Function1 +# 40| 0: [TypeAccess] Integer +# 40| 1: [TypeAccess] Integer +# 40| 0: [ClassInstanceExpr] new FuncRef(...) +# 40| -3: [TypeAccess] FuncRef +# 41| 17: [ExprStmt] ; +# 41| 0: [MethodCall] functionExpression1c(...) +# 41| -1: [TypeAccess] FuncExprsKt +# 41| 0: [IntegerLiteral] 5 +# 41| 1: [MemberRefExpr] ...::... +# 41| -4: [AnonymousClass] new Function2(...) { ... } +# 41| 1: [Constructor] +# 41| 5: [BlockStmt] { ... } +# 41| 0: [SuperConstructorInvocationStmt] super(...) +# 41| 0: [IntegerLiteral] 2 +# 41| 2: [Method] invoke +#-----| 4: (Parameters) +# 41| 0: [Parameter] a0 +# 41| 1: [Parameter] a1 +# 41| 5: [BlockStmt] { ... } +# 41| 0: [ReturnStmt] return ... +# 41| 0: [MethodCall] f1(...) +# 41| -1: [VarAccess] a0 +# 41| 0: [VarAccess] a1 +# 41| -3: [TypeAccess] Function2 +# 41| 0: [TypeAccess] FuncRef +# 41| 1: [TypeAccess] Integer +# 41| 2: [TypeAccess] Integer +# 42| 18: [ExprStmt] ; +# 42| 0: [MethodCall] functionExpression1a(...) +# 42| -1: [TypeAccess] FuncExprsKt +# 42| 0: [IntegerLiteral] 5 +# 42| 1: [MemberRefExpr] ...::... +# 42| -4: [AnonymousClass] new Function1(...) { ... } +# 42| 1: [Constructor] +#-----| 4: (Parameters) +# 42| 0: [Parameter] +# 42| 5: [BlockStmt] { ... } +# 42| 0: [SuperConstructorInvocationStmt] super(...) +# 42| 0: [IntegerLiteral] 1 +# 42| 1: [ExprStmt] ; +# 42| 0: [AssignExpr] ...=... +# 42| 0: [VarAccess] this. +# 42| -1: [ThisAccess] this +# 42| 1: [VarAccess] +# 42| 2: [FieldDeclaration] int ; +# 42| -1: [TypeAccess] int +# 42| 3: [Method] invoke +#-----| 4: (Parameters) +# 42| 0: [Parameter] a0 +# 42| 5: [BlockStmt] { ... } +# 42| 0: [ReturnStmt] return ... +# 42| 0: [MethodCall] f3(...) +# 42| -1: [TypeAccess] FuncExprsKt +# 42| 0: [VarAccess] this. +# 42| -1: [ThisAccess] this +# 42| 1: [VarAccess] a0 +# 42| -3: [TypeAccess] Function1 +# 42| 0: [TypeAccess] Integer +# 42| 1: [TypeAccess] Integer +# 42| 0: [IntegerLiteral] 3 +# 43| 19: [ExprStmt] ; +# 43| 0: [MethodCall] functionExpression3(...) +# 43| -1: [TypeAccess] FuncExprsKt +# 43| 0: [IntegerLiteral] 5 +# 43| 1: [MemberRefExpr] ...::... +# 43| -4: [AnonymousClass] new Function2(...) { ... } +# 43| 1: [Constructor] +# 43| 5: [BlockStmt] { ... } +# 43| 0: [SuperConstructorInvocationStmt] super(...) +# 43| 0: [IntegerLiteral] 2 +# 43| 2: [Method] invoke +#-----| 4: (Parameters) +# 43| 0: [Parameter] a0 +# 43| 1: [Parameter] a1 +# 43| 5: [BlockStmt] { ... } +# 43| 0: [ReturnStmt] return ... +# 43| 0: [MethodCall] f3(...) +# 43| -1: [TypeAccess] FuncExprsKt +# 43| 0: [VarAccess] a0 +# 43| 1: [VarAccess] a1 +# 43| -3: [TypeAccess] Function2 +# 43| 0: [TypeAccess] Integer +# 43| 1: [TypeAccess] Integer +# 43| 2: [TypeAccess] Integer +# 44| 20: [ExprStmt] ; +# 44| 0: [MethodCall] functionExpression22(...) +# 44| -1: [TypeAccess] FuncExprsKt +# 44| 0: [IntegerLiteral] 5 +# 44| 1: [MemberRefExpr] ...::... +# 44| -4: [AnonymousClass] new Function22(...) { ... } +# 44| 1: [Constructor] +#-----| 4: (Parameters) +# 44| 0: [Parameter] +# 44| 5: [BlockStmt] { ... } +# 44| 0: [SuperConstructorInvocationStmt] super(...) +# 44| 0: [IntegerLiteral] 22 +# 44| 1: [ExprStmt] ; +# 44| 0: [AssignExpr] ...=... +# 44| 0: [VarAccess] this. +# 44| -1: [ThisAccess] this +# 44| 1: [VarAccess] +# 44| 2: [FieldDeclaration] FuncRef ; +# 44| -1: [TypeAccess] FuncRef +# 44| 3: [Method] invoke +#-----| 4: (Parameters) +# 44| 0: [Parameter] a0 +# 44| 1: [Parameter] a1 +# 44| 2: [Parameter] a2 +# 44| 3: [Parameter] a3 +# 44| 4: [Parameter] a4 +# 44| 5: [Parameter] a5 +# 44| 6: [Parameter] a6 +# 44| 7: [Parameter] a7 +# 44| 8: [Parameter] a8 +# 44| 9: [Parameter] a9 +# 44| 10: [Parameter] a10 +# 44| 11: [Parameter] a11 +# 44| 12: [Parameter] a12 +# 44| 13: [Parameter] a13 +# 44| 14: [Parameter] a14 +# 44| 15: [Parameter] a15 +# 44| 16: [Parameter] a16 +# 44| 17: [Parameter] a17 +# 44| 18: [Parameter] a18 +# 44| 19: [Parameter] a19 +# 44| 20: [Parameter] a20 +# 44| 21: [Parameter] a21 +# 44| 5: [BlockStmt] { ... } +# 44| 0: [ReturnStmt] return ... +# 44| 0: [MethodCall] f22(...) +# 44| -1: [VarAccess] this. +# 44| -1: [ThisAccess] this +# 44| 0: [VarAccess] a0 +# 44| 1: [VarAccess] a1 +# 44| 2: [VarAccess] a2 +# 44| 3: [VarAccess] a3 +# 44| 4: [VarAccess] a4 +# 44| 5: [VarAccess] a5 +# 44| 6: [VarAccess] a6 +# 44| 7: [VarAccess] a7 +# 44| 8: [VarAccess] a8 +# 44| 9: [VarAccess] a9 +# 44| 10: [VarAccess] a10 +# 44| 11: [VarAccess] a11 +# 44| 12: [VarAccess] a12 +# 44| 13: [VarAccess] a13 +# 44| 14: [VarAccess] a14 +# 44| 15: [VarAccess] a15 +# 44| 16: [VarAccess] a16 +# 44| 17: [VarAccess] a17 +# 44| 18: [VarAccess] a18 +# 44| 19: [VarAccess] a19 +# 44| 20: [VarAccess] a20 +# 44| 21: [VarAccess] a21 +# 44| -3: [TypeAccess] Function22 +# 44| 0: [TypeAccess] Integer +# 44| 1: [TypeAccess] Integer +# 44| 2: [TypeAccess] Integer +# 44| 3: [TypeAccess] Integer +# 44| 4: [TypeAccess] Integer +# 44| 5: [TypeAccess] Integer +# 44| 6: [TypeAccess] Integer +# 44| 7: [TypeAccess] Integer +# 44| 8: [TypeAccess] Integer +# 44| 9: [TypeAccess] Integer +# 44| 10: [TypeAccess] Integer +# 44| 11: [TypeAccess] Integer +# 44| 12: [TypeAccess] Integer +# 44| 13: [TypeAccess] Integer +# 44| 14: [TypeAccess] Integer +# 44| 15: [TypeAccess] Integer +# 44| 16: [TypeAccess] Integer +# 44| 17: [TypeAccess] Integer +# 44| 18: [TypeAccess] Integer +# 44| 19: [TypeAccess] Integer +# 44| 20: [TypeAccess] Integer +# 44| 21: [TypeAccess] Integer +# 44| 22: [TypeAccess] Unit +# 44| 0: [ClassInstanceExpr] new FuncRef(...) +# 44| -3: [TypeAccess] FuncRef +# 45| 21: [ExprStmt] ; +# 45| 0: [MethodCall] functionExpression23(...) +# 45| -1: [TypeAccess] FuncExprsKt +# 45| 0: [IntegerLiteral] 5 +# 45| 1: [MemberRefExpr] ...::... +# 45| -4: [AnonymousClass] new FunctionN(...) { ... } +# 45| 1: [Constructor] +#-----| 4: (Parameters) +# 45| 0: [Parameter] +# 45| 5: [BlockStmt] { ... } +# 45| 0: [SuperConstructorInvocationStmt] super(...) +# 45| 0: [IntegerLiteral] 23 +# 45| 1: [ExprStmt] ; +# 45| 0: [AssignExpr] ...=... +# 45| 0: [VarAccess] this. +# 45| -1: [ThisAccess] this +# 45| 1: [VarAccess] +# 45| 2: [FieldDeclaration] FuncRef ; +# 45| -1: [TypeAccess] FuncRef +# 45| 3: [Method] invoke +#-----| 4: (Parameters) +# 45| 0: [Parameter] a0 +# 45| 5: [BlockStmt] { ... } +# 45| 0: [ReturnStmt] return ... +# 45| 0: [MethodCall] f23(...) +# 45| -1: [VarAccess] this. +# 45| -1: [ThisAccess] this +# 45| 0: [CastExpr] (...)... +# 45| 0: [TypeAccess] int +# 45| 1: [ArrayAccess] ...[...] +# 45| 0: [VarAccess] a0 +# 45| 1: [IntegerLiteral] 0 +# 45| 1: [CastExpr] (...)... +# 45| 0: [TypeAccess] int +# 45| 1: [ArrayAccess] ...[...] +# 45| 0: [VarAccess] a0 +# 45| 1: [IntegerLiteral] 1 +# 45| 2: [CastExpr] (...)... +# 45| 0: [TypeAccess] int +# 45| 1: [ArrayAccess] ...[...] +# 45| 0: [VarAccess] a0 +# 45| 1: [IntegerLiteral] 2 +# 45| 3: [CastExpr] (...)... +# 45| 0: [TypeAccess] int +# 45| 1: [ArrayAccess] ...[...] +# 45| 0: [VarAccess] a0 +# 45| 1: [IntegerLiteral] 3 +# 45| 4: [CastExpr] (...)... +# 45| 0: [TypeAccess] int +# 45| 1: [ArrayAccess] ...[...] +# 45| 0: [VarAccess] a0 +# 45| 1: [IntegerLiteral] 4 +# 45| 5: [CastExpr] (...)... +# 45| 0: [TypeAccess] int +# 45| 1: [ArrayAccess] ...[...] +# 45| 0: [VarAccess] a0 +# 45| 1: [IntegerLiteral] 5 +# 45| 6: [CastExpr] (...)... +# 45| 0: [TypeAccess] int +# 45| 1: [ArrayAccess] ...[...] +# 45| 0: [VarAccess] a0 +# 45| 1: [IntegerLiteral] 6 +# 45| 7: [CastExpr] (...)... +# 45| 0: [TypeAccess] int +# 45| 1: [ArrayAccess] ...[...] +# 45| 0: [VarAccess] a0 +# 45| 1: [IntegerLiteral] 7 +# 45| 8: [CastExpr] (...)... +# 45| 0: [TypeAccess] int +# 45| 1: [ArrayAccess] ...[...] +# 45| 0: [VarAccess] a0 +# 45| 1: [IntegerLiteral] 8 +# 45| 9: [CastExpr] (...)... +# 45| 0: [TypeAccess] int +# 45| 1: [ArrayAccess] ...[...] +# 45| 0: [VarAccess] a0 +# 45| 1: [IntegerLiteral] 9 +# 45| 10: [CastExpr] (...)... +# 45| 0: [TypeAccess] int +# 45| 1: [ArrayAccess] ...[...] +# 45| 0: [VarAccess] a0 +# 45| 1: [IntegerLiteral] 10 +# 45| 11: [CastExpr] (...)... +# 45| 0: [TypeAccess] int +# 45| 1: [ArrayAccess] ...[...] +# 45| 0: [VarAccess] a0 +# 45| 1: [IntegerLiteral] 11 +# 45| 12: [CastExpr] (...)... +# 45| 0: [TypeAccess] int +# 45| 1: [ArrayAccess] ...[...] +# 45| 0: [VarAccess] a0 +# 45| 1: [IntegerLiteral] 12 +# 45| 13: [CastExpr] (...)... +# 45| 0: [TypeAccess] int +# 45| 1: [ArrayAccess] ...[...] +# 45| 0: [VarAccess] a0 +# 45| 1: [IntegerLiteral] 13 +# 45| 14: [CastExpr] (...)... +# 45| 0: [TypeAccess] int +# 45| 1: [ArrayAccess] ...[...] +# 45| 0: [VarAccess] a0 +# 45| 1: [IntegerLiteral] 14 +# 45| 15: [CastExpr] (...)... +# 45| 0: [TypeAccess] int +# 45| 1: [ArrayAccess] ...[...] +# 45| 0: [VarAccess] a0 +# 45| 1: [IntegerLiteral] 15 +# 45| 16: [CastExpr] (...)... +# 45| 0: [TypeAccess] int +# 45| 1: [ArrayAccess] ...[...] +# 45| 0: [VarAccess] a0 +# 45| 1: [IntegerLiteral] 16 +# 45| 17: [CastExpr] (...)... +# 45| 0: [TypeAccess] int +# 45| 1: [ArrayAccess] ...[...] +# 45| 0: [VarAccess] a0 +# 45| 1: [IntegerLiteral] 17 +# 45| 18: [CastExpr] (...)... +# 45| 0: [TypeAccess] int +# 45| 1: [ArrayAccess] ...[...] +# 45| 0: [VarAccess] a0 +# 45| 1: [IntegerLiteral] 18 +# 45| 19: [CastExpr] (...)... +# 45| 0: [TypeAccess] int +# 45| 1: [ArrayAccess] ...[...] +# 45| 0: [VarAccess] a0 +# 45| 1: [IntegerLiteral] 19 +# 45| 20: [CastExpr] (...)... +# 45| 0: [TypeAccess] int +# 45| 1: [ArrayAccess] ...[...] +# 45| 0: [VarAccess] a0 +# 45| 1: [IntegerLiteral] 20 +# 45| 21: [CastExpr] (...)... +# 45| 0: [TypeAccess] int +# 45| 1: [ArrayAccess] ...[...] +# 45| 0: [VarAccess] a0 +# 45| 1: [IntegerLiteral] 21 +# 45| 22: [CastExpr] (...)... +# 45| 0: [TypeAccess] int +# 45| 1: [ArrayAccess] ...[...] +# 45| 0: [VarAccess] a0 +# 45| 1: [IntegerLiteral] 22 +# 45| -3: [TypeAccess] FunctionN +# 45| 0: [TypeAccess] String +# 45| 0: [ClassInstanceExpr] new FuncRef(...) +# 45| -3: [TypeAccess] FuncRef +# 46| 22: [ExprStmt] ; +# 46| 0: [MethodCall] functionExpression23c(...) +# 46| -1: [TypeAccess] FuncExprsKt +# 46| 0: [IntegerLiteral] 5 +# 46| 1: [MemberRefExpr] ...::... +# 46| -4: [AnonymousClass] new FunctionN(...) { ... } +# 46| 1: [Constructor] +# 46| 5: [BlockStmt] { ... } +# 46| 0: [SuperConstructorInvocationStmt] super(...) +# 46| 0: [IntegerLiteral] 24 +# 46| 2: [Method] invoke +#-----| 4: (Parameters) +# 46| 0: [Parameter] a0 +# 46| 5: [BlockStmt] { ... } +# 46| 0: [ReturnStmt] return ... +# 46| 0: [MethodCall] f23(...) +# 46| -1: [CastExpr] (...)... +# 46| 0: [TypeAccess] FuncRef +# 46| 1: [ArrayAccess] ...[...] +# 46| 0: [VarAccess] a0 +# 46| 1: [IntegerLiteral] 0 +# 46| 0: [CastExpr] (...)... +# 46| 0: [TypeAccess] int +# 46| 1: [ArrayAccess] ...[...] +# 46| 0: [VarAccess] a0 +# 46| 1: [IntegerLiteral] 1 +# 46| 1: [CastExpr] (...)... +# 46| 0: [TypeAccess] int +# 46| 1: [ArrayAccess] ...[...] +# 46| 0: [VarAccess] a0 +# 46| 1: [IntegerLiteral] 2 +# 46| 2: [CastExpr] (...)... +# 46| 0: [TypeAccess] int +# 46| 1: [ArrayAccess] ...[...] +# 46| 0: [VarAccess] a0 +# 46| 1: [IntegerLiteral] 3 +# 46| 3: [CastExpr] (...)... +# 46| 0: [TypeAccess] int +# 46| 1: [ArrayAccess] ...[...] +# 46| 0: [VarAccess] a0 +# 46| 1: [IntegerLiteral] 4 +# 46| 4: [CastExpr] (...)... +# 46| 0: [TypeAccess] int +# 46| 1: [ArrayAccess] ...[...] +# 46| 0: [VarAccess] a0 +# 46| 1: [IntegerLiteral] 5 +# 46| 5: [CastExpr] (...)... +# 46| 0: [TypeAccess] int +# 46| 1: [ArrayAccess] ...[...] +# 46| 0: [VarAccess] a0 +# 46| 1: [IntegerLiteral] 6 +# 46| 6: [CastExpr] (...)... +# 46| 0: [TypeAccess] int +# 46| 1: [ArrayAccess] ...[...] +# 46| 0: [VarAccess] a0 +# 46| 1: [IntegerLiteral] 7 +# 46| 7: [CastExpr] (...)... +# 46| 0: [TypeAccess] int +# 46| 1: [ArrayAccess] ...[...] +# 46| 0: [VarAccess] a0 +# 46| 1: [IntegerLiteral] 8 +# 46| 8: [CastExpr] (...)... +# 46| 0: [TypeAccess] int +# 46| 1: [ArrayAccess] ...[...] +# 46| 0: [VarAccess] a0 +# 46| 1: [IntegerLiteral] 9 +# 46| 9: [CastExpr] (...)... +# 46| 0: [TypeAccess] int +# 46| 1: [ArrayAccess] ...[...] +# 46| 0: [VarAccess] a0 +# 46| 1: [IntegerLiteral] 10 +# 46| 10: [CastExpr] (...)... +# 46| 0: [TypeAccess] int +# 46| 1: [ArrayAccess] ...[...] +# 46| 0: [VarAccess] a0 +# 46| 1: [IntegerLiteral] 11 +# 46| 11: [CastExpr] (...)... +# 46| 0: [TypeAccess] int +# 46| 1: [ArrayAccess] ...[...] +# 46| 0: [VarAccess] a0 +# 46| 1: [IntegerLiteral] 12 +# 46| 12: [CastExpr] (...)... +# 46| 0: [TypeAccess] int +# 46| 1: [ArrayAccess] ...[...] +# 46| 0: [VarAccess] a0 +# 46| 1: [IntegerLiteral] 13 +# 46| 13: [CastExpr] (...)... +# 46| 0: [TypeAccess] int +# 46| 1: [ArrayAccess] ...[...] +# 46| 0: [VarAccess] a0 +# 46| 1: [IntegerLiteral] 14 +# 46| 14: [CastExpr] (...)... +# 46| 0: [TypeAccess] int +# 46| 1: [ArrayAccess] ...[...] +# 46| 0: [VarAccess] a0 +# 46| 1: [IntegerLiteral] 15 +# 46| 15: [CastExpr] (...)... +# 46| 0: [TypeAccess] int +# 46| 1: [ArrayAccess] ...[...] +# 46| 0: [VarAccess] a0 +# 46| 1: [IntegerLiteral] 16 +# 46| 16: [CastExpr] (...)... +# 46| 0: [TypeAccess] int +# 46| 1: [ArrayAccess] ...[...] +# 46| 0: [VarAccess] a0 +# 46| 1: [IntegerLiteral] 17 +# 46| 17: [CastExpr] (...)... +# 46| 0: [TypeAccess] int +# 46| 1: [ArrayAccess] ...[...] +# 46| 0: [VarAccess] a0 +# 46| 1: [IntegerLiteral] 18 +# 46| 18: [CastExpr] (...)... +# 46| 0: [TypeAccess] int +# 46| 1: [ArrayAccess] ...[...] +# 46| 0: [VarAccess] a0 +# 46| 1: [IntegerLiteral] 19 +# 46| 19: [CastExpr] (...)... +# 46| 0: [TypeAccess] int +# 46| 1: [ArrayAccess] ...[...] +# 46| 0: [VarAccess] a0 +# 46| 1: [IntegerLiteral] 20 +# 46| 20: [CastExpr] (...)... +# 46| 0: [TypeAccess] int +# 46| 1: [ArrayAccess] ...[...] +# 46| 0: [VarAccess] a0 +# 46| 1: [IntegerLiteral] 21 +# 46| 21: [CastExpr] (...)... +# 46| 0: [TypeAccess] int +# 46| 1: [ArrayAccess] ...[...] +# 46| 0: [VarAccess] a0 +# 46| 1: [IntegerLiteral] 22 +# 46| 22: [CastExpr] (...)... +# 46| 0: [TypeAccess] int +# 46| 1: [ArrayAccess] ...[...] +# 46| 0: [VarAccess] a0 +# 46| 1: [IntegerLiteral] 23 +# 46| -3: [TypeAccess] FunctionN +# 46| 0: [TypeAccess] String +# 48| 23: [LocalTypeDeclStmt] class ... +# 48| 0: [LocalClass] +# 48| 1: [Constructor] +# 48| 5: [BlockStmt] { ... } +# 48| 0: [SuperConstructorInvocationStmt] super(...) +# 48| 2: [Method] local +# 48| 3: [TypeAccess] int +# 48| 5: [BlockStmt] { ... } +# 48| 0: [ReturnStmt] return ... +# 48| 0: [IntegerLiteral] 5 +# 49| 24: [ExprStmt] ; +# 49| 0: [MethodCall] functionExpression0a(...) +# 49| -1: [TypeAccess] FuncExprsKt +# 49| 0: [MemberRefExpr] ...::... +# 49| -4: [AnonymousClass] new Function0(...) { ... } +# 49| 1: [Constructor] +# 49| 5: [BlockStmt] { ... } +# 49| 0: [SuperConstructorInvocationStmt] super(...) +# 49| 0: [IntegerLiteral] 0 +# 49| 2: [Method] invoke +# 49| 5: [BlockStmt] { ... } +# 49| 0: [ReturnStmt] return ... +# 49| 0: [MethodCall] local(...) +# 49| -1: [ClassInstanceExpr] new (...) +# 49| -3: [TypeAccess] Object +# 49| -3: [TypeAccess] Function0 +# 49| 0: [TypeAccess] Integer +# 51| 25: [ExprStmt] ; +# 51| 0: [MethodCall] fn(...) +# 51| -2: [TypeAccess] FuncRef +# 51| -1: [TypeAccess] FuncExprsKt +# 51| 0: [MemberRefExpr] ...::... +# 51| -4: [AnonymousClass] new Function0(...) { ... } +# 51| 1: [Constructor] +# 51| 5: [BlockStmt] { ... } +# 51| 0: [SuperConstructorInvocationStmt] super(...) +# 51| 0: [IntegerLiteral] 0 +# 51| 2: [Method] invoke +# 51| 5: [BlockStmt] { ... } +# 51| 0: [ReturnStmt] return ... +# 51| 0: [ClassInstanceExpr] new FuncRef(...) +# 51| -3: [TypeAccess] FuncRef +# 51| -3: [TypeAccess] Function0 +# 51| 0: [TypeAccess] FuncRef +# 58| 14: [Method] fn +#-----| 2: (Generic Parameters) +# 58| 0: [TypeVariable] T +# 58| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 58| 0: [Parameter] l +# 58| 0: [TypeAccess] Function0 +# 58| 0: [WildcardTypeAccess] ? ... +# 58| 0: [TypeAccess] T +# 58| 5: [BlockStmt] { ... } +# 59| 15: [ExtensionMethod] f3 +# 59| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 59| 0: [Parameter] +# 59| 0: [TypeAccess] int +# 59| 1: [Parameter] a +# 59| 0: [TypeAccess] int +# 59| 5: [BlockStmt] { ... } +# 59| 0: [ReturnStmt] return ... +# 59| 0: [IntegerLiteral] 5 +# 82| 16: [Method] fn +# 82| 3: [TypeAccess] Unit +# 82| 5: [BlockStmt] { ... } +# 83| 0: [LocalVariableDeclStmt] var ...; +# 83| 1: [LocalVariableDeclExpr] l1 +# 83| 0: [LambdaExpr] ...->... +# 83| -4: [AnonymousClass] new Function1(...) { ... } +# 83| 1: [Constructor] +# 83| 5: [BlockStmt] { ... } +# 83| 0: [SuperConstructorInvocationStmt] super(...) +# 83| 2: [Method] invoke +# 83| 3: [TypeAccess] String +#-----| 4: (Parameters) +# 83| 0: [Parameter] i +# 83| 0: [TypeAccess] int +# 83| 5: [BlockStmt] { ... } +# 83| 0: [ReturnStmt] return ... +# 83| 0: [MethodCall] toString(...) +# 83| -1: [VarAccess] i +# 83| -3: [TypeAccess] Function1 +# 83| 0: [TypeAccess] Integer +# 83| 1: [TypeAccess] String +# 84| 1: [ExprStmt] ; +# 84| 0: [ImplicitCoercionToUnitExpr] +# 84| 0: [TypeAccess] Unit +# 84| 1: [MethodCall] invoke(...) +# 84| -1: [VarAccess] l1 +# 84| 0: [IntegerLiteral] 5 +# 86| 2: [LocalVariableDeclStmt] var ...; +# 86| 1: [LocalVariableDeclExpr] l2 +# 86| 0: [LambdaExpr] ...->... +# 86| -4: [AnonymousClass] new Function1(...) { ... } +# 86| 1: [Constructor] +# 86| 5: [BlockStmt] { ... } +# 86| 0: [SuperConstructorInvocationStmt] super(...) +# 86| 2: [Method] invoke +# 86| 3: [TypeAccess] String +#-----| 4: (Parameters) +# 86| 0: [Parameter] i +# 86| 0: [TypeAccess] int +# 86| 5: [BlockStmt] { ... } +# 86| 0: [ReturnStmt] return ... +# 86| 0: [MethodCall] toString(...) +# 86| -1: [VarAccess] i +# 86| -3: [TypeAccess] Function1 +# 86| 0: [TypeAccess] Integer +# 86| 1: [TypeAccess] String +# 87| 3: [ExprStmt] ; +# 87| 0: [ImplicitCoercionToUnitExpr] +# 87| 0: [TypeAccess] Unit +# 87| 1: [MethodCall] invoke(...) +# 87| -1: [VarAccess] l2 +# 87| 0: [IntegerLiteral] 5 +# 89| 4: [LocalVariableDeclStmt] var ...; +# 89| 1: [LocalVariableDeclExpr] l3 +# 90| 0: [LambdaExpr] ...->... +# 90| -4: [AnonymousClass] new FunctionN(...) { ... } +# 90| 1: [Constructor] +# 90| 5: [BlockStmt] { ... } +# 90| 0: [SuperConstructorInvocationStmt] super(...) +# 90| 2: [Method] invoke +#-----| 4: (Parameters) +# 90| 0: [Parameter] a0 +# 90| 5: [BlockStmt] { ... } +# 90| 0: [ReturnStmt] return ... +# 90| 0: [MethodCall] invoke(...) +# 90| -1: [ThisAccess] this +# 90| 0: [CastExpr] (...)... +# 90| 0: [TypeAccess] int +# 90| 1: [ArrayAccess] ...[...] +# 90| 0: [VarAccess] a0 +# 90| 1: [IntegerLiteral] 0 +# 90| 1: [CastExpr] (...)... +# 90| 0: [TypeAccess] int +# 90| 1: [ArrayAccess] ...[...] +# 90| 0: [VarAccess] a0 +# 90| 1: [IntegerLiteral] 1 +# 90| 2: [CastExpr] (...)... +# 90| 0: [TypeAccess] int +# 90| 1: [ArrayAccess] ...[...] +# 90| 0: [VarAccess] a0 +# 90| 1: [IntegerLiteral] 2 +# 90| 3: [CastExpr] (...)... +# 90| 0: [TypeAccess] int +# 90| 1: [ArrayAccess] ...[...] +# 90| 0: [VarAccess] a0 +# 90| 1: [IntegerLiteral] 3 +# 90| 4: [CastExpr] (...)... +# 90| 0: [TypeAccess] int +# 90| 1: [ArrayAccess] ...[...] +# 90| 0: [VarAccess] a0 +# 90| 1: [IntegerLiteral] 4 +# 90| 5: [CastExpr] (...)... +# 90| 0: [TypeAccess] int +# 90| 1: [ArrayAccess] ...[...] +# 90| 0: [VarAccess] a0 +# 90| 1: [IntegerLiteral] 5 +# 90| 6: [CastExpr] (...)... +# 90| 0: [TypeAccess] int +# 90| 1: [ArrayAccess] ...[...] +# 90| 0: [VarAccess] a0 +# 90| 1: [IntegerLiteral] 6 +# 90| 7: [CastExpr] (...)... +# 90| 0: [TypeAccess] int +# 90| 1: [ArrayAccess] ...[...] +# 90| 0: [VarAccess] a0 +# 90| 1: [IntegerLiteral] 7 +# 90| 8: [CastExpr] (...)... +# 90| 0: [TypeAccess] int +# 90| 1: [ArrayAccess] ...[...] +# 90| 0: [VarAccess] a0 +# 90| 1: [IntegerLiteral] 8 +# 90| 9: [CastExpr] (...)... +# 90| 0: [TypeAccess] int +# 90| 1: [ArrayAccess] ...[...] +# 90| 0: [VarAccess] a0 +# 90| 1: [IntegerLiteral] 9 +# 90| 10: [CastExpr] (...)... +# 90| 0: [TypeAccess] int +# 90| 1: [ArrayAccess] ...[...] +# 90| 0: [VarAccess] a0 +# 90| 1: [IntegerLiteral] 10 +# 90| 11: [CastExpr] (...)... +# 90| 0: [TypeAccess] int +# 90| 1: [ArrayAccess] ...[...] +# 90| 0: [VarAccess] a0 +# 90| 1: [IntegerLiteral] 11 +# 90| 12: [CastExpr] (...)... +# 90| 0: [TypeAccess] int +# 90| 1: [ArrayAccess] ...[...] +# 90| 0: [VarAccess] a0 +# 90| 1: [IntegerLiteral] 12 +# 90| 13: [CastExpr] (...)... +# 90| 0: [TypeAccess] int +# 90| 1: [ArrayAccess] ...[...] +# 90| 0: [VarAccess] a0 +# 90| 1: [IntegerLiteral] 13 +# 90| 14: [CastExpr] (...)... +# 90| 0: [TypeAccess] int +# 90| 1: [ArrayAccess] ...[...] +# 90| 0: [VarAccess] a0 +# 90| 1: [IntegerLiteral] 14 +# 90| 15: [CastExpr] (...)... +# 90| 0: [TypeAccess] int +# 90| 1: [ArrayAccess] ...[...] +# 90| 0: [VarAccess] a0 +# 90| 1: [IntegerLiteral] 15 +# 90| 16: [CastExpr] (...)... +# 90| 0: [TypeAccess] int +# 90| 1: [ArrayAccess] ...[...] +# 90| 0: [VarAccess] a0 +# 90| 1: [IntegerLiteral] 16 +# 90| 17: [CastExpr] (...)... +# 90| 0: [TypeAccess] int +# 90| 1: [ArrayAccess] ...[...] +# 90| 0: [VarAccess] a0 +# 90| 1: [IntegerLiteral] 17 +# 90| 18: [CastExpr] (...)... +# 90| 0: [TypeAccess] int +# 90| 1: [ArrayAccess] ...[...] +# 90| 0: [VarAccess] a0 +# 90| 1: [IntegerLiteral] 18 +# 90| 19: [CastExpr] (...)... +# 90| 0: [TypeAccess] int +# 90| 1: [ArrayAccess] ...[...] +# 90| 0: [VarAccess] a0 +# 90| 1: [IntegerLiteral] 19 +# 90| 20: [CastExpr] (...)... +# 90| 0: [TypeAccess] int +# 90| 1: [ArrayAccess] ...[...] +# 90| 0: [VarAccess] a0 +# 90| 1: [IntegerLiteral] 20 +# 90| 21: [CastExpr] (...)... +# 90| 0: [TypeAccess] int +# 90| 1: [ArrayAccess] ...[...] +# 90| 0: [VarAccess] a0 +# 90| 1: [IntegerLiteral] 21 +# 90| 22: [CastExpr] (...)... +# 90| 0: [TypeAccess] int +# 90| 1: [ArrayAccess] ...[...] +# 90| 0: [VarAccess] a0 +# 90| 1: [IntegerLiteral] 22 +# 90| 3: [Method] invoke +# 90| 3: [TypeAccess] String +#-----| 4: (Parameters) +# 90| 0: [Parameter] p0 +# 90| 0: [TypeAccess] int +# 90| 1: [Parameter] p1 +# 90| 0: [TypeAccess] int +# 90| 2: [Parameter] p2 +# 90| 0: [TypeAccess] int +# 90| 3: [Parameter] p3 +# 90| 0: [TypeAccess] int +# 90| 4: [Parameter] p4 +# 90| 0: [TypeAccess] int +# 90| 5: [Parameter] p5 +# 90| 0: [TypeAccess] int +# 90| 6: [Parameter] p6 +# 90| 0: [TypeAccess] int +# 90| 7: [Parameter] p7 +# 90| 0: [TypeAccess] int +# 90| 8: [Parameter] p8 +# 90| 0: [TypeAccess] int +# 90| 9: [Parameter] p9 +# 90| 0: [TypeAccess] int +# 90| 10: [Parameter] p10 +# 90| 0: [TypeAccess] int +# 90| 11: [Parameter] p11 +# 90| 0: [TypeAccess] int +# 90| 12: [Parameter] p12 +# 90| 0: [TypeAccess] int +# 90| 13: [Parameter] p13 +# 90| 0: [TypeAccess] int +# 90| 14: [Parameter] p14 +# 90| 0: [TypeAccess] int +# 90| 15: [Parameter] p15 +# 90| 0: [TypeAccess] int +# 90| 16: [Parameter] p16 +# 90| 0: [TypeAccess] int +# 90| 17: [Parameter] p17 +# 90| 0: [TypeAccess] int +# 90| 18: [Parameter] p18 +# 90| 0: [TypeAccess] int +# 90| 19: [Parameter] p19 +# 90| 0: [TypeAccess] int +# 90| 20: [Parameter] p20 +# 90| 0: [TypeAccess] int +# 90| 21: [Parameter] p21 +# 90| 0: [TypeAccess] int +# 90| 22: [Parameter] p22 +# 90| 0: [TypeAccess] int +# 90| 5: [BlockStmt] { ... } +# 90| 0: [ReturnStmt] return ... +# 90| 0: [StringLiteral] "" +# 90| -3: [TypeAccess] FunctionN +# 90| 0: [TypeAccess] String +# 91| 5: [ExprStmt] ; +# 91| 0: [ImplicitCoercionToUnitExpr] +# 91| 0: [TypeAccess] Unit +# 91| 1: [MethodCall] invoke(...) +# 91| -1: [VarAccess] l3 +# 91| 0: [ArrayCreationExpr] new Object[] +# 91| -2: [ArrayInit] {...} +# 91| 0: [IntegerLiteral] 1 +# 91| 1: [IntegerLiteral] 2 +# 91| 2: [IntegerLiteral] 3 +# 91| 3: [IntegerLiteral] 4 +# 91| 4: [IntegerLiteral] 5 +# 91| 5: [IntegerLiteral] 6 +# 91| 6: [IntegerLiteral] 7 +# 91| 7: [IntegerLiteral] 8 +# 91| 8: [IntegerLiteral] 9 +# 91| 9: [IntegerLiteral] 0 +# 91| 10: [IntegerLiteral] 1 +# 91| 11: [IntegerLiteral] 2 +# 91| 12: [IntegerLiteral] 3 +# 91| 13: [IntegerLiteral] 4 +# 91| 14: [IntegerLiteral] 5 +# 91| 15: [IntegerLiteral] 6 +# 91| 16: [IntegerLiteral] 7 +# 91| 17: [IntegerLiteral] 8 +# 91| 18: [IntegerLiteral] 9 +# 91| 19: [IntegerLiteral] 0 +# 91| 20: [IntegerLiteral] 1 +# 91| 21: [IntegerLiteral] 2 +# 91| 22: [IntegerLiteral] 3 +# 91| -1: [TypeAccess] Object +# 91| 0: [IntegerLiteral] 23 +# 93| 6: [LocalVariableDeclStmt] var ...; +# 93| 1: [LocalVariableDeclExpr] l4 +# 94| 0: [LambdaExpr] ...->... +# 94| -4: [AnonymousClass] new Function22(...) { ... } +# 94| 1: [Constructor] +# 94| 5: [BlockStmt] { ... } +# 94| 0: [SuperConstructorInvocationStmt] super(...) +# 94| 2: [Method] invoke +# 94| 3: [TypeAccess] String +#-----| 4: (Parameters) +# 94| 0: [Parameter] p0 +# 94| 0: [TypeAccess] int +# 94| 1: [Parameter] p1 +# 94| 0: [TypeAccess] int +# 94| 2: [Parameter] p2 +# 94| 0: [TypeAccess] int +# 94| 3: [Parameter] p3 +# 94| 0: [TypeAccess] int +# 94| 4: [Parameter] p4 +# 94| 0: [TypeAccess] int +# 94| 5: [Parameter] p5 +# 94| 0: [TypeAccess] int +# 94| 6: [Parameter] p6 +# 94| 0: [TypeAccess] int +# 94| 7: [Parameter] p7 +# 94| 0: [TypeAccess] int +# 94| 8: [Parameter] p8 +# 94| 0: [TypeAccess] int +# 94| 9: [Parameter] p9 +# 94| 0: [TypeAccess] int +# 94| 10: [Parameter] p10 +# 94| 0: [TypeAccess] int +# 94| 11: [Parameter] p11 +# 94| 0: [TypeAccess] int +# 94| 12: [Parameter] p12 +# 94| 0: [TypeAccess] int +# 94| 13: [Parameter] p13 +# 94| 0: [TypeAccess] int +# 94| 14: [Parameter] p14 +# 94| 0: [TypeAccess] int +# 94| 15: [Parameter] p15 +# 94| 0: [TypeAccess] int +# 94| 16: [Parameter] p16 +# 94| 0: [TypeAccess] int +# 94| 17: [Parameter] p17 +# 94| 0: [TypeAccess] int +# 94| 18: [Parameter] p18 +# 94| 0: [TypeAccess] int +# 94| 19: [Parameter] p19 +# 94| 0: [TypeAccess] int +# 94| 20: [Parameter] p20 +# 94| 0: [TypeAccess] int +# 94| 21: [Parameter] p21 +# 94| 0: [TypeAccess] int +# 94| 5: [BlockStmt] { ... } +# 94| 0: [ReturnStmt] return ... +# 94| 0: [StringLiteral] "" +# 94| -3: [TypeAccess] Function22 +# 94| 0: [TypeAccess] Integer +# 94| 1: [TypeAccess] Integer +# 94| 2: [TypeAccess] Integer +# 94| 3: [TypeAccess] Integer +# 94| 4: [TypeAccess] Integer +# 94| 5: [TypeAccess] Integer +# 94| 6: [TypeAccess] Integer +# 94| 7: [TypeAccess] Integer +# 94| 8: [TypeAccess] Integer +# 94| 9: [TypeAccess] Integer +# 94| 10: [TypeAccess] Integer +# 94| 11: [TypeAccess] Integer +# 94| 12: [TypeAccess] Integer +# 94| 13: [TypeAccess] Integer +# 94| 14: [TypeAccess] Integer +# 94| 15: [TypeAccess] Integer +# 94| 16: [TypeAccess] Integer +# 94| 17: [TypeAccess] Integer +# 94| 18: [TypeAccess] Integer +# 94| 19: [TypeAccess] Integer +# 94| 20: [TypeAccess] Integer +# 94| 21: [TypeAccess] Integer +# 94| 22: [TypeAccess] String +# 95| 7: [ExprStmt] ; +# 95| 0: [ImplicitCoercionToUnitExpr] +# 95| 0: [TypeAccess] Unit +# 95| 1: [MethodCall] invoke(...) +# 95| -1: [VarAccess] l4 +# 95| 0: [IntegerLiteral] 1 +# 95| 1: [IntegerLiteral] 2 +# 95| 2: [IntegerLiteral] 3 +# 95| 3: [IntegerLiteral] 4 +# 95| 4: [IntegerLiteral] 5 +# 95| 5: [IntegerLiteral] 6 +# 95| 6: [IntegerLiteral] 7 +# 95| 7: [IntegerLiteral] 8 +# 95| 8: [IntegerLiteral] 9 +# 95| 9: [IntegerLiteral] 0 +# 95| 10: [IntegerLiteral] 1 +# 95| 11: [IntegerLiteral] 2 +# 95| 12: [IntegerLiteral] 3 +# 95| 13: [IntegerLiteral] 4 +# 95| 14: [IntegerLiteral] 5 +# 95| 15: [IntegerLiteral] 6 +# 95| 16: [IntegerLiteral] 7 +# 95| 17: [IntegerLiteral] 8 +# 95| 18: [IntegerLiteral] 9 +# 95| 19: [IntegerLiteral] 0 +# 95| 20: [IntegerLiteral] 1 +# 95| 21: [IntegerLiteral] 2 +# 54| 2: [Class] MyLambda +# 54| 1: [Constructor] MyLambda +# 54| 5: [BlockStmt] { ... } +# 54| 0: [SuperConstructorInvocationStmt] super(...) +# 54| 1: [BlockStmt] { ... } +# 55| 2: [Method] invoke +# 55| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 55| 0: [Parameter] x +# 55| 0: [TypeAccess] int +# 55| 5: [BlockStmt] { ... } +# 55| 0: [ReturnStmt] return ... +# 55| 0: [IntegerLiteral] 5 +# 61| 3: [Class] FuncRef +# 61| 1: [Constructor] FuncRef +# 61| 5: [BlockStmt] { ... } +# 61| 0: [SuperConstructorInvocationStmt] super(...) +# 61| 1: [BlockStmt] { ... } +# 62| 2: [Class] Companion +# 62| 1: [Constructor] Companion +# 62| 5: [BlockStmt] { ... } +# 62| 0: [SuperConstructorInvocationStmt] super(...) +# 62| 1: [BlockStmt] { ... } +# 63| 2: [Method] f0 +# 63| 3: [TypeAccess] int +# 63| 5: [BlockStmt] { ... } +# 63| 0: [ReturnStmt] return ... +# 63| 0: [IntegerLiteral] 5 +# 65| 3: [Method] f0 +# 65| 3: [TypeAccess] int +# 65| 5: [BlockStmt] { ... } +# 65| 0: [ReturnStmt] return ... +# 65| 0: [IntegerLiteral] 5 +# 66| 4: [Method] f1 +# 66| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 66| 0: [Parameter] a +# 66| 0: [TypeAccess] int +# 66| 5: [BlockStmt] { ... } +# 66| 0: [ReturnStmt] return ... +# 66| 0: [IntegerLiteral] 5 +# 67| 5: [Method] f22 +# 67| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 67| 0: [Parameter] a0 +# 67| 0: [TypeAccess] int +# 67| 1: [Parameter] a1 +# 67| 0: [TypeAccess] int +# 67| 2: [Parameter] a2 +# 67| 0: [TypeAccess] int +# 67| 3: [Parameter] a3 +# 67| 0: [TypeAccess] int +# 67| 4: [Parameter] a4 +# 67| 0: [TypeAccess] int +# 67| 5: [Parameter] a5 +# 67| 0: [TypeAccess] int +# 67| 6: [Parameter] a6 +# 67| 0: [TypeAccess] int +# 67| 7: [Parameter] a7 +# 67| 0: [TypeAccess] int +# 67| 8: [Parameter] a8 +# 67| 0: [TypeAccess] int +# 67| 9: [Parameter] a9 +# 67| 0: [TypeAccess] int +# 67| 10: [Parameter] a10 +# 67| 0: [TypeAccess] int +# 68| 11: [Parameter] a11 +# 68| 0: [TypeAccess] int +# 68| 12: [Parameter] a12 +# 68| 0: [TypeAccess] int +# 68| 13: [Parameter] a13 +# 68| 0: [TypeAccess] int +# 68| 14: [Parameter] a14 +# 68| 0: [TypeAccess] int +# 68| 15: [Parameter] a15 +# 68| 0: [TypeAccess] int +# 68| 16: [Parameter] a16 +# 68| 0: [TypeAccess] int +# 68| 17: [Parameter] a17 +# 68| 0: [TypeAccess] int +# 68| 18: [Parameter] a18 +# 68| 0: [TypeAccess] int +# 68| 19: [Parameter] a19 +# 68| 0: [TypeAccess] int +# 68| 20: [Parameter] a20 +# 68| 0: [TypeAccess] int +# 68| 21: [Parameter] a21 +# 68| 0: [TypeAccess] int +# 68| 5: [BlockStmt] { ... } +# 69| 6: [Method] f23 +# 69| 3: [TypeAccess] String +#-----| 4: (Parameters) +# 69| 0: [Parameter] a0 +# 69| 0: [TypeAccess] int +# 69| 1: [Parameter] a1 +# 69| 0: [TypeAccess] int +# 69| 2: [Parameter] a2 +# 69| 0: [TypeAccess] int +# 69| 3: [Parameter] a3 +# 69| 0: [TypeAccess] int +# 69| 4: [Parameter] a4 +# 69| 0: [TypeAccess] int +# 69| 5: [Parameter] a5 +# 69| 0: [TypeAccess] int +# 69| 6: [Parameter] a6 +# 69| 0: [TypeAccess] int +# 69| 7: [Parameter] a7 +# 69| 0: [TypeAccess] int +# 69| 8: [Parameter] a8 +# 69| 0: [TypeAccess] int +# 69| 9: [Parameter] a9 +# 69| 0: [TypeAccess] int +# 69| 10: [Parameter] a10 +# 69| 0: [TypeAccess] int +# 70| 11: [Parameter] a11 +# 70| 0: [TypeAccess] int +# 70| 12: [Parameter] a12 +# 70| 0: [TypeAccess] int +# 70| 13: [Parameter] a13 +# 70| 0: [TypeAccess] int +# 70| 14: [Parameter] a14 +# 70| 0: [TypeAccess] int +# 70| 15: [Parameter] a15 +# 70| 0: [TypeAccess] int +# 70| 16: [Parameter] a16 +# 70| 0: [TypeAccess] int +# 70| 17: [Parameter] a17 +# 70| 0: [TypeAccess] int +# 70| 18: [Parameter] a18 +# 70| 0: [TypeAccess] int +# 70| 19: [Parameter] a19 +# 70| 0: [TypeAccess] int +# 70| 20: [Parameter] a20 +# 70| 0: [TypeAccess] int +# 70| 21: [Parameter] a21 +# 70| 0: [TypeAccess] int +# 70| 22: [Parameter] a22 +# 70| 0: [TypeAccess] int +# 70| 5: [BlockStmt] { ... } +# 70| 0: [ReturnStmt] return ... +# 70| 0: [StringLiteral] "" +# 73| 4: [Class] Class3 +# 73| 3: [Constructor] Class3 +# 73| 5: [BlockStmt] { ... } +# 73| 0: [SuperConstructorInvocationStmt] super(...) +# 73| 1: [BlockStmt] { ... } +# 74| 4: [Method] call +# 74| 3: [TypeAccess] Unit +# 74| 5: [BlockStmt] { ... } +# 75| 0: [ExprStmt] ; +# 75| 0: [MethodCall] fn(...) +# 75| -1: [ThisAccess] this +# 75| 0: [LambdaExpr] ...->... +# 75| -4: [AnonymousClass] new Function1>,String>(...) { ... } +# 75| 1: [Constructor] +# 75| 5: [BlockStmt] { ... } +# 75| 0: [SuperConstructorInvocationStmt] super(...) +# 75| 2: [Method] invoke +# 75| 3: [TypeAccess] String +#-----| 4: (Parameters) +# 75| 0: [Parameter] a +# 75| 0: [TypeAccess] Generic> +# 75| 0: [TypeAccess] Generic +# 75| 0: [TypeAccess] Integer +# 75| 5: [BlockStmt] { ... } +# 75| 0: [ReturnStmt] return ... +# 75| 0: [StringLiteral] "a" +# 75| -3: [TypeAccess] Function1>,String> +# 75| 0: [TypeAccess] Generic> +# 75| 0: [TypeAccess] Generic +# 75| 0: [TypeAccess] Integer +# 75| 1: [TypeAccess] String +# 77| 5: [Method] fn +# 77| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 77| 0: [Parameter] f +# 77| 0: [TypeAccess] Function1>,String> +# 77| 0: [WildcardTypeAccess] ? ... +# 77| 1: [TypeAccess] Generic> +# 77| 0: [TypeAccess] Generic +# 77| 0: [TypeAccess] Integer +# 77| 1: [TypeAccess] String +# 77| 5: [BlockStmt] { ... } +# 79| 6: [Class,GenericType,ParameterizedType] Generic +#-----| -2: (Generic Parameters) +# 79| 0: [TypeVariable] T +# 79| 1: [Constructor] Generic +# 79| 5: [BlockStmt] { ... } +# 79| 0: [SuperConstructorInvocationStmt] super(...) +# 79| 1: [BlockStmt] { ... } +kFunctionInvoke.kt: +# 0| [CompilationUnit] kFunctionInvoke +# 0| 1: [Class] KFunctionInvokeKt +# 7| 1: [Method] useRef +# 7| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 7| 0: [Parameter] a +# 7| 0: [TypeAccess] A +# 7| 1: [Parameter] s +# 7| 0: [TypeAccess] String +# 7| 5: [BlockStmt] { ... } +# 8| 0: [LocalVariableDeclStmt] var ...; +# 8| 1: [LocalVariableDeclExpr] toCall +# 8| 0: [MemberRefExpr] ...::... +# 8| -4: [AnonymousClass] new Function1(...) { ... } +# 8| 1: [Constructor] +#-----| 4: (Parameters) +# 8| 0: [Parameter] +# 8| 5: [BlockStmt] { ... } +# 8| 0: [SuperConstructorInvocationStmt] super(...) +# 8| 0: [IntegerLiteral] 1 +# 8| 1: [ExprStmt] ; +# 8| 0: [AssignExpr] ...=... +# 8| 0: [VarAccess] this. +# 8| -1: [ThisAccess] this +# 8| 1: [VarAccess] +# 8| 2: [FieldDeclaration] A ; +# 8| -1: [TypeAccess] A +# 8| 3: [Method] invoke +#-----| 4: (Parameters) +# 8| 0: [Parameter] a0 +# 8| 5: [BlockStmt] { ... } +# 8| 0: [ReturnStmt] return ... +# 8| 0: [MethodCall] f(...) +# 8| -1: [VarAccess] this. +# 8| -1: [ThisAccess] this +# 8| 0: [VarAccess] a0 +# 8| -3: [TypeAccess] Function1 +# 8| 0: [TypeAccess] String +# 8| 1: [TypeAccess] Unit +# 8| 0: [VarAccess] a +# 9| 1: [ExprStmt] ; +# 9| 0: [MethodCall] invoke(...) +# 9| -1: [VarAccess] toCall +# 9| 0: [VarAccess] s +# 3| 2: [Class] A +# 3| 1: [Constructor] A +# 3| 5: [BlockStmt] { ... } +# 3| 0: [SuperConstructorInvocationStmt] super(...) +# 3| 1: [BlockStmt] { ... } +# 4| 2: [Method] f +# 4| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 4| 0: [Parameter] s +# 4| 0: [TypeAccess] String +# 4| 5: [BlockStmt] { ... } +localFunctionCalls.kt: +# 0| [CompilationUnit] localFunctionCalls +# 0| 1: [Class] LocalFunctionCallsKt +# 3| 1: [Method] x +# 3| 3: [TypeAccess] Unit +# 3| 5: [BlockStmt] { ... } +# 4| 0: [LocalVariableDeclStmt] var ...; +# 4| 1: [LocalVariableDeclExpr] x +# 4| 0: [IntegerLiteral] 5 +# 5| 1: [LocalTypeDeclStmt] class ... +# 5| 0: [LocalClass] +# 5| 1: [Constructor] +# 5| 5: [BlockStmt] { ... } +# 5| 0: [SuperConstructorInvocationStmt] super(...) +# 5| 2: [Method] a +#-----| 2: (Generic Parameters) +# 5| 0: [TypeVariable] T +# 5| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 5| 0: [Parameter] i +# 5| 0: [TypeAccess] int +# 5| 5: [BlockStmt] { ... } +# 5| 0: [ReturnStmt] return ... +# 5| 0: [AddExpr] ... + ... +# 5| 0: [VarAccess] i +# 5| 1: [VarAccess] x +# 6| 2: [ExprStmt] ; +# 6| 0: [AssignExpr] ...=... +# 6| 0: [VarAccess] x +# 6| 1: [IntegerLiteral] 6 +# 7| 3: [ExprStmt] ; +# 7| 0: [ImplicitCoercionToUnitExpr] +# 7| 0: [TypeAccess] Unit +# 7| 1: [MethodCall] a(...) +# 7| -2: [TypeAccess] String +# 7| -1: [ClassInstanceExpr] new (...) +# 7| -3: [TypeAccess] Object +# 7| 0: [IntegerLiteral] 42 +# 8| 4: [ExprStmt] ; +# 8| 0: [AssignExpr] ...=... +# 8| 0: [VarAccess] x +# 8| 1: [IntegerLiteral] 7 +# 9| 5: [LocalTypeDeclStmt] class ... +# 9| 0: [LocalClass] +# 9| 1: [Constructor] +# 9| 5: [BlockStmt] { ... } +# 9| 0: [SuperConstructorInvocationStmt] super(...) +# 9| 2: [ExtensionMethod] f1 +#-----| 2: (Generic Parameters) +# 9| 0: [TypeVariable] T1 +# 9| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 9| 0: [Parameter] +# 9| 0: [TypeAccess] C1 +# 9| 0: [TypeAccess] T1 +# 9| 1: [Parameter] i +# 9| 0: [TypeAccess] int +# 9| 5: [BlockStmt] { ... } +# 9| 0: [ReturnStmt] return ... +# 9| 0: [IntegerLiteral] 5 +# 10| 6: [ExprStmt] ; +# 10| 0: [ImplicitCoercionToUnitExpr] +# 10| 0: [TypeAccess] Unit +# 10| 1: [MethodCall] f1(...) +# 10| -2: [TypeAccess] Integer +# 10| -1: [ClassInstanceExpr] new (...) +# 10| -3: [TypeAccess] Object +# 10| 0: [ClassInstanceExpr] new C1(...) +# 10| -3: [TypeAccess] C1 +# 10| 0: [TypeAccess] Integer +# 10| 1: [IntegerLiteral] 42 +# 11| 7: [ExprStmt] ; +# 11| 0: [ImplicitCoercionToUnitExpr] +# 11| 0: [TypeAccess] Unit +# 11| 1: [MethodCall] f1(...) +# 11| -2: [TypeAccess] Integer +# 11| -1: [ClassInstanceExpr] new (...) +# 11| -3: [TypeAccess] Object +# 11| 0: [ClassInstanceExpr] new C1(...) +# 11| -3: [TypeAccess] C1 +# 11| 0: [TypeAccess] Integer +# 11| 1: [IntegerLiteral] 42 +# 14| 2: [Class,GenericType,ParameterizedType] C1 +#-----| -2: (Generic Parameters) +# 14| 0: [TypeVariable] T +# 14| 1: [Constructor] C1 +# 14| 5: [BlockStmt] { ... } +# 14| 0: [SuperConstructorInvocationStmt] super(...) +# 14| 1: [BlockStmt] { ... } +samConversion.kt: +# 0| [CompilationUnit] samConversion +# 0| 1: [Class] SamConversionKt +# 1| 1: [Method] main +# 1| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 1| 0: [Parameter] b +# 1| 0: [TypeAccess] boolean +# 1| 5: [BlockStmt] { ... } +# 2| 0: [LocalVariableDeclStmt] var ...; +# 2| 1: [LocalVariableDeclExpr] isEven +# 2| 0: [CastExpr] (...)... +# 2| 0: [TypeAccess] IntPredicate +# 2| 1: [ClassInstanceExpr] new (...) +# 2| -4: [AnonymousClass] new IntPredicate(...) { ... } +# 2| 1: [Constructor] +#-----| 4: (Parameters) +# 2| 0: [Parameter] +# 2| 5: [BlockStmt] { ... } +# 2| 0: [SuperConstructorInvocationStmt] super(...) +# 2| 1: [ExprStmt] ; +# 2| 0: [AssignExpr] ...=... +# 2| 0: [VarAccess] this. +# 2| -1: [ThisAccess] this +# 2| 1: [VarAccess] +# 2| 2: [FieldDeclaration] Function1 ; +# 2| -1: [TypeAccess] Function1 +# 2| 0: [TypeAccess] Integer +# 2| 1: [TypeAccess] Boolean +# 2| 3: [Method] accept +# 2| 3: [TypeAccess] boolean +#-----| 4: (Parameters) +# 2| 0: [Parameter] i +# 2| 0: [TypeAccess] int +# 2| 5: [BlockStmt] { ... } +# 2| 0: [ReturnStmt] return ... +# 2| 0: [MethodCall] invoke(...) +# 2| -1: [VarAccess] +# 2| 0: [VarAccess] i +# 2| -3: [TypeAccess] IntPredicate +# 2| 0: [LambdaExpr] ...->... +# 2| -4: [AnonymousClass] new Function1(...) { ... } +# 2| 1: [Constructor] +# 2| 5: [BlockStmt] { ... } +# 2| 0: [SuperConstructorInvocationStmt] super(...) +# 2| 2: [Method] invoke +# 2| 3: [TypeAccess] boolean +#-----| 4: (Parameters) +# 2| 0: [Parameter] it +# 2| 0: [TypeAccess] int +# 2| 5: [BlockStmt] { ... } +# 2| 0: [ReturnStmt] return ... +# 2| 0: [ValueEQExpr] ... (value equals) ... +# 2| 0: [RemExpr] ... % ... +# 2| 0: [VarAccess] it +# 2| 1: [IntegerLiteral] 2 +# 2| 1: [IntegerLiteral] 0 +# 2| -3: [TypeAccess] Function1 +# 2| 0: [TypeAccess] Integer +# 2| 1: [TypeAccess] Boolean +# 4| 1: [LocalVariableDeclStmt] var ...; +# 4| 1: [LocalVariableDeclExpr] i0 +# 4| 0: [CastExpr] (...)... +# 4| 0: [TypeAccess] InterfaceFn1 +# 4| 1: [ClassInstanceExpr] new (...) +# 4| -4: [AnonymousClass] new InterfaceFn1(...) { ... } +# 4| 1: [Constructor] +#-----| 4: (Parameters) +# 4| 0: [Parameter] +# 4| 5: [BlockStmt] { ... } +# 4| 0: [SuperConstructorInvocationStmt] super(...) +# 4| 1: [ExprStmt] ; +# 4| 0: [AssignExpr] ...=... +# 4| 0: [VarAccess] this. +# 4| -1: [ThisAccess] this +# 4| 1: [VarAccess] +# 4| 2: [FieldDeclaration] Function2 ; +# 4| -1: [TypeAccess] Function2 +# 4| 0: [TypeAccess] Integer +# 4| 1: [TypeAccess] Integer +# 4| 2: [TypeAccess] Unit +# 4| 3: [Method] fn1 +# 4| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 4| 0: [Parameter] i +# 4| 0: [TypeAccess] int +# 4| 1: [Parameter] j +# 4| 0: [TypeAccess] int +# 4| 5: [BlockStmt] { ... } +# 4| 0: [ReturnStmt] return ... +# 4| 0: [MethodCall] invoke(...) +# 4| -1: [VarAccess] +# 4| 0: [VarAccess] i +# 4| 1: [VarAccess] j +# 4| -3: [TypeAccess] InterfaceFn1 +# 4| 0: [LambdaExpr] ...->... +# 4| -4: [AnonymousClass] new Function2(...) { ... } +# 4| 1: [Constructor] +# 4| 5: [BlockStmt] { ... } +# 4| 0: [SuperConstructorInvocationStmt] super(...) +# 4| 2: [Method] invoke +# 4| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 4| 0: [Parameter] a +# 4| 0: [TypeAccess] int +# 4| 1: [Parameter] b +# 4| 0: [TypeAccess] int +# 4| 5: [BlockStmt] { ... } +# 4| 0: [ExprStmt] ; +# 4| 0: [VarAccess] INSTANCE +# 4| -3: [TypeAccess] Function2 +# 4| 0: [TypeAccess] Integer +# 4| 1: [TypeAccess] Integer +# 4| 2: [TypeAccess] Unit +# 5| 2: [LocalVariableDeclStmt] var ...; +# 5| 1: [LocalVariableDeclExpr] i1 +# 5| 0: [CastExpr] (...)... +# 5| 0: [TypeAccess] InterfaceFn1 +# 5| 1: [ClassInstanceExpr] new (...) +# 5| -4: [AnonymousClass] new InterfaceFn1(...) { ... } +# 5| 1: [Constructor] +#-----| 4: (Parameters) +# 5| 0: [Parameter] +# 5| 5: [BlockStmt] { ... } +# 5| 0: [SuperConstructorInvocationStmt] super(...) +# 5| 1: [ExprStmt] ; +# 5| 0: [AssignExpr] ...=... +# 5| 0: [VarAccess] this. +# 5| -1: [ThisAccess] this +# 5| 1: [VarAccess] +# 5| 2: [FieldDeclaration] Function2 ; +# 5| -1: [TypeAccess] Function2 +# 5| 0: [TypeAccess] Integer +# 5| 1: [TypeAccess] Integer +# 5| 2: [TypeAccess] Unit +# 5| 3: [Method] fn1 +# 5| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 5| 0: [Parameter] i +# 5| 0: [TypeAccess] int +# 5| 1: [Parameter] j +# 5| 0: [TypeAccess] int +# 5| 5: [BlockStmt] { ... } +# 5| 0: [ReturnStmt] return ... +# 5| 0: [MethodCall] invoke(...) +# 5| -1: [VarAccess] +# 5| 0: [VarAccess] i +# 5| 1: [VarAccess] j +# 5| -3: [TypeAccess] InterfaceFn1 +# 5| 0: [MemberRefExpr] ...::... +# 5| -4: [AnonymousClass] new Function2(...) { ... } +# 5| 1: [Constructor] +# 5| 5: [BlockStmt] { ... } +# 5| 0: [SuperConstructorInvocationStmt] super(...) +# 5| 0: [IntegerLiteral] 2 +# 5| 2: [Method] invoke +#-----| 4: (Parameters) +# 5| 0: [Parameter] a0 +# 5| 1: [Parameter] a1 +# 5| 5: [BlockStmt] { ... } +# 5| 0: [ReturnStmt] return ... +# 5| 0: [MethodCall] fn2(...) +# 5| -1: [TypeAccess] SamConversionKt +# 5| 0: [VarAccess] a0 +# 5| 1: [VarAccess] a1 +# 5| -3: [TypeAccess] Function2 +# 5| 0: [TypeAccess] Integer +# 5| 1: [TypeAccess] Integer +# 5| 2: [TypeAccess] Unit +# 7| 3: [LocalVariableDeclStmt] var ...; +# 7| 1: [LocalVariableDeclExpr] i +# 7| 0: [CastExpr] (...)... +# 7| 0: [TypeAccess] InterfaceFnExt1 +# 7| 1: [ClassInstanceExpr] new (...) +# 7| -4: [AnonymousClass] new InterfaceFnExt1(...) { ... } +# 7| 1: [Constructor] +#-----| 4: (Parameters) +# 7| 0: [Parameter] +# 7| 5: [BlockStmt] { ... } +# 7| 0: [SuperConstructorInvocationStmt] super(...) +# 7| 1: [ExprStmt] ; +# 7| 0: [AssignExpr] ...=... +# 7| 0: [VarAccess] this. +# 7| -1: [ThisAccess] this +# 7| 1: [VarAccess] +# 7| 2: [FieldDeclaration] Function2 ; +# 7| -1: [TypeAccess] Function2 +# 7| 0: [TypeAccess] String +# 7| 1: [TypeAccess] Integer +# 7| 2: [TypeAccess] Boolean +# 7| 3: [ExtensionMethod] ext +# 7| 3: [TypeAccess] boolean +#-----| 4: (Parameters) +# 7| 0: [Parameter] +# 7| 0: [TypeAccess] String +# 7| 1: [Parameter] i +# 7| 0: [TypeAccess] int +# 7| 5: [BlockStmt] { ... } +# 7| 0: [ReturnStmt] return ... +# 7| 0: [MethodCall] invoke(...) +# 7| -1: [VarAccess] +# 7| 0: [ExtensionReceiverAccess] this +# 7| 1: [VarAccess] i +# 7| -3: [TypeAccess] InterfaceFnExt1 +# 7| 0: [LambdaExpr] ...->... +# 7| -4: [AnonymousClass] new Function2(...) { ... } +# 7| 1: [Constructor] +# 7| 5: [BlockStmt] { ... } +# 7| 0: [SuperConstructorInvocationStmt] super(...) +# 7| 2: [ExtensionMethod] invoke +# 7| 3: [TypeAccess] boolean +#-----| 4: (Parameters) +# 7| 0: [Parameter] $this$InterfaceFnExt1 +# 7| 0: [TypeAccess] String +# 7| 1: [Parameter] i +# 7| 0: [TypeAccess] int +# 7| 5: [BlockStmt] { ... } +# 7| 0: [ReturnStmt] return ... +# 7| 0: [ValueEQExpr] ... (value equals) ... +# 7| 0: [ExtensionReceiverAccess] this +# 7| 1: [StringLiteral] "" +# 7| -3: [TypeAccess] Function2 +# 7| 0: [TypeAccess] String +# 7| 1: [TypeAccess] Integer +# 7| 2: [TypeAccess] Boolean +# 9| 4: [LocalVariableDeclStmt] var ...; +# 9| 1: [LocalVariableDeclExpr] x +# 9| 0: [CastExpr] (...)... +# 9| 0: [TypeAccess] IntPredicate +# 9| 1: [ClassInstanceExpr] new (...) +# 9| -4: [AnonymousClass] new IntPredicate(...) { ... } +# 9| 1: [Constructor] +#-----| 4: (Parameters) +# 9| 0: [Parameter] +# 9| 5: [BlockStmt] { ... } +# 9| 0: [SuperConstructorInvocationStmt] super(...) +# 9| 1: [ExprStmt] ; +# 9| 0: [AssignExpr] ...=... +# 9| 0: [VarAccess] this. +# 9| -1: [ThisAccess] this +# 9| 1: [VarAccess] +# 9| 2: [FieldDeclaration] Function1 ; +# 9| -1: [TypeAccess] Function1 +# 9| 0: [TypeAccess] Integer +# 9| 1: [TypeAccess] Boolean +# 9| 3: [Method] accept +# 9| 3: [TypeAccess] boolean +#-----| 4: (Parameters) +# 9| 0: [Parameter] i +# 9| 0: [TypeAccess] int +# 9| 5: [BlockStmt] { ... } +# 9| 0: [ReturnStmt] return ... +# 9| 0: [MethodCall] invoke(...) +# 9| -1: [VarAccess] +# 9| 0: [VarAccess] i +# 9| -3: [TypeAccess] IntPredicate +# 9| 0: [WhenExpr] when ... +# 9| 0: [WhenBranch] ... -> ... +# 9| 0: [VarAccess] b +# 9| 1: [ExprStmt] ; +# 9| 0: [LambdaExpr] ...->... +# 9| -4: [AnonymousClass] new Function1(...) { ... } +# 9| 1: [Constructor] +# 9| 5: [BlockStmt] { ... } +# 9| 0: [SuperConstructorInvocationStmt] super(...) +# 9| 2: [Method] invoke +# 9| 3: [TypeAccess] boolean +#-----| 4: (Parameters) +# 10| 0: [Parameter] j +# 10| 0: [TypeAccess] int +# 10| 5: [BlockStmt] { ... } +# 10| 0: [ReturnStmt] return ... +# 10| 0: [ValueEQExpr] ... (value equals) ... +# 10| 0: [RemExpr] ... % ... +# 10| 0: [VarAccess] j +# 10| 1: [IntegerLiteral] 2 +# 10| 1: [IntegerLiteral] 0 +# 9| -3: [TypeAccess] Function1 +# 9| 0: [TypeAccess] Integer +# 9| 1: [TypeAccess] Boolean +# 9| 1: [WhenBranch] ... -> ... +# 9| 0: [BooleanLiteral] true +# 11| 1: [ExprStmt] ; +# 11| 0: [LambdaExpr] ...->... +# 11| -4: [AnonymousClass] new Function1(...) { ... } +# 11| 1: [Constructor] +# 11| 5: [BlockStmt] { ... } +# 11| 0: [SuperConstructorInvocationStmt] super(...) +# 11| 2: [Method] invoke +# 11| 3: [TypeAccess] boolean +#-----| 4: (Parameters) +# 12| 0: [Parameter] j +# 12| 0: [TypeAccess] int +# 12| 5: [BlockStmt] { ... } +# 12| 0: [ReturnStmt] return ... +# 12| 0: [ValueEQExpr] ... (value equals) ... +# 12| 0: [RemExpr] ... % ... +# 12| 0: [VarAccess] j +# 12| 1: [IntegerLiteral] 2 +# 12| 1: [IntegerLiteral] 1 +# 11| -3: [TypeAccess] Function1 +# 11| 0: [TypeAccess] Integer +# 11| 1: [TypeAccess] Boolean +# 20| 2: [Method] fn2 +# 20| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 20| 0: [Parameter] i +# 20| 0: [TypeAccess] int +# 20| 1: [Parameter] j +# 20| 0: [TypeAccess] int +# 20| 5: [BlockStmt] { ... } +# 36| 3: [Method] ff +# 36| 3: [TypeAccess] boolean +#-----| 4: (Parameters) +# 36| 0: [Parameter] i0 +# 36| 0: [TypeAccess] int +# 36| 1: [Parameter] i1 +# 36| 0: [TypeAccess] int +# 36| 2: [Parameter] i2 +# 36| 0: [TypeAccess] int +# 36| 3: [Parameter] i3 +# 36| 0: [TypeAccess] int +# 36| 4: [Parameter] i4 +# 36| 0: [TypeAccess] int +# 36| 5: [Parameter] i5 +# 36| 0: [TypeAccess] int +# 36| 6: [Parameter] i6 +# 36| 0: [TypeAccess] int +# 36| 7: [Parameter] i7 +# 36| 0: [TypeAccess] int +# 36| 8: [Parameter] i8 +# 36| 0: [TypeAccess] int +# 36| 9: [Parameter] i9 +# 36| 0: [TypeAccess] int +# 37| 10: [Parameter] i10 +# 37| 0: [TypeAccess] int +# 37| 11: [Parameter] i11 +# 37| 0: [TypeAccess] int +# 37| 12: [Parameter] i12 +# 37| 0: [TypeAccess] int +# 37| 13: [Parameter] i13 +# 37| 0: [TypeAccess] int +# 37| 14: [Parameter] i14 +# 37| 0: [TypeAccess] int +# 37| 15: [Parameter] i15 +# 37| 0: [TypeAccess] int +# 37| 16: [Parameter] i16 +# 37| 0: [TypeAccess] int +# 37| 17: [Parameter] i17 +# 37| 0: [TypeAccess] int +# 37| 18: [Parameter] i18 +# 37| 0: [TypeAccess] int +# 37| 19: [Parameter] i19 +# 37| 0: [TypeAccess] int +# 38| 20: [Parameter] i20 +# 38| 0: [TypeAccess] int +# 38| 21: [Parameter] i21 +# 38| 0: [TypeAccess] int +# 38| 22: [Parameter] i22 +# 38| 0: [TypeAccess] int +# 38| 5: [BlockStmt] { ... } +# 38| 0: [ReturnStmt] return ... +# 38| 0: [BooleanLiteral] true +# 40| 4: [Method] fn +# 40| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 40| 0: [Parameter] boo +# 40| 0: [TypeAccess] boolean +# 40| 5: [BlockStmt] { ... } +# 41| 0: [LocalVariableDeclStmt] var ...; +# 41| 1: [LocalVariableDeclExpr] a +# 41| 0: [MemberRefExpr] ...::... +# 41| -4: [AnonymousClass] new FunctionN(...) { ... } +# 41| 1: [Constructor] +# 41| 5: [BlockStmt] { ... } +# 41| 0: [SuperConstructorInvocationStmt] super(...) +# 41| 0: [IntegerLiteral] 23 +# 41| 2: [Method] invoke +#-----| 4: (Parameters) +# 41| 0: [Parameter] a0 +# 41| 5: [BlockStmt] { ... } +# 41| 0: [ReturnStmt] return ... +# 41| 0: [MethodCall] ff(...) +# 41| -1: [TypeAccess] SamConversionKt +# 41| 0: [CastExpr] (...)... +# 41| 0: [TypeAccess] int +# 41| 1: [ArrayAccess] ...[...] +# 41| 0: [VarAccess] a0 +# 41| 1: [IntegerLiteral] 0 +# 41| 1: [CastExpr] (...)... +# 41| 0: [TypeAccess] int +# 41| 1: [ArrayAccess] ...[...] +# 41| 0: [VarAccess] a0 +# 41| 1: [IntegerLiteral] 1 +# 41| 2: [CastExpr] (...)... +# 41| 0: [TypeAccess] int +# 41| 1: [ArrayAccess] ...[...] +# 41| 0: [VarAccess] a0 +# 41| 1: [IntegerLiteral] 2 +# 41| 3: [CastExpr] (...)... +# 41| 0: [TypeAccess] int +# 41| 1: [ArrayAccess] ...[...] +# 41| 0: [VarAccess] a0 +# 41| 1: [IntegerLiteral] 3 +# 41| 4: [CastExpr] (...)... +# 41| 0: [TypeAccess] int +# 41| 1: [ArrayAccess] ...[...] +# 41| 0: [VarAccess] a0 +# 41| 1: [IntegerLiteral] 4 +# 41| 5: [CastExpr] (...)... +# 41| 0: [TypeAccess] int +# 41| 1: [ArrayAccess] ...[...] +# 41| 0: [VarAccess] a0 +# 41| 1: [IntegerLiteral] 5 +# 41| 6: [CastExpr] (...)... +# 41| 0: [TypeAccess] int +# 41| 1: [ArrayAccess] ...[...] +# 41| 0: [VarAccess] a0 +# 41| 1: [IntegerLiteral] 6 +# 41| 7: [CastExpr] (...)... +# 41| 0: [TypeAccess] int +# 41| 1: [ArrayAccess] ...[...] +# 41| 0: [VarAccess] a0 +# 41| 1: [IntegerLiteral] 7 +# 41| 8: [CastExpr] (...)... +# 41| 0: [TypeAccess] int +# 41| 1: [ArrayAccess] ...[...] +# 41| 0: [VarAccess] a0 +# 41| 1: [IntegerLiteral] 8 +# 41| 9: [CastExpr] (...)... +# 41| 0: [TypeAccess] int +# 41| 1: [ArrayAccess] ...[...] +# 41| 0: [VarAccess] a0 +# 41| 1: [IntegerLiteral] 9 +# 41| 10: [CastExpr] (...)... +# 41| 0: [TypeAccess] int +# 41| 1: [ArrayAccess] ...[...] +# 41| 0: [VarAccess] a0 +# 41| 1: [IntegerLiteral] 10 +# 41| 11: [CastExpr] (...)... +# 41| 0: [TypeAccess] int +# 41| 1: [ArrayAccess] ...[...] +# 41| 0: [VarAccess] a0 +# 41| 1: [IntegerLiteral] 11 +# 41| 12: [CastExpr] (...)... +# 41| 0: [TypeAccess] int +# 41| 1: [ArrayAccess] ...[...] +# 41| 0: [VarAccess] a0 +# 41| 1: [IntegerLiteral] 12 +# 41| 13: [CastExpr] (...)... +# 41| 0: [TypeAccess] int +# 41| 1: [ArrayAccess] ...[...] +# 41| 0: [VarAccess] a0 +# 41| 1: [IntegerLiteral] 13 +# 41| 14: [CastExpr] (...)... +# 41| 0: [TypeAccess] int +# 41| 1: [ArrayAccess] ...[...] +# 41| 0: [VarAccess] a0 +# 41| 1: [IntegerLiteral] 14 +# 41| 15: [CastExpr] (...)... +# 41| 0: [TypeAccess] int +# 41| 1: [ArrayAccess] ...[...] +# 41| 0: [VarAccess] a0 +# 41| 1: [IntegerLiteral] 15 +# 41| 16: [CastExpr] (...)... +# 41| 0: [TypeAccess] int +# 41| 1: [ArrayAccess] ...[...] +# 41| 0: [VarAccess] a0 +# 41| 1: [IntegerLiteral] 16 +# 41| 17: [CastExpr] (...)... +# 41| 0: [TypeAccess] int +# 41| 1: [ArrayAccess] ...[...] +# 41| 0: [VarAccess] a0 +# 41| 1: [IntegerLiteral] 17 +# 41| 18: [CastExpr] (...)... +# 41| 0: [TypeAccess] int +# 41| 1: [ArrayAccess] ...[...] +# 41| 0: [VarAccess] a0 +# 41| 1: [IntegerLiteral] 18 +# 41| 19: [CastExpr] (...)... +# 41| 0: [TypeAccess] int +# 41| 1: [ArrayAccess] ...[...] +# 41| 0: [VarAccess] a0 +# 41| 1: [IntegerLiteral] 19 +# 41| 20: [CastExpr] (...)... +# 41| 0: [TypeAccess] int +# 41| 1: [ArrayAccess] ...[...] +# 41| 0: [VarAccess] a0 +# 41| 1: [IntegerLiteral] 20 +# 41| 21: [CastExpr] (...)... +# 41| 0: [TypeAccess] int +# 41| 1: [ArrayAccess] ...[...] +# 41| 0: [VarAccess] a0 +# 41| 1: [IntegerLiteral] 21 +# 41| 22: [CastExpr] (...)... +# 41| 0: [TypeAccess] int +# 41| 1: [ArrayAccess] ...[...] +# 41| 0: [VarAccess] a0 +# 41| 1: [IntegerLiteral] 22 +# 41| -3: [TypeAccess] FunctionN +# 41| 0: [TypeAccess] Boolean +# 42| 1: [LocalVariableDeclStmt] var ...; +# 42| 1: [LocalVariableDeclExpr] b +# 42| 0: [CastExpr] (...)... +# 42| 0: [TypeAccess] BigArityPredicate +# 42| 1: [ClassInstanceExpr] new (...) +# 42| -4: [AnonymousClass] new BigArityPredicate(...) { ... } +# 42| 1: [Constructor] +#-----| 4: (Parameters) +# 42| 0: [Parameter] +# 42| 5: [BlockStmt] { ... } +# 42| 0: [SuperConstructorInvocationStmt] super(...) +# 42| 1: [ExprStmt] ; +# 42| 0: [AssignExpr] ...=... +# 42| 0: [VarAccess] this. +# 42| -1: [ThisAccess] this +# 42| 1: [VarAccess] +# 42| 2: [FieldDeclaration] FunctionN ; +# 42| -1: [TypeAccess] FunctionN +# 42| 0: [TypeAccess] Boolean +# 42| 3: [Method] accept +# 42| 3: [TypeAccess] boolean +#-----| 4: (Parameters) +# 42| 0: [Parameter] i0 +# 42| 0: [TypeAccess] int +# 42| 1: [Parameter] i1 +# 42| 0: [TypeAccess] int +# 42| 2: [Parameter] i2 +# 42| 0: [TypeAccess] int +# 42| 3: [Parameter] i3 +# 42| 0: [TypeAccess] int +# 42| 4: [Parameter] i4 +# 42| 0: [TypeAccess] int +# 42| 5: [Parameter] i5 +# 42| 0: [TypeAccess] int +# 42| 6: [Parameter] i6 +# 42| 0: [TypeAccess] int +# 42| 7: [Parameter] i7 +# 42| 0: [TypeAccess] int +# 42| 8: [Parameter] i8 +# 42| 0: [TypeAccess] int +# 42| 9: [Parameter] i9 +# 42| 0: [TypeAccess] int +# 42| 10: [Parameter] i10 +# 42| 0: [TypeAccess] int +# 42| 11: [Parameter] i11 +# 42| 0: [TypeAccess] int +# 42| 12: [Parameter] i12 +# 42| 0: [TypeAccess] int +# 42| 13: [Parameter] i13 +# 42| 0: [TypeAccess] int +# 42| 14: [Parameter] i14 +# 42| 0: [TypeAccess] int +# 42| 15: [Parameter] i15 +# 42| 0: [TypeAccess] int +# 42| 16: [Parameter] i16 +# 42| 0: [TypeAccess] int +# 42| 17: [Parameter] i17 +# 42| 0: [TypeAccess] int +# 42| 18: [Parameter] i18 +# 42| 0: [TypeAccess] int +# 42| 19: [Parameter] i19 +# 42| 0: [TypeAccess] int +# 42| 20: [Parameter] i20 +# 42| 0: [TypeAccess] int +# 42| 21: [Parameter] i21 +# 42| 0: [TypeAccess] int +# 42| 22: [Parameter] i22 +# 42| 0: [TypeAccess] int +# 42| 5: [BlockStmt] { ... } +# 42| 0: [ReturnStmt] return ... +# 42| 0: [MethodCall] invoke(...) +# 42| -1: [VarAccess] +# 42| 0: [ArrayCreationExpr] new Object[] +# 42| -2: [ArrayInit] {...} +# 42| 0: [VarAccess] i0 +# 42| 1: [VarAccess] i1 +# 42| 2: [VarAccess] i2 +# 42| 3: [VarAccess] i3 +# 42| 4: [VarAccess] i4 +# 42| 5: [VarAccess] i5 +# 42| 6: [VarAccess] i6 +# 42| 7: [VarAccess] i7 +# 42| 8: [VarAccess] i8 +# 42| 9: [VarAccess] i9 +# 42| 10: [VarAccess] i10 +# 42| 11: [VarAccess] i11 +# 42| 12: [VarAccess] i12 +# 42| 13: [VarAccess] i13 +# 42| 14: [VarAccess] i14 +# 42| 15: [VarAccess] i15 +# 42| 16: [VarAccess] i16 +# 42| 17: [VarAccess] i17 +# 42| 18: [VarAccess] i18 +# 42| 19: [VarAccess] i19 +# 42| 20: [VarAccess] i20 +# 42| 21: [VarAccess] i21 +# 42| 22: [VarAccess] i22 +# 42| -1: [TypeAccess] Object +# 42| 0: [IntegerLiteral] 23 +# 42| -3: [TypeAccess] BigArityPredicate +# 42| 0: [VarAccess] a +# 43| 2: [LocalVariableDeclStmt] var ...; +# 43| 1: [LocalVariableDeclExpr] c +# 43| 0: [CastExpr] (...)... +# 43| 0: [TypeAccess] BigArityPredicate +# 43| 1: [ClassInstanceExpr] new (...) +# 43| -4: [AnonymousClass] new BigArityPredicate(...) { ... } +# 43| 1: [Constructor] +#-----| 4: (Parameters) +# 43| 0: [Parameter] +# 43| 5: [BlockStmt] { ... } +# 43| 0: [SuperConstructorInvocationStmt] super(...) +# 43| 1: [ExprStmt] ; +# 43| 0: [AssignExpr] ...=... +# 43| 0: [VarAccess] this. +# 43| -1: [ThisAccess] this +# 43| 1: [VarAccess] +# 43| 2: [FieldDeclaration] FunctionN ; +# 43| -1: [TypeAccess] FunctionN +# 43| 0: [TypeAccess] Boolean +# 43| 3: [Method] accept +# 43| 3: [TypeAccess] boolean +#-----| 4: (Parameters) +# 43| 0: [Parameter] i0 +# 43| 0: [TypeAccess] int +# 43| 1: [Parameter] i1 +# 43| 0: [TypeAccess] int +# 43| 2: [Parameter] i2 +# 43| 0: [TypeAccess] int +# 43| 3: [Parameter] i3 +# 43| 0: [TypeAccess] int +# 43| 4: [Parameter] i4 +# 43| 0: [TypeAccess] int +# 43| 5: [Parameter] i5 +# 43| 0: [TypeAccess] int +# 43| 6: [Parameter] i6 +# 43| 0: [TypeAccess] int +# 43| 7: [Parameter] i7 +# 43| 0: [TypeAccess] int +# 43| 8: [Parameter] i8 +# 43| 0: [TypeAccess] int +# 43| 9: [Parameter] i9 +# 43| 0: [TypeAccess] int +# 43| 10: [Parameter] i10 +# 43| 0: [TypeAccess] int +# 43| 11: [Parameter] i11 +# 43| 0: [TypeAccess] int +# 43| 12: [Parameter] i12 +# 43| 0: [TypeAccess] int +# 43| 13: [Parameter] i13 +# 43| 0: [TypeAccess] int +# 43| 14: [Parameter] i14 +# 43| 0: [TypeAccess] int +# 43| 15: [Parameter] i15 +# 43| 0: [TypeAccess] int +# 43| 16: [Parameter] i16 +# 43| 0: [TypeAccess] int +# 43| 17: [Parameter] i17 +# 43| 0: [TypeAccess] int +# 43| 18: [Parameter] i18 +# 43| 0: [TypeAccess] int +# 43| 19: [Parameter] i19 +# 43| 0: [TypeAccess] int +# 43| 20: [Parameter] i20 +# 43| 0: [TypeAccess] int +# 43| 21: [Parameter] i21 +# 43| 0: [TypeAccess] int +# 43| 22: [Parameter] i22 +# 43| 0: [TypeAccess] int +# 43| 5: [BlockStmt] { ... } +# 43| 0: [ReturnStmt] return ... +# 43| 0: [MethodCall] invoke(...) +# 43| -1: [VarAccess] +# 43| 0: [ArrayCreationExpr] new Object[] +# 43| -2: [ArrayInit] {...} +# 43| 0: [VarAccess] i0 +# 43| 1: [VarAccess] i1 +# 43| 2: [VarAccess] i2 +# 43| 3: [VarAccess] i3 +# 43| 4: [VarAccess] i4 +# 43| 5: [VarAccess] i5 +# 43| 6: [VarAccess] i6 +# 43| 7: [VarAccess] i7 +# 43| 8: [VarAccess] i8 +# 43| 9: [VarAccess] i9 +# 43| 10: [VarAccess] i10 +# 43| 11: [VarAccess] i11 +# 43| 12: [VarAccess] i12 +# 43| 13: [VarAccess] i13 +# 43| 14: [VarAccess] i14 +# 43| 15: [VarAccess] i15 +# 43| 16: [VarAccess] i16 +# 43| 17: [VarAccess] i17 +# 43| 18: [VarAccess] i18 +# 43| 19: [VarAccess] i19 +# 43| 20: [VarAccess] i20 +# 43| 21: [VarAccess] i21 +# 43| 22: [VarAccess] i22 +# 43| -1: [TypeAccess] Object +# 43| 0: [IntegerLiteral] 23 +# 43| -3: [TypeAccess] BigArityPredicate +# 43| 0: [LambdaExpr] ...->... +# 43| -4: [AnonymousClass] new FunctionN(...) { ... } +# 43| 1: [Constructor] +# 43| 5: [BlockStmt] { ... } +# 43| 0: [SuperConstructorInvocationStmt] super(...) +# 43| 2: [Method] invoke +#-----| 4: (Parameters) +# 43| 0: [Parameter] a0 +# 43| 5: [BlockStmt] { ... } +# 43| 0: [ReturnStmt] return ... +# 43| 0: [MethodCall] invoke(...) +# 43| -1: [ThisAccess] this +# 43| 0: [CastExpr] (...)... +# 43| 0: [TypeAccess] int +# 43| 1: [ArrayAccess] ...[...] +# 43| 0: [VarAccess] a0 +# 43| 1: [IntegerLiteral] 0 +# 43| 1: [CastExpr] (...)... +# 43| 0: [TypeAccess] int +# 43| 1: [ArrayAccess] ...[...] +# 43| 0: [VarAccess] a0 +# 43| 1: [IntegerLiteral] 1 +# 43| 2: [CastExpr] (...)... +# 43| 0: [TypeAccess] int +# 43| 1: [ArrayAccess] ...[...] +# 43| 0: [VarAccess] a0 +# 43| 1: [IntegerLiteral] 2 +# 43| 3: [CastExpr] (...)... +# 43| 0: [TypeAccess] int +# 43| 1: [ArrayAccess] ...[...] +# 43| 0: [VarAccess] a0 +# 43| 1: [IntegerLiteral] 3 +# 43| 4: [CastExpr] (...)... +# 43| 0: [TypeAccess] int +# 43| 1: [ArrayAccess] ...[...] +# 43| 0: [VarAccess] a0 +# 43| 1: [IntegerLiteral] 4 +# 43| 5: [CastExpr] (...)... +# 43| 0: [TypeAccess] int +# 43| 1: [ArrayAccess] ...[...] +# 43| 0: [VarAccess] a0 +# 43| 1: [IntegerLiteral] 5 +# 43| 6: [CastExpr] (...)... +# 43| 0: [TypeAccess] int +# 43| 1: [ArrayAccess] ...[...] +# 43| 0: [VarAccess] a0 +# 43| 1: [IntegerLiteral] 6 +# 43| 7: [CastExpr] (...)... +# 43| 0: [TypeAccess] int +# 43| 1: [ArrayAccess] ...[...] +# 43| 0: [VarAccess] a0 +# 43| 1: [IntegerLiteral] 7 +# 43| 8: [CastExpr] (...)... +# 43| 0: [TypeAccess] int +# 43| 1: [ArrayAccess] ...[...] +# 43| 0: [VarAccess] a0 +# 43| 1: [IntegerLiteral] 8 +# 43| 9: [CastExpr] (...)... +# 43| 0: [TypeAccess] int +# 43| 1: [ArrayAccess] ...[...] +# 43| 0: [VarAccess] a0 +# 43| 1: [IntegerLiteral] 9 +# 43| 10: [CastExpr] (...)... +# 43| 0: [TypeAccess] int +# 43| 1: [ArrayAccess] ...[...] +# 43| 0: [VarAccess] a0 +# 43| 1: [IntegerLiteral] 10 +# 43| 11: [CastExpr] (...)... +# 43| 0: [TypeAccess] int +# 43| 1: [ArrayAccess] ...[...] +# 43| 0: [VarAccess] a0 +# 43| 1: [IntegerLiteral] 11 +# 43| 12: [CastExpr] (...)... +# 43| 0: [TypeAccess] int +# 43| 1: [ArrayAccess] ...[...] +# 43| 0: [VarAccess] a0 +# 43| 1: [IntegerLiteral] 12 +# 43| 13: [CastExpr] (...)... +# 43| 0: [TypeAccess] int +# 43| 1: [ArrayAccess] ...[...] +# 43| 0: [VarAccess] a0 +# 43| 1: [IntegerLiteral] 13 +# 43| 14: [CastExpr] (...)... +# 43| 0: [TypeAccess] int +# 43| 1: [ArrayAccess] ...[...] +# 43| 0: [VarAccess] a0 +# 43| 1: [IntegerLiteral] 14 +# 43| 15: [CastExpr] (...)... +# 43| 0: [TypeAccess] int +# 43| 1: [ArrayAccess] ...[...] +# 43| 0: [VarAccess] a0 +# 43| 1: [IntegerLiteral] 15 +# 43| 16: [CastExpr] (...)... +# 43| 0: [TypeAccess] int +# 43| 1: [ArrayAccess] ...[...] +# 43| 0: [VarAccess] a0 +# 43| 1: [IntegerLiteral] 16 +# 43| 17: [CastExpr] (...)... +# 43| 0: [TypeAccess] int +# 43| 1: [ArrayAccess] ...[...] +# 43| 0: [VarAccess] a0 +# 43| 1: [IntegerLiteral] 17 +# 43| 18: [CastExpr] (...)... +# 43| 0: [TypeAccess] int +# 43| 1: [ArrayAccess] ...[...] +# 43| 0: [VarAccess] a0 +# 43| 1: [IntegerLiteral] 18 +# 43| 19: [CastExpr] (...)... +# 43| 0: [TypeAccess] int +# 43| 1: [ArrayAccess] ...[...] +# 43| 0: [VarAccess] a0 +# 43| 1: [IntegerLiteral] 19 +# 43| 20: [CastExpr] (...)... +# 43| 0: [TypeAccess] int +# 43| 1: [ArrayAccess] ...[...] +# 43| 0: [VarAccess] a0 +# 43| 1: [IntegerLiteral] 20 +# 43| 21: [CastExpr] (...)... +# 43| 0: [TypeAccess] int +# 43| 1: [ArrayAccess] ...[...] +# 43| 0: [VarAccess] a0 +# 43| 1: [IntegerLiteral] 21 +# 43| 22: [CastExpr] (...)... +# 43| 0: [TypeAccess] int +# 43| 1: [ArrayAccess] ...[...] +# 43| 0: [VarAccess] a0 +# 43| 1: [IntegerLiteral] 22 +# 43| 3: [Method] invoke +# 43| 3: [TypeAccess] boolean +#-----| 4: (Parameters) +# 43| 0: [Parameter] i0 +# 43| 0: [TypeAccess] int +# 43| 1: [Parameter] i1 +# 43| 0: [TypeAccess] int +# 43| 2: [Parameter] i2 +# 43| 0: [TypeAccess] int +# 43| 3: [Parameter] i3 +# 43| 0: [TypeAccess] int +# 43| 4: [Parameter] i4 +# 43| 0: [TypeAccess] int +# 43| 5: [Parameter] i5 +# 43| 0: [TypeAccess] int +# 43| 6: [Parameter] i6 +# 43| 0: [TypeAccess] int +# 43| 7: [Parameter] i7 +# 43| 0: [TypeAccess] int +# 43| 8: [Parameter] i8 +# 43| 0: [TypeAccess] int +# 43| 9: [Parameter] i9 +# 43| 0: [TypeAccess] int +# 44| 10: [Parameter] i10 +# 44| 0: [TypeAccess] int +# 44| 11: [Parameter] i11 +# 44| 0: [TypeAccess] int +# 44| 12: [Parameter] i12 +# 44| 0: [TypeAccess] int +# 44| 13: [Parameter] i13 +# 44| 0: [TypeAccess] int +# 44| 14: [Parameter] i14 +# 44| 0: [TypeAccess] int +# 44| 15: [Parameter] i15 +# 44| 0: [TypeAccess] int +# 44| 16: [Parameter] i16 +# 44| 0: [TypeAccess] int +# 44| 17: [Parameter] i17 +# 44| 0: [TypeAccess] int +# 44| 18: [Parameter] i18 +# 44| 0: [TypeAccess] int +# 44| 19: [Parameter] i19 +# 44| 0: [TypeAccess] int +# 45| 20: [Parameter] i20 +# 45| 0: [TypeAccess] int +# 45| 21: [Parameter] i21 +# 45| 0: [TypeAccess] int +# 45| 22: [Parameter] i22 +# 45| 0: [TypeAccess] int +# 45| 5: [BlockStmt] { ... } +# 45| 0: [ReturnStmt] return ... +# 45| 0: [BooleanLiteral] true +# 43| -3: [TypeAccess] FunctionN +# 43| 0: [TypeAccess] Boolean +# 46| 3: [LocalVariableDeclStmt] var ...; +# 46| 1: [LocalVariableDeclExpr] d +# 46| 0: [CastExpr] (...)... +# 46| 0: [TypeAccess] SomePredicate +# 46| 0: [TypeAccess] Integer +# 46| 1: [ClassInstanceExpr] new (...) +# 46| -4: [AnonymousClass] new SomePredicate(...) { ... } +# 46| 1: [Constructor] +#-----| 4: (Parameters) +# 46| 0: [Parameter] +# 46| 5: [BlockStmt] { ... } +# 46| 0: [SuperConstructorInvocationStmt] super(...) +# 46| 1: [ExprStmt] ; +# 46| 0: [AssignExpr] ...=... +# 46| 0: [VarAccess] this. +# 46| -1: [ThisAccess] this +# 46| 1: [VarAccess] +# 46| 2: [FieldDeclaration] Function1 ; +# 46| -1: [TypeAccess] Function1 +# 46| 0: [TypeAccess] Integer +# 46| 1: [TypeAccess] Boolean +# 46| 3: [Method] fn +# 46| 3: [TypeAccess] boolean +#-----| 4: (Parameters) +# 46| 0: [Parameter] i +# 46| 0: [TypeAccess] Integer +# 46| 5: [BlockStmt] { ... } +# 46| 0: [ReturnStmt] return ... +# 46| 0: [MethodCall] invoke(...) +# 46| -1: [VarAccess] +# 46| 0: [VarAccess] i +# 46| -3: [TypeAccess] SomePredicate +# 46| 0: [TypeAccess] Integer +# 46| 0: [LambdaExpr] ...->... +# 46| -4: [AnonymousClass] new Function1(...) { ... } +# 46| 1: [Constructor] +# 46| 5: [BlockStmt] { ... } +# 46| 0: [SuperConstructorInvocationStmt] super(...) +# 46| 2: [Method] invoke +# 46| 3: [TypeAccess] boolean +#-----| 4: (Parameters) +# 46| 0: [Parameter] a +# 46| 0: [TypeAccess] int +# 46| 5: [BlockStmt] { ... } +# 46| 0: [ReturnStmt] return ... +# 46| 0: [BooleanLiteral] true +# 46| -3: [TypeAccess] Function1 +# 46| 0: [TypeAccess] Integer +# 46| 1: [TypeAccess] Boolean +# 57| 5: [Method] test +# 57| 3: [TypeAccess] Unit +# 57| 5: [BlockStmt] { ... } +# 58| 0: [LocalVariableDeclStmt] var ...; +# 58| 1: [LocalVariableDeclExpr] i0 +# 58| 0: [CastExpr] (...)... +# 58| 0: [TypeAccess] InterfaceFn1Sus +# 58| 1: [ClassInstanceExpr] new (...) +# 58| -4: [AnonymousClass] new InterfaceFn1Sus(...) { ... } +# 58| 1: [Constructor] +#-----| 4: (Parameters) +# 58| 0: [Parameter] +# 58| 5: [BlockStmt] { ... } +# 58| 0: [SuperConstructorInvocationStmt] super(...) +# 58| 1: [ExprStmt] ; +# 58| 0: [AssignExpr] ...=... +# 58| 0: [VarAccess] this. +# 58| -1: [ThisAccess] this +# 58| 1: [VarAccess] +# 58| 2: [FieldDeclaration] Function2 ; +# 58| -1: [TypeAccess] Function2 +# 58| 0: [TypeAccess] Integer +# 58| 1: [TypeAccess] Integer +# 58| 2: [TypeAccess] Unit +# 58| 3: [Method] fn1 +# 58| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 58| 0: [Parameter] i +# 58| 0: [TypeAccess] int +# 58| 1: [Parameter] j +# 58| 0: [TypeAccess] int +# 58| 5: [BlockStmt] { ... } +# 58| 0: [ReturnStmt] return ... +# 58| 0: [MethodCall] invoke(...) +# 58| -1: [VarAccess] +# 58| 0: [VarAccess] i +# 58| 1: [VarAccess] j +# 58| -3: [TypeAccess] InterfaceFn1Sus +# 58| 0: [LambdaExpr] ...->... +# 58| -4: [AnonymousClass] new Function2(...) { ... } +# 58| 1: [Constructor] +# 58| 5: [BlockStmt] { ... } +# 58| 0: [SuperConstructorInvocationStmt] super(...) +# 58| 2: [Method] invoke +# 58| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 58| 0: [Parameter] a +# 58| 0: [TypeAccess] int +# 58| 1: [Parameter] b +# 58| 0: [TypeAccess] int +# 58| 5: [BlockStmt] { ... } +# 58| 0: [ExprStmt] ; +# 58| 0: [VarAccess] INSTANCE +# 58| -3: [TypeAccess] Function2 +# 58| 0: [TypeAccess] Integer +# 58| 1: [TypeAccess] Integer +# 58| 2: [TypeAccess] Unit +# 59| 1: [ExprStmt] ; +# 59| 0: [MethodCall] fn1(...) +# 59| -1: [VarAccess] i0 +# 59| 0: [IntegerLiteral] 1 +# 59| 1: [IntegerLiteral] 2 +# 74| 6: [Method] propertyRefsTest +# 74| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 74| 0: [Parameter] prt +# 74| 0: [TypeAccess] PropertyRefsTest +# 74| 5: [BlockStmt] { ... } +# 75| 0: [LocalVariableDeclStmt] var ...; +# 75| 1: [LocalVariableDeclExpr] test1 +# 75| 0: [CastExpr] (...)... +# 75| 0: [TypeAccess] IntGetter +# 75| 1: [ClassInstanceExpr] new (...) +# 75| -4: [AnonymousClass] new IntGetter(...) { ... } +# 75| 1: [Constructor] +#-----| 4: (Parameters) +# 75| 0: [Parameter] +# 75| 5: [BlockStmt] { ... } +# 75| 0: [SuperConstructorInvocationStmt] super(...) +# 75| 1: [ExprStmt] ; +# 75| 0: [AssignExpr] ...=... +# 75| 0: [VarAccess] this. +# 75| -1: [ThisAccess] this +# 75| 1: [VarAccess] +# 75| 2: [FieldDeclaration] Function0 ; +# 75| -1: [TypeAccess] Function0 +# 75| 0: [TypeAccess] Integer +# 75| 3: [Method] f +# 75| 3: [TypeAccess] int +# 75| 5: [BlockStmt] { ... } +# 75| 0: [ReturnStmt] return ... +# 75| 0: [MethodCall] invoke(...) +# 75| -1: [VarAccess] +# 75| -3: [TypeAccess] IntGetter +# 75| 0: [PropertyRefExpr] ...::... +# 75| -4: [AnonymousClass] new KProperty0(...) { ... } +# 75| 1: [Constructor] +#-----| 4: (Parameters) +# 75| 0: [Parameter] +# 75| 5: [BlockStmt] { ... } +# 75| 0: [SuperConstructorInvocationStmt] super(...) +# 75| 1: [ExprStmt] ; +# 75| 0: [AssignExpr] ...=... +# 75| 0: [VarAccess] this. +# 75| -1: [ThisAccess] this +# 75| 1: [VarAccess] +# 75| 2: [FieldDeclaration] PropertyRefsTest ; +# 75| -1: [TypeAccess] PropertyRefsTest +# 75| 3: [Method] get +# 75| 5: [BlockStmt] { ... } +# 75| 0: [ReturnStmt] return ... +# 75| 0: [MethodCall] getX(...) +# 75| -1: [VarAccess] this. +# 75| -1: [ThisAccess] this +# 75| 4: [Method] invoke +# 75| 5: [BlockStmt] { ... } +# 75| 0: [ReturnStmt] return ... +# 75| 0: [MethodCall] get(...) +# 75| -1: [ThisAccess] this +# 75| -3: [TypeAccess] KProperty0 +# 75| 0: [TypeAccess] Integer +# 75| 0: [VarAccess] prt +# 76| 1: [LocalVariableDeclStmt] var ...; +# 76| 1: [LocalVariableDeclExpr] test2 +# 76| 0: [CastExpr] (...)... +# 76| 0: [TypeAccess] PropertyRefsGetter +# 76| 1: [ClassInstanceExpr] new (...) +# 76| -4: [AnonymousClass] new PropertyRefsGetter(...) { ... } +# 76| 1: [Constructor] +#-----| 4: (Parameters) +# 76| 0: [Parameter] +# 76| 5: [BlockStmt] { ... } +# 76| 0: [SuperConstructorInvocationStmt] super(...) +# 76| 1: [ExprStmt] ; +# 76| 0: [AssignExpr] ...=... +# 76| 0: [VarAccess] this. +# 76| -1: [ThisAccess] this +# 76| 1: [VarAccess] +# 76| 2: [FieldDeclaration] Function1 ; +# 76| -1: [TypeAccess] Function1 +# 76| 0: [TypeAccess] PropertyRefsTest +# 76| 1: [TypeAccess] Integer +# 76| 3: [Method] f +# 76| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 76| 0: [Parameter] prt +# 76| 0: [TypeAccess] PropertyRefsTest +# 76| 5: [BlockStmt] { ... } +# 76| 0: [ReturnStmt] return ... +# 76| 0: [MethodCall] invoke(...) +# 76| -1: [VarAccess] +# 76| 0: [VarAccess] prt +# 76| -3: [TypeAccess] PropertyRefsGetter +# 76| 0: [PropertyRefExpr] ...::... +# 76| -4: [AnonymousClass] new KProperty1(...) { ... } +# 76| 1: [Constructor] +# 76| 5: [BlockStmt] { ... } +# 76| 0: [SuperConstructorInvocationStmt] super(...) +# 76| 2: [Method] get +#-----| 4: (Parameters) +# 76| 0: [Parameter] a0 +# 76| 5: [BlockStmt] { ... } +# 76| 0: [ReturnStmt] return ... +# 76| 0: [MethodCall] getX(...) +# 76| -1: [VarAccess] a0 +# 76| 3: [Method] invoke +#-----| 4: (Parameters) +# 76| 0: [Parameter] a0 +# 76| 5: [BlockStmt] { ... } +# 76| 0: [ReturnStmt] return ... +# 76| 0: [MethodCall] get(...) +# 76| -1: [ThisAccess] this +# 76| 0: [VarAccess] a0 +# 76| -3: [TypeAccess] KProperty1 +# 76| 0: [TypeAccess] PropertyRefsTest +# 76| 1: [TypeAccess] Integer +# 16| 2: [Interface] IntPredicate +# 17| 1: [Method] accept +# 17| 3: [TypeAccess] boolean +#-----| 4: (Parameters) +# 17| 0: [Parameter] i +# 17| 0: [TypeAccess] int +# 22| 3: [Interface] InterfaceFn1 +# 23| 1: [Method] fn1 +# 23| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 23| 0: [Parameter] i +# 23| 0: [TypeAccess] int +# 23| 1: [Parameter] j +# 23| 0: [TypeAccess] int +# 26| 4: [Interface] InterfaceFnExt1 +# 27| 1: [ExtensionMethod] ext +# 27| 3: [TypeAccess] boolean +#-----| 4: (Parameters) +# 27| 0: [Parameter] +# 27| 0: [TypeAccess] String +# 27| 1: [Parameter] i +# 27| 0: [TypeAccess] int +# 30| 5: [Interface] BigArityPredicate +# 31| 1: [Method] accept +# 31| 3: [TypeAccess] boolean +#-----| 4: (Parameters) +# 31| 0: [Parameter] i0 +# 31| 0: [TypeAccess] int +# 31| 1: [Parameter] i1 +# 31| 0: [TypeAccess] int +# 31| 2: [Parameter] i2 +# 31| 0: [TypeAccess] int +# 31| 3: [Parameter] i3 +# 31| 0: [TypeAccess] int +# 31| 4: [Parameter] i4 +# 31| 0: [TypeAccess] int +# 31| 5: [Parameter] i5 +# 31| 0: [TypeAccess] int +# 31| 6: [Parameter] i6 +# 31| 0: [TypeAccess] int +# 31| 7: [Parameter] i7 +# 31| 0: [TypeAccess] int +# 31| 8: [Parameter] i8 +# 31| 0: [TypeAccess] int +# 31| 9: [Parameter] i9 +# 31| 0: [TypeAccess] int +# 32| 10: [Parameter] i10 +# 32| 0: [TypeAccess] int +# 32| 11: [Parameter] i11 +# 32| 0: [TypeAccess] int +# 32| 12: [Parameter] i12 +# 32| 0: [TypeAccess] int +# 32| 13: [Parameter] i13 +# 32| 0: [TypeAccess] int +# 32| 14: [Parameter] i14 +# 32| 0: [TypeAccess] int +# 32| 15: [Parameter] i15 +# 32| 0: [TypeAccess] int +# 32| 16: [Parameter] i16 +# 32| 0: [TypeAccess] int +# 32| 17: [Parameter] i17 +# 32| 0: [TypeAccess] int +# 32| 18: [Parameter] i18 +# 32| 0: [TypeAccess] int +# 32| 19: [Parameter] i19 +# 32| 0: [TypeAccess] int +# 33| 20: [Parameter] i20 +# 33| 0: [TypeAccess] int +# 33| 21: [Parameter] i21 +# 33| 0: [TypeAccess] int +# 33| 22: [Parameter] i22 +# 33| 0: [TypeAccess] int +# 49| 6: [GenericType,Interface,ParameterizedType] SomePredicate +#-----| -2: (Generic Parameters) +# 49| 0: [TypeVariable] T +# 50| 1: [Method] fn +# 50| 3: [TypeAccess] boolean +#-----| 4: (Parameters) +# 50| 0: [Parameter] i +# 50| 0: [TypeAccess] T +# 53| 7: [Interface] InterfaceFn1Sus +# 54| 1: [Method] fn1 +# 54| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 54| 0: [Parameter] i +# 54| 0: [TypeAccess] int +# 54| 1: [Parameter] j +# 54| 0: [TypeAccess] int +# 62| 8: [Class] PropertyRefsTest +# 62| 1: [Constructor] PropertyRefsTest +# 62| 5: [BlockStmt] { ... } +# 62| 0: [SuperConstructorInvocationStmt] super(...) +# 62| 1: [BlockStmt] { ... } +# 63| 0: [ExprStmt] ; +# 63| 0: [KtInitializerAssignExpr] ...=... +# 63| 0: [VarAccess] x +# 63| 2: [Method] getX +# 63| 3: [TypeAccess] int +# 63| 5: [BlockStmt] { ... } +# 63| 0: [ReturnStmt] return ... +# 63| 0: [VarAccess] this.x +# 63| -1: [ThisAccess] this +# 63| 3: [FieldDeclaration] int x; +# 63| -1: [TypeAccess] int +# 63| 0: [IntegerLiteral] 1 +# 66| 9: [Interface] PropertyRefsGetter +# 67| 1: [Method] f +# 67| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 67| 0: [Parameter] prt +# 67| 0: [TypeAccess] PropertyRefsTest +# 70| 10: [Interface] IntGetter +# 71| 1: [Method] f +# 71| 3: [TypeAccess] int +whenExpr.kt: +# 0| [CompilationUnit] whenExpr +# 0| 1: [Class] WhenExprKt +# 1| 1: [Method] testWhen +# 1| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 1| 0: [Parameter] i +# 1| 0: [TypeAccess] int +# 1| 5: [BlockStmt] { ... } +# 2| 0: [ReturnStmt] return ... +# 2| 0: [StmtExpr] +# 2| 0: [BlockStmt] { ... } +# 2| 0: [LocalVariableDeclStmt] var ...; +# 2| 1: [LocalVariableDeclExpr] tmp0_subject +# 2| 0: [VarAccess] i +# 2| 1: [ExprStmt] ; +# 2| 0: [WhenExpr] when ... +# 3| 0: [WhenBranch] ... -> ... +# 3| 0: [ValueEQExpr] ... (value equals) ... +# 3| 0: [VarAccess] tmp0_subject +# 3| 1: [IntegerLiteral] 0 +# 3| 1: [ExprStmt] ; +# 3| 0: [IntegerLiteral] 1 +# 4| 1: [WhenBranch] ... -> ... +# 4| 0: [ValueEQExpr] ... (value equals) ... +# 4| 0: [VarAccess] tmp0_subject +# 4| 1: [IntegerLiteral] 1 +# 4| 1: [ExprStmt] ; +# 4| 0: [IntegerLiteral] 2 +# 5| 2: [WhenBranch] ... -> ... +# 5| 0: [ValueEQExpr] ... (value equals) ... +# 5| 0: [VarAccess] tmp0_subject +# 5| 1: [IntegerLiteral] 2 +# 5| 1: [ReturnStmt] return ... +# 5| 0: [IntegerLiteral] 3 +# 6| 3: [WhenBranch] ... -> ... +# 6| 0: [ValueEQExpr] ... (value equals) ... +# 6| 0: [VarAccess] tmp0_subject +# 6| 1: [IntegerLiteral] 3 +# 6| 1: [ThrowStmt] throw ... +# 6| 0: [ClassInstanceExpr] new Exception(...) +# 6| -3: [TypeAccess] Exception +# 6| 0: [StringLiteral] "No threes please" +# 7| 4: [WhenBranch] ... -> ... +# 7| 0: [BooleanLiteral] true +# 7| 1: [ExprStmt] ; +# 7| 0: [IntegerLiteral] 999 diff --git a/java/ql/test-kotlin2/library-tests/exprs/PrintAst.qlref b/java/ql/test-kotlin2/library-tests/exprs/PrintAst.qlref new file mode 100644 index 00000000000..c7fd5faf239 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/exprs/PrintAst.qlref @@ -0,0 +1 @@ +semmle/code/java/PrintAst.ql \ No newline at end of file diff --git a/java/ql/test-kotlin2/library-tests/exprs/binop.expected b/java/ql/test-kotlin2/library-tests/exprs/binop.expected new file mode 100644 index 00000000000..f69701028d5 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/exprs/binop.expected @@ -0,0 +1,138 @@ +| exprs.kt:12:14:12:18 | ... + ... | exprs.kt:12:14:12:14 | x | exprs.kt:12:18:12:18 | y | +| exprs.kt:13:14:13:18 | ... - ... | exprs.kt:13:14:13:14 | x | exprs.kt:13:18:13:18 | y | +| exprs.kt:14:14:14:18 | ... / ... | exprs.kt:14:14:14:14 | x | exprs.kt:14:18:14:18 | y | +| exprs.kt:15:14:15:18 | ... % ... | exprs.kt:15:14:15:14 | x | exprs.kt:15:18:15:18 | y | +| exprs.kt:16:14:16:20 | ... << ... | exprs.kt:16:14:16:14 | x | exprs.kt:16:20:16:20 | y | +| exprs.kt:17:14:17:20 | ... >> ... | exprs.kt:17:14:17:14 | x | exprs.kt:17:20:17:20 | y | +| exprs.kt:18:14:18:21 | ... >>> ... | exprs.kt:18:14:18:14 | x | exprs.kt:18:21:18:21 | y | +| exprs.kt:19:14:19:20 | ... & ... | exprs.kt:19:14:19:14 | x | exprs.kt:19:20:19:20 | y | +| exprs.kt:20:15:20:20 | ... \| ... | exprs.kt:20:15:20:15 | x | exprs.kt:20:20:20:20 | y | +| exprs.kt:21:15:21:21 | ... ^ ... | exprs.kt:21:15:21:15 | x | exprs.kt:21:21:21:21 | y | +| exprs.kt:23:15:23:20 | ... (value equals) ... | exprs.kt:23:15:23:15 | x | exprs.kt:23:20:23:20 | y | +| exprs.kt:24:15:24:20 | ... (value not-equals) ... | exprs.kt:24:15:24:15 | x | exprs.kt:24:20:24:20 | y | +| exprs.kt:25:15:25:19 | ... < ... | exprs.kt:25:15:25:15 | x | exprs.kt:25:19:25:19 | y | +| exprs.kt:26:15:26:20 | ... <= ... | exprs.kt:26:15:26:15 | x | exprs.kt:26:20:26:20 | y | +| exprs.kt:27:15:27:19 | ... > ... | exprs.kt:27:15:27:15 | x | exprs.kt:27:19:27:19 | y | +| exprs.kt:28:15:28:20 | ... >= ... | exprs.kt:28:15:28:15 | x | exprs.kt:28:20:28:20 | y | +| exprs.kt:29:15:29:21 | ... == ... | exprs.kt:29:15:29:15 | x | exprs.kt:29:21:29:21 | y | +| exprs.kt:30:15:30:21 | ... != ... | exprs.kt:30:15:30:15 | x | exprs.kt:30:21:30:21 | y | +| exprs.kt:35:15:35:23 | ... + ... | exprs.kt:35:15:35:17 | byx | exprs.kt:35:21:35:23 | byy | +| exprs.kt:36:15:36:23 | ... - ... | exprs.kt:36:15:36:17 | byx | exprs.kt:36:21:36:23 | byy | +| exprs.kt:37:15:37:23 | ... / ... | exprs.kt:37:15:37:17 | byx | exprs.kt:37:21:37:23 | byy | +| exprs.kt:38:15:38:23 | ... % ... | exprs.kt:38:15:38:17 | byx | exprs.kt:38:21:38:23 | byy | +| exprs.kt:39:15:39:24 | ... (value equals) ... | exprs.kt:39:15:39:17 | intValue(...) | exprs.kt:39:22:39:24 | intValue(...) | +| exprs.kt:40:15:40:24 | ... (value not-equals) ... | exprs.kt:40:15:40:17 | intValue(...) | exprs.kt:40:22:40:24 | intValue(...) | +| exprs.kt:41:15:41:23 | ... < ... | exprs.kt:41:15:41:17 | intValue(...) | exprs.kt:41:21:41:23 | intValue(...) | +| exprs.kt:42:15:42:24 | ... <= ... | exprs.kt:42:15:42:17 | intValue(...) | exprs.kt:42:22:42:24 | intValue(...) | +| exprs.kt:43:16:43:24 | ... > ... | exprs.kt:43:16:43:18 | intValue(...) | exprs.kt:43:22:43:24 | intValue(...) | +| exprs.kt:44:16:44:25 | ... >= ... | exprs.kt:44:16:44:18 | intValue(...) | exprs.kt:44:23:44:25 | intValue(...) | +| exprs.kt:45:16:45:26 | ... == ... | exprs.kt:45:16:45:18 | byx | exprs.kt:45:24:45:26 | byy | +| exprs.kt:46:16:46:26 | ... != ... | exprs.kt:46:16:46:18 | byx | exprs.kt:46:24:46:26 | byy | +| exprs.kt:47:16:47:25 | ... \| ... | exprs.kt:47:16:47:18 | byx | exprs.kt:47:23:47:25 | byy | +| exprs.kt:48:16:48:26 | ... & ... | exprs.kt:48:16:48:18 | byx | exprs.kt:48:24:48:26 | byy | +| exprs.kt:49:16:49:26 | ... ^ ... | exprs.kt:49:16:49:18 | byx | exprs.kt:49:24:49:26 | byy | +| exprs.kt:52:14:52:20 | ... + ... | exprs.kt:52:14:52:15 | sx | exprs.kt:52:19:52:20 | sy | +| exprs.kt:53:14:53:20 | ... - ... | exprs.kt:53:14:53:15 | sx | exprs.kt:53:19:53:20 | sy | +| exprs.kt:54:14:54:20 | ... / ... | exprs.kt:54:14:54:15 | sx | exprs.kt:54:19:54:20 | sy | +| exprs.kt:55:14:55:20 | ... % ... | exprs.kt:55:14:55:15 | sx | exprs.kt:55:19:55:20 | sy | +| exprs.kt:56:14:56:21 | ... (value equals) ... | exprs.kt:56:14:56:15 | intValue(...) | exprs.kt:56:20:56:21 | intValue(...) | +| exprs.kt:57:14:57:21 | ... (value not-equals) ... | exprs.kt:57:14:57:15 | intValue(...) | exprs.kt:57:20:57:21 | intValue(...) | +| exprs.kt:58:14:58:20 | ... < ... | exprs.kt:58:14:58:15 | intValue(...) | exprs.kt:58:19:58:20 | intValue(...) | +| exprs.kt:59:14:59:21 | ... <= ... | exprs.kt:59:14:59:15 | intValue(...) | exprs.kt:59:20:59:21 | intValue(...) | +| exprs.kt:60:15:60:21 | ... > ... | exprs.kt:60:15:60:16 | intValue(...) | exprs.kt:60:20:60:21 | intValue(...) | +| exprs.kt:61:15:61:22 | ... >= ... | exprs.kt:61:15:61:16 | intValue(...) | exprs.kt:61:21:61:22 | intValue(...) | +| exprs.kt:62:15:62:23 | ... == ... | exprs.kt:62:15:62:16 | sx | exprs.kt:62:22:62:23 | sy | +| exprs.kt:63:15:63:23 | ... != ... | exprs.kt:63:15:63:16 | sx | exprs.kt:63:22:63:23 | sy | +| exprs.kt:64:15:64:22 | ... \| ... | exprs.kt:64:15:64:16 | sx | exprs.kt:64:21:64:22 | sy | +| exprs.kt:65:15:65:23 | ... & ... | exprs.kt:65:15:65:16 | sx | exprs.kt:65:22:65:23 | sy | +| exprs.kt:66:15:66:23 | ... ^ ... | exprs.kt:66:15:66:16 | sx | exprs.kt:66:22:66:23 | sy | +| exprs.kt:69:14:69:20 | ... + ... | exprs.kt:69:14:69:15 | lx | exprs.kt:69:19:69:20 | ly | +| exprs.kt:70:14:70:20 | ... - ... | exprs.kt:70:14:70:15 | lx | exprs.kt:70:19:70:20 | ly | +| exprs.kt:71:14:71:20 | ... / ... | exprs.kt:71:14:71:15 | lx | exprs.kt:71:19:71:20 | ly | +| exprs.kt:72:14:72:20 | ... % ... | exprs.kt:72:14:72:15 | lx | exprs.kt:72:19:72:20 | ly | +| exprs.kt:73:14:73:21 | ... << ... | exprs.kt:73:14:73:15 | lx | exprs.kt:73:21:73:21 | y | +| exprs.kt:74:14:74:21 | ... >> ... | exprs.kt:74:14:74:15 | lx | exprs.kt:74:21:74:21 | y | +| exprs.kt:75:14:75:22 | ... >>> ... | exprs.kt:75:14:75:15 | lx | exprs.kt:75:22:75:22 | y | +| exprs.kt:76:14:76:22 | ... & ... | exprs.kt:76:14:76:15 | lx | exprs.kt:76:21:76:22 | ly | +| exprs.kt:77:15:77:22 | ... \| ... | exprs.kt:77:15:77:16 | lx | exprs.kt:77:21:77:22 | ly | +| exprs.kt:78:15:78:23 | ... ^ ... | exprs.kt:78:15:78:16 | lx | exprs.kt:78:22:78:23 | ly | +| exprs.kt:80:15:80:22 | ... (value equals) ... | exprs.kt:80:15:80:16 | lx | exprs.kt:80:21:80:22 | ly | +| exprs.kt:81:15:81:22 | ... (value not-equals) ... | exprs.kt:81:15:81:16 | lx | exprs.kt:81:21:81:22 | ly | +| exprs.kt:82:15:82:21 | ... < ... | exprs.kt:82:15:82:16 | lx | exprs.kt:82:20:82:21 | ly | +| exprs.kt:83:15:83:22 | ... <= ... | exprs.kt:83:15:83:16 | lx | exprs.kt:83:21:83:22 | ly | +| exprs.kt:84:15:84:21 | ... > ... | exprs.kt:84:15:84:16 | lx | exprs.kt:84:20:84:21 | ly | +| exprs.kt:85:15:85:22 | ... >= ... | exprs.kt:85:15:85:16 | lx | exprs.kt:85:21:85:22 | ly | +| exprs.kt:86:15:86:23 | ... == ... | exprs.kt:86:15:86:16 | lx | exprs.kt:86:22:86:23 | ly | +| exprs.kt:87:15:87:23 | ... != ... | exprs.kt:87:15:87:16 | lx | exprs.kt:87:22:87:23 | ly | +| exprs.kt:90:14:90:20 | ... + ... | exprs.kt:90:14:90:15 | dx | exprs.kt:90:19:90:20 | dy | +| exprs.kt:91:14:91:20 | ... - ... | exprs.kt:91:14:91:15 | dx | exprs.kt:91:19:91:20 | dy | +| exprs.kt:92:14:92:20 | ... / ... | exprs.kt:92:14:92:15 | dx | exprs.kt:92:19:92:20 | dy | +| exprs.kt:93:14:93:20 | ... % ... | exprs.kt:93:14:93:15 | dx | exprs.kt:93:19:93:20 | dy | +| exprs.kt:94:14:94:21 | ... == ... | exprs.kt:94:14:94:15 | dx | exprs.kt:94:20:94:21 | dy | +| exprs.kt:95:14:95:21 | ... != ... | exprs.kt:95:14:95:15 | dx | exprs.kt:95:20:95:21 | dy | +| exprs.kt:96:14:96:20 | ... < ... | exprs.kt:96:14:96:15 | dx | exprs.kt:96:19:96:20 | dy | +| exprs.kt:97:14:97:21 | ... <= ... | exprs.kt:97:14:97:15 | dx | exprs.kt:97:20:97:21 | dy | +| exprs.kt:98:15:98:21 | ... > ... | exprs.kt:98:15:98:16 | dx | exprs.kt:98:20:98:21 | dy | +| exprs.kt:99:15:99:22 | ... >= ... | exprs.kt:99:15:99:16 | dx | exprs.kt:99:21:99:22 | dy | +| exprs.kt:100:15:100:23 | ... == ... | exprs.kt:100:15:100:16 | dx | exprs.kt:100:22:100:23 | dy | +| exprs.kt:101:15:101:23 | ... != ... | exprs.kt:101:15:101:16 | dx | exprs.kt:101:22:101:23 | dy | +| exprs.kt:104:14:104:20 | ... + ... | exprs.kt:104:14:104:15 | fx | exprs.kt:104:19:104:20 | fy | +| exprs.kt:105:14:105:20 | ... - ... | exprs.kt:105:14:105:15 | fx | exprs.kt:105:19:105:20 | fy | +| exprs.kt:106:14:106:20 | ... / ... | exprs.kt:106:14:106:15 | fx | exprs.kt:106:19:106:20 | fy | +| exprs.kt:107:14:107:20 | ... % ... | exprs.kt:107:14:107:15 | fx | exprs.kt:107:19:107:20 | fy | +| exprs.kt:108:14:108:21 | ... == ... | exprs.kt:108:14:108:15 | fx | exprs.kt:108:20:108:21 | fy | +| exprs.kt:109:14:109:21 | ... != ... | exprs.kt:109:14:109:15 | fx | exprs.kt:109:20:109:21 | fy | +| exprs.kt:110:14:110:20 | ... < ... | exprs.kt:110:14:110:15 | fx | exprs.kt:110:19:110:20 | fy | +| exprs.kt:111:14:111:21 | ... <= ... | exprs.kt:111:14:111:15 | fx | exprs.kt:111:20:111:21 | fy | +| exprs.kt:112:15:112:21 | ... > ... | exprs.kt:112:15:112:16 | fx | exprs.kt:112:20:112:21 | fy | +| exprs.kt:113:15:113:22 | ... >= ... | exprs.kt:113:15:113:16 | fx | exprs.kt:113:21:113:22 | fy | +| exprs.kt:114:15:114:23 | ... == ... | exprs.kt:114:15:114:16 | fx | exprs.kt:114:22:114:23 | fy | +| exprs.kt:115:15:115:23 | ... != ... | exprs.kt:115:15:115:16 | fx | exprs.kt:115:22:115:23 | fy | +| exprs.kt:119:14:119:21 | ... && ... | exprs.kt:119:14:119:15 | b1 | exprs.kt:119:20:119:21 | b2 | +| exprs.kt:120:14:120:21 | ... \|\| ... | exprs.kt:120:14:120:15 | b1 | exprs.kt:120:20:120:21 | b2 | +| exprs.kt:133:31:133:41 | ... + ... | exprs.kt:133:31:133:34 | str1 | exprs.kt:133:38:133:41 | str2 | +| exprs.kt:134:16:134:26 | ... + ... | exprs.kt:134:16:134:19 | str1 | exprs.kt:134:23:134:26 | str2 | +| exprs.kt:137:12:137:23 | ... > ... | exprs.kt:137:12:137:19 | variable | exprs.kt:137:23:137:23 | 0 | +| exprs.kt:141:12:141:20 | ... + ... | exprs.kt:141:12:141:14 | 123 | exprs.kt:141:18:141:20 | 456 | +| exprs.kt:167:8:167:16 | ... (value not-equals) ... | exprs.kt:167:8:167:8 | r | exprs.kt:167:13:167:16 | null | +| exprs.kt:196:31:196:37 | ... + ... | exprs.kt:196:31:196:32 | getA1(...) | exprs.kt:196:36:196:37 | a2 | +| exprs.kt:211:20:211:29 | ... + ... | exprs.kt:211:20:211:21 | ...!! | exprs.kt:211:28:211:28 | 5 | +| exprs.kt:212:19:212:25 | ... + ... | exprs.kt:212:20:212:21 | ...!! | exprs.kt:212:25:212:25 | 5 | +| exprs.kt:230:12:230:47 | ... (value equals) ... | exprs.kt:230:12:230:27 | notNullPrimitive | exprs.kt:230:32:230:47 | notNullPrimitive | +| exprs.kt:231:12:231:48 | ... (value equals) ... | exprs.kt:231:12:231:27 | notNullPrimitive | exprs.kt:231:32:231:48 | nullablePrimitive | +| exprs.kt:232:12:232:49 | ... (value equals) ... | exprs.kt:232:12:232:28 | nullablePrimitive | exprs.kt:232:33:232:49 | nullablePrimitive | +| exprs.kt:233:12:233:43 | ... (value equals) ... | exprs.kt:233:12:233:25 | notNullReftype | exprs.kt:233:30:233:43 | notNullReftype | +| exprs.kt:234:12:234:44 | ... (value equals) ... | exprs.kt:234:12:234:25 | notNullReftype | exprs.kt:234:30:234:44 | nullableReftype | +| exprs.kt:235:12:235:45 | ... (value equals) ... | exprs.kt:235:12:235:26 | nullableReftype | exprs.kt:235:31:235:45 | nullableReftype | +| exprs.kt:236:12:236:47 | ... (value not-equals) ... | exprs.kt:236:12:236:27 | notNullPrimitive | exprs.kt:236:32:236:47 | notNullPrimitive | +| exprs.kt:237:12:237:48 | ... (value not-equals) ... | exprs.kt:237:12:237:27 | notNullPrimitive | exprs.kt:237:32:237:48 | nullablePrimitive | +| exprs.kt:238:12:238:49 | ... (value not-equals) ... | exprs.kt:238:12:238:28 | nullablePrimitive | exprs.kt:238:33:238:49 | nullablePrimitive | +| exprs.kt:239:13:239:44 | ... (value not-equals) ... | exprs.kt:239:13:239:26 | notNullReftype | exprs.kt:239:31:239:44 | notNullReftype | +| exprs.kt:240:13:240:45 | ... (value not-equals) ... | exprs.kt:240:13:240:26 | notNullReftype | exprs.kt:240:31:240:45 | nullableReftype | +| exprs.kt:241:13:241:46 | ... (value not-equals) ... | exprs.kt:241:13:241:27 | nullableReftype | exprs.kt:241:32:241:46 | nullableReftype | +| exprs.kt:242:13:242:36 | ... (value equals) ... | exprs.kt:242:13:242:28 | notNullPrimitive | exprs.kt:242:33:242:36 | null | +| exprs.kt:243:13:243:37 | ... (value equals) ... | exprs.kt:243:13:243:29 | nullablePrimitive | exprs.kt:243:34:243:37 | null | +| exprs.kt:244:13:244:34 | ... (value equals) ... | exprs.kt:244:13:244:26 | notNullReftype | exprs.kt:244:31:244:34 | null | +| exprs.kt:245:13:245:35 | ... (value equals) ... | exprs.kt:245:13:245:27 | nullableReftype | exprs.kt:245:32:245:35 | null | +| exprs.kt:246:13:246:36 | ... (value not-equals) ... | exprs.kt:246:13:246:28 | notNullPrimitive | exprs.kt:246:33:246:36 | null | +| exprs.kt:247:13:247:37 | ... (value not-equals) ... | exprs.kt:247:13:247:29 | nullablePrimitive | exprs.kt:247:34:247:37 | null | +| exprs.kt:248:13:248:34 | ... (value not-equals) ... | exprs.kt:248:13:248:26 | notNullReftype | exprs.kt:248:31:248:34 | null | +| exprs.kt:249:13:249:35 | ... (value not-equals) ... | exprs.kt:249:13:249:27 | nullableReftype | exprs.kt:249:32:249:35 | null | +| exprs.kt:259:11:259:15 | ... * ... | exprs.kt:259:11:259:11 | x | exprs.kt:259:15:259:15 | y | +| exprs.kt:260:11:260:19 | ... * ... | exprs.kt:260:11:260:13 | byx | exprs.kt:260:17:260:19 | byy | +| exprs.kt:261:11:261:17 | ... * ... | exprs.kt:261:11:261:12 | lx | exprs.kt:261:16:261:17 | ly | +| exprs.kt:262:11:262:17 | ... * ... | exprs.kt:262:11:262:12 | dx | exprs.kt:262:16:262:17 | dy | +| exprs.kt:263:11:263:17 | ... * ... | exprs.kt:263:11:263:12 | fx | exprs.kt:263:16:263:17 | fy | +| funcExprs.kt:32:35:32:42 | ... + ... | funcExprs.kt:32:35:32:38 | this | funcExprs.kt:32:42:32:42 | a | +| localFunctionCalls.kt:5:25:5:29 | ... + ... | localFunctionCalls.kt:5:25:5:25 | i | localFunctionCalls.kt:5:29:5:29 | x | +| samConversion.kt:2:33:2:38 | ... % ... | samConversion.kt:2:33:2:34 | it | samConversion.kt:2:38:2:38 | 2 | +| samConversion.kt:2:33:2:43 | ... (value equals) ... | samConversion.kt:2:33:2:38 | ... % ... | samConversion.kt:2:43:2:43 | 0 | +| samConversion.kt:7:36:7:45 | ... (value equals) ... | samConversion.kt:7:36:7:39 | this | samConversion.kt:7:44:7:45 | "" | +| samConversion.kt:10:18:10:22 | ... % ... | samConversion.kt:10:18:10:18 | j | samConversion.kt:10:22:10:22 | 2 | +| samConversion.kt:10:18:10:27 | ... (value equals) ... | samConversion.kt:10:18:10:22 | ... % ... | samConversion.kt:10:27:10:27 | 0 | +| samConversion.kt:12:18:12:22 | ... % ... | samConversion.kt:12:18:12:18 | j | samConversion.kt:12:22:12:22 | 2 | +| samConversion.kt:12:18:12:27 | ... (value equals) ... | samConversion.kt:12:18:12:22 | ... % ... | samConversion.kt:12:27:12:27 | 1 | +| whenExpr.kt:3:5:3:5 | ... (value equals) ... | whenExpr.kt:3:5:3:5 | tmp0_subject | whenExpr.kt:3:5:3:5 | 0 | +| whenExpr.kt:4:5:4:5 | ... (value equals) ... | whenExpr.kt:4:5:4:5 | tmp0_subject | whenExpr.kt:4:5:4:5 | 1 | +| whenExpr.kt:5:5:5:5 | ... (value equals) ... | whenExpr.kt:5:5:5:5 | tmp0_subject | whenExpr.kt:5:5:5:5 | 2 | +| whenExpr.kt:6:5:6:5 | ... (value equals) ... | whenExpr.kt:6:5:6:5 | tmp0_subject | whenExpr.kt:6:5:6:5 | 3 | diff --git a/java/ql/test-kotlin2/library-tests/exprs/binop.ql b/java/ql/test-kotlin2/library-tests/exprs/binop.ql new file mode 100644 index 00000000000..d865d83fcf9 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/exprs/binop.ql @@ -0,0 +1,44 @@ +import java + +newtype TMaybeElement = + TElement(Element e) or + TNoElement() + +class MaybeElement extends TMaybeElement { + abstract string toString(); + + abstract Location getLocation(); +} + +class YesMaybeElement extends MaybeElement { + Element e; + + YesMaybeElement() { this = TElement(e) } + + override string toString() { result = e.toString() } + + override Location getLocation() { result = e.getLocation() } +} + +class NoMaybeElement extends MaybeElement { + NoMaybeElement() { this = TNoElement() } + + override string toString() { result = "" } + + override Location getLocation() { none() } +} + +MaybeElement lhs(BinaryExpr e) { + if exists(e.getLeftOperand()) + then result = TElement(e.getLeftOperand()) + else result = TNoElement() +} + +MaybeElement rhs(BinaryExpr e) { + if exists(e.getRightOperand()) + then result = TElement(e.getRightOperand()) + else result = TNoElement() +} + +from Expr e +select e, lhs(e), rhs(e) diff --git a/java/ql/test-kotlin2/library-tests/exprs/delegatedProperties.expected b/java/ql/test-kotlin2/library-tests/exprs/delegatedProperties.expected new file mode 100644 index 00000000000..7141b6d1531 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/exprs/delegatedProperties.expected @@ -0,0 +1,68 @@ +delegatedProperties +| delegatedProperties.kt:6:9:9:9 | prop1 | prop1 | local | delegatedProperties.kt:6:24:9:9 | Lazy prop1$delegate | delegatedProperties.kt:6:27:9:9 | lazy(...) | +| delegatedProperties.kt:19:9:19:51 | varResource1 | varResource1 | local | delegatedProperties.kt:19:31:19:51 | ResourceDelegate varResource1$delegate | delegatedProperties.kt:19:34:19:51 | new ResourceDelegate(...) | +| delegatedProperties.kt:23:9:23:31 | name | name | local | delegatedProperties.kt:23:26:23:31 | Map name$delegate | delegatedProperties.kt:23:29:23:31 | map | +| delegatedProperties.kt:33:9:33:76 | readOnly | readOnly | local | delegatedProperties.kt:33:27:33:47 | ReadWriteProperty readOnly$delegate | delegatedProperties.kt:33:30:33:47 | resourceDelegate(...) | +| delegatedProperties.kt:34:9:34:48 | readWrite | readWrite | local | delegatedProperties.kt:34:28:34:48 | ReadWriteProperty readWrite$delegate | delegatedProperties.kt:34:31:34:48 | resourceDelegate(...) | +| delegatedProperties.kt:39:9:39:51 | varResource2 | varResource2 | local | delegatedProperties.kt:39:31:39:51 | ResourceDelegate varResource2$delegate | delegatedProperties.kt:39:31:39:51 | provideDelegate(...) | +| delegatedProperties.kt:42:5:42:47 | varResource0 | varResource0 | non-local | delegatedProperties.kt:42:27:42:47 | varResource0$delegate | delegatedProperties.kt:42:30:42:47 | new ResourceDelegate(...) | +| delegatedProperties.kt:66:5:66:50 | delegatedToMember1 | delegatedToMember1 | non-local | delegatedProperties.kt:66:33:66:50 | delegatedToMember1$delegate | delegatedProperties.kt:66:36:66:50 | ...::... | +| delegatedProperties.kt:67:5:67:53 | delegatedToMember2 | delegatedToMember2 | non-local | delegatedProperties.kt:67:33:67:53 | delegatedToMember2$delegate | delegatedProperties.kt:67:36:67:53 | ...::... | +| delegatedProperties.kt:69:5:69:56 | delegatedToExtMember1 | delegatedToExtMember1 | non-local | delegatedProperties.kt:69:36:69:56 | delegatedToExtMember1$delegate | delegatedProperties.kt:69:39:69:56 | ...::... | +| delegatedProperties.kt:70:5:70:59 | delegatedToExtMember2 | delegatedToExtMember2 | non-local | delegatedProperties.kt:70:36:70:59 | delegatedToExtMember2$delegate | delegatedProperties.kt:70:39:70:59 | ...::... | +| delegatedProperties.kt:72:5:72:56 | delegatedToBaseClass1 | delegatedToBaseClass1 | non-local | delegatedProperties.kt:72:36:72:56 | delegatedToBaseClass1$delegate | delegatedProperties.kt:72:39:72:56 | ...::... | +| delegatedProperties.kt:73:5:73:56 | delegatedToBaseClass2 | delegatedToBaseClass2 | non-local | delegatedProperties.kt:73:36:73:56 | delegatedToBaseClass2$delegate | delegatedProperties.kt:73:39:73:56 | ...::... | +| delegatedProperties.kt:75:5:75:78 | delegatedToAnotherClass1 | delegatedToAnotherClass1 | non-local | delegatedProperties.kt:75:39:75:78 | delegatedToAnotherClass1$delegate | delegatedProperties.kt:75:42:75:78 | ...::... | +| delegatedProperties.kt:77:5:77:49 | delegatedToTopLevel | delegatedToTopLevel | non-local | delegatedProperties.kt:77:34:77:49 | delegatedToTopLevel$delegate | delegatedProperties.kt:77:37:77:49 | ...::... | +| delegatedProperties.kt:79:5:79:38 | max | max | non-local | delegatedProperties.kt:79:18:79:38 | max$delegate | delegatedProperties.kt:79:21:79:38 | ...::... | +| delegatedProperties.kt:82:9:82:54 | delegatedToMember3 | delegatedToMember3 | local | delegatedProperties.kt:82:37:82:54 | KMutableProperty0 delegatedToMember3$delegate | delegatedProperties.kt:82:40:82:54 | ...::... | +| delegatedProperties.kt:87:1:87:46 | extDelegated | extDelegated | non-local | delegatedProperties.kt:87:31:87:46 | extDelegated$delegateMyClass | delegatedProperties.kt:87:34:87:46 | ...::... | +delegatedPropertyTypes +| delegatedProperties.kt:6:9:9:9 | prop1 | file://:0:0:0:0 | int | file:///Lazy.class:0:0:0:0 | Lazy | +| delegatedProperties.kt:19:9:19:51 | varResource1 | file://:0:0:0:0 | int | delegatedProperties.kt:45:1:51:1 | ResourceDelegate | +| delegatedProperties.kt:23:9:23:31 | name | file:///String.class:0:0:0:0 | String | file:///Map.class:0:0:0:0 | Map | +| delegatedProperties.kt:33:9:33:76 | readOnly | file://:0:0:0:0 | int | file:///ReadWriteProperty.class:0:0:0:0 | ReadWriteProperty | +| delegatedProperties.kt:34:9:34:48 | readWrite | file://:0:0:0:0 | int | file:///ReadWriteProperty.class:0:0:0:0 | ReadWriteProperty | +| delegatedProperties.kt:39:9:39:51 | varResource2 | file://:0:0:0:0 | int | delegatedProperties.kt:45:1:51:1 | ResourceDelegate | +| delegatedProperties.kt:42:5:42:47 | varResource0 | file://:0:0:0:0 | int | delegatedProperties.kt:45:1:51:1 | ResourceDelegate | +| delegatedProperties.kt:66:5:66:50 | delegatedToMember1 | file://:0:0:0:0 | int | file:///KMutableProperty0.class:0:0:0:0 | KMutableProperty0 | +| delegatedProperties.kt:67:5:67:53 | delegatedToMember2 | file://:0:0:0:0 | int | file:///KMutableProperty1.class:0:0:0:0 | KMutableProperty1 | +| delegatedProperties.kt:69:5:69:56 | delegatedToExtMember1 | file://:0:0:0:0 | int | file:///KMutableProperty0.class:0:0:0:0 | KMutableProperty0 | +| delegatedProperties.kt:70:5:70:59 | delegatedToExtMember2 | file://:0:0:0:0 | int | file:///KMutableProperty1.class:0:0:0:0 | KMutableProperty1 | +| delegatedProperties.kt:72:5:72:56 | delegatedToBaseClass1 | file://:0:0:0:0 | int | file:///KProperty0.class:0:0:0:0 | KProperty0 | +| delegatedProperties.kt:73:5:73:56 | delegatedToBaseClass2 | file://:0:0:0:0 | int | file:///KProperty1.class:0:0:0:0 | KProperty1 | +| delegatedProperties.kt:75:5:75:78 | delegatedToAnotherClass1 | file://:0:0:0:0 | int | file:///KProperty0.class:0:0:0:0 | KProperty0 | +| delegatedProperties.kt:77:5:77:49 | delegatedToTopLevel | file://:0:0:0:0 | int | file:///KMutableProperty0.class:0:0:0:0 | KMutableProperty0 | +| delegatedProperties.kt:79:5:79:38 | max | file://:0:0:0:0 | int | file:///KProperty0.class:0:0:0:0 | KProperty0 | +| delegatedProperties.kt:82:9:82:54 | delegatedToMember3 | file://:0:0:0:0 | int | file:///KMutableProperty0.class:0:0:0:0 | KMutableProperty0 | +| delegatedProperties.kt:87:1:87:46 | extDelegated | file://:0:0:0:0 | int | file:///KMutableProperty0.class:0:0:0:0 | KMutableProperty0 | +delegatedPropertyGetters +| delegatedProperties.kt:6:9:9:9 | prop1 | delegatedProperties.kt:6:24:9:9 | | +| delegatedProperties.kt:19:9:19:51 | varResource1 | delegatedProperties.kt:19:31:19:51 | | +| delegatedProperties.kt:23:9:23:31 | name | delegatedProperties.kt:23:26:23:31 | | +| delegatedProperties.kt:33:9:33:76 | readOnly | delegatedProperties.kt:33:27:33:47 | | +| delegatedProperties.kt:34:9:34:48 | readWrite | delegatedProperties.kt:34:28:34:48 | | +| delegatedProperties.kt:39:9:39:51 | varResource2 | delegatedProperties.kt:39:31:39:51 | | +| delegatedProperties.kt:42:5:42:47 | varResource0 | delegatedProperties.kt:42:27:42:47 | getVarResource0 | +| delegatedProperties.kt:66:5:66:50 | delegatedToMember1 | delegatedProperties.kt:66:33:66:50 | getDelegatedToMember1 | +| delegatedProperties.kt:67:5:67:53 | delegatedToMember2 | delegatedProperties.kt:67:33:67:53 | getDelegatedToMember2 | +| delegatedProperties.kt:69:5:69:56 | delegatedToExtMember1 | delegatedProperties.kt:69:36:69:56 | getDelegatedToExtMember1 | +| delegatedProperties.kt:70:5:70:59 | delegatedToExtMember2 | delegatedProperties.kt:70:36:70:59 | getDelegatedToExtMember2 | +| delegatedProperties.kt:72:5:72:56 | delegatedToBaseClass1 | delegatedProperties.kt:72:36:72:56 | getDelegatedToBaseClass1 | +| delegatedProperties.kt:73:5:73:56 | delegatedToBaseClass2 | delegatedProperties.kt:73:36:73:56 | getDelegatedToBaseClass2 | +| delegatedProperties.kt:75:5:75:78 | delegatedToAnotherClass1 | delegatedProperties.kt:75:39:75:78 | getDelegatedToAnotherClass1 | +| delegatedProperties.kt:77:5:77:49 | delegatedToTopLevel | delegatedProperties.kt:77:34:77:49 | getDelegatedToTopLevel | +| delegatedProperties.kt:79:5:79:38 | max | delegatedProperties.kt:79:18:79:38 | getMax | +| delegatedProperties.kt:82:9:82:54 | delegatedToMember3 | delegatedProperties.kt:82:37:82:54 | | +| delegatedProperties.kt:87:1:87:46 | extDelegated | delegatedProperties.kt:87:31:87:46 | getExtDelegated | +delegatedPropertySetters +| delegatedProperties.kt:19:9:19:51 | varResource1 | delegatedProperties.kt:19:31:19:51 | | +| delegatedProperties.kt:34:9:34:48 | readWrite | delegatedProperties.kt:34:28:34:48 | | +| delegatedProperties.kt:42:5:42:47 | varResource0 | delegatedProperties.kt:42:27:42:47 | setVarResource0 | +| delegatedProperties.kt:66:5:66:50 | delegatedToMember1 | delegatedProperties.kt:66:33:66:50 | setDelegatedToMember1 | +| delegatedProperties.kt:67:5:67:53 | delegatedToMember2 | delegatedProperties.kt:67:33:67:53 | setDelegatedToMember2 | +| delegatedProperties.kt:69:5:69:56 | delegatedToExtMember1 | delegatedProperties.kt:69:36:69:56 | setDelegatedToExtMember1 | +| delegatedProperties.kt:70:5:70:59 | delegatedToExtMember2 | delegatedProperties.kt:70:36:70:59 | setDelegatedToExtMember2 | +| delegatedProperties.kt:77:5:77:49 | delegatedToTopLevel | delegatedProperties.kt:77:34:77:49 | setDelegatedToTopLevel | +| delegatedProperties.kt:82:9:82:54 | delegatedToMember3 | delegatedProperties.kt:82:37:82:54 | | +| delegatedProperties.kt:87:1:87:46 | extDelegated | delegatedProperties.kt:87:31:87:46 | setExtDelegated | diff --git a/java/ql/test-kotlin2/library-tests/exprs/delegatedProperties.kt b/java/ql/test-kotlin2/library-tests/exprs/delegatedProperties.kt new file mode 100644 index 00000000000..477e4b66ae9 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/exprs/delegatedProperties.kt @@ -0,0 +1,87 @@ +import kotlin.properties.ReadWriteProperty +import kotlin.reflect.KProperty + +class ClassProp1 { + fun fn() { + val prop1: Int by lazy { + println("init") + 5 + } + println(prop1) + println(prop1) + } +} + +class Resource + +class Owner { + fun fn(map: Map) { + var varResource1: Int by ResourceDelegate() + println(varResource1) + varResource1 = 2 + + val name: String by map + + fun resourceDelegate(): ReadWriteProperty = object : ReadWriteProperty { + var curValue = 0 + override fun getValue(thisRef: Any?, property: KProperty<*>): Int = curValue + override fun setValue(thisRef: Any?, property: KProperty<*>, value: Int) { + curValue = value + } + } + + val readOnly: Int by resourceDelegate() // ReadWriteProperty as val + var readWrite: Int by resourceDelegate() + + println(varResource0) + varResource0 = 3 + + val varResource2: Int by DelegateProvider() + } + + var varResource0: Int by ResourceDelegate() +} + +class ResourceDelegate { + operator fun getValue(thisRef: Owner?, property: KProperty<*>): Int { + return 1 + } + operator fun setValue(thisRef: Owner?, property: KProperty<*>, value: Int?) { + } +} + +class DelegateProvider { + operator fun provideDelegate(thisRef: Owner?, prop: KProperty<*>): ResourceDelegate { + // ... some logic + return ResourceDelegate() + } +} + +var topLevelInt: Int = 0 + +class ClassWithDelegate(val anotherClassInt: Int) +open class Base(val baseClassInt: Int) + +class MyClass(var memberInt: Int, val anotherClassInstance: ClassWithDelegate) : Base(memberInt) { + var delegatedToMember1: Int by this::memberInt + var delegatedToMember2: Int by MyClass::memberInt + + var delegatedToExtMember1: Int by this::extDelegated + var delegatedToExtMember2: Int by MyClass::extDelegated + + val delegatedToBaseClass1: Int by this::baseClassInt + val delegatedToBaseClass2: Int by Base::baseClassInt + + val delegatedToAnotherClass1: Int by anotherClassInstance::anotherClassInt + + var delegatedToTopLevel: Int by ::topLevelInt + + val max: Int by Integer::MAX_VALUE + + fun fn(){ + var delegatedToMember3: Int by this::memberInt + fn() + } +} + +var MyClass.extDelegated: Int by ::topLevelInt diff --git a/java/ql/test-kotlin2/library-tests/exprs/delegatedProperties.ql b/java/ql/test-kotlin2/library-tests/exprs/delegatedProperties.ql new file mode 100644 index 00000000000..56042ac2586 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/exprs/delegatedProperties.ql @@ -0,0 +1,38 @@ +import java + +// Stop external filepaths from appearing in the results +class ClassOrInterfaceLocation extends ClassOrInterface { + override predicate hasLocationInfo(string path, int sl, int sc, int el, int ec) { + exists(string fullPath | super.hasLocationInfo(fullPath, sl, sc, el, ec) | + if exists(this.getFile().getRelativePath()) + then path = fullPath + else path = fullPath.regexpReplaceAll(".*/", "/") + ) + } +} + +query predicate delegatedProperties( + DelegatedProperty dp, string name, string isLocal, Variable underlying, Expr initializer +) { + ( + dp.isLocal() and isLocal = "local" + or + not dp.isLocal() and isLocal = "non-local" + ) and + underlying = dp.getDelegatee() and + name = dp.getName() and + underlying.getInitializer() = initializer +} + +query predicate delegatedPropertyTypes(DelegatedProperty dp, Type type, Type underlyingType) { + dp.getGetter().getReturnType() = type and + dp.getDelegatee().getType() = underlyingType +} + +query predicate delegatedPropertyGetters(DelegatedProperty dp, Method getter) { + dp.getGetter() = getter +} + +query predicate delegatedPropertySetters(DelegatedProperty dp, Method setter) { + dp.getSetter() = setter +} diff --git a/java/ql/test-kotlin2/library-tests/exprs/exprs.expected b/java/ql/test-kotlin2/library-tests/exprs/exprs.expected new file mode 100644 index 00000000000..220dee0084b --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/exprs/exprs.expected @@ -0,0 +1,4388 @@ +| delegatedProperties.kt:0:0:0:0 | null | delegatedProperties.kt:6:24:9:9 | | NullLiteral | +| delegatedProperties.kt:0:0:0:0 | null | delegatedProperties.kt:19:31:19:51 | | NullLiteral | +| delegatedProperties.kt:0:0:0:0 | null | delegatedProperties.kt:19:31:19:51 | | NullLiteral | +| delegatedProperties.kt:0:0:0:0 | null | delegatedProperties.kt:23:26:23:31 | | NullLiteral | +| delegatedProperties.kt:0:0:0:0 | null | delegatedProperties.kt:33:27:33:47 | | NullLiteral | +| delegatedProperties.kt:0:0:0:0 | null | delegatedProperties.kt:34:28:34:48 | | NullLiteral | +| delegatedProperties.kt:0:0:0:0 | null | delegatedProperties.kt:34:28:34:48 | | NullLiteral | +| delegatedProperties.kt:0:0:0:0 | null | delegatedProperties.kt:39:31:39:51 | | NullLiteral | +| delegatedProperties.kt:0:0:0:0 | null | delegatedProperties.kt:82:37:82:54 | | NullLiteral | +| delegatedProperties.kt:0:0:0:0 | null | delegatedProperties.kt:82:37:82:54 | | NullLiteral | +| delegatedProperties.kt:1:9:1:12 | null | delegatedProperties.kt:18:5:40:5 | fn | NullLiteral | +| delegatedProperties.kt:1:9:1:12 | this | delegatedProperties.kt:42:27:42:47 | getVarResource0 | ThisAccess | +| delegatedProperties.kt:1:9:1:12 | this | delegatedProperties.kt:42:27:42:47 | setVarResource0 | ThisAccess | +| delegatedProperties.kt:1:9:1:12 | this | delegatedProperties.kt:66:33:66:50 | getDelegatedToMember1 | ThisAccess | +| delegatedProperties.kt:1:9:1:12 | this | delegatedProperties.kt:66:33:66:50 | setDelegatedToMember1 | ThisAccess | +| delegatedProperties.kt:1:9:1:12 | this | delegatedProperties.kt:67:33:67:53 | getDelegatedToMember2 | ThisAccess | +| delegatedProperties.kt:1:9:1:12 | this | delegatedProperties.kt:67:33:67:53 | setDelegatedToMember2 | ThisAccess | +| delegatedProperties.kt:1:9:1:12 | this | delegatedProperties.kt:69:36:69:56 | getDelegatedToExtMember1 | ThisAccess | +| delegatedProperties.kt:1:9:1:12 | this | delegatedProperties.kt:69:36:69:56 | setDelegatedToExtMember1 | ThisAccess | +| delegatedProperties.kt:1:9:1:12 | this | delegatedProperties.kt:70:36:70:59 | getDelegatedToExtMember2 | ThisAccess | +| delegatedProperties.kt:1:9:1:12 | this | delegatedProperties.kt:70:36:70:59 | setDelegatedToExtMember2 | ThisAccess | +| delegatedProperties.kt:1:9:1:12 | this | delegatedProperties.kt:72:36:72:56 | getDelegatedToBaseClass1 | ThisAccess | +| delegatedProperties.kt:1:9:1:12 | this | delegatedProperties.kt:73:36:73:56 | getDelegatedToBaseClass2 | ThisAccess | +| delegatedProperties.kt:1:9:1:12 | this | delegatedProperties.kt:75:39:75:78 | getDelegatedToAnotherClass1 | ThisAccess | +| delegatedProperties.kt:1:9:1:12 | this | delegatedProperties.kt:77:34:77:49 | getDelegatedToTopLevel | ThisAccess | +| delegatedProperties.kt:1:9:1:12 | this | delegatedProperties.kt:77:34:77:49 | setDelegatedToTopLevel | ThisAccess | +| delegatedProperties.kt:1:9:1:12 | this | delegatedProperties.kt:79:18:79:38 | getMax | ThisAccess | +| delegatedProperties.kt:1:9:1:12 | this | delegatedProperties.kt:87:31:87:46 | getExtDelegated | ExtensionReceiverAccess | +| delegatedProperties.kt:1:9:1:12 | this | delegatedProperties.kt:87:31:87:46 | setExtDelegated | ExtensionReceiverAccess | +| delegatedProperties.kt:5:5:12:5 | Unit | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:6:24:9:9 | ...::... | delegatedProperties.kt:6:24:9:9 | | PropertyRefExpr | +| delegatedProperties.kt:6:24:9:9 | (...) | delegatedProperties.kt:6:24:9:9 | get | MethodCall | +| delegatedProperties.kt:6:24:9:9 | Integer | delegatedProperties.kt:6:24:9:9 | | TypeAccess | +| delegatedProperties.kt:6:24:9:9 | Integer | delegatedProperties.kt:6:24:9:9 | | TypeAccess | +| delegatedProperties.kt:6:24:9:9 | KProperty0 | delegatedProperties.kt:6:24:9:9 | | TypeAccess | +| delegatedProperties.kt:6:24:9:9 | LazyKt | delegatedProperties.kt:6:24:9:9 | | TypeAccess | +| delegatedProperties.kt:6:24:9:9 | Object | delegatedProperties.kt:6:24:9:9 | get | TypeAccess | +| delegatedProperties.kt:6:24:9:9 | get(...) | delegatedProperties.kt:6:24:9:9 | invoke | MethodCall | +| delegatedProperties.kt:6:24:9:9 | getValue(...) | delegatedProperties.kt:6:24:9:9 | | MethodCall | +| delegatedProperties.kt:6:24:9:9 | int | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:6:24:9:9 | new (...) | delegatedProperties.kt:6:24:9:9 | get | ClassInstanceExpr | +| delegatedProperties.kt:6:24:9:9 | prop1$delegate | delegatedProperties.kt:5:5:12:5 | fn | LocalVariableDeclExpr | +| delegatedProperties.kt:6:24:9:9 | prop1$delegate | delegatedProperties.kt:6:24:9:9 | | VarAccess | +| delegatedProperties.kt:6:24:9:9 | this | delegatedProperties.kt:6:24:9:9 | invoke | ThisAccess | +| delegatedProperties.kt:6:27:9:9 | Integer | delegatedProperties.kt:5:5:12:5 | fn | TypeAccess | +| delegatedProperties.kt:6:27:9:9 | LazyKt | delegatedProperties.kt:5:5:12:5 | fn | TypeAccess | +| delegatedProperties.kt:6:27:9:9 | lazy(...) | delegatedProperties.kt:5:5:12:5 | fn | MethodCall | +| delegatedProperties.kt:6:32:9:9 | ...->... | delegatedProperties.kt:5:5:12:5 | fn | LambdaExpr | +| delegatedProperties.kt:6:32:9:9 | Function0 | delegatedProperties.kt:5:5:12:5 | fn | TypeAccess | +| delegatedProperties.kt:6:32:9:9 | Integer | delegatedProperties.kt:5:5:12:5 | fn | TypeAccess | +| delegatedProperties.kt:6:32:9:9 | int | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:7:13:7:27 | ConsoleKt | delegatedProperties.kt:6:32:9:9 | invoke | TypeAccess | +| delegatedProperties.kt:7:13:7:27 | println(...) | delegatedProperties.kt:6:32:9:9 | invoke | MethodCall | +| delegatedProperties.kt:7:22:7:25 | "init" | delegatedProperties.kt:6:32:9:9 | invoke | StringLiteral | +| delegatedProperties.kt:8:13:8:13 | 5 | delegatedProperties.kt:6:32:9:9 | invoke | IntegerLiteral | +| delegatedProperties.kt:10:9:10:22 | ConsoleKt | delegatedProperties.kt:5:5:12:5 | fn | TypeAccess | +| delegatedProperties.kt:10:9:10:22 | println(...) | delegatedProperties.kt:5:5:12:5 | fn | MethodCall | +| delegatedProperties.kt:10:17:10:21 | (...) | delegatedProperties.kt:5:5:12:5 | fn | MethodCall | +| delegatedProperties.kt:10:17:10:21 | Object | delegatedProperties.kt:5:5:12:5 | fn | TypeAccess | +| delegatedProperties.kt:10:17:10:21 | new (...) | delegatedProperties.kt:5:5:12:5 | fn | ClassInstanceExpr | +| delegatedProperties.kt:11:9:11:22 | ConsoleKt | delegatedProperties.kt:5:5:12:5 | fn | TypeAccess | +| delegatedProperties.kt:11:9:11:22 | println(...) | delegatedProperties.kt:5:5:12:5 | fn | MethodCall | +| delegatedProperties.kt:11:17:11:21 | (...) | delegatedProperties.kt:5:5:12:5 | fn | MethodCall | +| delegatedProperties.kt:11:17:11:21 | Object | delegatedProperties.kt:5:5:12:5 | fn | TypeAccess | +| delegatedProperties.kt:11:17:11:21 | new (...) | delegatedProperties.kt:5:5:12:5 | fn | ClassInstanceExpr | +| delegatedProperties.kt:18:5:40:5 | Unit | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:18:12:18:33 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| delegatedProperties.kt:18:12:18:33 | Map | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:18:12:18:33 | Object | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:18:12:18:33 | String | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:19:31:19:51 | ...::... | delegatedProperties.kt:19:31:19:51 | | PropertyRefExpr | +| delegatedProperties.kt:19:31:19:51 | ...::... | delegatedProperties.kt:19:31:19:51 | | PropertyRefExpr | +| delegatedProperties.kt:19:31:19:51 | (...) | delegatedProperties.kt:19:31:19:51 | get | MethodCall | +| delegatedProperties.kt:19:31:19:51 | (...) | delegatedProperties.kt:19:31:19:51 | get | MethodCall | +| delegatedProperties.kt:19:31:19:51 | (...) | delegatedProperties.kt:19:31:19:51 | set | MethodCall | +| delegatedProperties.kt:19:31:19:51 | (...) | delegatedProperties.kt:19:31:19:51 | set | MethodCall | +| delegatedProperties.kt:19:31:19:51 | Integer | delegatedProperties.kt:19:31:19:51 | | TypeAccess | +| delegatedProperties.kt:19:31:19:51 | Integer | delegatedProperties.kt:19:31:19:51 | | TypeAccess | +| delegatedProperties.kt:19:31:19:51 | KMutableProperty0 | delegatedProperties.kt:19:31:19:51 | | TypeAccess | +| delegatedProperties.kt:19:31:19:51 | KMutableProperty0 | delegatedProperties.kt:19:31:19:51 | | TypeAccess | +| delegatedProperties.kt:19:31:19:51 | Object | delegatedProperties.kt:19:31:19:51 | get | TypeAccess | +| delegatedProperties.kt:19:31:19:51 | Object | delegatedProperties.kt:19:31:19:51 | get | TypeAccess | +| delegatedProperties.kt:19:31:19:51 | Object | delegatedProperties.kt:19:31:19:51 | set | TypeAccess | +| delegatedProperties.kt:19:31:19:51 | Object | delegatedProperties.kt:19:31:19:51 | set | TypeAccess | +| delegatedProperties.kt:19:31:19:51 | Unit | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:19:31:19:51 | a0 | delegatedProperties.kt:19:31:19:51 | set | VarAccess | +| delegatedProperties.kt:19:31:19:51 | a0 | delegatedProperties.kt:19:31:19:51 | set | VarAccess | +| delegatedProperties.kt:19:31:19:51 | get(...) | delegatedProperties.kt:19:31:19:51 | invoke | MethodCall | +| delegatedProperties.kt:19:31:19:51 | get(...) | delegatedProperties.kt:19:31:19:51 | invoke | MethodCall | +| delegatedProperties.kt:19:31:19:51 | getValue(...) | delegatedProperties.kt:19:31:19:51 | | MethodCall | +| delegatedProperties.kt:19:31:19:51 | int | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:19:31:19:51 | int | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:19:31:19:51 | new (...) | delegatedProperties.kt:19:31:19:51 | get | ClassInstanceExpr | +| delegatedProperties.kt:19:31:19:51 | new (...) | delegatedProperties.kt:19:31:19:51 | get | ClassInstanceExpr | +| delegatedProperties.kt:19:31:19:51 | new (...) | delegatedProperties.kt:19:31:19:51 | set | ClassInstanceExpr | +| delegatedProperties.kt:19:31:19:51 | new (...) | delegatedProperties.kt:19:31:19:51 | set | ClassInstanceExpr | +| delegatedProperties.kt:19:31:19:51 | setValue(...) | delegatedProperties.kt:19:31:19:51 | | MethodCall | +| delegatedProperties.kt:19:31:19:51 | this | delegatedProperties.kt:19:31:19:51 | invoke | ThisAccess | +| delegatedProperties.kt:19:31:19:51 | this | delegatedProperties.kt:19:31:19:51 | invoke | ThisAccess | +| delegatedProperties.kt:19:31:19:51 | varResource1$delegate | delegatedProperties.kt:18:5:40:5 | fn | LocalVariableDeclExpr | +| delegatedProperties.kt:19:31:19:51 | varResource1$delegate | delegatedProperties.kt:19:31:19:51 | | VarAccess | +| delegatedProperties.kt:19:31:19:51 | varResource1$delegate | delegatedProperties.kt:19:31:19:51 | | VarAccess | +| delegatedProperties.kt:19:34:19:51 | ResourceDelegate | delegatedProperties.kt:18:5:40:5 | fn | TypeAccess | +| delegatedProperties.kt:19:34:19:51 | new ResourceDelegate(...) | delegatedProperties.kt:18:5:40:5 | fn | ClassInstanceExpr | +| delegatedProperties.kt:19:34:19:51 | value | delegatedProperties.kt:19:31:19:51 | | VarAccess | +| delegatedProperties.kt:20:9:20:29 | ConsoleKt | delegatedProperties.kt:18:5:40:5 | fn | TypeAccess | +| delegatedProperties.kt:20:9:20:29 | println(...) | delegatedProperties.kt:18:5:40:5 | fn | MethodCall | +| delegatedProperties.kt:20:17:20:28 | (...) | delegatedProperties.kt:18:5:40:5 | fn | MethodCall | +| delegatedProperties.kt:20:17:20:28 | Object | delegatedProperties.kt:18:5:40:5 | fn | TypeAccess | +| delegatedProperties.kt:20:17:20:28 | new (...) | delegatedProperties.kt:18:5:40:5 | fn | ClassInstanceExpr | +| delegatedProperties.kt:21:9:21:20 | (...) | delegatedProperties.kt:18:5:40:5 | fn | MethodCall | +| delegatedProperties.kt:21:9:21:20 | Object | delegatedProperties.kt:18:5:40:5 | fn | TypeAccess | +| delegatedProperties.kt:21:9:21:20 | new (...) | delegatedProperties.kt:18:5:40:5 | fn | ClassInstanceExpr | +| delegatedProperties.kt:21:24:21:24 | 2 | delegatedProperties.kt:18:5:40:5 | fn | IntegerLiteral | +| delegatedProperties.kt:23:26:23:31 | ...::... | delegatedProperties.kt:23:26:23:31 | | PropertyRefExpr | +| delegatedProperties.kt:23:26:23:31 | (...) | delegatedProperties.kt:23:26:23:31 | get | MethodCall | +| delegatedProperties.kt:23:26:23:31 | KProperty0 | delegatedProperties.kt:23:26:23:31 | | TypeAccess | +| delegatedProperties.kt:23:26:23:31 | MapAccessorsKt | delegatedProperties.kt:23:26:23:31 | | TypeAccess | +| delegatedProperties.kt:23:26:23:31 | Object | delegatedProperties.kt:23:26:23:31 | | TypeAccess | +| delegatedProperties.kt:23:26:23:31 | Object | delegatedProperties.kt:23:26:23:31 | get | TypeAccess | +| delegatedProperties.kt:23:26:23:31 | String | delegatedProperties.kt:23:26:23:31 | | TypeAccess | +| delegatedProperties.kt:23:26:23:31 | String | delegatedProperties.kt:23:26:23:31 | | TypeAccess | +| delegatedProperties.kt:23:26:23:31 | String | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:23:26:23:31 | get(...) | delegatedProperties.kt:23:26:23:31 | invoke | MethodCall | +| delegatedProperties.kt:23:26:23:31 | getValue(...) | delegatedProperties.kt:23:26:23:31 | | MethodCall | +| delegatedProperties.kt:23:26:23:31 | name$delegate | delegatedProperties.kt:18:5:40:5 | fn | LocalVariableDeclExpr | +| delegatedProperties.kt:23:26:23:31 | name$delegate | delegatedProperties.kt:23:26:23:31 | | VarAccess | +| delegatedProperties.kt:23:26:23:31 | new (...) | delegatedProperties.kt:23:26:23:31 | get | ClassInstanceExpr | +| delegatedProperties.kt:23:26:23:31 | this | delegatedProperties.kt:23:26:23:31 | invoke | ThisAccess | +| delegatedProperties.kt:23:29:23:31 | map | delegatedProperties.kt:18:5:40:5 | fn | VarAccess | +| delegatedProperties.kt:25:9:31:9 | Integer | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:25:9:31:9 | Object | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:25:9:31:9 | ReadWriteProperty | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:25:64:31:9 | | delegatedProperties.kt:25:9:31:9 | resourceDelegate | StmtExpr | +| delegatedProperties.kt:25:64:31:9 | ReadWriteProperty | delegatedProperties.kt:25:9:31:9 | resourceDelegate | TypeAccess | +| delegatedProperties.kt:25:64:31:9 | new (...) | delegatedProperties.kt:25:9:31:9 | resourceDelegate | ClassInstanceExpr | +| delegatedProperties.kt:26:13:26:28 | ...=... | delegatedProperties.kt:25:64:31:9 | | KtInitializerAssignExpr | +| delegatedProperties.kt:26:13:26:28 | ...=... | delegatedProperties.kt:26:13:26:28 | setCurValue | AssignExpr | +| delegatedProperties.kt:26:13:26:28 | | delegatedProperties.kt:26:13:26:28 | setCurValue | VarAccess | +| delegatedProperties.kt:26:13:26:28 | Unit | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:26:13:26:28 | curValue | delegatedProperties.kt:25:64:31:9 | | VarAccess | +| delegatedProperties.kt:26:13:26:28 | int | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:26:13:26:28 | int | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:26:13:26:28 | int | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:26:13:26:28 | this | delegatedProperties.kt:26:13:26:28 | getCurValue | ThisAccess | +| delegatedProperties.kt:26:13:26:28 | this | delegatedProperties.kt:26:13:26:28 | setCurValue | ThisAccess | +| delegatedProperties.kt:26:13:26:28 | this.curValue | delegatedProperties.kt:26:13:26:28 | getCurValue | VarAccess | +| delegatedProperties.kt:26:13:26:28 | this.curValue | delegatedProperties.kt:26:13:26:28 | setCurValue | VarAccess | +| delegatedProperties.kt:26:28:26:28 | 0 | delegatedProperties.kt:25:64:31:9 | | IntegerLiteral | +| delegatedProperties.kt:27:22:27:88 | int | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:27:35:27:47 | Object | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:27:50:27:71 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| delegatedProperties.kt:27:50:27:71 | KProperty | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:27:81:27:88 | getCurValue(...) | delegatedProperties.kt:27:22:27:88 | getValue | MethodCall | +| delegatedProperties.kt:27:81:27:88 | this | delegatedProperties.kt:27:22:27:88 | getValue | ThisAccess | +| delegatedProperties.kt:28:22:30:13 | Unit | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:28:35:28:47 | Object | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:28:50:28:71 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| delegatedProperties.kt:28:50:28:71 | KProperty | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:28:74:28:83 | int | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:29:17:29:24 | setCurValue(...) | delegatedProperties.kt:28:22:30:13 | setValue | MethodCall | +| delegatedProperties.kt:29:17:29:24 | this | delegatedProperties.kt:28:22:30:13 | setValue | ThisAccess | +| delegatedProperties.kt:29:28:29:32 | value | delegatedProperties.kt:28:22:30:13 | setValue | VarAccess | +| delegatedProperties.kt:33:27:33:47 | ...::... | delegatedProperties.kt:33:27:33:47 | | PropertyRefExpr | +| delegatedProperties.kt:33:27:33:47 | (...) | delegatedProperties.kt:33:27:33:47 | get | MethodCall | +| delegatedProperties.kt:33:27:33:47 | Integer | delegatedProperties.kt:33:27:33:47 | | TypeAccess | +| delegatedProperties.kt:33:27:33:47 | KProperty0 | delegatedProperties.kt:33:27:33:47 | | TypeAccess | +| delegatedProperties.kt:33:27:33:47 | Object | delegatedProperties.kt:33:27:33:47 | get | TypeAccess | +| delegatedProperties.kt:33:27:33:47 | get(...) | delegatedProperties.kt:33:27:33:47 | invoke | MethodCall | +| delegatedProperties.kt:33:27:33:47 | getValue(...) | delegatedProperties.kt:33:27:33:47 | | MethodCall | +| delegatedProperties.kt:33:27:33:47 | int | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:33:27:33:47 | new (...) | delegatedProperties.kt:33:27:33:47 | get | ClassInstanceExpr | +| delegatedProperties.kt:33:27:33:47 | readOnly$delegate | delegatedProperties.kt:18:5:40:5 | fn | LocalVariableDeclExpr | +| delegatedProperties.kt:33:27:33:47 | readOnly$delegate | delegatedProperties.kt:33:27:33:47 | | VarAccess | +| delegatedProperties.kt:33:27:33:47 | this | delegatedProperties.kt:33:27:33:47 | invoke | ThisAccess | +| delegatedProperties.kt:33:30:33:47 | Object | delegatedProperties.kt:18:5:40:5 | fn | TypeAccess | +| delegatedProperties.kt:33:30:33:47 | new (...) | delegatedProperties.kt:18:5:40:5 | fn | ClassInstanceExpr | +| delegatedProperties.kt:33:30:33:47 | resourceDelegate(...) | delegatedProperties.kt:18:5:40:5 | fn | MethodCall | +| delegatedProperties.kt:34:28:34:48 | ...::... | delegatedProperties.kt:34:28:34:48 | | PropertyRefExpr | +| delegatedProperties.kt:34:28:34:48 | ...::... | delegatedProperties.kt:34:28:34:48 | | PropertyRefExpr | +| delegatedProperties.kt:34:28:34:48 | (...) | delegatedProperties.kt:34:28:34:48 | get | MethodCall | +| delegatedProperties.kt:34:28:34:48 | (...) | delegatedProperties.kt:34:28:34:48 | get | MethodCall | +| delegatedProperties.kt:34:28:34:48 | (...) | delegatedProperties.kt:34:28:34:48 | set | MethodCall | +| delegatedProperties.kt:34:28:34:48 | (...) | delegatedProperties.kt:34:28:34:48 | set | MethodCall | +| delegatedProperties.kt:34:28:34:48 | Integer | delegatedProperties.kt:34:28:34:48 | | TypeAccess | +| delegatedProperties.kt:34:28:34:48 | Integer | delegatedProperties.kt:34:28:34:48 | | TypeAccess | +| delegatedProperties.kt:34:28:34:48 | KMutableProperty0 | delegatedProperties.kt:34:28:34:48 | | TypeAccess | +| delegatedProperties.kt:34:28:34:48 | KMutableProperty0 | delegatedProperties.kt:34:28:34:48 | | TypeAccess | +| delegatedProperties.kt:34:28:34:48 | Object | delegatedProperties.kt:34:28:34:48 | get | TypeAccess | +| delegatedProperties.kt:34:28:34:48 | Object | delegatedProperties.kt:34:28:34:48 | get | TypeAccess | +| delegatedProperties.kt:34:28:34:48 | Object | delegatedProperties.kt:34:28:34:48 | set | TypeAccess | +| delegatedProperties.kt:34:28:34:48 | Object | delegatedProperties.kt:34:28:34:48 | set | TypeAccess | +| delegatedProperties.kt:34:28:34:48 | Unit | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:34:28:34:48 | a0 | delegatedProperties.kt:34:28:34:48 | set | VarAccess | +| delegatedProperties.kt:34:28:34:48 | a0 | delegatedProperties.kt:34:28:34:48 | set | VarAccess | +| delegatedProperties.kt:34:28:34:48 | get(...) | delegatedProperties.kt:34:28:34:48 | invoke | MethodCall | +| delegatedProperties.kt:34:28:34:48 | get(...) | delegatedProperties.kt:34:28:34:48 | invoke | MethodCall | +| delegatedProperties.kt:34:28:34:48 | getValue(...) | delegatedProperties.kt:34:28:34:48 | | MethodCall | +| delegatedProperties.kt:34:28:34:48 | int | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:34:28:34:48 | int | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:34:28:34:48 | new (...) | delegatedProperties.kt:34:28:34:48 | get | ClassInstanceExpr | +| delegatedProperties.kt:34:28:34:48 | new (...) | delegatedProperties.kt:34:28:34:48 | get | ClassInstanceExpr | +| delegatedProperties.kt:34:28:34:48 | new (...) | delegatedProperties.kt:34:28:34:48 | set | ClassInstanceExpr | +| delegatedProperties.kt:34:28:34:48 | new (...) | delegatedProperties.kt:34:28:34:48 | set | ClassInstanceExpr | +| delegatedProperties.kt:34:28:34:48 | readWrite$delegate | delegatedProperties.kt:18:5:40:5 | fn | LocalVariableDeclExpr | +| delegatedProperties.kt:34:28:34:48 | readWrite$delegate | delegatedProperties.kt:34:28:34:48 | | VarAccess | +| delegatedProperties.kt:34:28:34:48 | readWrite$delegate | delegatedProperties.kt:34:28:34:48 | | VarAccess | +| delegatedProperties.kt:34:28:34:48 | setValue(...) | delegatedProperties.kt:34:28:34:48 | | MethodCall | +| delegatedProperties.kt:34:28:34:48 | this | delegatedProperties.kt:34:28:34:48 | invoke | ThisAccess | +| delegatedProperties.kt:34:28:34:48 | this | delegatedProperties.kt:34:28:34:48 | invoke | ThisAccess | +| delegatedProperties.kt:34:31:34:48 | Object | delegatedProperties.kt:18:5:40:5 | fn | TypeAccess | +| delegatedProperties.kt:34:31:34:48 | new (...) | delegatedProperties.kt:18:5:40:5 | fn | ClassInstanceExpr | +| delegatedProperties.kt:34:31:34:48 | resourceDelegate(...) | delegatedProperties.kt:18:5:40:5 | fn | MethodCall | +| delegatedProperties.kt:34:31:34:48 | value | delegatedProperties.kt:34:28:34:48 | | VarAccess | +| delegatedProperties.kt:36:9:36:29 | ConsoleKt | delegatedProperties.kt:18:5:40:5 | fn | TypeAccess | +| delegatedProperties.kt:36:9:36:29 | println(...) | delegatedProperties.kt:18:5:40:5 | fn | MethodCall | +| delegatedProperties.kt:36:17:36:28 | getVarResource0(...) | delegatedProperties.kt:18:5:40:5 | fn | MethodCall | +| delegatedProperties.kt:36:17:36:28 | this | delegatedProperties.kt:18:5:40:5 | fn | ThisAccess | +| delegatedProperties.kt:37:9:37:20 | setVarResource0(...) | delegatedProperties.kt:18:5:40:5 | fn | MethodCall | +| delegatedProperties.kt:37:9:37:20 | this | delegatedProperties.kt:18:5:40:5 | fn | ThisAccess | +| delegatedProperties.kt:37:24:37:24 | 3 | delegatedProperties.kt:18:5:40:5 | fn | IntegerLiteral | +| delegatedProperties.kt:39:31:39:51 | ...::... | delegatedProperties.kt:18:5:40:5 | fn | PropertyRefExpr | +| delegatedProperties.kt:39:31:39:51 | ...::... | delegatedProperties.kt:39:31:39:51 | | PropertyRefExpr | +| delegatedProperties.kt:39:31:39:51 | (...) | delegatedProperties.kt:39:31:39:51 | get | MethodCall | +| delegatedProperties.kt:39:31:39:51 | (...) | delegatedProperties.kt:39:31:39:51 | get | MethodCall | +| delegatedProperties.kt:39:31:39:51 | Integer | delegatedProperties.kt:18:5:40:5 | fn | TypeAccess | +| delegatedProperties.kt:39:31:39:51 | Integer | delegatedProperties.kt:39:31:39:51 | | TypeAccess | +| delegatedProperties.kt:39:31:39:51 | KProperty0 | delegatedProperties.kt:18:5:40:5 | fn | TypeAccess | +| delegatedProperties.kt:39:31:39:51 | KProperty0 | delegatedProperties.kt:39:31:39:51 | | TypeAccess | +| delegatedProperties.kt:39:31:39:51 | Object | delegatedProperties.kt:39:31:39:51 | get | TypeAccess | +| delegatedProperties.kt:39:31:39:51 | Object | delegatedProperties.kt:39:31:39:51 | get | TypeAccess | +| delegatedProperties.kt:39:31:39:51 | get(...) | delegatedProperties.kt:39:31:39:51 | invoke | MethodCall | +| delegatedProperties.kt:39:31:39:51 | get(...) | delegatedProperties.kt:39:31:39:51 | invoke | MethodCall | +| delegatedProperties.kt:39:31:39:51 | getValue(...) | delegatedProperties.kt:39:31:39:51 | | MethodCall | +| delegatedProperties.kt:39:31:39:51 | int | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:39:31:39:51 | new (...) | delegatedProperties.kt:39:31:39:51 | get | ClassInstanceExpr | +| delegatedProperties.kt:39:31:39:51 | new (...) | delegatedProperties.kt:39:31:39:51 | get | ClassInstanceExpr | +| delegatedProperties.kt:39:31:39:51 | provideDelegate(...) | delegatedProperties.kt:18:5:40:5 | fn | MethodCall | +| delegatedProperties.kt:39:31:39:51 | this | delegatedProperties.kt:39:31:39:51 | invoke | ThisAccess | +| delegatedProperties.kt:39:31:39:51 | this | delegatedProperties.kt:39:31:39:51 | invoke | ThisAccess | +| delegatedProperties.kt:39:31:39:51 | varResource2$delegate | delegatedProperties.kt:18:5:40:5 | fn | LocalVariableDeclExpr | +| delegatedProperties.kt:39:31:39:51 | varResource2$delegate | delegatedProperties.kt:39:31:39:51 | | VarAccess | +| delegatedProperties.kt:39:34:39:51 | DelegateProvider | delegatedProperties.kt:18:5:40:5 | fn | TypeAccess | +| delegatedProperties.kt:39:34:39:51 | new DelegateProvider(...) | delegatedProperties.kt:18:5:40:5 | fn | ClassInstanceExpr | +| delegatedProperties.kt:42:27:42:47 | ...::... | delegatedProperties.kt:42:27:42:47 | getVarResource0 | PropertyRefExpr | +| delegatedProperties.kt:42:27:42:47 | ...::... | delegatedProperties.kt:42:27:42:47 | setVarResource0 | PropertyRefExpr | +| delegatedProperties.kt:42:27:42:47 | ...=... | delegatedProperties.kt:17:1:43:1 | Owner | KtInitializerAssignExpr | +| delegatedProperties.kt:42:27:42:47 | Integer | delegatedProperties.kt:42:27:42:47 | getVarResource0 | TypeAccess | +| delegatedProperties.kt:42:27:42:47 | Integer | delegatedProperties.kt:42:27:42:47 | setVarResource0 | TypeAccess | +| delegatedProperties.kt:42:27:42:47 | KMutableProperty1 | delegatedProperties.kt:42:27:42:47 | getVarResource0 | TypeAccess | +| delegatedProperties.kt:42:27:42:47 | KMutableProperty1 | delegatedProperties.kt:42:27:42:47 | setVarResource0 | TypeAccess | +| delegatedProperties.kt:42:27:42:47 | Owner | delegatedProperties.kt:42:27:42:47 | getVarResource0 | TypeAccess | +| delegatedProperties.kt:42:27:42:47 | Owner | delegatedProperties.kt:42:27:42:47 | setVarResource0 | TypeAccess | +| delegatedProperties.kt:42:27:42:47 | ResourceDelegate | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:42:27:42:47 | Unit | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:42:27:42:47 | a0 | delegatedProperties.kt:42:27:42:47 | get | VarAccess | +| delegatedProperties.kt:42:27:42:47 | a0 | delegatedProperties.kt:42:27:42:47 | get | VarAccess | +| delegatedProperties.kt:42:27:42:47 | a0 | delegatedProperties.kt:42:27:42:47 | invoke | VarAccess | +| delegatedProperties.kt:42:27:42:47 | a0 | delegatedProperties.kt:42:27:42:47 | invoke | VarAccess | +| delegatedProperties.kt:42:27:42:47 | a0 | delegatedProperties.kt:42:27:42:47 | set | VarAccess | +| delegatedProperties.kt:42:27:42:47 | a0 | delegatedProperties.kt:42:27:42:47 | set | VarAccess | +| delegatedProperties.kt:42:27:42:47 | a1 | delegatedProperties.kt:42:27:42:47 | set | VarAccess | +| delegatedProperties.kt:42:27:42:47 | a1 | delegatedProperties.kt:42:27:42:47 | set | VarAccess | +| delegatedProperties.kt:42:27:42:47 | get(...) | delegatedProperties.kt:42:27:42:47 | invoke | MethodCall | +| delegatedProperties.kt:42:27:42:47 | get(...) | delegatedProperties.kt:42:27:42:47 | invoke | MethodCall | +| delegatedProperties.kt:42:27:42:47 | getValue(...) | delegatedProperties.kt:42:27:42:47 | getVarResource0 | MethodCall | +| delegatedProperties.kt:42:27:42:47 | getVarResource0(...) | delegatedProperties.kt:42:27:42:47 | get | MethodCall | +| delegatedProperties.kt:42:27:42:47 | getVarResource0(...) | delegatedProperties.kt:42:27:42:47 | get | MethodCall | +| delegatedProperties.kt:42:27:42:47 | int | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:42:27:42:47 | int | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:42:27:42:47 | setValue(...) | delegatedProperties.kt:42:27:42:47 | setVarResource0 | MethodCall | +| delegatedProperties.kt:42:27:42:47 | setVarResource0(...) | delegatedProperties.kt:42:27:42:47 | set | MethodCall | +| delegatedProperties.kt:42:27:42:47 | setVarResource0(...) | delegatedProperties.kt:42:27:42:47 | set | MethodCall | +| delegatedProperties.kt:42:27:42:47 | this | delegatedProperties.kt:42:27:42:47 | getVarResource0 | ThisAccess | +| delegatedProperties.kt:42:27:42:47 | this | delegatedProperties.kt:42:27:42:47 | invoke | ThisAccess | +| delegatedProperties.kt:42:27:42:47 | this | delegatedProperties.kt:42:27:42:47 | invoke | ThisAccess | +| delegatedProperties.kt:42:27:42:47 | this | delegatedProperties.kt:42:27:42:47 | setVarResource0 | ThisAccess | +| delegatedProperties.kt:42:27:42:47 | this.varResource0$delegate | delegatedProperties.kt:42:27:42:47 | getVarResource0 | VarAccess | +| delegatedProperties.kt:42:27:42:47 | this.varResource0$delegate | delegatedProperties.kt:42:27:42:47 | setVarResource0 | VarAccess | +| delegatedProperties.kt:42:27:42:47 | varResource0$delegate | delegatedProperties.kt:17:1:43:1 | Owner | VarAccess | +| delegatedProperties.kt:42:30:42:47 | | delegatedProperties.kt:42:27:42:47 | setVarResource0 | VarAccess | +| delegatedProperties.kt:42:30:42:47 | ResourceDelegate | delegatedProperties.kt:17:1:43:1 | Owner | TypeAccess | +| delegatedProperties.kt:42:30:42:47 | new ResourceDelegate(...) | delegatedProperties.kt:17:1:43:1 | Owner | ClassInstanceExpr | +| delegatedProperties.kt:46:14:48:5 | int | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:46:27:46:41 | Owner | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:46:44:46:65 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| delegatedProperties.kt:46:44:46:65 | KProperty | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:47:16:47:16 | 1 | delegatedProperties.kt:46:14:48:5 | getValue | IntegerLiteral | +| delegatedProperties.kt:49:14:50:5 | Unit | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:49:27:49:41 | Owner | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:49:44:49:65 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| delegatedProperties.kt:49:44:49:65 | KProperty | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:49:68:49:78 | Integer | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:54:14:57:5 | ResourceDelegate | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:54:34:54:48 | Owner | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:54:51:54:68 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| delegatedProperties.kt:54:51:54:68 | KProperty | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:56:16:56:33 | ResourceDelegate | delegatedProperties.kt:54:14:57:5 | provideDelegate | TypeAccess | +| delegatedProperties.kt:56:16:56:33 | new ResourceDelegate(...) | delegatedProperties.kt:54:14:57:5 | provideDelegate | ClassInstanceExpr | +| delegatedProperties.kt:60:1:60:24 | ...=... | delegatedProperties.kt:0:0:0:0 | | KtInitializerAssignExpr | +| delegatedProperties.kt:60:1:60:24 | ...=... | delegatedProperties.kt:60:1:60:24 | setTopLevelInt | AssignExpr | +| delegatedProperties.kt:60:1:60:24 | | delegatedProperties.kt:60:1:60:24 | setTopLevelInt | VarAccess | +| delegatedProperties.kt:60:1:60:24 | DelegatedPropertiesKt | delegatedProperties.kt:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:60:1:60:24 | DelegatedPropertiesKt | delegatedProperties.kt:60:1:60:24 | getTopLevelInt | TypeAccess | +| delegatedProperties.kt:60:1:60:24 | DelegatedPropertiesKt | delegatedProperties.kt:60:1:60:24 | setTopLevelInt | TypeAccess | +| delegatedProperties.kt:60:1:60:24 | DelegatedPropertiesKt.topLevelInt | delegatedProperties.kt:0:0:0:0 | | VarAccess | +| delegatedProperties.kt:60:1:60:24 | DelegatedPropertiesKt.topLevelInt | delegatedProperties.kt:60:1:60:24 | getTopLevelInt | VarAccess | +| delegatedProperties.kt:60:1:60:24 | DelegatedPropertiesKt.topLevelInt | delegatedProperties.kt:60:1:60:24 | setTopLevelInt | VarAccess | +| delegatedProperties.kt:60:1:60:24 | Unit | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:60:1:60:24 | int | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:60:1:60:24 | int | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:60:1:60:24 | int | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:60:24:60:24 | 0 | delegatedProperties.kt:0:0:0:0 | | IntegerLiteral | +| delegatedProperties.kt:62:25:62:48 | ...=... | delegatedProperties.kt:62:1:62:49 | ClassWithDelegate | KtInitializerAssignExpr | +| delegatedProperties.kt:62:25:62:48 | anotherClassInt | delegatedProperties.kt:62:1:62:49 | ClassWithDelegate | VarAccess | +| delegatedProperties.kt:62:25:62:48 | anotherClassInt | delegatedProperties.kt:62:1:62:49 | ClassWithDelegate | VarAccess | +| delegatedProperties.kt:62:25:62:48 | int | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:62:25:62:48 | int | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:62:25:62:48 | int | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:62:25:62:48 | this | delegatedProperties.kt:62:25:62:48 | getAnotherClassInt | ThisAccess | +| delegatedProperties.kt:62:25:62:48 | this.anotherClassInt | delegatedProperties.kt:62:25:62:48 | getAnotherClassInt | VarAccess | +| delegatedProperties.kt:63:17:63:37 | ...=... | delegatedProperties.kt:63:6:63:38 | Base | KtInitializerAssignExpr | +| delegatedProperties.kt:63:17:63:37 | baseClassInt | delegatedProperties.kt:63:6:63:38 | Base | VarAccess | +| delegatedProperties.kt:63:17:63:37 | baseClassInt | delegatedProperties.kt:63:6:63:38 | Base | VarAccess | +| delegatedProperties.kt:63:17:63:37 | int | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:63:17:63:37 | int | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:63:17:63:37 | int | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:63:17:63:37 | this | delegatedProperties.kt:63:17:63:37 | getBaseClassInt | ThisAccess | +| delegatedProperties.kt:63:17:63:37 | this.baseClassInt | delegatedProperties.kt:63:17:63:37 | getBaseClassInt | VarAccess | +| delegatedProperties.kt:65:15:65:32 | ...=... | delegatedProperties.kt:65:1:85:1 | MyClass | KtInitializerAssignExpr | +| delegatedProperties.kt:65:15:65:32 | ...=... | delegatedProperties.kt:65:15:65:32 | setMemberInt | AssignExpr | +| delegatedProperties.kt:65:15:65:32 | | delegatedProperties.kt:65:15:65:32 | setMemberInt | VarAccess | +| delegatedProperties.kt:65:15:65:32 | Unit | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:65:15:65:32 | int | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:65:15:65:32 | int | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:65:15:65:32 | int | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:65:15:65:32 | int | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:65:15:65:32 | memberInt | delegatedProperties.kt:65:1:85:1 | MyClass | VarAccess | +| delegatedProperties.kt:65:15:65:32 | memberInt | delegatedProperties.kt:65:1:85:1 | MyClass | VarAccess | +| delegatedProperties.kt:65:15:65:32 | this | delegatedProperties.kt:65:15:65:32 | getMemberInt | ThisAccess | +| delegatedProperties.kt:65:15:65:32 | this | delegatedProperties.kt:65:15:65:32 | setMemberInt | ThisAccess | +| delegatedProperties.kt:65:15:65:32 | this.memberInt | delegatedProperties.kt:65:15:65:32 | getMemberInt | VarAccess | +| delegatedProperties.kt:65:15:65:32 | this.memberInt | delegatedProperties.kt:65:15:65:32 | setMemberInt | VarAccess | +| delegatedProperties.kt:65:35:65:77 | ...=... | delegatedProperties.kt:65:1:85:1 | MyClass | KtInitializerAssignExpr | +| delegatedProperties.kt:65:35:65:77 | ClassWithDelegate | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:65:35:65:77 | ClassWithDelegate | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:65:35:65:77 | ClassWithDelegate | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:65:35:65:77 | anotherClassInstance | delegatedProperties.kt:65:1:85:1 | MyClass | VarAccess | +| delegatedProperties.kt:65:35:65:77 | anotherClassInstance | delegatedProperties.kt:65:1:85:1 | MyClass | VarAccess | +| delegatedProperties.kt:65:35:65:77 | this | delegatedProperties.kt:65:35:65:77 | getAnotherClassInstance | ThisAccess | +| delegatedProperties.kt:65:35:65:77 | this.anotherClassInstance | delegatedProperties.kt:65:35:65:77 | getAnotherClassInstance | VarAccess | +| delegatedProperties.kt:65:87:65:95 | memberInt | delegatedProperties.kt:65:1:85:1 | MyClass | VarAccess | +| delegatedProperties.kt:66:33:66:50 | ...::... | delegatedProperties.kt:66:33:66:50 | getDelegatedToMember1 | PropertyRefExpr | +| delegatedProperties.kt:66:33:66:50 | ...::... | delegatedProperties.kt:66:33:66:50 | setDelegatedToMember1 | PropertyRefExpr | +| delegatedProperties.kt:66:33:66:50 | ...=... | delegatedProperties.kt:65:1:85:1 | MyClass | KtInitializerAssignExpr | +| delegatedProperties.kt:66:33:66:50 | Integer | delegatedProperties.kt:66:33:66:50 | getDelegatedToMember1 | TypeAccess | +| delegatedProperties.kt:66:33:66:50 | Integer | delegatedProperties.kt:66:33:66:50 | getDelegatedToMember1 | TypeAccess | +| delegatedProperties.kt:66:33:66:50 | Integer | delegatedProperties.kt:66:33:66:50 | setDelegatedToMember1 | TypeAccess | +| delegatedProperties.kt:66:33:66:50 | Integer | delegatedProperties.kt:66:33:66:50 | setDelegatedToMember1 | TypeAccess | +| delegatedProperties.kt:66:33:66:50 | Integer | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:66:33:66:50 | KMutableProperty0 | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:66:33:66:50 | KMutableProperty1 | delegatedProperties.kt:66:33:66:50 | getDelegatedToMember1 | TypeAccess | +| delegatedProperties.kt:66:33:66:50 | KMutableProperty1 | delegatedProperties.kt:66:33:66:50 | setDelegatedToMember1 | TypeAccess | +| delegatedProperties.kt:66:33:66:50 | MyClass | delegatedProperties.kt:66:33:66:50 | getDelegatedToMember1 | TypeAccess | +| delegatedProperties.kt:66:33:66:50 | MyClass | delegatedProperties.kt:66:33:66:50 | setDelegatedToMember1 | TypeAccess | +| delegatedProperties.kt:66:33:66:50 | PropertyReferenceDelegatesKt | delegatedProperties.kt:66:33:66:50 | getDelegatedToMember1 | TypeAccess | +| delegatedProperties.kt:66:33:66:50 | PropertyReferenceDelegatesKt | delegatedProperties.kt:66:33:66:50 | setDelegatedToMember1 | TypeAccess | +| delegatedProperties.kt:66:33:66:50 | Unit | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:66:33:66:50 | a0 | delegatedProperties.kt:66:33:66:50 | get | VarAccess | +| delegatedProperties.kt:66:33:66:50 | a0 | delegatedProperties.kt:66:33:66:50 | get | VarAccess | +| delegatedProperties.kt:66:33:66:50 | a0 | delegatedProperties.kt:66:33:66:50 | invoke | VarAccess | +| delegatedProperties.kt:66:33:66:50 | a0 | delegatedProperties.kt:66:33:66:50 | invoke | VarAccess | +| delegatedProperties.kt:66:33:66:50 | a0 | delegatedProperties.kt:66:33:66:50 | set | VarAccess | +| delegatedProperties.kt:66:33:66:50 | a0 | delegatedProperties.kt:66:33:66:50 | set | VarAccess | +| delegatedProperties.kt:66:33:66:50 | a1 | delegatedProperties.kt:66:33:66:50 | set | VarAccess | +| delegatedProperties.kt:66:33:66:50 | a1 | delegatedProperties.kt:66:33:66:50 | set | VarAccess | +| delegatedProperties.kt:66:33:66:50 | delegatedToMember1$delegate | delegatedProperties.kt:65:1:85:1 | MyClass | VarAccess | +| delegatedProperties.kt:66:33:66:50 | get(...) | delegatedProperties.kt:66:33:66:50 | invoke | MethodCall | +| delegatedProperties.kt:66:33:66:50 | get(...) | delegatedProperties.kt:66:33:66:50 | invoke | MethodCall | +| delegatedProperties.kt:66:33:66:50 | getDelegatedToMember1(...) | delegatedProperties.kt:66:33:66:50 | get | MethodCall | +| delegatedProperties.kt:66:33:66:50 | getDelegatedToMember1(...) | delegatedProperties.kt:66:33:66:50 | get | MethodCall | +| delegatedProperties.kt:66:33:66:50 | getValue(...) | delegatedProperties.kt:66:33:66:50 | getDelegatedToMember1 | MethodCall | +| delegatedProperties.kt:66:33:66:50 | int | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:66:33:66:50 | int | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:66:33:66:50 | setDelegatedToMember1(...) | delegatedProperties.kt:66:33:66:50 | set | MethodCall | +| delegatedProperties.kt:66:33:66:50 | setDelegatedToMember1(...) | delegatedProperties.kt:66:33:66:50 | set | MethodCall | +| delegatedProperties.kt:66:33:66:50 | setValue(...) | delegatedProperties.kt:66:33:66:50 | setDelegatedToMember1 | MethodCall | +| delegatedProperties.kt:66:33:66:50 | this | delegatedProperties.kt:66:33:66:50 | getDelegatedToMember1 | ThisAccess | +| delegatedProperties.kt:66:33:66:50 | this | delegatedProperties.kt:66:33:66:50 | invoke | ThisAccess | +| delegatedProperties.kt:66:33:66:50 | this | delegatedProperties.kt:66:33:66:50 | invoke | ThisAccess | +| delegatedProperties.kt:66:33:66:50 | this | delegatedProperties.kt:66:33:66:50 | setDelegatedToMember1 | ThisAccess | +| delegatedProperties.kt:66:33:66:50 | this.delegatedToMember1$delegate | delegatedProperties.kt:66:33:66:50 | getDelegatedToMember1 | VarAccess | +| delegatedProperties.kt:66:33:66:50 | this.delegatedToMember1$delegate | delegatedProperties.kt:66:33:66:50 | setDelegatedToMember1 | VarAccess | +| delegatedProperties.kt:66:36:66:39 | MyClass | delegatedProperties.kt:65:1:85:1 | MyClass | TypeAccess | +| delegatedProperties.kt:66:36:66:39 | MyClass.this | delegatedProperties.kt:65:1:85:1 | MyClass | ThisAccess | +| delegatedProperties.kt:66:36:66:50 | ...::... | delegatedProperties.kt:65:1:85:1 | MyClass | PropertyRefExpr | +| delegatedProperties.kt:66:36:66:50 | ...=... | delegatedProperties.kt:66:36:66:50 | | AssignExpr | +| delegatedProperties.kt:66:36:66:50 | | delegatedProperties.kt:66:36:66:50 | | VarAccess | +| delegatedProperties.kt:66:36:66:50 | | delegatedProperties.kt:66:33:66:50 | setDelegatedToMember1 | VarAccess | +| delegatedProperties.kt:66:36:66:50 | Integer | delegatedProperties.kt:65:1:85:1 | MyClass | TypeAccess | +| delegatedProperties.kt:66:36:66:50 | KMutableProperty0 | delegatedProperties.kt:65:1:85:1 | MyClass | TypeAccess | +| delegatedProperties.kt:66:36:66:50 | MyClass | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:66:36:66:50 | a0 | delegatedProperties.kt:66:36:66:50 | set | VarAccess | +| delegatedProperties.kt:66:36:66:50 | get(...) | delegatedProperties.kt:66:36:66:50 | invoke | MethodCall | +| delegatedProperties.kt:66:36:66:50 | getMemberInt(...) | delegatedProperties.kt:66:36:66:50 | get | MethodCall | +| delegatedProperties.kt:66:36:66:50 | setMemberInt(...) | delegatedProperties.kt:66:36:66:50 | set | MethodCall | +| delegatedProperties.kt:66:36:66:50 | this | delegatedProperties.kt:66:36:66:50 | | ThisAccess | +| delegatedProperties.kt:66:36:66:50 | this | delegatedProperties.kt:66:36:66:50 | get | ThisAccess | +| delegatedProperties.kt:66:36:66:50 | this | delegatedProperties.kt:66:36:66:50 | invoke | ThisAccess | +| delegatedProperties.kt:66:36:66:50 | this | delegatedProperties.kt:66:36:66:50 | set | ThisAccess | +| delegatedProperties.kt:66:36:66:50 | this. | delegatedProperties.kt:66:36:66:50 | | VarAccess | +| delegatedProperties.kt:66:36:66:50 | this. | delegatedProperties.kt:66:36:66:50 | get | VarAccess | +| delegatedProperties.kt:66:36:66:50 | this. | delegatedProperties.kt:66:36:66:50 | set | VarAccess | +| delegatedProperties.kt:67:33:67:53 | ...::... | delegatedProperties.kt:67:33:67:53 | getDelegatedToMember2 | PropertyRefExpr | +| delegatedProperties.kt:67:33:67:53 | ...::... | delegatedProperties.kt:67:33:67:53 | setDelegatedToMember2 | PropertyRefExpr | +| delegatedProperties.kt:67:33:67:53 | ...=... | delegatedProperties.kt:65:1:85:1 | MyClass | KtInitializerAssignExpr | +| delegatedProperties.kt:67:33:67:53 | Integer | delegatedProperties.kt:67:33:67:53 | getDelegatedToMember2 | TypeAccess | +| delegatedProperties.kt:67:33:67:53 | Integer | delegatedProperties.kt:67:33:67:53 | getDelegatedToMember2 | TypeAccess | +| delegatedProperties.kt:67:33:67:53 | Integer | delegatedProperties.kt:67:33:67:53 | setDelegatedToMember2 | TypeAccess | +| delegatedProperties.kt:67:33:67:53 | Integer | delegatedProperties.kt:67:33:67:53 | setDelegatedToMember2 | TypeAccess | +| delegatedProperties.kt:67:33:67:53 | Integer | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:67:33:67:53 | KMutableProperty1 | delegatedProperties.kt:67:33:67:53 | getDelegatedToMember2 | TypeAccess | +| delegatedProperties.kt:67:33:67:53 | KMutableProperty1 | delegatedProperties.kt:67:33:67:53 | setDelegatedToMember2 | TypeAccess | +| delegatedProperties.kt:67:33:67:53 | KMutableProperty1 | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:67:33:67:53 | MyClass | delegatedProperties.kt:67:33:67:53 | getDelegatedToMember2 | TypeAccess | +| delegatedProperties.kt:67:33:67:53 | MyClass | delegatedProperties.kt:67:33:67:53 | getDelegatedToMember2 | TypeAccess | +| delegatedProperties.kt:67:33:67:53 | MyClass | delegatedProperties.kt:67:33:67:53 | setDelegatedToMember2 | TypeAccess | +| delegatedProperties.kt:67:33:67:53 | MyClass | delegatedProperties.kt:67:33:67:53 | setDelegatedToMember2 | TypeAccess | +| delegatedProperties.kt:67:33:67:53 | MyClass | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:67:33:67:53 | PropertyReferenceDelegatesKt | delegatedProperties.kt:67:33:67:53 | getDelegatedToMember2 | TypeAccess | +| delegatedProperties.kt:67:33:67:53 | PropertyReferenceDelegatesKt | delegatedProperties.kt:67:33:67:53 | setDelegatedToMember2 | TypeAccess | +| delegatedProperties.kt:67:33:67:53 | Unit | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:67:33:67:53 | a0 | delegatedProperties.kt:67:33:67:53 | get | VarAccess | +| delegatedProperties.kt:67:33:67:53 | a0 | delegatedProperties.kt:67:33:67:53 | get | VarAccess | +| delegatedProperties.kt:67:33:67:53 | a0 | delegatedProperties.kt:67:33:67:53 | invoke | VarAccess | +| delegatedProperties.kt:67:33:67:53 | a0 | delegatedProperties.kt:67:33:67:53 | invoke | VarAccess | +| delegatedProperties.kt:67:33:67:53 | a0 | delegatedProperties.kt:67:33:67:53 | set | VarAccess | +| delegatedProperties.kt:67:33:67:53 | a0 | delegatedProperties.kt:67:33:67:53 | set | VarAccess | +| delegatedProperties.kt:67:33:67:53 | a1 | delegatedProperties.kt:67:33:67:53 | set | VarAccess | +| delegatedProperties.kt:67:33:67:53 | a1 | delegatedProperties.kt:67:33:67:53 | set | VarAccess | +| delegatedProperties.kt:67:33:67:53 | delegatedToMember2$delegate | delegatedProperties.kt:65:1:85:1 | MyClass | VarAccess | +| delegatedProperties.kt:67:33:67:53 | get(...) | delegatedProperties.kt:67:33:67:53 | invoke | MethodCall | +| delegatedProperties.kt:67:33:67:53 | get(...) | delegatedProperties.kt:67:33:67:53 | invoke | MethodCall | +| delegatedProperties.kt:67:33:67:53 | getDelegatedToMember2(...) | delegatedProperties.kt:67:33:67:53 | get | MethodCall | +| delegatedProperties.kt:67:33:67:53 | getDelegatedToMember2(...) | delegatedProperties.kt:67:33:67:53 | get | MethodCall | +| delegatedProperties.kt:67:33:67:53 | getValue(...) | delegatedProperties.kt:67:33:67:53 | getDelegatedToMember2 | MethodCall | +| delegatedProperties.kt:67:33:67:53 | int | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:67:33:67:53 | int | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:67:33:67:53 | setDelegatedToMember2(...) | delegatedProperties.kt:67:33:67:53 | set | MethodCall | +| delegatedProperties.kt:67:33:67:53 | setDelegatedToMember2(...) | delegatedProperties.kt:67:33:67:53 | set | MethodCall | +| delegatedProperties.kt:67:33:67:53 | setValue(...) | delegatedProperties.kt:67:33:67:53 | setDelegatedToMember2 | MethodCall | +| delegatedProperties.kt:67:33:67:53 | this | delegatedProperties.kt:67:33:67:53 | getDelegatedToMember2 | ThisAccess | +| delegatedProperties.kt:67:33:67:53 | this | delegatedProperties.kt:67:33:67:53 | invoke | ThisAccess | +| delegatedProperties.kt:67:33:67:53 | this | delegatedProperties.kt:67:33:67:53 | invoke | ThisAccess | +| delegatedProperties.kt:67:33:67:53 | this | delegatedProperties.kt:67:33:67:53 | setDelegatedToMember2 | ThisAccess | +| delegatedProperties.kt:67:33:67:53 | this.delegatedToMember2$delegate | delegatedProperties.kt:67:33:67:53 | getDelegatedToMember2 | VarAccess | +| delegatedProperties.kt:67:33:67:53 | this.delegatedToMember2$delegate | delegatedProperties.kt:67:33:67:53 | setDelegatedToMember2 | VarAccess | +| delegatedProperties.kt:67:36:67:53 | ...::... | delegatedProperties.kt:65:1:85:1 | MyClass | PropertyRefExpr | +| delegatedProperties.kt:67:36:67:53 | | delegatedProperties.kt:67:33:67:53 | setDelegatedToMember2 | VarAccess | +| delegatedProperties.kt:67:36:67:53 | Integer | delegatedProperties.kt:65:1:85:1 | MyClass | TypeAccess | +| delegatedProperties.kt:67:36:67:53 | KMutableProperty1 | delegatedProperties.kt:65:1:85:1 | MyClass | TypeAccess | +| delegatedProperties.kt:67:36:67:53 | MyClass | delegatedProperties.kt:65:1:85:1 | MyClass | TypeAccess | +| delegatedProperties.kt:67:36:67:53 | a0 | delegatedProperties.kt:67:36:67:53 | get | VarAccess | +| delegatedProperties.kt:67:36:67:53 | a0 | delegatedProperties.kt:67:36:67:53 | invoke | VarAccess | +| delegatedProperties.kt:67:36:67:53 | a0 | delegatedProperties.kt:67:36:67:53 | set | VarAccess | +| delegatedProperties.kt:67:36:67:53 | a1 | delegatedProperties.kt:67:36:67:53 | set | VarAccess | +| delegatedProperties.kt:67:36:67:53 | get(...) | delegatedProperties.kt:67:36:67:53 | invoke | MethodCall | +| delegatedProperties.kt:67:36:67:53 | getMemberInt(...) | delegatedProperties.kt:67:36:67:53 | get | MethodCall | +| delegatedProperties.kt:67:36:67:53 | setMemberInt(...) | delegatedProperties.kt:67:36:67:53 | set | MethodCall | +| delegatedProperties.kt:67:36:67:53 | this | delegatedProperties.kt:67:36:67:53 | invoke | ThisAccess | +| delegatedProperties.kt:69:36:69:56 | ...::... | delegatedProperties.kt:69:36:69:56 | getDelegatedToExtMember1 | PropertyRefExpr | +| delegatedProperties.kt:69:36:69:56 | ...::... | delegatedProperties.kt:69:36:69:56 | setDelegatedToExtMember1 | PropertyRefExpr | +| delegatedProperties.kt:69:36:69:56 | ...=... | delegatedProperties.kt:65:1:85:1 | MyClass | KtInitializerAssignExpr | +| delegatedProperties.kt:69:36:69:56 | Integer | delegatedProperties.kt:69:36:69:56 | getDelegatedToExtMember1 | TypeAccess | +| delegatedProperties.kt:69:36:69:56 | Integer | delegatedProperties.kt:69:36:69:56 | getDelegatedToExtMember1 | TypeAccess | +| delegatedProperties.kt:69:36:69:56 | Integer | delegatedProperties.kt:69:36:69:56 | setDelegatedToExtMember1 | TypeAccess | +| delegatedProperties.kt:69:36:69:56 | Integer | delegatedProperties.kt:69:36:69:56 | setDelegatedToExtMember1 | TypeAccess | +| delegatedProperties.kt:69:36:69:56 | Integer | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:69:36:69:56 | KMutableProperty0 | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:69:36:69:56 | KMutableProperty1 | delegatedProperties.kt:69:36:69:56 | getDelegatedToExtMember1 | TypeAccess | +| delegatedProperties.kt:69:36:69:56 | KMutableProperty1 | delegatedProperties.kt:69:36:69:56 | setDelegatedToExtMember1 | TypeAccess | +| delegatedProperties.kt:69:36:69:56 | MyClass | delegatedProperties.kt:69:36:69:56 | getDelegatedToExtMember1 | TypeAccess | +| delegatedProperties.kt:69:36:69:56 | MyClass | delegatedProperties.kt:69:36:69:56 | setDelegatedToExtMember1 | TypeAccess | +| delegatedProperties.kt:69:36:69:56 | PropertyReferenceDelegatesKt | delegatedProperties.kt:69:36:69:56 | getDelegatedToExtMember1 | TypeAccess | +| delegatedProperties.kt:69:36:69:56 | PropertyReferenceDelegatesKt | delegatedProperties.kt:69:36:69:56 | setDelegatedToExtMember1 | TypeAccess | +| delegatedProperties.kt:69:36:69:56 | Unit | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:69:36:69:56 | a0 | delegatedProperties.kt:69:36:69:56 | get | VarAccess | +| delegatedProperties.kt:69:36:69:56 | a0 | delegatedProperties.kt:69:36:69:56 | get | VarAccess | +| delegatedProperties.kt:69:36:69:56 | a0 | delegatedProperties.kt:69:36:69:56 | invoke | VarAccess | +| delegatedProperties.kt:69:36:69:56 | a0 | delegatedProperties.kt:69:36:69:56 | invoke | VarAccess | +| delegatedProperties.kt:69:36:69:56 | a0 | delegatedProperties.kt:69:36:69:56 | set | VarAccess | +| delegatedProperties.kt:69:36:69:56 | a0 | delegatedProperties.kt:69:36:69:56 | set | VarAccess | +| delegatedProperties.kt:69:36:69:56 | a1 | delegatedProperties.kt:69:36:69:56 | set | VarAccess | +| delegatedProperties.kt:69:36:69:56 | a1 | delegatedProperties.kt:69:36:69:56 | set | VarAccess | +| delegatedProperties.kt:69:36:69:56 | delegatedToExtMember1$delegate | delegatedProperties.kt:65:1:85:1 | MyClass | VarAccess | +| delegatedProperties.kt:69:36:69:56 | get(...) | delegatedProperties.kt:69:36:69:56 | invoke | MethodCall | +| delegatedProperties.kt:69:36:69:56 | get(...) | delegatedProperties.kt:69:36:69:56 | invoke | MethodCall | +| delegatedProperties.kt:69:36:69:56 | getDelegatedToExtMember1(...) | delegatedProperties.kt:69:36:69:56 | get | MethodCall | +| delegatedProperties.kt:69:36:69:56 | getDelegatedToExtMember1(...) | delegatedProperties.kt:69:36:69:56 | get | MethodCall | +| delegatedProperties.kt:69:36:69:56 | getValue(...) | delegatedProperties.kt:69:36:69:56 | getDelegatedToExtMember1 | MethodCall | +| delegatedProperties.kt:69:36:69:56 | int | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:69:36:69:56 | int | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:69:36:69:56 | setDelegatedToExtMember1(...) | delegatedProperties.kt:69:36:69:56 | set | MethodCall | +| delegatedProperties.kt:69:36:69:56 | setDelegatedToExtMember1(...) | delegatedProperties.kt:69:36:69:56 | set | MethodCall | +| delegatedProperties.kt:69:36:69:56 | setValue(...) | delegatedProperties.kt:69:36:69:56 | setDelegatedToExtMember1 | MethodCall | +| delegatedProperties.kt:69:36:69:56 | this | delegatedProperties.kt:69:36:69:56 | getDelegatedToExtMember1 | ThisAccess | +| delegatedProperties.kt:69:36:69:56 | this | delegatedProperties.kt:69:36:69:56 | invoke | ThisAccess | +| delegatedProperties.kt:69:36:69:56 | this | delegatedProperties.kt:69:36:69:56 | invoke | ThisAccess | +| delegatedProperties.kt:69:36:69:56 | this | delegatedProperties.kt:69:36:69:56 | setDelegatedToExtMember1 | ThisAccess | +| delegatedProperties.kt:69:36:69:56 | this.delegatedToExtMember1$delegate | delegatedProperties.kt:69:36:69:56 | getDelegatedToExtMember1 | VarAccess | +| delegatedProperties.kt:69:36:69:56 | this.delegatedToExtMember1$delegate | delegatedProperties.kt:69:36:69:56 | setDelegatedToExtMember1 | VarAccess | +| delegatedProperties.kt:69:39:69:42 | MyClass | delegatedProperties.kt:65:1:85:1 | MyClass | TypeAccess | +| delegatedProperties.kt:69:39:69:42 | MyClass.this | delegatedProperties.kt:65:1:85:1 | MyClass | ThisAccess | +| delegatedProperties.kt:69:39:69:56 | ...::... | delegatedProperties.kt:65:1:85:1 | MyClass | PropertyRefExpr | +| delegatedProperties.kt:69:39:69:56 | ...=... | delegatedProperties.kt:69:39:69:56 | | AssignExpr | +| delegatedProperties.kt:69:39:69:56 | | delegatedProperties.kt:69:39:69:56 | | VarAccess | +| delegatedProperties.kt:69:39:69:56 | | delegatedProperties.kt:69:36:69:56 | setDelegatedToExtMember1 | VarAccess | +| delegatedProperties.kt:69:39:69:56 | DelegatedPropertiesKt | delegatedProperties.kt:69:39:69:56 | get | TypeAccess | +| delegatedProperties.kt:69:39:69:56 | DelegatedPropertiesKt | delegatedProperties.kt:69:39:69:56 | set | TypeAccess | +| delegatedProperties.kt:69:39:69:56 | Integer | delegatedProperties.kt:65:1:85:1 | MyClass | TypeAccess | +| delegatedProperties.kt:69:39:69:56 | KMutableProperty0 | delegatedProperties.kt:65:1:85:1 | MyClass | TypeAccess | +| delegatedProperties.kt:69:39:69:56 | MyClass | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:69:39:69:56 | a0 | delegatedProperties.kt:69:39:69:56 | set | VarAccess | +| delegatedProperties.kt:69:39:69:56 | get(...) | delegatedProperties.kt:69:39:69:56 | invoke | MethodCall | +| delegatedProperties.kt:69:39:69:56 | getExtDelegated(...) | delegatedProperties.kt:69:39:69:56 | get | MethodCall | +| delegatedProperties.kt:69:39:69:56 | setExtDelegated(...) | delegatedProperties.kt:69:39:69:56 | set | MethodCall | +| delegatedProperties.kt:69:39:69:56 | this | delegatedProperties.kt:69:39:69:56 | | ThisAccess | +| delegatedProperties.kt:69:39:69:56 | this | delegatedProperties.kt:69:39:69:56 | get | ThisAccess | +| delegatedProperties.kt:69:39:69:56 | this | delegatedProperties.kt:69:39:69:56 | invoke | ThisAccess | +| delegatedProperties.kt:69:39:69:56 | this | delegatedProperties.kt:69:39:69:56 | set | ThisAccess | +| delegatedProperties.kt:69:39:69:56 | this. | delegatedProperties.kt:69:39:69:56 | | VarAccess | +| delegatedProperties.kt:69:39:69:56 | this. | delegatedProperties.kt:69:39:69:56 | get | VarAccess | +| delegatedProperties.kt:69:39:69:56 | this. | delegatedProperties.kt:69:39:69:56 | set | VarAccess | +| delegatedProperties.kt:70:36:70:59 | ...::... | delegatedProperties.kt:70:36:70:59 | getDelegatedToExtMember2 | PropertyRefExpr | +| delegatedProperties.kt:70:36:70:59 | ...::... | delegatedProperties.kt:70:36:70:59 | setDelegatedToExtMember2 | PropertyRefExpr | +| delegatedProperties.kt:70:36:70:59 | ...=... | delegatedProperties.kt:65:1:85:1 | MyClass | KtInitializerAssignExpr | +| delegatedProperties.kt:70:36:70:59 | Integer | delegatedProperties.kt:70:36:70:59 | getDelegatedToExtMember2 | TypeAccess | +| delegatedProperties.kt:70:36:70:59 | Integer | delegatedProperties.kt:70:36:70:59 | getDelegatedToExtMember2 | TypeAccess | +| delegatedProperties.kt:70:36:70:59 | Integer | delegatedProperties.kt:70:36:70:59 | setDelegatedToExtMember2 | TypeAccess | +| delegatedProperties.kt:70:36:70:59 | Integer | delegatedProperties.kt:70:36:70:59 | setDelegatedToExtMember2 | TypeAccess | +| delegatedProperties.kt:70:36:70:59 | Integer | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:70:36:70:59 | KMutableProperty1 | delegatedProperties.kt:70:36:70:59 | getDelegatedToExtMember2 | TypeAccess | +| delegatedProperties.kt:70:36:70:59 | KMutableProperty1 | delegatedProperties.kt:70:36:70:59 | setDelegatedToExtMember2 | TypeAccess | +| delegatedProperties.kt:70:36:70:59 | KMutableProperty1 | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:70:36:70:59 | MyClass | delegatedProperties.kt:70:36:70:59 | getDelegatedToExtMember2 | TypeAccess | +| delegatedProperties.kt:70:36:70:59 | MyClass | delegatedProperties.kt:70:36:70:59 | getDelegatedToExtMember2 | TypeAccess | +| delegatedProperties.kt:70:36:70:59 | MyClass | delegatedProperties.kt:70:36:70:59 | setDelegatedToExtMember2 | TypeAccess | +| delegatedProperties.kt:70:36:70:59 | MyClass | delegatedProperties.kt:70:36:70:59 | setDelegatedToExtMember2 | TypeAccess | +| delegatedProperties.kt:70:36:70:59 | MyClass | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:70:36:70:59 | PropertyReferenceDelegatesKt | delegatedProperties.kt:70:36:70:59 | getDelegatedToExtMember2 | TypeAccess | +| delegatedProperties.kt:70:36:70:59 | PropertyReferenceDelegatesKt | delegatedProperties.kt:70:36:70:59 | setDelegatedToExtMember2 | TypeAccess | +| delegatedProperties.kt:70:36:70:59 | Unit | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:70:36:70:59 | a0 | delegatedProperties.kt:70:36:70:59 | get | VarAccess | +| delegatedProperties.kt:70:36:70:59 | a0 | delegatedProperties.kt:70:36:70:59 | get | VarAccess | +| delegatedProperties.kt:70:36:70:59 | a0 | delegatedProperties.kt:70:36:70:59 | invoke | VarAccess | +| delegatedProperties.kt:70:36:70:59 | a0 | delegatedProperties.kt:70:36:70:59 | invoke | VarAccess | +| delegatedProperties.kt:70:36:70:59 | a0 | delegatedProperties.kt:70:36:70:59 | set | VarAccess | +| delegatedProperties.kt:70:36:70:59 | a0 | delegatedProperties.kt:70:36:70:59 | set | VarAccess | +| delegatedProperties.kt:70:36:70:59 | a1 | delegatedProperties.kt:70:36:70:59 | set | VarAccess | +| delegatedProperties.kt:70:36:70:59 | a1 | delegatedProperties.kt:70:36:70:59 | set | VarAccess | +| delegatedProperties.kt:70:36:70:59 | delegatedToExtMember2$delegate | delegatedProperties.kt:65:1:85:1 | MyClass | VarAccess | +| delegatedProperties.kt:70:36:70:59 | get(...) | delegatedProperties.kt:70:36:70:59 | invoke | MethodCall | +| delegatedProperties.kt:70:36:70:59 | get(...) | delegatedProperties.kt:70:36:70:59 | invoke | MethodCall | +| delegatedProperties.kt:70:36:70:59 | getDelegatedToExtMember2(...) | delegatedProperties.kt:70:36:70:59 | get | MethodCall | +| delegatedProperties.kt:70:36:70:59 | getDelegatedToExtMember2(...) | delegatedProperties.kt:70:36:70:59 | get | MethodCall | +| delegatedProperties.kt:70:36:70:59 | getValue(...) | delegatedProperties.kt:70:36:70:59 | getDelegatedToExtMember2 | MethodCall | +| delegatedProperties.kt:70:36:70:59 | int | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:70:36:70:59 | int | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:70:36:70:59 | setDelegatedToExtMember2(...) | delegatedProperties.kt:70:36:70:59 | set | MethodCall | +| delegatedProperties.kt:70:36:70:59 | setDelegatedToExtMember2(...) | delegatedProperties.kt:70:36:70:59 | set | MethodCall | +| delegatedProperties.kt:70:36:70:59 | setValue(...) | delegatedProperties.kt:70:36:70:59 | setDelegatedToExtMember2 | MethodCall | +| delegatedProperties.kt:70:36:70:59 | this | delegatedProperties.kt:70:36:70:59 | getDelegatedToExtMember2 | ThisAccess | +| delegatedProperties.kt:70:36:70:59 | this | delegatedProperties.kt:70:36:70:59 | invoke | ThisAccess | +| delegatedProperties.kt:70:36:70:59 | this | delegatedProperties.kt:70:36:70:59 | invoke | ThisAccess | +| delegatedProperties.kt:70:36:70:59 | this | delegatedProperties.kt:70:36:70:59 | setDelegatedToExtMember2 | ThisAccess | +| delegatedProperties.kt:70:36:70:59 | this.delegatedToExtMember2$delegate | delegatedProperties.kt:70:36:70:59 | getDelegatedToExtMember2 | VarAccess | +| delegatedProperties.kt:70:36:70:59 | this.delegatedToExtMember2$delegate | delegatedProperties.kt:70:36:70:59 | setDelegatedToExtMember2 | VarAccess | +| delegatedProperties.kt:70:39:70:59 | ...::... | delegatedProperties.kt:65:1:85:1 | MyClass | PropertyRefExpr | +| delegatedProperties.kt:70:39:70:59 | | delegatedProperties.kt:70:36:70:59 | setDelegatedToExtMember2 | VarAccess | +| delegatedProperties.kt:70:39:70:59 | DelegatedPropertiesKt | delegatedProperties.kt:70:39:70:59 | get | TypeAccess | +| delegatedProperties.kt:70:39:70:59 | DelegatedPropertiesKt | delegatedProperties.kt:70:39:70:59 | set | TypeAccess | +| delegatedProperties.kt:70:39:70:59 | Integer | delegatedProperties.kt:65:1:85:1 | MyClass | TypeAccess | +| delegatedProperties.kt:70:39:70:59 | KMutableProperty1 | delegatedProperties.kt:65:1:85:1 | MyClass | TypeAccess | +| delegatedProperties.kt:70:39:70:59 | MyClass | delegatedProperties.kt:65:1:85:1 | MyClass | TypeAccess | +| delegatedProperties.kt:70:39:70:59 | a0 | delegatedProperties.kt:70:39:70:59 | get | VarAccess | +| delegatedProperties.kt:70:39:70:59 | a0 | delegatedProperties.kt:70:39:70:59 | invoke | VarAccess | +| delegatedProperties.kt:70:39:70:59 | a0 | delegatedProperties.kt:70:39:70:59 | set | VarAccess | +| delegatedProperties.kt:70:39:70:59 | a1 | delegatedProperties.kt:70:39:70:59 | set | VarAccess | +| delegatedProperties.kt:70:39:70:59 | get(...) | delegatedProperties.kt:70:39:70:59 | invoke | MethodCall | +| delegatedProperties.kt:70:39:70:59 | getExtDelegated(...) | delegatedProperties.kt:70:39:70:59 | get | MethodCall | +| delegatedProperties.kt:70:39:70:59 | setExtDelegated(...) | delegatedProperties.kt:70:39:70:59 | set | MethodCall | +| delegatedProperties.kt:70:39:70:59 | this | delegatedProperties.kt:70:39:70:59 | invoke | ThisAccess | +| delegatedProperties.kt:72:36:72:56 | ...::... | delegatedProperties.kt:72:36:72:56 | getDelegatedToBaseClass1 | PropertyRefExpr | +| delegatedProperties.kt:72:36:72:56 | ...=... | delegatedProperties.kt:65:1:85:1 | MyClass | KtInitializerAssignExpr | +| delegatedProperties.kt:72:36:72:56 | Integer | delegatedProperties.kt:72:36:72:56 | getDelegatedToBaseClass1 | TypeAccess | +| delegatedProperties.kt:72:36:72:56 | Integer | delegatedProperties.kt:72:36:72:56 | getDelegatedToBaseClass1 | TypeAccess | +| delegatedProperties.kt:72:36:72:56 | Integer | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:72:36:72:56 | KProperty0 | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:72:36:72:56 | KProperty1 | delegatedProperties.kt:72:36:72:56 | getDelegatedToBaseClass1 | TypeAccess | +| delegatedProperties.kt:72:36:72:56 | MyClass | delegatedProperties.kt:72:36:72:56 | getDelegatedToBaseClass1 | TypeAccess | +| delegatedProperties.kt:72:36:72:56 | PropertyReferenceDelegatesKt | delegatedProperties.kt:72:36:72:56 | getDelegatedToBaseClass1 | TypeAccess | +| delegatedProperties.kt:72:36:72:56 | a0 | delegatedProperties.kt:72:36:72:56 | get | VarAccess | +| delegatedProperties.kt:72:36:72:56 | a0 | delegatedProperties.kt:72:36:72:56 | invoke | VarAccess | +| delegatedProperties.kt:72:36:72:56 | delegatedToBaseClass1$delegate | delegatedProperties.kt:65:1:85:1 | MyClass | VarAccess | +| delegatedProperties.kt:72:36:72:56 | get(...) | delegatedProperties.kt:72:36:72:56 | invoke | MethodCall | +| delegatedProperties.kt:72:36:72:56 | getDelegatedToBaseClass1(...) | delegatedProperties.kt:72:36:72:56 | get | MethodCall | +| delegatedProperties.kt:72:36:72:56 | getValue(...) | delegatedProperties.kt:72:36:72:56 | getDelegatedToBaseClass1 | MethodCall | +| delegatedProperties.kt:72:36:72:56 | int | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:72:36:72:56 | this | delegatedProperties.kt:72:36:72:56 | getDelegatedToBaseClass1 | ThisAccess | +| delegatedProperties.kt:72:36:72:56 | this | delegatedProperties.kt:72:36:72:56 | invoke | ThisAccess | +| delegatedProperties.kt:72:36:72:56 | this.delegatedToBaseClass1$delegate | delegatedProperties.kt:72:36:72:56 | getDelegatedToBaseClass1 | VarAccess | +| delegatedProperties.kt:72:39:72:42 | MyClass | delegatedProperties.kt:65:1:85:1 | MyClass | TypeAccess | +| delegatedProperties.kt:72:39:72:42 | MyClass.this | delegatedProperties.kt:65:1:85:1 | MyClass | ThisAccess | +| delegatedProperties.kt:72:39:72:56 | ...::... | delegatedProperties.kt:65:1:85:1 | MyClass | PropertyRefExpr | +| delegatedProperties.kt:72:39:72:56 | ...=... | delegatedProperties.kt:72:39:72:56 | | AssignExpr | +| delegatedProperties.kt:72:39:72:56 | | delegatedProperties.kt:72:39:72:56 | | VarAccess | +| delegatedProperties.kt:72:39:72:56 | Integer | delegatedProperties.kt:65:1:85:1 | MyClass | TypeAccess | +| delegatedProperties.kt:72:39:72:56 | KProperty0 | delegatedProperties.kt:65:1:85:1 | MyClass | TypeAccess | +| delegatedProperties.kt:72:39:72:56 | MyClass | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:72:39:72:56 | get(...) | delegatedProperties.kt:72:39:72:56 | invoke | MethodCall | +| delegatedProperties.kt:72:39:72:56 | getBaseClassInt(...) | delegatedProperties.kt:72:39:72:56 | get | MethodCall | +| delegatedProperties.kt:72:39:72:56 | this | delegatedProperties.kt:72:39:72:56 | | ThisAccess | +| delegatedProperties.kt:72:39:72:56 | this | delegatedProperties.kt:72:39:72:56 | get | ThisAccess | +| delegatedProperties.kt:72:39:72:56 | this | delegatedProperties.kt:72:39:72:56 | invoke | ThisAccess | +| delegatedProperties.kt:72:39:72:56 | this. | delegatedProperties.kt:72:39:72:56 | | VarAccess | +| delegatedProperties.kt:72:39:72:56 | this. | delegatedProperties.kt:72:39:72:56 | get | VarAccess | +| delegatedProperties.kt:73:36:73:56 | ...::... | delegatedProperties.kt:73:36:73:56 | getDelegatedToBaseClass2 | PropertyRefExpr | +| delegatedProperties.kt:73:36:73:56 | ...=... | delegatedProperties.kt:65:1:85:1 | MyClass | KtInitializerAssignExpr | +| delegatedProperties.kt:73:36:73:56 | Base | delegatedProperties.kt:73:36:73:56 | getDelegatedToBaseClass2 | TypeAccess | +| delegatedProperties.kt:73:36:73:56 | Base | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:73:36:73:56 | Integer | delegatedProperties.kt:73:36:73:56 | getDelegatedToBaseClass2 | TypeAccess | +| delegatedProperties.kt:73:36:73:56 | Integer | delegatedProperties.kt:73:36:73:56 | getDelegatedToBaseClass2 | TypeAccess | +| delegatedProperties.kt:73:36:73:56 | Integer | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:73:36:73:56 | KProperty1 | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:73:36:73:56 | KProperty1 | delegatedProperties.kt:73:36:73:56 | getDelegatedToBaseClass2 | TypeAccess | +| delegatedProperties.kt:73:36:73:56 | MyClass | delegatedProperties.kt:73:36:73:56 | getDelegatedToBaseClass2 | TypeAccess | +| delegatedProperties.kt:73:36:73:56 | PropertyReferenceDelegatesKt | delegatedProperties.kt:73:36:73:56 | getDelegatedToBaseClass2 | TypeAccess | +| delegatedProperties.kt:73:36:73:56 | a0 | delegatedProperties.kt:73:36:73:56 | get | VarAccess | +| delegatedProperties.kt:73:36:73:56 | a0 | delegatedProperties.kt:73:36:73:56 | invoke | VarAccess | +| delegatedProperties.kt:73:36:73:56 | delegatedToBaseClass2$delegate | delegatedProperties.kt:65:1:85:1 | MyClass | VarAccess | +| delegatedProperties.kt:73:36:73:56 | get(...) | delegatedProperties.kt:73:36:73:56 | invoke | MethodCall | +| delegatedProperties.kt:73:36:73:56 | getDelegatedToBaseClass2(...) | delegatedProperties.kt:73:36:73:56 | get | MethodCall | +| delegatedProperties.kt:73:36:73:56 | getValue(...) | delegatedProperties.kt:73:36:73:56 | getDelegatedToBaseClass2 | MethodCall | +| delegatedProperties.kt:73:36:73:56 | int | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:73:36:73:56 | this | delegatedProperties.kt:73:36:73:56 | getDelegatedToBaseClass2 | ThisAccess | +| delegatedProperties.kt:73:36:73:56 | this | delegatedProperties.kt:73:36:73:56 | invoke | ThisAccess | +| delegatedProperties.kt:73:36:73:56 | this.delegatedToBaseClass2$delegate | delegatedProperties.kt:73:36:73:56 | getDelegatedToBaseClass2 | VarAccess | +| delegatedProperties.kt:73:39:73:56 | ...::... | delegatedProperties.kt:65:1:85:1 | MyClass | PropertyRefExpr | +| delegatedProperties.kt:73:39:73:56 | Base | delegatedProperties.kt:65:1:85:1 | MyClass | TypeAccess | +| delegatedProperties.kt:73:39:73:56 | Integer | delegatedProperties.kt:65:1:85:1 | MyClass | TypeAccess | +| delegatedProperties.kt:73:39:73:56 | KProperty1 | delegatedProperties.kt:65:1:85:1 | MyClass | TypeAccess | +| delegatedProperties.kt:73:39:73:56 | a0 | delegatedProperties.kt:73:39:73:56 | get | VarAccess | +| delegatedProperties.kt:73:39:73:56 | a0 | delegatedProperties.kt:73:39:73:56 | invoke | VarAccess | +| delegatedProperties.kt:73:39:73:56 | get(...) | delegatedProperties.kt:73:39:73:56 | invoke | MethodCall | +| delegatedProperties.kt:73:39:73:56 | getBaseClassInt(...) | delegatedProperties.kt:73:39:73:56 | get | MethodCall | +| delegatedProperties.kt:73:39:73:56 | this | delegatedProperties.kt:73:39:73:56 | invoke | ThisAccess | +| delegatedProperties.kt:75:39:75:78 | ...::... | delegatedProperties.kt:75:39:75:78 | getDelegatedToAnotherClass1 | PropertyRefExpr | +| delegatedProperties.kt:75:39:75:78 | ...=... | delegatedProperties.kt:65:1:85:1 | MyClass | KtInitializerAssignExpr | +| delegatedProperties.kt:75:39:75:78 | Integer | delegatedProperties.kt:75:39:75:78 | getDelegatedToAnotherClass1 | TypeAccess | +| delegatedProperties.kt:75:39:75:78 | Integer | delegatedProperties.kt:75:39:75:78 | getDelegatedToAnotherClass1 | TypeAccess | +| delegatedProperties.kt:75:39:75:78 | Integer | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:75:39:75:78 | KProperty0 | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:75:39:75:78 | KProperty1 | delegatedProperties.kt:75:39:75:78 | getDelegatedToAnotherClass1 | TypeAccess | +| delegatedProperties.kt:75:39:75:78 | MyClass | delegatedProperties.kt:75:39:75:78 | getDelegatedToAnotherClass1 | TypeAccess | +| delegatedProperties.kt:75:39:75:78 | PropertyReferenceDelegatesKt | delegatedProperties.kt:75:39:75:78 | getDelegatedToAnotherClass1 | TypeAccess | +| delegatedProperties.kt:75:39:75:78 | a0 | delegatedProperties.kt:75:39:75:78 | get | VarAccess | +| delegatedProperties.kt:75:39:75:78 | a0 | delegatedProperties.kt:75:39:75:78 | invoke | VarAccess | +| delegatedProperties.kt:75:39:75:78 | delegatedToAnotherClass1$delegate | delegatedProperties.kt:65:1:85:1 | MyClass | VarAccess | +| delegatedProperties.kt:75:39:75:78 | get(...) | delegatedProperties.kt:75:39:75:78 | invoke | MethodCall | +| delegatedProperties.kt:75:39:75:78 | getDelegatedToAnotherClass1(...) | delegatedProperties.kt:75:39:75:78 | get | MethodCall | +| delegatedProperties.kt:75:39:75:78 | getValue(...) | delegatedProperties.kt:75:39:75:78 | getDelegatedToAnotherClass1 | MethodCall | +| delegatedProperties.kt:75:39:75:78 | int | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:75:39:75:78 | this | delegatedProperties.kt:75:39:75:78 | getDelegatedToAnotherClass1 | ThisAccess | +| delegatedProperties.kt:75:39:75:78 | this | delegatedProperties.kt:75:39:75:78 | invoke | ThisAccess | +| delegatedProperties.kt:75:39:75:78 | this.delegatedToAnotherClass1$delegate | delegatedProperties.kt:75:39:75:78 | getDelegatedToAnotherClass1 | VarAccess | +| delegatedProperties.kt:75:42:75:61 | MyClass | delegatedProperties.kt:65:1:85:1 | MyClass | TypeAccess | +| delegatedProperties.kt:75:42:75:61 | MyClass.this | delegatedProperties.kt:65:1:85:1 | MyClass | ThisAccess | +| delegatedProperties.kt:75:42:75:61 | getAnotherClassInstance(...) | delegatedProperties.kt:65:1:85:1 | MyClass | MethodCall | +| delegatedProperties.kt:75:42:75:78 | ...::... | delegatedProperties.kt:65:1:85:1 | MyClass | PropertyRefExpr | +| delegatedProperties.kt:75:42:75:78 | ...=... | delegatedProperties.kt:75:42:75:78 | | AssignExpr | +| delegatedProperties.kt:75:42:75:78 | | delegatedProperties.kt:75:42:75:78 | | VarAccess | +| delegatedProperties.kt:75:42:75:78 | ClassWithDelegate | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:75:42:75:78 | Integer | delegatedProperties.kt:65:1:85:1 | MyClass | TypeAccess | +| delegatedProperties.kt:75:42:75:78 | KProperty0 | delegatedProperties.kt:65:1:85:1 | MyClass | TypeAccess | +| delegatedProperties.kt:75:42:75:78 | get(...) | delegatedProperties.kt:75:42:75:78 | invoke | MethodCall | +| delegatedProperties.kt:75:42:75:78 | getAnotherClassInt(...) | delegatedProperties.kt:75:42:75:78 | get | MethodCall | +| delegatedProperties.kt:75:42:75:78 | this | delegatedProperties.kt:75:42:75:78 | | ThisAccess | +| delegatedProperties.kt:75:42:75:78 | this | delegatedProperties.kt:75:42:75:78 | get | ThisAccess | +| delegatedProperties.kt:75:42:75:78 | this | delegatedProperties.kt:75:42:75:78 | invoke | ThisAccess | +| delegatedProperties.kt:75:42:75:78 | this. | delegatedProperties.kt:75:42:75:78 | | VarAccess | +| delegatedProperties.kt:75:42:75:78 | this. | delegatedProperties.kt:75:42:75:78 | get | VarAccess | +| delegatedProperties.kt:77:34:77:49 | ...::... | delegatedProperties.kt:77:34:77:49 | getDelegatedToTopLevel | PropertyRefExpr | +| delegatedProperties.kt:77:34:77:49 | ...::... | delegatedProperties.kt:77:34:77:49 | setDelegatedToTopLevel | PropertyRefExpr | +| delegatedProperties.kt:77:34:77:49 | ...=... | delegatedProperties.kt:65:1:85:1 | MyClass | KtInitializerAssignExpr | +| delegatedProperties.kt:77:34:77:49 | Integer | delegatedProperties.kt:77:34:77:49 | getDelegatedToTopLevel | TypeAccess | +| delegatedProperties.kt:77:34:77:49 | Integer | delegatedProperties.kt:77:34:77:49 | getDelegatedToTopLevel | TypeAccess | +| delegatedProperties.kt:77:34:77:49 | Integer | delegatedProperties.kt:77:34:77:49 | setDelegatedToTopLevel | TypeAccess | +| delegatedProperties.kt:77:34:77:49 | Integer | delegatedProperties.kt:77:34:77:49 | setDelegatedToTopLevel | TypeAccess | +| delegatedProperties.kt:77:34:77:49 | Integer | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:77:34:77:49 | KMutableProperty0 | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:77:34:77:49 | KMutableProperty1 | delegatedProperties.kt:77:34:77:49 | getDelegatedToTopLevel | TypeAccess | +| delegatedProperties.kt:77:34:77:49 | KMutableProperty1 | delegatedProperties.kt:77:34:77:49 | setDelegatedToTopLevel | TypeAccess | +| delegatedProperties.kt:77:34:77:49 | MyClass | delegatedProperties.kt:77:34:77:49 | getDelegatedToTopLevel | TypeAccess | +| delegatedProperties.kt:77:34:77:49 | MyClass | delegatedProperties.kt:77:34:77:49 | setDelegatedToTopLevel | TypeAccess | +| delegatedProperties.kt:77:34:77:49 | PropertyReferenceDelegatesKt | delegatedProperties.kt:77:34:77:49 | getDelegatedToTopLevel | TypeAccess | +| delegatedProperties.kt:77:34:77:49 | PropertyReferenceDelegatesKt | delegatedProperties.kt:77:34:77:49 | setDelegatedToTopLevel | TypeAccess | +| delegatedProperties.kt:77:34:77:49 | Unit | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:77:34:77:49 | a0 | delegatedProperties.kt:77:34:77:49 | get | VarAccess | +| delegatedProperties.kt:77:34:77:49 | a0 | delegatedProperties.kt:77:34:77:49 | get | VarAccess | +| delegatedProperties.kt:77:34:77:49 | a0 | delegatedProperties.kt:77:34:77:49 | invoke | VarAccess | +| delegatedProperties.kt:77:34:77:49 | a0 | delegatedProperties.kt:77:34:77:49 | invoke | VarAccess | +| delegatedProperties.kt:77:34:77:49 | a0 | delegatedProperties.kt:77:34:77:49 | set | VarAccess | +| delegatedProperties.kt:77:34:77:49 | a0 | delegatedProperties.kt:77:34:77:49 | set | VarAccess | +| delegatedProperties.kt:77:34:77:49 | a1 | delegatedProperties.kt:77:34:77:49 | set | VarAccess | +| delegatedProperties.kt:77:34:77:49 | a1 | delegatedProperties.kt:77:34:77:49 | set | VarAccess | +| delegatedProperties.kt:77:34:77:49 | delegatedToTopLevel$delegate | delegatedProperties.kt:65:1:85:1 | MyClass | VarAccess | +| delegatedProperties.kt:77:34:77:49 | get(...) | delegatedProperties.kt:77:34:77:49 | invoke | MethodCall | +| delegatedProperties.kt:77:34:77:49 | get(...) | delegatedProperties.kt:77:34:77:49 | invoke | MethodCall | +| delegatedProperties.kt:77:34:77:49 | getDelegatedToTopLevel(...) | delegatedProperties.kt:77:34:77:49 | get | MethodCall | +| delegatedProperties.kt:77:34:77:49 | getDelegatedToTopLevel(...) | delegatedProperties.kt:77:34:77:49 | get | MethodCall | +| delegatedProperties.kt:77:34:77:49 | getValue(...) | delegatedProperties.kt:77:34:77:49 | getDelegatedToTopLevel | MethodCall | +| delegatedProperties.kt:77:34:77:49 | int | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:77:34:77:49 | int | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:77:34:77:49 | setDelegatedToTopLevel(...) | delegatedProperties.kt:77:34:77:49 | set | MethodCall | +| delegatedProperties.kt:77:34:77:49 | setDelegatedToTopLevel(...) | delegatedProperties.kt:77:34:77:49 | set | MethodCall | +| delegatedProperties.kt:77:34:77:49 | setValue(...) | delegatedProperties.kt:77:34:77:49 | setDelegatedToTopLevel | MethodCall | +| delegatedProperties.kt:77:34:77:49 | this | delegatedProperties.kt:77:34:77:49 | getDelegatedToTopLevel | ThisAccess | +| delegatedProperties.kt:77:34:77:49 | this | delegatedProperties.kt:77:34:77:49 | invoke | ThisAccess | +| delegatedProperties.kt:77:34:77:49 | this | delegatedProperties.kt:77:34:77:49 | invoke | ThisAccess | +| delegatedProperties.kt:77:34:77:49 | this | delegatedProperties.kt:77:34:77:49 | setDelegatedToTopLevel | ThisAccess | +| delegatedProperties.kt:77:34:77:49 | this.delegatedToTopLevel$delegate | delegatedProperties.kt:77:34:77:49 | getDelegatedToTopLevel | VarAccess | +| delegatedProperties.kt:77:34:77:49 | this.delegatedToTopLevel$delegate | delegatedProperties.kt:77:34:77:49 | setDelegatedToTopLevel | VarAccess | +| delegatedProperties.kt:77:37:77:49 | ...::... | delegatedProperties.kt:65:1:85:1 | MyClass | PropertyRefExpr | +| delegatedProperties.kt:77:37:77:49 | | delegatedProperties.kt:77:34:77:49 | setDelegatedToTopLevel | VarAccess | +| delegatedProperties.kt:77:37:77:49 | DelegatedPropertiesKt | delegatedProperties.kt:77:37:77:49 | get | TypeAccess | +| delegatedProperties.kt:77:37:77:49 | DelegatedPropertiesKt | delegatedProperties.kt:77:37:77:49 | set | TypeAccess | +| delegatedProperties.kt:77:37:77:49 | Integer | delegatedProperties.kt:65:1:85:1 | MyClass | TypeAccess | +| delegatedProperties.kt:77:37:77:49 | KMutableProperty0 | delegatedProperties.kt:65:1:85:1 | MyClass | TypeAccess | +| delegatedProperties.kt:77:37:77:49 | a0 | delegatedProperties.kt:77:37:77:49 | set | VarAccess | +| delegatedProperties.kt:77:37:77:49 | get(...) | delegatedProperties.kt:77:37:77:49 | invoke | MethodCall | +| delegatedProperties.kt:77:37:77:49 | getTopLevelInt(...) | delegatedProperties.kt:77:37:77:49 | get | MethodCall | +| delegatedProperties.kt:77:37:77:49 | setTopLevelInt(...) | delegatedProperties.kt:77:37:77:49 | set | MethodCall | +| delegatedProperties.kt:77:37:77:49 | this | delegatedProperties.kt:77:37:77:49 | invoke | ThisAccess | +| delegatedProperties.kt:79:18:79:38 | ...::... | delegatedProperties.kt:79:18:79:38 | getMax | PropertyRefExpr | +| delegatedProperties.kt:79:18:79:38 | ...=... | delegatedProperties.kt:65:1:85:1 | MyClass | KtInitializerAssignExpr | +| delegatedProperties.kt:79:18:79:38 | Integer | delegatedProperties.kt:79:18:79:38 | getMax | TypeAccess | +| delegatedProperties.kt:79:18:79:38 | Integer | delegatedProperties.kt:79:18:79:38 | getMax | TypeAccess | +| delegatedProperties.kt:79:18:79:38 | Integer | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:79:18:79:38 | KProperty0 | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:79:18:79:38 | KProperty1 | delegatedProperties.kt:79:18:79:38 | getMax | TypeAccess | +| delegatedProperties.kt:79:18:79:38 | MyClass | delegatedProperties.kt:79:18:79:38 | getMax | TypeAccess | +| delegatedProperties.kt:79:18:79:38 | PropertyReferenceDelegatesKt | delegatedProperties.kt:79:18:79:38 | getMax | TypeAccess | +| delegatedProperties.kt:79:18:79:38 | a0 | delegatedProperties.kt:79:18:79:38 | get | VarAccess | +| delegatedProperties.kt:79:18:79:38 | a0 | delegatedProperties.kt:79:18:79:38 | invoke | VarAccess | +| delegatedProperties.kt:79:18:79:38 | get(...) | delegatedProperties.kt:79:18:79:38 | invoke | MethodCall | +| delegatedProperties.kt:79:18:79:38 | getMax(...) | delegatedProperties.kt:79:18:79:38 | get | MethodCall | +| delegatedProperties.kt:79:18:79:38 | getValue(...) | delegatedProperties.kt:79:18:79:38 | getMax | MethodCall | +| delegatedProperties.kt:79:18:79:38 | int | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:79:18:79:38 | max$delegate | delegatedProperties.kt:65:1:85:1 | MyClass | VarAccess | +| delegatedProperties.kt:79:18:79:38 | this | delegatedProperties.kt:79:18:79:38 | getMax | ThisAccess | +| delegatedProperties.kt:79:18:79:38 | this | delegatedProperties.kt:79:18:79:38 | invoke | ThisAccess | +| delegatedProperties.kt:79:18:79:38 | this.max$delegate | delegatedProperties.kt:79:18:79:38 | getMax | VarAccess | +| delegatedProperties.kt:79:21:79:38 | ...::... | delegatedProperties.kt:65:1:85:1 | MyClass | PropertyRefExpr | +| delegatedProperties.kt:79:21:79:38 | Integer | delegatedProperties.kt:65:1:85:1 | MyClass | TypeAccess | +| delegatedProperties.kt:79:21:79:38 | KProperty0 | delegatedProperties.kt:65:1:85:1 | MyClass | TypeAccess | +| delegatedProperties.kt:79:21:79:38 | MAX_VALUE | delegatedProperties.kt:79:21:79:38 | get | VarAccess | +| delegatedProperties.kt:79:21:79:38 | get(...) | delegatedProperties.kt:79:21:79:38 | invoke | MethodCall | +| delegatedProperties.kt:79:21:79:38 | this | delegatedProperties.kt:79:21:79:38 | invoke | ThisAccess | +| delegatedProperties.kt:81:5:84:5 | Unit | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:82:37:82:54 | ...::... | delegatedProperties.kt:82:37:82:54 | | PropertyRefExpr | +| delegatedProperties.kt:82:37:82:54 | ...::... | delegatedProperties.kt:82:37:82:54 | | PropertyRefExpr | +| delegatedProperties.kt:82:37:82:54 | (...) | delegatedProperties.kt:82:37:82:54 | get | MethodCall | +| delegatedProperties.kt:82:37:82:54 | (...) | delegatedProperties.kt:82:37:82:54 | get | MethodCall | +| delegatedProperties.kt:82:37:82:54 | (...) | delegatedProperties.kt:82:37:82:54 | set | MethodCall | +| delegatedProperties.kt:82:37:82:54 | (...) | delegatedProperties.kt:82:37:82:54 | set | MethodCall | +| delegatedProperties.kt:82:37:82:54 | Integer | delegatedProperties.kt:82:37:82:54 | | TypeAccess | +| delegatedProperties.kt:82:37:82:54 | Integer | delegatedProperties.kt:82:37:82:54 | | TypeAccess | +| delegatedProperties.kt:82:37:82:54 | Integer | delegatedProperties.kt:82:37:82:54 | | TypeAccess | +| delegatedProperties.kt:82:37:82:54 | Integer | delegatedProperties.kt:82:37:82:54 | | TypeAccess | +| delegatedProperties.kt:82:37:82:54 | KMutableProperty0 | delegatedProperties.kt:82:37:82:54 | | TypeAccess | +| delegatedProperties.kt:82:37:82:54 | KMutableProperty0 | delegatedProperties.kt:82:37:82:54 | | TypeAccess | +| delegatedProperties.kt:82:37:82:54 | Object | delegatedProperties.kt:82:37:82:54 | get | TypeAccess | +| delegatedProperties.kt:82:37:82:54 | Object | delegatedProperties.kt:82:37:82:54 | get | TypeAccess | +| delegatedProperties.kt:82:37:82:54 | Object | delegatedProperties.kt:82:37:82:54 | set | TypeAccess | +| delegatedProperties.kt:82:37:82:54 | Object | delegatedProperties.kt:82:37:82:54 | set | TypeAccess | +| delegatedProperties.kt:82:37:82:54 | PropertyReferenceDelegatesKt | delegatedProperties.kt:82:37:82:54 | | TypeAccess | +| delegatedProperties.kt:82:37:82:54 | PropertyReferenceDelegatesKt | delegatedProperties.kt:82:37:82:54 | | TypeAccess | +| delegatedProperties.kt:82:37:82:54 | Unit | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:82:37:82:54 | a0 | delegatedProperties.kt:82:37:82:54 | set | VarAccess | +| delegatedProperties.kt:82:37:82:54 | a0 | delegatedProperties.kt:82:37:82:54 | set | VarAccess | +| delegatedProperties.kt:82:37:82:54 | delegatedToMember3$delegate | delegatedProperties.kt:81:5:84:5 | fn | LocalVariableDeclExpr | +| delegatedProperties.kt:82:37:82:54 | delegatedToMember3$delegate | delegatedProperties.kt:82:37:82:54 | | VarAccess | +| delegatedProperties.kt:82:37:82:54 | delegatedToMember3$delegate | delegatedProperties.kt:82:37:82:54 | | VarAccess | +| delegatedProperties.kt:82:37:82:54 | get(...) | delegatedProperties.kt:82:37:82:54 | invoke | MethodCall | +| delegatedProperties.kt:82:37:82:54 | get(...) | delegatedProperties.kt:82:37:82:54 | invoke | MethodCall | +| delegatedProperties.kt:82:37:82:54 | getValue(...) | delegatedProperties.kt:82:37:82:54 | | MethodCall | +| delegatedProperties.kt:82:37:82:54 | int | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:82:37:82:54 | int | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:82:37:82:54 | new (...) | delegatedProperties.kt:82:37:82:54 | get | ClassInstanceExpr | +| delegatedProperties.kt:82:37:82:54 | new (...) | delegatedProperties.kt:82:37:82:54 | get | ClassInstanceExpr | +| delegatedProperties.kt:82:37:82:54 | new (...) | delegatedProperties.kt:82:37:82:54 | set | ClassInstanceExpr | +| delegatedProperties.kt:82:37:82:54 | new (...) | delegatedProperties.kt:82:37:82:54 | set | ClassInstanceExpr | +| delegatedProperties.kt:82:37:82:54 | setValue(...) | delegatedProperties.kt:82:37:82:54 | | MethodCall | +| delegatedProperties.kt:82:37:82:54 | this | delegatedProperties.kt:82:37:82:54 | invoke | ThisAccess | +| delegatedProperties.kt:82:37:82:54 | this | delegatedProperties.kt:82:37:82:54 | invoke | ThisAccess | +| delegatedProperties.kt:82:40:82:43 | this | delegatedProperties.kt:81:5:84:5 | fn | ThisAccess | +| delegatedProperties.kt:82:40:82:54 | ...::... | delegatedProperties.kt:81:5:84:5 | fn | PropertyRefExpr | +| delegatedProperties.kt:82:40:82:54 | ...=... | delegatedProperties.kt:82:40:82:54 | | AssignExpr | +| delegatedProperties.kt:82:40:82:54 | | delegatedProperties.kt:82:40:82:54 | | VarAccess | +| delegatedProperties.kt:82:40:82:54 | Integer | delegatedProperties.kt:81:5:84:5 | fn | TypeAccess | +| delegatedProperties.kt:82:40:82:54 | KMutableProperty0 | delegatedProperties.kt:81:5:84:5 | fn | TypeAccess | +| delegatedProperties.kt:82:40:82:54 | MyClass | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:82:40:82:54 | a0 | delegatedProperties.kt:82:40:82:54 | set | VarAccess | +| delegatedProperties.kt:82:40:82:54 | get(...) | delegatedProperties.kt:82:40:82:54 | invoke | MethodCall | +| delegatedProperties.kt:82:40:82:54 | getMemberInt(...) | delegatedProperties.kt:82:40:82:54 | get | MethodCall | +| delegatedProperties.kt:82:40:82:54 | setMemberInt(...) | delegatedProperties.kt:82:40:82:54 | set | MethodCall | +| delegatedProperties.kt:82:40:82:54 | this | delegatedProperties.kt:82:40:82:54 | | ThisAccess | +| delegatedProperties.kt:82:40:82:54 | this | delegatedProperties.kt:82:40:82:54 | get | ThisAccess | +| delegatedProperties.kt:82:40:82:54 | this | delegatedProperties.kt:82:40:82:54 | invoke | ThisAccess | +| delegatedProperties.kt:82:40:82:54 | this | delegatedProperties.kt:82:40:82:54 | set | ThisAccess | +| delegatedProperties.kt:82:40:82:54 | this. | delegatedProperties.kt:82:40:82:54 | | VarAccess | +| delegatedProperties.kt:82:40:82:54 | this. | delegatedProperties.kt:82:40:82:54 | get | VarAccess | +| delegatedProperties.kt:82:40:82:54 | this. | delegatedProperties.kt:82:40:82:54 | set | VarAccess | +| delegatedProperties.kt:82:40:82:54 | value | delegatedProperties.kt:82:37:82:54 | | VarAccess | +| delegatedProperties.kt:83:9:83:12 | fn(...) | delegatedProperties.kt:81:5:84:5 | fn | MethodCall | +| delegatedProperties.kt:83:9:83:12 | this | delegatedProperties.kt:81:5:84:5 | fn | ThisAccess | +| delegatedProperties.kt:87:1:87:46 | MyClass | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:87:1:87:46 | MyClass | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:87:31:87:46 | ...::... | delegatedProperties.kt:87:31:87:46 | getExtDelegated | PropertyRefExpr | +| delegatedProperties.kt:87:31:87:46 | ...::... | delegatedProperties.kt:87:31:87:46 | setExtDelegated | PropertyRefExpr | +| delegatedProperties.kt:87:31:87:46 | ...=... | delegatedProperties.kt:0:0:0:0 | | KtInitializerAssignExpr | +| delegatedProperties.kt:87:31:87:46 | DelegatedPropertiesKt | delegatedProperties.kt:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:87:31:87:46 | DelegatedPropertiesKt | delegatedProperties.kt:87:31:87:46 | get | TypeAccess | +| delegatedProperties.kt:87:31:87:46 | DelegatedPropertiesKt | delegatedProperties.kt:87:31:87:46 | get | TypeAccess | +| delegatedProperties.kt:87:31:87:46 | DelegatedPropertiesKt | delegatedProperties.kt:87:31:87:46 | getExtDelegated | TypeAccess | +| delegatedProperties.kt:87:31:87:46 | DelegatedPropertiesKt | delegatedProperties.kt:87:31:87:46 | set | TypeAccess | +| delegatedProperties.kt:87:31:87:46 | DelegatedPropertiesKt | delegatedProperties.kt:87:31:87:46 | set | TypeAccess | +| delegatedProperties.kt:87:31:87:46 | DelegatedPropertiesKt | delegatedProperties.kt:87:31:87:46 | setExtDelegated | TypeAccess | +| delegatedProperties.kt:87:31:87:46 | DelegatedPropertiesKt.extDelegated$delegateMyClass | delegatedProperties.kt:0:0:0:0 | | VarAccess | +| delegatedProperties.kt:87:31:87:46 | DelegatedPropertiesKt.extDelegated$delegateMyClass | delegatedProperties.kt:87:31:87:46 | getExtDelegated | VarAccess | +| delegatedProperties.kt:87:31:87:46 | DelegatedPropertiesKt.extDelegated$delegateMyClass | delegatedProperties.kt:87:31:87:46 | setExtDelegated | VarAccess | +| delegatedProperties.kt:87:31:87:46 | Integer | delegatedProperties.kt:87:31:87:46 | getExtDelegated | TypeAccess | +| delegatedProperties.kt:87:31:87:46 | Integer | delegatedProperties.kt:87:31:87:46 | getExtDelegated | TypeAccess | +| delegatedProperties.kt:87:31:87:46 | Integer | delegatedProperties.kt:87:31:87:46 | setExtDelegated | TypeAccess | +| delegatedProperties.kt:87:31:87:46 | Integer | delegatedProperties.kt:87:31:87:46 | setExtDelegated | TypeAccess | +| delegatedProperties.kt:87:31:87:46 | Integer | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:87:31:87:46 | KMutableProperty0 | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:87:31:87:46 | KMutableProperty1 | delegatedProperties.kt:87:31:87:46 | getExtDelegated | TypeAccess | +| delegatedProperties.kt:87:31:87:46 | KMutableProperty1 | delegatedProperties.kt:87:31:87:46 | setExtDelegated | TypeAccess | +| delegatedProperties.kt:87:31:87:46 | MyClass | delegatedProperties.kt:87:31:87:46 | getExtDelegated | TypeAccess | +| delegatedProperties.kt:87:31:87:46 | MyClass | delegatedProperties.kt:87:31:87:46 | setExtDelegated | TypeAccess | +| delegatedProperties.kt:87:31:87:46 | PropertyReferenceDelegatesKt | delegatedProperties.kt:87:31:87:46 | getExtDelegated | TypeAccess | +| delegatedProperties.kt:87:31:87:46 | PropertyReferenceDelegatesKt | delegatedProperties.kt:87:31:87:46 | setExtDelegated | TypeAccess | +| delegatedProperties.kt:87:31:87:46 | Unit | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:87:31:87:46 | a0 | delegatedProperties.kt:87:31:87:46 | get | VarAccess | +| delegatedProperties.kt:87:31:87:46 | a0 | delegatedProperties.kt:87:31:87:46 | get | VarAccess | +| delegatedProperties.kt:87:31:87:46 | a0 | delegatedProperties.kt:87:31:87:46 | invoke | VarAccess | +| delegatedProperties.kt:87:31:87:46 | a0 | delegatedProperties.kt:87:31:87:46 | invoke | VarAccess | +| delegatedProperties.kt:87:31:87:46 | a0 | delegatedProperties.kt:87:31:87:46 | set | VarAccess | +| delegatedProperties.kt:87:31:87:46 | a0 | delegatedProperties.kt:87:31:87:46 | set | VarAccess | +| delegatedProperties.kt:87:31:87:46 | a1 | delegatedProperties.kt:87:31:87:46 | set | VarAccess | +| delegatedProperties.kt:87:31:87:46 | a1 | delegatedProperties.kt:87:31:87:46 | set | VarAccess | +| delegatedProperties.kt:87:31:87:46 | get(...) | delegatedProperties.kt:87:31:87:46 | invoke | MethodCall | +| delegatedProperties.kt:87:31:87:46 | get(...) | delegatedProperties.kt:87:31:87:46 | invoke | MethodCall | +| delegatedProperties.kt:87:31:87:46 | getExtDelegated(...) | delegatedProperties.kt:87:31:87:46 | get | MethodCall | +| delegatedProperties.kt:87:31:87:46 | getExtDelegated(...) | delegatedProperties.kt:87:31:87:46 | get | MethodCall | +| delegatedProperties.kt:87:31:87:46 | getValue(...) | delegatedProperties.kt:87:31:87:46 | getExtDelegated | MethodCall | +| delegatedProperties.kt:87:31:87:46 | int | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:87:31:87:46 | int | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:87:31:87:46 | setExtDelegated(...) | delegatedProperties.kt:87:31:87:46 | set | MethodCall | +| delegatedProperties.kt:87:31:87:46 | setExtDelegated(...) | delegatedProperties.kt:87:31:87:46 | set | MethodCall | +| delegatedProperties.kt:87:31:87:46 | setValue(...) | delegatedProperties.kt:87:31:87:46 | setExtDelegated | MethodCall | +| delegatedProperties.kt:87:31:87:46 | this | delegatedProperties.kt:87:31:87:46 | invoke | ThisAccess | +| delegatedProperties.kt:87:31:87:46 | this | delegatedProperties.kt:87:31:87:46 | invoke | ThisAccess | +| delegatedProperties.kt:87:34:87:46 | ...::... | delegatedProperties.kt:0:0:0:0 | | PropertyRefExpr | +| delegatedProperties.kt:87:34:87:46 | | delegatedProperties.kt:87:31:87:46 | setExtDelegated | VarAccess | +| delegatedProperties.kt:87:34:87:46 | DelegatedPropertiesKt | delegatedProperties.kt:87:34:87:46 | get | TypeAccess | +| delegatedProperties.kt:87:34:87:46 | DelegatedPropertiesKt | delegatedProperties.kt:87:34:87:46 | set | TypeAccess | +| delegatedProperties.kt:87:34:87:46 | Integer | delegatedProperties.kt:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:87:34:87:46 | KMutableProperty0 | delegatedProperties.kt:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:87:34:87:46 | a0 | delegatedProperties.kt:87:34:87:46 | set | VarAccess | +| delegatedProperties.kt:87:34:87:46 | get(...) | delegatedProperties.kt:87:34:87:46 | invoke | MethodCall | +| delegatedProperties.kt:87:34:87:46 | getTopLevelInt(...) | delegatedProperties.kt:87:34:87:46 | get | MethodCall | +| delegatedProperties.kt:87:34:87:46 | setTopLevelInt(...) | delegatedProperties.kt:87:34:87:46 | set | MethodCall | +| delegatedProperties.kt:87:34:87:46 | this | delegatedProperties.kt:87:34:87:46 | invoke | ThisAccess | +| exprs.kt:0:0:0:0 | Color | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:0:0:0:0 | Color | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:0:0:0:0 | Color | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:0:0:0:0 | Color[] | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:0:0:0:0 | Direction | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:0:0:0:0 | Direction | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:0:0:0:0 | Direction | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:0:0:0:0 | Direction[] | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:0:0:0:0 | EnumEntries | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:0:0:0:0 | EnumEntries | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:0:0:0:0 | String | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:0:0:0:0 | String | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:4:1:142:1 | int | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:4:20:4:25 | int | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:4:28:4:33 | int | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:5:20:5:28 | byte | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:5:31:5:39 | byte | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:6:20:6:28 | short | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:6:31:6:39 | short | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:7:20:7:27 | long | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:7:30:7:37 | long | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:8:20:8:29 | double | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:8:32:8:41 | double | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:9:20:9:28 | float | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:9:31:9:39 | float | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:11:9:11:10 | i1 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:11:14:11:14 | 1 | exprs.kt:4:1:142:1 | topLevelMethod | IntegerLiteral | +| exprs.kt:12:9:12:10 | i2 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:12:14:12:14 | x | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:12:14:12:18 | ... + ... | exprs.kt:4:1:142:1 | topLevelMethod | AddExpr | +| exprs.kt:12:18:12:18 | y | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:13:9:13:10 | i3 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:13:14:13:14 | x | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:13:14:13:18 | ... - ... | exprs.kt:4:1:142:1 | topLevelMethod | SubExpr | +| exprs.kt:13:18:13:18 | y | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:14:9:14:10 | i4 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:14:14:14:14 | x | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:14:14:14:18 | ... / ... | exprs.kt:4:1:142:1 | topLevelMethod | DivExpr | +| exprs.kt:14:18:14:18 | y | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:15:9:15:10 | i5 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:15:14:15:14 | x | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:15:14:15:18 | ... % ... | exprs.kt:4:1:142:1 | topLevelMethod | RemExpr | +| exprs.kt:15:18:15:18 | y | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:16:9:16:10 | i6 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:16:14:16:14 | x | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:16:14:16:20 | ... << ... | exprs.kt:4:1:142:1 | topLevelMethod | LeftShiftExpr | +| exprs.kt:16:20:16:20 | y | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:17:9:17:10 | i7 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:17:14:17:14 | x | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:17:14:17:20 | ... >> ... | exprs.kt:4:1:142:1 | topLevelMethod | RightShiftExpr | +| exprs.kt:17:20:17:20 | y | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:18:9:18:10 | i8 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:18:14:18:14 | x | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:18:14:18:21 | ... >>> ... | exprs.kt:4:1:142:1 | topLevelMethod | UnsignedRightShiftExpr | +| exprs.kt:18:21:18:21 | y | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:19:9:19:10 | i9 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:19:14:19:14 | x | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:19:14:19:20 | ... & ... | exprs.kt:4:1:142:1 | topLevelMethod | AndBitwiseExpr | +| exprs.kt:19:20:19:20 | y | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:20:9:20:11 | i10 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:20:15:20:15 | x | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:20:15:20:20 | ... \| ... | exprs.kt:4:1:142:1 | topLevelMethod | OrBitwiseExpr | +| exprs.kt:20:20:20:20 | y | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:21:9:21:11 | i11 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:21:15:21:15 | x | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:21:15:21:21 | ... ^ ... | exprs.kt:4:1:142:1 | topLevelMethod | XorBitwiseExpr | +| exprs.kt:21:21:21:21 | y | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:22:9:22:11 | i12 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:22:15:22:15 | x | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:22:15:22:21 | ~... | exprs.kt:4:1:142:1 | topLevelMethod | BitNotExpr | +| exprs.kt:23:9:23:11 | i13 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:23:15:23:15 | x | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:23:15:23:20 | ... (value equals) ... | exprs.kt:4:1:142:1 | topLevelMethod | ValueEQExpr | +| exprs.kt:23:20:23:20 | y | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:24:9:24:11 | i14 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:24:15:24:15 | x | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:24:15:24:20 | ... (value not-equals) ... | exprs.kt:4:1:142:1 | topLevelMethod | ValueNEExpr | +| exprs.kt:24:20:24:20 | y | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:25:9:25:11 | i15 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:25:15:25:15 | x | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:25:15:25:19 | ... < ... | exprs.kt:4:1:142:1 | topLevelMethod | LTExpr | +| exprs.kt:25:19:25:19 | y | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:26:9:26:11 | i16 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:26:15:26:15 | x | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:26:15:26:20 | ... <= ... | exprs.kt:4:1:142:1 | topLevelMethod | LEExpr | +| exprs.kt:26:20:26:20 | y | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:27:9:27:11 | i17 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:27:15:27:15 | x | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:27:15:27:19 | ... > ... | exprs.kt:4:1:142:1 | topLevelMethod | GTExpr | +| exprs.kt:27:19:27:19 | y | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:28:9:28:11 | i18 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:28:15:28:15 | x | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:28:15:28:20 | ... >= ... | exprs.kt:4:1:142:1 | topLevelMethod | GEExpr | +| exprs.kt:28:20:28:20 | y | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:29:9:29:11 | i19 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:29:15:29:15 | x | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:29:15:29:21 | ... == ... | exprs.kt:4:1:142:1 | topLevelMethod | EQExpr | +| exprs.kt:29:21:29:21 | y | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:30:9:30:11 | i20 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:30:15:30:15 | x | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:30:15:30:21 | ... != ... | exprs.kt:4:1:142:1 | topLevelMethod | NEExpr | +| exprs.kt:30:21:30:21 | y | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:31:9:31:11 | i21 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:31:15:31:15 | x | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:31:15:31:25 | contains(...) | exprs.kt:4:1:142:1 | topLevelMethod | MethodCall | +| exprs.kt:31:20:31:20 | x | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:31:20:31:25 | rangeTo(...) | exprs.kt:4:1:142:1 | topLevelMethod | MethodCall | +| exprs.kt:31:25:31:25 | y | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:32:9:32:11 | i22 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:32:15:32:15 | x | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:32:15:32:26 | !... | exprs.kt:4:1:142:1 | topLevelMethod | LogNotExpr | +| exprs.kt:32:15:32:26 | contains(...) | exprs.kt:4:1:142:1 | topLevelMethod | MethodCall | +| exprs.kt:32:21:32:21 | x | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:32:21:32:26 | rangeTo(...) | exprs.kt:4:1:142:1 | topLevelMethod | MethodCall | +| exprs.kt:32:26:32:26 | y | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:34:9:34:11 | by1 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:34:15:34:17 | 1.0 | exprs.kt:4:1:142:1 | topLevelMethod | DoubleLiteral | +| exprs.kt:35:9:35:11 | by2 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:35:15:35:17 | byx | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:35:15:35:23 | ... + ... | exprs.kt:4:1:142:1 | topLevelMethod | AddExpr | +| exprs.kt:35:21:35:23 | byy | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:36:9:36:11 | by3 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:36:15:36:17 | byx | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:36:15:36:23 | ... - ... | exprs.kt:4:1:142:1 | topLevelMethod | SubExpr | +| exprs.kt:36:21:36:23 | byy | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:37:9:37:11 | by4 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:37:15:37:17 | byx | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:37:15:37:23 | ... / ... | exprs.kt:4:1:142:1 | topLevelMethod | DivExpr | +| exprs.kt:37:21:37:23 | byy | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:38:9:38:11 | by5 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:38:15:38:17 | byx | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:38:15:38:23 | ... % ... | exprs.kt:4:1:142:1 | topLevelMethod | RemExpr | +| exprs.kt:38:21:38:23 | byy | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:39:9:39:11 | by6 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:39:15:39:17 | byx | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:39:15:39:17 | intValue(...) | exprs.kt:4:1:142:1 | topLevelMethod | MethodCall | +| exprs.kt:39:15:39:24 | ... (value equals) ... | exprs.kt:4:1:142:1 | topLevelMethod | ValueEQExpr | +| exprs.kt:39:22:39:24 | byy | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:39:22:39:24 | intValue(...) | exprs.kt:4:1:142:1 | topLevelMethod | MethodCall | +| exprs.kt:40:9:40:11 | by7 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:40:15:40:17 | byx | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:40:15:40:17 | intValue(...) | exprs.kt:4:1:142:1 | topLevelMethod | MethodCall | +| exprs.kt:40:15:40:24 | ... (value not-equals) ... | exprs.kt:4:1:142:1 | topLevelMethod | ValueNEExpr | +| exprs.kt:40:22:40:24 | byy | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:40:22:40:24 | intValue(...) | exprs.kt:4:1:142:1 | topLevelMethod | MethodCall | +| exprs.kt:41:9:41:11 | by8 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:41:15:41:17 | byx | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:41:15:41:17 | intValue(...) | exprs.kt:4:1:142:1 | topLevelMethod | MethodCall | +| exprs.kt:41:15:41:23 | ... < ... | exprs.kt:4:1:142:1 | topLevelMethod | LTExpr | +| exprs.kt:41:21:41:23 | byy | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:41:21:41:23 | intValue(...) | exprs.kt:4:1:142:1 | topLevelMethod | MethodCall | +| exprs.kt:42:9:42:11 | by9 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:42:15:42:17 | byx | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:42:15:42:17 | intValue(...) | exprs.kt:4:1:142:1 | topLevelMethod | MethodCall | +| exprs.kt:42:15:42:24 | ... <= ... | exprs.kt:4:1:142:1 | topLevelMethod | LEExpr | +| exprs.kt:42:22:42:24 | byy | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:42:22:42:24 | intValue(...) | exprs.kt:4:1:142:1 | topLevelMethod | MethodCall | +| exprs.kt:43:9:43:12 | by10 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:43:16:43:18 | byx | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:43:16:43:18 | intValue(...) | exprs.kt:4:1:142:1 | topLevelMethod | MethodCall | +| exprs.kt:43:16:43:24 | ... > ... | exprs.kt:4:1:142:1 | topLevelMethod | GTExpr | +| exprs.kt:43:22:43:24 | byy | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:43:22:43:24 | intValue(...) | exprs.kt:4:1:142:1 | topLevelMethod | MethodCall | +| exprs.kt:44:9:44:12 | by11 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:44:16:44:18 | byx | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:44:16:44:18 | intValue(...) | exprs.kt:4:1:142:1 | topLevelMethod | MethodCall | +| exprs.kt:44:16:44:25 | ... >= ... | exprs.kt:4:1:142:1 | topLevelMethod | GEExpr | +| exprs.kt:44:23:44:25 | byy | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:44:23:44:25 | intValue(...) | exprs.kt:4:1:142:1 | topLevelMethod | MethodCall | +| exprs.kt:45:9:45:12 | by12 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:45:16:45:18 | byx | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:45:16:45:26 | ... == ... | exprs.kt:4:1:142:1 | topLevelMethod | EQExpr | +| exprs.kt:45:24:45:26 | byy | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:46:9:46:12 | by13 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:46:16:46:18 | byx | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:46:16:46:26 | ... != ... | exprs.kt:4:1:142:1 | topLevelMethod | NEExpr | +| exprs.kt:46:24:46:26 | byy | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:47:9:47:12 | by14 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:47:16:47:18 | byx | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:47:16:47:25 | ... \| ... | exprs.kt:4:1:142:1 | topLevelMethod | OrBitwiseExpr | +| exprs.kt:47:23:47:25 | byy | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:48:9:48:12 | by15 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:48:16:48:18 | byx | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:48:16:48:26 | ... & ... | exprs.kt:4:1:142:1 | topLevelMethod | AndBitwiseExpr | +| exprs.kt:48:24:48:26 | byy | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:49:9:49:12 | by16 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:49:16:49:18 | byx | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:49:16:49:26 | ... ^ ... | exprs.kt:4:1:142:1 | topLevelMethod | XorBitwiseExpr | +| exprs.kt:49:24:49:26 | byy | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:51:9:51:10 | s1 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:51:14:51:16 | 1.0 | exprs.kt:4:1:142:1 | topLevelMethod | DoubleLiteral | +| exprs.kt:52:9:52:10 | s2 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:52:14:52:15 | sx | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:52:14:52:20 | ... + ... | exprs.kt:4:1:142:1 | topLevelMethod | AddExpr | +| exprs.kt:52:19:52:20 | sy | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:53:9:53:10 | s3 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:53:14:53:15 | sx | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:53:14:53:20 | ... - ... | exprs.kt:4:1:142:1 | topLevelMethod | SubExpr | +| exprs.kt:53:19:53:20 | sy | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:54:9:54:10 | s4 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:54:14:54:15 | sx | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:54:14:54:20 | ... / ... | exprs.kt:4:1:142:1 | topLevelMethod | DivExpr | +| exprs.kt:54:19:54:20 | sy | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:55:9:55:10 | s5 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:55:14:55:15 | sx | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:55:14:55:20 | ... % ... | exprs.kt:4:1:142:1 | topLevelMethod | RemExpr | +| exprs.kt:55:19:55:20 | sy | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:56:9:56:10 | s6 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:56:14:56:15 | intValue(...) | exprs.kt:4:1:142:1 | topLevelMethod | MethodCall | +| exprs.kt:56:14:56:15 | sx | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:56:14:56:21 | ... (value equals) ... | exprs.kt:4:1:142:1 | topLevelMethod | ValueEQExpr | +| exprs.kt:56:20:56:21 | intValue(...) | exprs.kt:4:1:142:1 | topLevelMethod | MethodCall | +| exprs.kt:56:20:56:21 | sy | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:57:9:57:10 | s7 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:57:14:57:15 | intValue(...) | exprs.kt:4:1:142:1 | topLevelMethod | MethodCall | +| exprs.kt:57:14:57:15 | sx | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:57:14:57:21 | ... (value not-equals) ... | exprs.kt:4:1:142:1 | topLevelMethod | ValueNEExpr | +| exprs.kt:57:20:57:21 | intValue(...) | exprs.kt:4:1:142:1 | topLevelMethod | MethodCall | +| exprs.kt:57:20:57:21 | sy | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:58:9:58:10 | s8 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:58:14:58:15 | intValue(...) | exprs.kt:4:1:142:1 | topLevelMethod | MethodCall | +| exprs.kt:58:14:58:15 | sx | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:58:14:58:20 | ... < ... | exprs.kt:4:1:142:1 | topLevelMethod | LTExpr | +| exprs.kt:58:19:58:20 | intValue(...) | exprs.kt:4:1:142:1 | topLevelMethod | MethodCall | +| exprs.kt:58:19:58:20 | sy | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:59:9:59:10 | s9 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:59:14:59:15 | intValue(...) | exprs.kt:4:1:142:1 | topLevelMethod | MethodCall | +| exprs.kt:59:14:59:15 | sx | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:59:14:59:21 | ... <= ... | exprs.kt:4:1:142:1 | topLevelMethod | LEExpr | +| exprs.kt:59:20:59:21 | intValue(...) | exprs.kt:4:1:142:1 | topLevelMethod | MethodCall | +| exprs.kt:59:20:59:21 | sy | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:60:9:60:11 | s10 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:60:15:60:16 | intValue(...) | exprs.kt:4:1:142:1 | topLevelMethod | MethodCall | +| exprs.kt:60:15:60:16 | sx | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:60:15:60:21 | ... > ... | exprs.kt:4:1:142:1 | topLevelMethod | GTExpr | +| exprs.kt:60:20:60:21 | intValue(...) | exprs.kt:4:1:142:1 | topLevelMethod | MethodCall | +| exprs.kt:60:20:60:21 | sy | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:61:9:61:11 | s11 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:61:15:61:16 | intValue(...) | exprs.kt:4:1:142:1 | topLevelMethod | MethodCall | +| exprs.kt:61:15:61:16 | sx | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:61:15:61:22 | ... >= ... | exprs.kt:4:1:142:1 | topLevelMethod | GEExpr | +| exprs.kt:61:21:61:22 | intValue(...) | exprs.kt:4:1:142:1 | topLevelMethod | MethodCall | +| exprs.kt:61:21:61:22 | sy | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:62:9:62:11 | s12 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:62:15:62:16 | sx | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:62:15:62:23 | ... == ... | exprs.kt:4:1:142:1 | topLevelMethod | EQExpr | +| exprs.kt:62:22:62:23 | sy | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:63:9:63:11 | s13 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:63:15:63:16 | sx | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:63:15:63:23 | ... != ... | exprs.kt:4:1:142:1 | topLevelMethod | NEExpr | +| exprs.kt:63:22:63:23 | sy | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:64:9:64:11 | s14 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:64:15:64:16 | sx | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:64:15:64:22 | ... \| ... | exprs.kt:4:1:142:1 | topLevelMethod | OrBitwiseExpr | +| exprs.kt:64:21:64:22 | sy | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:65:9:65:11 | s15 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:65:15:65:16 | sx | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:65:15:65:23 | ... & ... | exprs.kt:4:1:142:1 | topLevelMethod | AndBitwiseExpr | +| exprs.kt:65:22:65:23 | sy | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:66:9:66:11 | s16 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:66:15:66:16 | sx | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:66:15:66:23 | ... ^ ... | exprs.kt:4:1:142:1 | topLevelMethod | XorBitwiseExpr | +| exprs.kt:66:22:66:23 | sy | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:68:9:68:10 | l1 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:68:14:68:16 | 1.0 | exprs.kt:4:1:142:1 | topLevelMethod | DoubleLiteral | +| exprs.kt:69:9:69:10 | l2 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:69:14:69:15 | lx | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:69:14:69:20 | ... + ... | exprs.kt:4:1:142:1 | topLevelMethod | AddExpr | +| exprs.kt:69:19:69:20 | ly | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:70:9:70:10 | l3 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:70:14:70:15 | lx | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:70:14:70:20 | ... - ... | exprs.kt:4:1:142:1 | topLevelMethod | SubExpr | +| exprs.kt:70:19:70:20 | ly | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:71:9:71:10 | l4 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:71:14:71:15 | lx | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:71:14:71:20 | ... / ... | exprs.kt:4:1:142:1 | topLevelMethod | DivExpr | +| exprs.kt:71:19:71:20 | ly | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:72:9:72:10 | l5 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:72:14:72:15 | lx | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:72:14:72:20 | ... % ... | exprs.kt:4:1:142:1 | topLevelMethod | RemExpr | +| exprs.kt:72:19:72:20 | ly | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:73:9:73:10 | l6 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:73:14:73:15 | lx | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:73:14:73:21 | ... << ... | exprs.kt:4:1:142:1 | topLevelMethod | LeftShiftExpr | +| exprs.kt:73:21:73:21 | y | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:74:9:74:10 | l7 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:74:14:74:15 | lx | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:74:14:74:21 | ... >> ... | exprs.kt:4:1:142:1 | topLevelMethod | RightShiftExpr | +| exprs.kt:74:21:74:21 | y | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:75:9:75:10 | l8 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:75:14:75:15 | lx | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:75:14:75:22 | ... >>> ... | exprs.kt:4:1:142:1 | topLevelMethod | UnsignedRightShiftExpr | +| exprs.kt:75:22:75:22 | y | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:76:9:76:10 | l9 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:76:14:76:15 | lx | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:76:14:76:22 | ... & ... | exprs.kt:4:1:142:1 | topLevelMethod | AndBitwiseExpr | +| exprs.kt:76:21:76:22 | ly | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:77:9:77:11 | l10 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:77:15:77:16 | lx | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:77:15:77:22 | ... \| ... | exprs.kt:4:1:142:1 | topLevelMethod | OrBitwiseExpr | +| exprs.kt:77:21:77:22 | ly | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:78:9:78:11 | l11 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:78:15:78:16 | lx | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:78:15:78:23 | ... ^ ... | exprs.kt:4:1:142:1 | topLevelMethod | XorBitwiseExpr | +| exprs.kt:78:22:78:23 | ly | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:79:9:79:11 | l12 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:79:15:79:16 | lx | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:79:15:79:22 | ~... | exprs.kt:4:1:142:1 | topLevelMethod | BitNotExpr | +| exprs.kt:80:9:80:11 | l13 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:80:15:80:16 | lx | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:80:15:80:22 | ... (value equals) ... | exprs.kt:4:1:142:1 | topLevelMethod | ValueEQExpr | +| exprs.kt:80:21:80:22 | ly | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:81:9:81:11 | l14 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:81:15:81:16 | lx | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:81:15:81:22 | ... (value not-equals) ... | exprs.kt:4:1:142:1 | topLevelMethod | ValueNEExpr | +| exprs.kt:81:21:81:22 | ly | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:82:9:82:11 | l15 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:82:15:82:16 | lx | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:82:15:82:21 | ... < ... | exprs.kt:4:1:142:1 | topLevelMethod | LTExpr | +| exprs.kt:82:20:82:21 | ly | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:83:9:83:11 | l16 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:83:15:83:16 | lx | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:83:15:83:22 | ... <= ... | exprs.kt:4:1:142:1 | topLevelMethod | LEExpr | +| exprs.kt:83:21:83:22 | ly | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:84:9:84:11 | l17 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:84:15:84:16 | lx | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:84:15:84:21 | ... > ... | exprs.kt:4:1:142:1 | topLevelMethod | GTExpr | +| exprs.kt:84:20:84:21 | ly | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:85:9:85:11 | l18 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:85:15:85:16 | lx | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:85:15:85:22 | ... >= ... | exprs.kt:4:1:142:1 | topLevelMethod | GEExpr | +| exprs.kt:85:21:85:22 | ly | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:86:9:86:11 | l19 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:86:15:86:16 | lx | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:86:15:86:23 | ... == ... | exprs.kt:4:1:142:1 | topLevelMethod | EQExpr | +| exprs.kt:86:22:86:23 | ly | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:87:9:87:11 | l20 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:87:15:87:16 | lx | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:87:15:87:23 | ... != ... | exprs.kt:4:1:142:1 | topLevelMethod | NEExpr | +| exprs.kt:87:22:87:23 | ly | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:89:9:89:10 | d1 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:89:14:89:16 | 1.0 | exprs.kt:4:1:142:1 | topLevelMethod | DoubleLiteral | +| exprs.kt:90:9:90:10 | d2 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:90:14:90:15 | dx | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:90:14:90:20 | ... + ... | exprs.kt:4:1:142:1 | topLevelMethod | AddExpr | +| exprs.kt:90:19:90:20 | dy | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:91:9:91:10 | d3 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:91:14:91:15 | dx | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:91:14:91:20 | ... - ... | exprs.kt:4:1:142:1 | topLevelMethod | SubExpr | +| exprs.kt:91:19:91:20 | dy | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:92:9:92:10 | d4 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:92:14:92:15 | dx | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:92:14:92:20 | ... / ... | exprs.kt:4:1:142:1 | topLevelMethod | DivExpr | +| exprs.kt:92:19:92:20 | dy | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:93:9:93:10 | d5 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:93:14:93:15 | dx | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:93:14:93:20 | ... % ... | exprs.kt:4:1:142:1 | topLevelMethod | RemExpr | +| exprs.kt:93:19:93:20 | dy | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:94:9:94:10 | d6 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:94:14:94:15 | dx | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:94:14:94:21 | ... == ... | exprs.kt:4:1:142:1 | topLevelMethod | EQExpr | +| exprs.kt:94:20:94:21 | dy | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:95:9:95:10 | d7 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:95:14:95:15 | dx | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:95:14:95:21 | ... != ... | exprs.kt:4:1:142:1 | topLevelMethod | NEExpr | +| exprs.kt:95:20:95:21 | dy | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:96:9:96:10 | d8 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:96:14:96:15 | dx | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:96:14:96:20 | ... < ... | exprs.kt:4:1:142:1 | topLevelMethod | LTExpr | +| exprs.kt:96:19:96:20 | dy | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:97:9:97:10 | d9 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:97:14:97:15 | dx | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:97:14:97:21 | ... <= ... | exprs.kt:4:1:142:1 | topLevelMethod | LEExpr | +| exprs.kt:97:20:97:21 | dy | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:98:9:98:11 | d10 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:98:15:98:16 | dx | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:98:15:98:21 | ... > ... | exprs.kt:4:1:142:1 | topLevelMethod | GTExpr | +| exprs.kt:98:20:98:21 | dy | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:99:9:99:11 | d11 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:99:15:99:16 | dx | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:99:15:99:22 | ... >= ... | exprs.kt:4:1:142:1 | topLevelMethod | GEExpr | +| exprs.kt:99:21:99:22 | dy | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:100:9:100:11 | d12 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:100:15:100:16 | dx | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:100:15:100:23 | ... == ... | exprs.kt:4:1:142:1 | topLevelMethod | EQExpr | +| exprs.kt:100:22:100:23 | dy | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:101:9:101:11 | d13 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:101:15:101:16 | dx | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:101:15:101:23 | ... != ... | exprs.kt:4:1:142:1 | topLevelMethod | NEExpr | +| exprs.kt:101:22:101:23 | dy | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:103:9:103:10 | f1 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:103:14:103:16 | 1.0 | exprs.kt:4:1:142:1 | topLevelMethod | DoubleLiteral | +| exprs.kt:104:9:104:10 | f2 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:104:14:104:15 | fx | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:104:14:104:20 | ... + ... | exprs.kt:4:1:142:1 | topLevelMethod | AddExpr | +| exprs.kt:104:19:104:20 | fy | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:105:9:105:10 | f3 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:105:14:105:15 | fx | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:105:14:105:20 | ... - ... | exprs.kt:4:1:142:1 | topLevelMethod | SubExpr | +| exprs.kt:105:19:105:20 | fy | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:106:9:106:10 | f4 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:106:14:106:15 | fx | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:106:14:106:20 | ... / ... | exprs.kt:4:1:142:1 | topLevelMethod | DivExpr | +| exprs.kt:106:19:106:20 | fy | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:107:9:107:10 | f5 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:107:14:107:15 | fx | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:107:14:107:20 | ... % ... | exprs.kt:4:1:142:1 | topLevelMethod | RemExpr | +| exprs.kt:107:19:107:20 | fy | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:108:9:108:10 | f6 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:108:14:108:15 | fx | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:108:14:108:21 | ... == ... | exprs.kt:4:1:142:1 | topLevelMethod | EQExpr | +| exprs.kt:108:20:108:21 | fy | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:109:9:109:10 | f7 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:109:14:109:15 | fx | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:109:14:109:21 | ... != ... | exprs.kt:4:1:142:1 | topLevelMethod | NEExpr | +| exprs.kt:109:20:109:21 | fy | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:110:9:110:10 | f8 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:110:14:110:15 | fx | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:110:14:110:20 | ... < ... | exprs.kt:4:1:142:1 | topLevelMethod | LTExpr | +| exprs.kt:110:19:110:20 | fy | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:111:9:111:10 | f9 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:111:14:111:15 | fx | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:111:14:111:21 | ... <= ... | exprs.kt:4:1:142:1 | topLevelMethod | LEExpr | +| exprs.kt:111:20:111:21 | fy | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:112:9:112:11 | f10 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:112:15:112:16 | fx | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:112:15:112:21 | ... > ... | exprs.kt:4:1:142:1 | topLevelMethod | GTExpr | +| exprs.kt:112:20:112:21 | fy | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:113:9:113:11 | f11 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:113:15:113:16 | fx | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:113:15:113:22 | ... >= ... | exprs.kt:4:1:142:1 | topLevelMethod | GEExpr | +| exprs.kt:113:21:113:22 | fy | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:114:9:114:11 | f12 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:114:15:114:16 | fx | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:114:15:114:23 | ... == ... | exprs.kt:4:1:142:1 | topLevelMethod | EQExpr | +| exprs.kt:114:22:114:23 | fy | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:115:9:115:11 | f13 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:115:15:115:16 | fx | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:115:15:115:23 | ... != ... | exprs.kt:4:1:142:1 | topLevelMethod | NEExpr | +| exprs.kt:115:22:115:23 | fy | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:117:9:117:10 | b1 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:117:14:117:17 | true | exprs.kt:4:1:142:1 | topLevelMethod | BooleanLiteral | +| exprs.kt:118:9:118:10 | b2 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:118:14:118:18 | false | exprs.kt:4:1:142:1 | topLevelMethod | BooleanLiteral | +| exprs.kt:119:9:119:10 | b3 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:119:14:119:15 | b1 | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:119:14:119:21 | ... && ... | exprs.kt:4:1:142:1 | topLevelMethod | AndLogicalExpr | +| exprs.kt:119:20:119:21 | b2 | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:120:9:120:10 | b4 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:120:14:120:15 | b1 | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:120:14:120:21 | ... \|\| ... | exprs.kt:4:1:142:1 | topLevelMethod | OrLogicalExpr | +| exprs.kt:120:20:120:21 | b2 | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:121:9:121:10 | b5 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:121:14:121:16 | !... | exprs.kt:4:1:142:1 | topLevelMethod | LogNotExpr | +| exprs.kt:121:15:121:16 | b1 | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:123:9:123:9 | c | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:123:13:123:15 | x | exprs.kt:4:1:142:1 | topLevelMethod | CharacterLiteral | +| exprs.kt:124:9:124:11 | str | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:124:16:124:25 | "string lit" | exprs.kt:4:1:142:1 | topLevelMethod | StringLiteral | +| exprs.kt:125:9:125:20 | strWithQuote | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:125:25:125:37 | "string \\" lit" | exprs.kt:4:1:142:1 | topLevelMethod | StringLiteral | +| exprs.kt:126:9:126:10 | b6 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:126:14:126:15 | i1 | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:126:14:126:22 | ...instanceof... | exprs.kt:4:1:142:1 | topLevelMethod | InstanceOfExpr | +| exprs.kt:126:14:126:22 | int | exprs.kt:4:1:142:1 | topLevelMethod | TypeAccess | +| exprs.kt:127:9:127:10 | b7 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:127:14:127:15 | i1 | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:127:14:127:23 | ... !is ... | exprs.kt:4:1:142:1 | topLevelMethod | NotInstanceOfExpr | +| exprs.kt:127:14:127:23 | int | exprs.kt:4:1:142:1 | topLevelMethod | TypeAccess | +| exprs.kt:128:9:128:10 | b8 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:128:14:128:15 | b7 | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:128:14:128:26 | (...)... | exprs.kt:4:1:142:1 | topLevelMethod | CastExpr | +| exprs.kt:128:14:128:26 | boolean | exprs.kt:4:1:142:1 | topLevelMethod | TypeAccess | +| exprs.kt:129:9:129:12 | str1 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:129:25:129:34 | "string lit" | exprs.kt:4:1:142:1 | topLevelMethod | StringLiteral | +| exprs.kt:130:9:130:12 | str2 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:130:26:130:35 | "string lit" | exprs.kt:4:1:142:1 | topLevelMethod | StringLiteral | +| exprs.kt:131:9:131:12 | str3 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:131:25:131:28 | null | exprs.kt:4:1:142:1 | topLevelMethod | NullLiteral | +| exprs.kt:132:9:132:12 | str4 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:132:24:132:48 | "..." | exprs.kt:4:1:142:1 | topLevelMethod | StringTemplateExpr | +| exprs.kt:132:25:132:28 | "foo " | exprs.kt:4:1:142:1 | topLevelMethod | StringLiteral | +| exprs.kt:132:30:132:33 | str1 | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:132:34:132:38 | " bar " | exprs.kt:4:1:142:1 | topLevelMethod | StringLiteral | +| exprs.kt:132:40:132:43 | str2 | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:132:44:132:47 | " baz" | exprs.kt:4:1:142:1 | topLevelMethod | StringLiteral | +| exprs.kt:133:9:133:12 | str5 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:133:24:133:66 | "..." | exprs.kt:4:1:142:1 | topLevelMethod | StringTemplateExpr | +| exprs.kt:133:25:133:28 | "foo " | exprs.kt:4:1:142:1 | topLevelMethod | StringLiteral | +| exprs.kt:133:31:133:34 | str1 | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:133:31:133:41 | ... + ... | exprs.kt:4:1:142:1 | topLevelMethod | AddExpr | +| exprs.kt:133:38:133:41 | str2 | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:133:43:133:47 | " bar " | exprs.kt:4:1:142:1 | topLevelMethod | StringLiteral | +| exprs.kt:133:50:133:53 | str2 | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:133:50:133:60 | Intrinsics | exprs.kt:4:1:142:1 | topLevelMethod | TypeAccess | +| exprs.kt:133:50:133:60 | stringPlus(...) | exprs.kt:4:1:142:1 | topLevelMethod | MethodCall | +| exprs.kt:133:57:133:60 | str1 | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:133:62:133:65 | " baz" | exprs.kt:4:1:142:1 | topLevelMethod | StringLiteral | +| exprs.kt:134:9:134:12 | str6 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:134:16:134:19 | str1 | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:134:16:134:26 | ... + ... | exprs.kt:4:1:142:1 | topLevelMethod | AddExpr | +| exprs.kt:134:23:134:26 | str2 | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:136:9:136:16 | variable | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:136:20:136:21 | 10 | exprs.kt:4:1:142:1 | topLevelMethod | IntegerLiteral | +| exprs.kt:137:12:137:19 | variable | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:137:12:137:23 | ... > ... | exprs.kt:4:1:142:1 | topLevelMethod | GTExpr | +| exprs.kt:137:23:137:23 | 0 | exprs.kt:4:1:142:1 | topLevelMethod | IntegerLiteral | +| exprs.kt:138:9:138:16 | variable | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:138:9:138:16 | variable | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:138:9:138:18 | ...=... | exprs.kt:4:1:142:1 | topLevelMethod | AssignExpr | +| exprs.kt:138:9:138:18 | | exprs.kt:4:1:142:1 | topLevelMethod | StmtExpr | +| exprs.kt:138:9:138:18 | | exprs.kt:4:1:142:1 | topLevelMethod | ImplicitCoercionToUnitExpr | +| exprs.kt:138:9:138:18 | Unit | exprs.kt:4:1:142:1 | topLevelMethod | TypeAccess | +| exprs.kt:138:9:138:18 | dec(...) | exprs.kt:4:1:142:1 | topLevelMethod | MethodCall | +| exprs.kt:138:9:138:18 | tmp0 | exprs.kt:4:1:142:1 | topLevelMethod | LocalVariableDeclExpr | +| exprs.kt:138:9:138:18 | tmp0 | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:138:9:138:18 | tmp0 | exprs.kt:4:1:142:1 | topLevelMethod | VarAccess | +| exprs.kt:141:12:141:14 | 123 | exprs.kt:4:1:142:1 | topLevelMethod | IntegerLiteral | +| exprs.kt:141:12:141:20 | ... + ... | exprs.kt:4:1:142:1 | topLevelMethod | AddExpr | +| exprs.kt:141:18:141:20 | 456 | exprs.kt:4:1:142:1 | topLevelMethod | IntegerLiteral | +| exprs.kt:144:1:146:1 | Unit | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:145:9:145:9 | d | exprs.kt:144:1:146:1 | getClass | LocalVariableDeclExpr | +| exprs.kt:145:13:145:16 | true | exprs.kt:144:1:146:1 | getClass | BooleanLiteral | +| exprs.kt:145:13:145:23 | ::class | exprs.kt:144:1:146:1 | getClass | ClassExpr | +| exprs.kt:148:9:148:18 | ...=... | exprs.kt:148:1:150:1 | C | KtInitializerAssignExpr | +| exprs.kt:148:9:148:18 | int | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:148:9:148:18 | int | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:148:9:148:18 | int | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:148:9:148:18 | n | exprs.kt:148:1:150:1 | C | VarAccess | +| exprs.kt:148:9:148:18 | n | exprs.kt:148:1:150:1 | C | VarAccess | +| exprs.kt:148:9:148:18 | this | exprs.kt:148:9:148:18 | getN | ThisAccess | +| exprs.kt:148:9:148:18 | this.n | exprs.kt:148:9:148:18 | getN | VarAccess | +| exprs.kt:149:5:149:33 | C | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:149:27:149:31 | C | exprs.kt:149:5:149:33 | foo | TypeAccess | +| exprs.kt:149:27:149:31 | new C(...) | exprs.kt:149:5:149:33 | foo | ClassInstanceExpr | +| exprs.kt:149:29:149:30 | 42 | exprs.kt:149:5:149:33 | foo | IntegerLiteral | +| exprs.kt:156:1:163:1 | Unit | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:156:15:156:21 | Root | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:156:24:156:35 | Subclass1 | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:157:5:159:5 | when ... | exprs.kt:156:1:163:1 | typeTests | WhenExpr | +| exprs.kt:157:8:157:8 | x | exprs.kt:156:1:163:1 | typeTests | VarAccess | +| exprs.kt:157:8:157:21 | ...instanceof... | exprs.kt:156:1:163:1 | typeTests | InstanceOfExpr | +| exprs.kt:157:8:157:21 | Subclass1 | exprs.kt:156:1:163:1 | typeTests | TypeAccess | +| exprs.kt:158:13:158:14 | x1 | exprs.kt:156:1:163:1 | typeTests | LocalVariableDeclExpr | +| exprs.kt:158:29:158:29 | | exprs.kt:156:1:163:1 | typeTests | ImplicitCastExpr | +| exprs.kt:158:29:158:29 | Subclass1 | exprs.kt:156:1:163:1 | typeTests | TypeAccess | +| exprs.kt:158:29:158:29 | x | exprs.kt:156:1:163:1 | typeTests | VarAccess | +| exprs.kt:160:9:160:10 | y1 | exprs.kt:156:1:163:1 | typeTests | LocalVariableDeclExpr | +| exprs.kt:160:25:160:60 | true | exprs.kt:156:1:163:1 | typeTests | BooleanLiteral | +| exprs.kt:160:25:160:60 | when ... | exprs.kt:156:1:163:1 | typeTests | WhenExpr | +| exprs.kt:160:29:160:29 | x | exprs.kt:156:1:163:1 | typeTests | VarAccess | +| exprs.kt:160:29:160:42 | ...instanceof... | exprs.kt:156:1:163:1 | typeTests | InstanceOfExpr | +| exprs.kt:160:29:160:42 | Subclass1 | exprs.kt:156:1:163:1 | typeTests | TypeAccess | +| exprs.kt:160:45:160:49 | | exprs.kt:156:1:163:1 | typeTests | StmtExpr | +| exprs.kt:160:45:160:49 | | exprs.kt:156:1:163:1 | typeTests | ImplicitCastExpr | +| exprs.kt:160:45:160:49 | Subclass1 | exprs.kt:156:1:163:1 | typeTests | TypeAccess | +| exprs.kt:160:47:160:47 | x | exprs.kt:156:1:163:1 | typeTests | VarAccess | +| exprs.kt:160:58:160:58 | y | exprs.kt:156:1:163:1 | typeTests | VarAccess | +| exprs.kt:161:9:161:9 | q | exprs.kt:156:1:163:1 | typeTests | LocalVariableDeclExpr | +| exprs.kt:161:13:161:13 | 1 | exprs.kt:156:1:163:1 | typeTests | IntegerLiteral | +| exprs.kt:162:5:162:48 | true | exprs.kt:156:1:163:1 | typeTests | BooleanLiteral | +| exprs.kt:162:5:162:48 | when ... | exprs.kt:156:1:163:1 | typeTests | WhenExpr | +| exprs.kt:162:9:162:9 | x | exprs.kt:156:1:163:1 | typeTests | VarAccess | +| exprs.kt:162:9:162:22 | ...instanceof... | exprs.kt:156:1:163:1 | typeTests | InstanceOfExpr | +| exprs.kt:162:9:162:22 | Subclass1 | exprs.kt:156:1:163:1 | typeTests | TypeAccess | +| exprs.kt:162:27:162:27 | q | exprs.kt:156:1:163:1 | typeTests | VarAccess | +| exprs.kt:162:27:162:31 | ...=... | exprs.kt:156:1:163:1 | typeTests | AssignExpr | +| exprs.kt:162:31:162:31 | 2 | exprs.kt:156:1:163:1 | typeTests | IntegerLiteral | +| exprs.kt:162:42:162:42 | q | exprs.kt:156:1:163:1 | typeTests | VarAccess | +| exprs.kt:162:42:162:46 | ...=... | exprs.kt:156:1:163:1 | typeTests | AssignExpr | +| exprs.kt:162:46:162:46 | 3 | exprs.kt:156:1:163:1 | typeTests | IntegerLiteral | +| exprs.kt:165:1:172:1 | Unit | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:165:9:165:18 | Polygon | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:166:9:166:9 | r | exprs.kt:165:1:172:1 | foo | LocalVariableDeclExpr | +| exprs.kt:166:13:166:13 | p | exprs.kt:165:1:172:1 | foo | VarAccess | +| exprs.kt:166:13:166:25 | getBounds(...) | exprs.kt:165:1:172:1 | foo | MethodCall | +| exprs.kt:167:5:171:5 | when ... | exprs.kt:165:1:172:1 | foo | WhenExpr | +| exprs.kt:167:8:167:8 | r | exprs.kt:165:1:172:1 | foo | VarAccess | +| exprs.kt:167:8:167:16 | ... (value not-equals) ... | exprs.kt:165:1:172:1 | foo | ValueNEExpr | +| exprs.kt:167:13:167:16 | null | exprs.kt:165:1:172:1 | foo | NullLiteral | +| exprs.kt:168:13:168:14 | r2 | exprs.kt:165:1:172:1 | foo | LocalVariableDeclExpr | +| exprs.kt:168:29:168:29 | | exprs.kt:165:1:172:1 | foo | ImplicitNotNullExpr | +| exprs.kt:168:29:168:29 | Rectangle | exprs.kt:165:1:172:1 | foo | TypeAccess | +| exprs.kt:168:29:168:29 | r | exprs.kt:165:1:172:1 | foo | VarAccess | +| exprs.kt:169:13:169:18 | height | exprs.kt:165:1:172:1 | foo | LocalVariableDeclExpr | +| exprs.kt:169:22:169:23 | r2 | exprs.kt:165:1:172:1 | foo | VarAccess | +| exprs.kt:169:25:169:30 | r2.height | exprs.kt:165:1:172:1 | foo | VarAccess | +| exprs.kt:170:9:170:10 | r2 | exprs.kt:165:1:172:1 | foo | VarAccess | +| exprs.kt:170:9:170:17 | r2.height | exprs.kt:165:1:172:1 | foo | VarAccess | +| exprs.kt:170:9:170:21 | ...=... | exprs.kt:165:1:172:1 | foo | AssignExpr | +| exprs.kt:170:21:170:21 | 3 | exprs.kt:165:1:172:1 | foo | IntegerLiteral | +| exprs.kt:174:1:176:1 | 0 | exprs.kt:174:6:176:1 | Direction | IntegerLiteral | +| exprs.kt:174:1:176:1 | Direction | exprs.kt:174:6:176:1 | Direction | TypeAccess | +| exprs.kt:174:1:176:1 | Enum | exprs.kt:174:6:176:1 | Direction | TypeAccess | +| exprs.kt:174:1:176:1 | new Enum(...) | exprs.kt:174:6:176:1 | Direction | ClassInstanceExpr | +| exprs.kt:174:1:176:1 | null | exprs.kt:174:6:176:1 | Direction | NullLiteral | +| exprs.kt:175:5:175:10 | ...=... | exprs.kt:0:0:0:0 | | KtInitializerAssignExpr | +| exprs.kt:175:5:175:10 | Direction | exprs.kt:0:0:0:0 | | TypeAccess | +| exprs.kt:175:5:175:10 | Direction | exprs.kt:0:0:0:0 | | TypeAccess | +| exprs.kt:175:5:175:10 | Direction | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:175:5:175:10 | Direction.NORTH | exprs.kt:0:0:0:0 | | VarAccess | +| exprs.kt:175:5:175:10 | new Direction(...) | exprs.kt:0:0:0:0 | | ClassInstanceExpr | +| exprs.kt:175:12:175:17 | ...=... | exprs.kt:0:0:0:0 | | KtInitializerAssignExpr | +| exprs.kt:175:12:175:17 | Direction | exprs.kt:0:0:0:0 | | TypeAccess | +| exprs.kt:175:12:175:17 | Direction | exprs.kt:0:0:0:0 | | TypeAccess | +| exprs.kt:175:12:175:17 | Direction | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:175:12:175:17 | Direction.SOUTH | exprs.kt:0:0:0:0 | | VarAccess | +| exprs.kt:175:12:175:17 | new Direction(...) | exprs.kt:0:0:0:0 | | ClassInstanceExpr | +| exprs.kt:175:19:175:23 | ...=... | exprs.kt:0:0:0:0 | | KtInitializerAssignExpr | +| exprs.kt:175:19:175:23 | Direction | exprs.kt:0:0:0:0 | | TypeAccess | +| exprs.kt:175:19:175:23 | Direction | exprs.kt:0:0:0:0 | | TypeAccess | +| exprs.kt:175:19:175:23 | Direction | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:175:19:175:23 | Direction.WEST | exprs.kt:0:0:0:0 | | VarAccess | +| exprs.kt:175:19:175:23 | new Direction(...) | exprs.kt:0:0:0:0 | | ClassInstanceExpr | +| exprs.kt:175:25:175:28 | ...=... | exprs.kt:0:0:0:0 | | KtInitializerAssignExpr | +| exprs.kt:175:25:175:28 | Direction | exprs.kt:0:0:0:0 | | TypeAccess | +| exprs.kt:175:25:175:28 | Direction | exprs.kt:0:0:0:0 | | TypeAccess | +| exprs.kt:175:25:175:28 | Direction | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:175:25:175:28 | Direction.EAST | exprs.kt:0:0:0:0 | | VarAccess | +| exprs.kt:175:25:175:28 | new Direction(...) | exprs.kt:0:0:0:0 | | ClassInstanceExpr | +| exprs.kt:178:1:182:1 | 0 | exprs.kt:178:6:182:1 | Color | IntegerLiteral | +| exprs.kt:178:1:182:1 | Color | exprs.kt:178:6:182:1 | Color | TypeAccess | +| exprs.kt:178:1:182:1 | Enum | exprs.kt:178:6:182:1 | Color | TypeAccess | +| exprs.kt:178:1:182:1 | new Enum(...) | exprs.kt:178:6:182:1 | Color | ClassInstanceExpr | +| exprs.kt:178:1:182:1 | null | exprs.kt:178:6:182:1 | Color | NullLiteral | +| exprs.kt:178:18:178:29 | ...=... | exprs.kt:178:6:182:1 | Color | KtInitializerAssignExpr | +| exprs.kt:178:18:178:29 | int | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:178:18:178:29 | int | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:178:18:178:29 | int | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:178:18:178:29 | rgb | exprs.kt:178:6:182:1 | Color | VarAccess | +| exprs.kt:178:18:178:29 | rgb | exprs.kt:178:6:182:1 | Color | VarAccess | +| exprs.kt:178:18:178:29 | this | exprs.kt:178:18:178:29 | getRgb | ThisAccess | +| exprs.kt:178:18:178:29 | this.rgb | exprs.kt:178:18:178:29 | getRgb | VarAccess | +| exprs.kt:179:5:179:18 | ...=... | exprs.kt:0:0:0:0 | | KtInitializerAssignExpr | +| exprs.kt:179:5:179:18 | Color | exprs.kt:0:0:0:0 | | TypeAccess | +| exprs.kt:179:5:179:18 | Color | exprs.kt:0:0:0:0 | | TypeAccess | +| exprs.kt:179:5:179:18 | Color | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:179:5:179:18 | Color.RED | exprs.kt:0:0:0:0 | | VarAccess | +| exprs.kt:179:5:179:18 | new Color(...) | exprs.kt:0:0:0:0 | | ClassInstanceExpr | +| exprs.kt:179:9:179:16 | 16711680 | exprs.kt:0:0:0:0 | | IntegerLiteral | +| exprs.kt:180:5:180:20 | ...=... | exprs.kt:0:0:0:0 | | KtInitializerAssignExpr | +| exprs.kt:180:5:180:20 | Color | exprs.kt:0:0:0:0 | | TypeAccess | +| exprs.kt:180:5:180:20 | Color | exprs.kt:0:0:0:0 | | TypeAccess | +| exprs.kt:180:5:180:20 | Color | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:180:5:180:20 | Color.GREEN | exprs.kt:0:0:0:0 | | VarAccess | +| exprs.kt:180:5:180:20 | new Color(...) | exprs.kt:0:0:0:0 | | ClassInstanceExpr | +| exprs.kt:180:11:180:18 | 65280 | exprs.kt:0:0:0:0 | | IntegerLiteral | +| exprs.kt:181:5:181:18 | ...=... | exprs.kt:0:0:0:0 | | KtInitializerAssignExpr | +| exprs.kt:181:5:181:18 | Color | exprs.kt:0:0:0:0 | | TypeAccess | +| exprs.kt:181:5:181:18 | Color | exprs.kt:0:0:0:0 | | TypeAccess | +| exprs.kt:181:5:181:18 | Color | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:181:5:181:18 | Color.BLUE | exprs.kt:0:0:0:0 | | VarAccess | +| exprs.kt:181:5:181:18 | new Color(...) | exprs.kt:0:0:0:0 | | ClassInstanceExpr | +| exprs.kt:181:10:181:17 | 255 | exprs.kt:0:0:0:0 | | IntegerLiteral | +| exprs.kt:184:1:187:1 | Unit | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:185:9:185:13 | south | exprs.kt:184:1:187:1 | enums | LocalVariableDeclExpr | +| exprs.kt:185:27:185:31 | Direction | exprs.kt:184:1:187:1 | enums | TypeAccess | +| exprs.kt:185:27:185:31 | Direction.SOUTH | exprs.kt:184:1:187:1 | enums | VarAccess | +| exprs.kt:186:9:186:13 | green | exprs.kt:184:1:187:1 | enums | LocalVariableDeclExpr | +| exprs.kt:186:23:186:27 | Color | exprs.kt:184:1:187:1 | enums | TypeAccess | +| exprs.kt:186:23:186:27 | Color.GREEN | exprs.kt:184:1:187:1 | enums | VarAccess | +| exprs.kt:192:5:192:14 | ...=... | exprs.kt:191:1:199:1 | Class1 | KtInitializerAssignExpr | +| exprs.kt:192:5:192:14 | a1 | exprs.kt:191:1:199:1 | Class1 | VarAccess | +| exprs.kt:192:5:192:14 | int | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:192:5:192:14 | int | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:192:5:192:14 | this | exprs.kt:192:5:192:14 | getA1 | ThisAccess | +| exprs.kt:192:5:192:14 | this.a1 | exprs.kt:192:5:192:14 | getA1 | VarAccess | +| exprs.kt:192:14:192:14 | 1 | exprs.kt:191:1:199:1 | Class1 | IntegerLiteral | +| exprs.kt:193:13:198:5 | Object | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:194:13:194:14 | a2 | exprs.kt:193:13:198:5 | getObject | LocalVariableDeclExpr | +| exprs.kt:194:18:194:18 | 2 | exprs.kt:193:13:198:5 | getObject | IntegerLiteral | +| exprs.kt:195:16:197:9 | | exprs.kt:193:13:198:5 | getObject | StmtExpr | +| exprs.kt:195:16:197:9 | Interface1 | exprs.kt:193:13:198:5 | getObject | TypeAccess | +| exprs.kt:195:16:197:9 | new (...) | exprs.kt:193:13:198:5 | getObject | ClassInstanceExpr | +| exprs.kt:196:13:196:49 | ...=... | exprs.kt:195:16:197:9 | | KtInitializerAssignExpr | +| exprs.kt:196:13:196:49 | String | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:196:13:196:49 | String | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:196:13:196:49 | a3 | exprs.kt:195:16:197:9 | | VarAccess | +| exprs.kt:196:13:196:49 | this | exprs.kt:196:13:196:49 | getA3 | ThisAccess | +| exprs.kt:196:13:196:49 | this.a3 | exprs.kt:196:13:196:49 | getA3 | VarAccess | +| exprs.kt:196:31:196:32 | getA1(...) | exprs.kt:195:16:197:9 | | MethodCall | +| exprs.kt:196:31:196:32 | this | exprs.kt:195:16:197:9 | | ThisAccess | +| exprs.kt:196:31:196:37 | ... + ... | exprs.kt:195:16:197:9 | | AddExpr | +| exprs.kt:196:31:196:49 | toString(...) | exprs.kt:195:16:197:9 | | MethodCall | +| exprs.kt:196:36:196:37 | a2 | exprs.kt:195:16:197:9 | | VarAccess | +| exprs.kt:201:1:203:1 | Unit | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:201:22:201:28 | Object | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:202:9:202:9 | y | exprs.kt:201:1:203:1 | notNullAssertion | LocalVariableDeclExpr | +| exprs.kt:202:18:202:18 | x | exprs.kt:201:1:203:1 | notNullAssertion | VarAccess | +| exprs.kt:202:19:202:20 | ...!! | exprs.kt:201:1:203:1 | notNullAssertion | NotNullExpr | +| exprs.kt:206:5:217:5 | Unit | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:206:11:206:18 | Object | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:206:21:206:30 | String | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:208:13:208:13 | a | exprs.kt:206:5:217:5 | x | LocalVariableDeclExpr | +| exprs.kt:208:17:208:18 | aa | exprs.kt:206:5:217:5 | x | VarAccess | +| exprs.kt:208:17:208:29 | String | exprs.kt:206:5:217:5 | x | TypeAccess | +| exprs.kt:208:17:208:29 | valueOf(...) | exprs.kt:206:5:217:5 | x | MethodCall | +| exprs.kt:209:13:209:14 | b0 | exprs.kt:206:5:217:5 | x | LocalVariableDeclExpr | +| exprs.kt:209:19:209:19 | s | exprs.kt:206:5:217:5 | x | VarAccess | +| exprs.kt:209:19:209:27 | Intrinsics | exprs.kt:206:5:217:5 | x | TypeAccess | +| exprs.kt:209:19:209:27 | stringPlus(...) | exprs.kt:206:5:217:5 | x | MethodCall | +| exprs.kt:209:26:209:26 | 5 | exprs.kt:206:5:217:5 | x | IntegerLiteral | +| exprs.kt:210:13:210:14 | b1 | exprs.kt:206:5:217:5 | x | LocalVariableDeclExpr | +| exprs.kt:210:19:210:19 | s | exprs.kt:206:5:217:5 | x | VarAccess | +| exprs.kt:210:19:210:23 | Intrinsics | exprs.kt:206:5:217:5 | x | TypeAccess | +| exprs.kt:210:19:210:23 | stringPlus(...) | exprs.kt:206:5:217:5 | x | MethodCall | +| exprs.kt:210:23:210:23 | 5 | exprs.kt:206:5:217:5 | x | IntegerLiteral | +| exprs.kt:211:13:211:14 | b2 | exprs.kt:206:5:217:5 | x | LocalVariableDeclExpr | +| exprs.kt:211:19:211:19 | s | exprs.kt:206:5:217:5 | x | VarAccess | +| exprs.kt:211:20:211:21 | ...!! | exprs.kt:206:5:217:5 | x | NotNullExpr | +| exprs.kt:211:20:211:29 | ... + ... | exprs.kt:206:5:217:5 | x | AddExpr | +| exprs.kt:211:28:211:28 | 5 | exprs.kt:206:5:217:5 | x | IntegerLiteral | +| exprs.kt:212:13:212:14 | b3 | exprs.kt:206:5:217:5 | x | LocalVariableDeclExpr | +| exprs.kt:212:19:212:19 | s | exprs.kt:206:5:217:5 | x | VarAccess | +| exprs.kt:212:19:212:25 | ... + ... | exprs.kt:206:5:217:5 | x | AddExpr | +| exprs.kt:212:20:212:21 | ...!! | exprs.kt:206:5:217:5 | x | NotNullExpr | +| exprs.kt:212:25:212:25 | 5 | exprs.kt:206:5:217:5 | x | IntegerLiteral | +| exprs.kt:213:13:213:14 | c0 | exprs.kt:206:5:217:5 | x | LocalVariableDeclExpr | +| exprs.kt:213:18:213:36 | Color | exprs.kt:206:5:217:5 | x | TypeAccess | +| exprs.kt:213:18:213:36 | values(...) | exprs.kt:206:5:217:5 | x | MethodCall | +| exprs.kt:214:13:214:14 | c1 | exprs.kt:206:5:217:5 | x | LocalVariableDeclExpr | +| exprs.kt:214:24:214:31 | Color | exprs.kt:206:5:217:5 | x | TypeAccess | +| exprs.kt:214:24:214:31 | values(...) | exprs.kt:206:5:217:5 | x | MethodCall | +| exprs.kt:215:13:215:14 | d0 | exprs.kt:206:5:217:5 | x | LocalVariableDeclExpr | +| exprs.kt:215:18:215:44 | Color | exprs.kt:206:5:217:5 | x | TypeAccess | +| exprs.kt:215:18:215:44 | valueOf(...) | exprs.kt:206:5:217:5 | x | MethodCall | +| exprs.kt:215:38:215:42 | "GREEN" | exprs.kt:206:5:217:5 | x | StringLiteral | +| exprs.kt:216:13:216:14 | d1 | exprs.kt:206:5:217:5 | x | LocalVariableDeclExpr | +| exprs.kt:216:24:216:39 | Color | exprs.kt:206:5:217:5 | x | TypeAccess | +| exprs.kt:216:24:216:39 | valueOf(...) | exprs.kt:206:5:217:5 | x | MethodCall | +| exprs.kt:216:33:216:37 | "GREEN" | exprs.kt:206:5:217:5 | x | StringLiteral | +| exprs.kt:220:1:222:1 | Unit | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:221:5:221:10 | StandardKt | exprs.kt:220:1:222:1 | todo | TypeAccess | +| exprs.kt:221:5:221:10 | TODO(...) | exprs.kt:220:1:222:1 | todo | MethodCall | +| exprs.kt:225:1:227:1 | Unit | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:226:9:226:9 | x | exprs.kt:225:1:227:1 | fnClassRef | LocalVariableDeclExpr | +| exprs.kt:226:13:226:29 | SomeClass1 | exprs.kt:225:1:227:1 | fnClassRef | TypeAccess | +| exprs.kt:226:13:226:29 | SomeClass1.class | exprs.kt:225:1:227:1 | fnClassRef | TypeLiteral | +| exprs.kt:229:1:250:1 | Unit | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:229:19:229:39 | int | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:229:42:229:64 | Integer | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:229:67:229:88 | String | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:229:91:229:114 | String | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:230:7:230:8 | b1 | exprs.kt:229:1:250:1 | equalityTests | LocalVariableDeclExpr | +| exprs.kt:230:12:230:27 | notNullPrimitive | exprs.kt:229:1:250:1 | equalityTests | VarAccess | +| exprs.kt:230:12:230:47 | ... (value equals) ... | exprs.kt:229:1:250:1 | equalityTests | ValueEQExpr | +| exprs.kt:230:32:230:47 | notNullPrimitive | exprs.kt:229:1:250:1 | equalityTests | VarAccess | +| exprs.kt:231:7:231:8 | b2 | exprs.kt:229:1:250:1 | equalityTests | LocalVariableDeclExpr | +| exprs.kt:231:12:231:27 | notNullPrimitive | exprs.kt:229:1:250:1 | equalityTests | VarAccess | +| exprs.kt:231:12:231:48 | ... (value equals) ... | exprs.kt:229:1:250:1 | equalityTests | ValueEQExpr | +| exprs.kt:231:32:231:48 | nullablePrimitive | exprs.kt:229:1:250:1 | equalityTests | VarAccess | +| exprs.kt:232:7:232:8 | b3 | exprs.kt:229:1:250:1 | equalityTests | LocalVariableDeclExpr | +| exprs.kt:232:12:232:28 | nullablePrimitive | exprs.kt:229:1:250:1 | equalityTests | VarAccess | +| exprs.kt:232:12:232:49 | ... (value equals) ... | exprs.kt:229:1:250:1 | equalityTests | ValueEQExpr | +| exprs.kt:232:33:232:49 | nullablePrimitive | exprs.kt:229:1:250:1 | equalityTests | VarAccess | +| exprs.kt:233:7:233:8 | b4 | exprs.kt:229:1:250:1 | equalityTests | LocalVariableDeclExpr | +| exprs.kt:233:12:233:25 | notNullReftype | exprs.kt:229:1:250:1 | equalityTests | VarAccess | +| exprs.kt:233:12:233:43 | ... (value equals) ... | exprs.kt:229:1:250:1 | equalityTests | ValueEQExpr | +| exprs.kt:233:30:233:43 | notNullReftype | exprs.kt:229:1:250:1 | equalityTests | VarAccess | +| exprs.kt:234:7:234:8 | b5 | exprs.kt:229:1:250:1 | equalityTests | LocalVariableDeclExpr | +| exprs.kt:234:12:234:25 | notNullReftype | exprs.kt:229:1:250:1 | equalityTests | VarAccess | +| exprs.kt:234:12:234:44 | ... (value equals) ... | exprs.kt:229:1:250:1 | equalityTests | ValueEQExpr | +| exprs.kt:234:30:234:44 | nullableReftype | exprs.kt:229:1:250:1 | equalityTests | VarAccess | +| exprs.kt:235:7:235:8 | b6 | exprs.kt:229:1:250:1 | equalityTests | LocalVariableDeclExpr | +| exprs.kt:235:12:235:26 | nullableReftype | exprs.kt:229:1:250:1 | equalityTests | VarAccess | +| exprs.kt:235:12:235:45 | ... (value equals) ... | exprs.kt:229:1:250:1 | equalityTests | ValueEQExpr | +| exprs.kt:235:31:235:45 | nullableReftype | exprs.kt:229:1:250:1 | equalityTests | VarAccess | +| exprs.kt:236:7:236:8 | b7 | exprs.kt:229:1:250:1 | equalityTests | LocalVariableDeclExpr | +| exprs.kt:236:12:236:27 | notNullPrimitive | exprs.kt:229:1:250:1 | equalityTests | VarAccess | +| exprs.kt:236:12:236:47 | ... (value not-equals) ... | exprs.kt:229:1:250:1 | equalityTests | ValueNEExpr | +| exprs.kt:236:32:236:47 | notNullPrimitive | exprs.kt:229:1:250:1 | equalityTests | VarAccess | +| exprs.kt:237:7:237:8 | b8 | exprs.kt:229:1:250:1 | equalityTests | LocalVariableDeclExpr | +| exprs.kt:237:12:237:27 | notNullPrimitive | exprs.kt:229:1:250:1 | equalityTests | VarAccess | +| exprs.kt:237:12:237:48 | ... (value not-equals) ... | exprs.kt:229:1:250:1 | equalityTests | ValueNEExpr | +| exprs.kt:237:32:237:48 | nullablePrimitive | exprs.kt:229:1:250:1 | equalityTests | VarAccess | +| exprs.kt:238:7:238:8 | b9 | exprs.kt:229:1:250:1 | equalityTests | LocalVariableDeclExpr | +| exprs.kt:238:12:238:28 | nullablePrimitive | exprs.kt:229:1:250:1 | equalityTests | VarAccess | +| exprs.kt:238:12:238:49 | ... (value not-equals) ... | exprs.kt:229:1:250:1 | equalityTests | ValueNEExpr | +| exprs.kt:238:33:238:49 | nullablePrimitive | exprs.kt:229:1:250:1 | equalityTests | VarAccess | +| exprs.kt:239:7:239:9 | b10 | exprs.kt:229:1:250:1 | equalityTests | LocalVariableDeclExpr | +| exprs.kt:239:13:239:26 | notNullReftype | exprs.kt:229:1:250:1 | equalityTests | VarAccess | +| exprs.kt:239:13:239:44 | ... (value not-equals) ... | exprs.kt:229:1:250:1 | equalityTests | ValueNEExpr | +| exprs.kt:239:31:239:44 | notNullReftype | exprs.kt:229:1:250:1 | equalityTests | VarAccess | +| exprs.kt:240:7:240:9 | b11 | exprs.kt:229:1:250:1 | equalityTests | LocalVariableDeclExpr | +| exprs.kt:240:13:240:26 | notNullReftype | exprs.kt:229:1:250:1 | equalityTests | VarAccess | +| exprs.kt:240:13:240:45 | ... (value not-equals) ... | exprs.kt:229:1:250:1 | equalityTests | ValueNEExpr | +| exprs.kt:240:31:240:45 | nullableReftype | exprs.kt:229:1:250:1 | equalityTests | VarAccess | +| exprs.kt:241:7:241:9 | b12 | exprs.kt:229:1:250:1 | equalityTests | LocalVariableDeclExpr | +| exprs.kt:241:13:241:27 | nullableReftype | exprs.kt:229:1:250:1 | equalityTests | VarAccess | +| exprs.kt:241:13:241:46 | ... (value not-equals) ... | exprs.kt:229:1:250:1 | equalityTests | ValueNEExpr | +| exprs.kt:241:32:241:46 | nullableReftype | exprs.kt:229:1:250:1 | equalityTests | VarAccess | +| exprs.kt:242:7:242:9 | b13 | exprs.kt:229:1:250:1 | equalityTests | LocalVariableDeclExpr | +| exprs.kt:242:13:242:28 | notNullPrimitive | exprs.kt:229:1:250:1 | equalityTests | VarAccess | +| exprs.kt:242:13:242:36 | ... (value equals) ... | exprs.kt:229:1:250:1 | equalityTests | ValueEQExpr | +| exprs.kt:242:33:242:36 | null | exprs.kt:229:1:250:1 | equalityTests | NullLiteral | +| exprs.kt:243:7:243:9 | b14 | exprs.kt:229:1:250:1 | equalityTests | LocalVariableDeclExpr | +| exprs.kt:243:13:243:29 | nullablePrimitive | exprs.kt:229:1:250:1 | equalityTests | VarAccess | +| exprs.kt:243:13:243:37 | ... (value equals) ... | exprs.kt:229:1:250:1 | equalityTests | ValueEQExpr | +| exprs.kt:243:34:243:37 | null | exprs.kt:229:1:250:1 | equalityTests | NullLiteral | +| exprs.kt:244:7:244:9 | b15 | exprs.kt:229:1:250:1 | equalityTests | LocalVariableDeclExpr | +| exprs.kt:244:13:244:26 | notNullReftype | exprs.kt:229:1:250:1 | equalityTests | VarAccess | +| exprs.kt:244:13:244:34 | ... (value equals) ... | exprs.kt:229:1:250:1 | equalityTests | ValueEQExpr | +| exprs.kt:244:31:244:34 | null | exprs.kt:229:1:250:1 | equalityTests | NullLiteral | +| exprs.kt:245:7:245:9 | b16 | exprs.kt:229:1:250:1 | equalityTests | LocalVariableDeclExpr | +| exprs.kt:245:13:245:27 | nullableReftype | exprs.kt:229:1:250:1 | equalityTests | VarAccess | +| exprs.kt:245:13:245:35 | ... (value equals) ... | exprs.kt:229:1:250:1 | equalityTests | ValueEQExpr | +| exprs.kt:245:32:245:35 | null | exprs.kt:229:1:250:1 | equalityTests | NullLiteral | +| exprs.kt:246:7:246:9 | b17 | exprs.kt:229:1:250:1 | equalityTests | LocalVariableDeclExpr | +| exprs.kt:246:13:246:28 | notNullPrimitive | exprs.kt:229:1:250:1 | equalityTests | VarAccess | +| exprs.kt:246:13:246:36 | ... (value not-equals) ... | exprs.kt:229:1:250:1 | equalityTests | ValueNEExpr | +| exprs.kt:246:33:246:36 | null | exprs.kt:229:1:250:1 | equalityTests | NullLiteral | +| exprs.kt:247:7:247:9 | b18 | exprs.kt:229:1:250:1 | equalityTests | LocalVariableDeclExpr | +| exprs.kt:247:13:247:29 | nullablePrimitive | exprs.kt:229:1:250:1 | equalityTests | VarAccess | +| exprs.kt:247:13:247:37 | ... (value not-equals) ... | exprs.kt:229:1:250:1 | equalityTests | ValueNEExpr | +| exprs.kt:247:34:247:37 | null | exprs.kt:229:1:250:1 | equalityTests | NullLiteral | +| exprs.kt:248:7:248:9 | b19 | exprs.kt:229:1:250:1 | equalityTests | LocalVariableDeclExpr | +| exprs.kt:248:13:248:26 | notNullReftype | exprs.kt:229:1:250:1 | equalityTests | VarAccess | +| exprs.kt:248:13:248:34 | ... (value not-equals) ... | exprs.kt:229:1:250:1 | equalityTests | ValueNEExpr | +| exprs.kt:248:31:248:34 | null | exprs.kt:229:1:250:1 | equalityTests | NullLiteral | +| exprs.kt:249:7:249:9 | b20 | exprs.kt:229:1:250:1 | equalityTests | LocalVariableDeclExpr | +| exprs.kt:249:13:249:27 | nullableReftype | exprs.kt:229:1:250:1 | equalityTests | VarAccess | +| exprs.kt:249:13:249:35 | ... (value not-equals) ... | exprs.kt:229:1:250:1 | equalityTests | ValueNEExpr | +| exprs.kt:249:32:249:35 | null | exprs.kt:229:1:250:1 | equalityTests | NullLiteral | +| exprs.kt:252:1:265:1 | Unit | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:252:18:252:23 | int | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:252:26:252:31 | int | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:253:18:253:26 | byte | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:253:29:253:37 | byte | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:254:18:254:26 | short | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:254:29:254:37 | short | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:255:18:255:25 | long | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:255:28:255:35 | long | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:256:18:256:27 | double | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:256:30:256:39 | double | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:257:18:257:26 | float | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:257:29:257:37 | float | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:259:7:259:7 | i | exprs.kt:252:1:265:1 | mulOperators | LocalVariableDeclExpr | +| exprs.kt:259:11:259:11 | x | exprs.kt:252:1:265:1 | mulOperators | VarAccess | +| exprs.kt:259:11:259:15 | ... * ... | exprs.kt:252:1:265:1 | mulOperators | MulExpr | +| exprs.kt:259:15:259:15 | y | exprs.kt:252:1:265:1 | mulOperators | VarAccess | +| exprs.kt:260:7:260:7 | b | exprs.kt:252:1:265:1 | mulOperators | LocalVariableDeclExpr | +| exprs.kt:260:11:260:13 | byx | exprs.kt:252:1:265:1 | mulOperators | VarAccess | +| exprs.kt:260:11:260:19 | ... * ... | exprs.kt:252:1:265:1 | mulOperators | MulExpr | +| exprs.kt:260:17:260:19 | byy | exprs.kt:252:1:265:1 | mulOperators | VarAccess | +| exprs.kt:261:7:261:7 | l | exprs.kt:252:1:265:1 | mulOperators | LocalVariableDeclExpr | +| exprs.kt:261:11:261:12 | lx | exprs.kt:252:1:265:1 | mulOperators | VarAccess | +| exprs.kt:261:11:261:17 | ... * ... | exprs.kt:252:1:265:1 | mulOperators | MulExpr | +| exprs.kt:261:16:261:17 | ly | exprs.kt:252:1:265:1 | mulOperators | VarAccess | +| exprs.kt:262:7:262:7 | d | exprs.kt:252:1:265:1 | mulOperators | LocalVariableDeclExpr | +| exprs.kt:262:11:262:12 | dx | exprs.kt:252:1:265:1 | mulOperators | VarAccess | +| exprs.kt:262:11:262:17 | ... * ... | exprs.kt:252:1:265:1 | mulOperators | MulExpr | +| exprs.kt:262:16:262:17 | dy | exprs.kt:252:1:265:1 | mulOperators | VarAccess | +| exprs.kt:263:7:263:7 | f | exprs.kt:252:1:265:1 | mulOperators | LocalVariableDeclExpr | +| exprs.kt:263:11:263:12 | fx | exprs.kt:252:1:265:1 | mulOperators | VarAccess | +| exprs.kt:263:11:263:17 | ... * ... | exprs.kt:252:1:265:1 | mulOperators | MulExpr | +| exprs.kt:263:16:263:17 | fy | exprs.kt:252:1:265:1 | mulOperators | VarAccess | +| exprs.kt:267:1:276:1 | Unit | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:269:7:269:13 | updated | exprs.kt:267:1:276:1 | inPlaceOperators | LocalVariableDeclExpr | +| exprs.kt:269:17:269:17 | 0 | exprs.kt:267:1:276:1 | inPlaceOperators | IntegerLiteral | +| exprs.kt:270:3:270:9 | updated | exprs.kt:267:1:276:1 | inPlaceOperators | VarAccess | +| exprs.kt:270:3:270:14 | ...+=... | exprs.kt:267:1:276:1 | inPlaceOperators | AssignAddExpr | +| exprs.kt:270:14:270:14 | 1 | exprs.kt:267:1:276:1 | inPlaceOperators | IntegerLiteral | +| exprs.kt:271:3:271:9 | updated | exprs.kt:267:1:276:1 | inPlaceOperators | VarAccess | +| exprs.kt:271:3:271:14 | ...-=... | exprs.kt:267:1:276:1 | inPlaceOperators | AssignSubExpr | +| exprs.kt:271:14:271:14 | 1 | exprs.kt:267:1:276:1 | inPlaceOperators | IntegerLiteral | +| exprs.kt:272:3:272:9 | updated | exprs.kt:267:1:276:1 | inPlaceOperators | VarAccess | +| exprs.kt:272:3:272:14 | ...*=... | exprs.kt:267:1:276:1 | inPlaceOperators | AssignMulExpr | +| exprs.kt:272:14:272:14 | 1 | exprs.kt:267:1:276:1 | inPlaceOperators | IntegerLiteral | +| exprs.kt:273:3:273:9 | updated | exprs.kt:267:1:276:1 | inPlaceOperators | VarAccess | +| exprs.kt:273:3:273:14 | .../=... | exprs.kt:267:1:276:1 | inPlaceOperators | AssignDivExpr | +| exprs.kt:273:14:273:14 | 1 | exprs.kt:267:1:276:1 | inPlaceOperators | IntegerLiteral | +| exprs.kt:274:3:274:9 | updated | exprs.kt:267:1:276:1 | inPlaceOperators | VarAccess | +| exprs.kt:274:3:274:14 | ...%=... | exprs.kt:267:1:276:1 | inPlaceOperators | AssignRemExpr | +| exprs.kt:274:14:274:14 | 1 | exprs.kt:267:1:276:1 | inPlaceOperators | IntegerLiteral | +| exprs.kt:278:8:278:66 | T | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:278:8:278:66 | T[] | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:278:52:278:66 | | exprs.kt:278:8:278:66 | getEnumValues | ErrorExpr | +| exprs.kt:280:1:283:1 | Unit | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:281:5:281:23 | | exprs.kt:280:1:283:1 | callToEnumValues | ImplicitCoercionToUnitExpr | +| exprs.kt:281:5:281:23 | Color | exprs.kt:280:1:283:1 | callToEnumValues | TypeAccess | +| exprs.kt:281:5:281:23 | Unit | exprs.kt:280:1:283:1 | callToEnumValues | TypeAccess | +| exprs.kt:281:5:281:23 | values(...) | exprs.kt:280:1:283:1 | callToEnumValues | MethodCall | +| exprs.kt:282:5:282:26 | | exprs.kt:280:1:283:1 | callToEnumValues | ImplicitCoercionToUnitExpr | +| exprs.kt:282:5:282:26 | Color | exprs.kt:280:1:283:1 | callToEnumValues | TypeAccess | +| exprs.kt:282:5:282:26 | ExprsKt | exprs.kt:280:1:283:1 | callToEnumValues | TypeAccess | +| exprs.kt:282:5:282:26 | Unit | exprs.kt:280:1:283:1 | callToEnumValues | TypeAccess | +| exprs.kt:282:5:282:26 | getEnumValues(...) | exprs.kt:280:1:283:1 | callToEnumValues | MethodCall | +| exprs.kt:285:1:346:1 | Unit | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:285:16:285:21 | int | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:285:24:285:32 | double | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:285:35:285:41 | byte | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:285:44:285:51 | short | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:285:54:285:60 | long | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:285:63:285:70 | float | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:286:5:286:6 | -... | exprs.kt:285:1:346:1 | unaryExprs | MinusExpr | +| exprs.kt:286:5:286:6 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | +| exprs.kt:286:5:286:6 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | +| exprs.kt:286:6:286:6 | i | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:287:5:287:6 | +... | exprs.kt:285:1:346:1 | unaryExprs | PlusExpr | +| exprs.kt:287:5:287:6 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | +| exprs.kt:287:5:287:6 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | +| exprs.kt:287:6:287:6 | i | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:288:5:288:6 | -... | exprs.kt:285:1:346:1 | unaryExprs | MinusExpr | +| exprs.kt:288:5:288:6 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | +| exprs.kt:288:5:288:6 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | +| exprs.kt:288:6:288:6 | d | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:289:5:289:6 | +... | exprs.kt:285:1:346:1 | unaryExprs | PlusExpr | +| exprs.kt:289:5:289:6 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | +| exprs.kt:289:5:289:6 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | +| exprs.kt:289:6:289:6 | d | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:290:9:290:10 | i0 | exprs.kt:285:1:346:1 | unaryExprs | LocalVariableDeclExpr | +| exprs.kt:290:14:290:14 | 1 | exprs.kt:285:1:346:1 | unaryExprs | IntegerLiteral | +| exprs.kt:291:9:291:10 | i1 | exprs.kt:285:1:346:1 | unaryExprs | LocalVariableDeclExpr | +| exprs.kt:291:14:291:14 | 1 | exprs.kt:285:1:346:1 | unaryExprs | IntegerLiteral | +| exprs.kt:292:5:292:6 | i0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:292:5:292:6 | i0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:292:5:292:8 | ...=... | exprs.kt:285:1:346:1 | unaryExprs | AssignExpr | +| exprs.kt:292:5:292:8 | | exprs.kt:285:1:346:1 | unaryExprs | StmtExpr | +| exprs.kt:292:5:292:8 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | +| exprs.kt:292:5:292:8 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | +| exprs.kt:292:5:292:8 | inc(...) | exprs.kt:285:1:346:1 | unaryExprs | MethodCall | +| exprs.kt:292:5:292:8 | tmp0 | exprs.kt:285:1:346:1 | unaryExprs | LocalVariableDeclExpr | +| exprs.kt:292:5:292:8 | tmp0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:292:5:292:8 | tmp0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:293:5:293:8 | | exprs.kt:285:1:346:1 | unaryExprs | StmtExpr | +| exprs.kt:293:5:293:8 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | +| exprs.kt:293:5:293:8 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | +| exprs.kt:293:5:293:8 | inc(...) | exprs.kt:285:1:346:1 | unaryExprs | MethodCall | +| exprs.kt:293:7:293:8 | ...=... | exprs.kt:285:1:346:1 | unaryExprs | AssignExpr | +| exprs.kt:293:7:293:8 | i0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:293:7:293:8 | i0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:293:7:293:8 | i0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:294:5:294:6 | i0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:294:5:294:6 | i0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:294:5:294:8 | ...=... | exprs.kt:285:1:346:1 | unaryExprs | AssignExpr | +| exprs.kt:294:5:294:8 | | exprs.kt:285:1:346:1 | unaryExprs | StmtExpr | +| exprs.kt:294:5:294:8 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | +| exprs.kt:294:5:294:8 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | +| exprs.kt:294:5:294:8 | dec(...) | exprs.kt:285:1:346:1 | unaryExprs | MethodCall | +| exprs.kt:294:5:294:8 | tmp1 | exprs.kt:285:1:346:1 | unaryExprs | LocalVariableDeclExpr | +| exprs.kt:294:5:294:8 | tmp1 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:294:5:294:8 | tmp1 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:295:5:295:8 | | exprs.kt:285:1:346:1 | unaryExprs | StmtExpr | +| exprs.kt:295:5:295:8 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | +| exprs.kt:295:5:295:8 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | +| exprs.kt:295:5:295:8 | dec(...) | exprs.kt:285:1:346:1 | unaryExprs | MethodCall | +| exprs.kt:295:7:295:8 | ...=... | exprs.kt:285:1:346:1 | unaryExprs | AssignExpr | +| exprs.kt:295:7:295:8 | i0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:295:7:295:8 | i0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:295:7:295:8 | i0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:296:5:296:6 | i0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:296:5:296:12 | inc(...) | exprs.kt:285:1:346:1 | unaryExprs | MethodCall | +| exprs.kt:296:8:296:12 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | +| exprs.kt:296:8:296:12 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | +| exprs.kt:297:5:297:6 | i0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:297:5:297:12 | dec(...) | exprs.kt:285:1:346:1 | unaryExprs | MethodCall | +| exprs.kt:297:8:297:12 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | +| exprs.kt:297:8:297:12 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | +| exprs.kt:298:5:298:6 | i1 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:298:5:298:12 | inc(...) | exprs.kt:285:1:346:1 | unaryExprs | MethodCall | +| exprs.kt:298:8:298:12 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | +| exprs.kt:298:8:298:12 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | +| exprs.kt:299:5:299:6 | i1 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:299:5:299:12 | dec(...) | exprs.kt:285:1:346:1 | unaryExprs | MethodCall | +| exprs.kt:299:8:299:12 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | +| exprs.kt:299:8:299:12 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | +| exprs.kt:300:5:300:5 | i | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:300:5:300:11 | ~... | exprs.kt:285:1:346:1 | unaryExprs | BitNotExpr | +| exprs.kt:300:7:300:11 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | +| exprs.kt:300:7:300:11 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | +| exprs.kt:302:5:302:6 | -... | exprs.kt:285:1:346:1 | unaryExprs | MinusExpr | +| exprs.kt:302:5:302:6 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | +| exprs.kt:302:5:302:6 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | +| exprs.kt:302:6:302:6 | b | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:303:5:303:6 | +... | exprs.kt:285:1:346:1 | unaryExprs | PlusExpr | +| exprs.kt:303:5:303:6 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | +| exprs.kt:303:5:303:6 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | +| exprs.kt:303:6:303:6 | b | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:304:9:304:10 | b0 | exprs.kt:285:1:346:1 | unaryExprs | LocalVariableDeclExpr | +| exprs.kt:304:20:304:20 | 1 | exprs.kt:285:1:346:1 | unaryExprs | IntegerLiteral | +| exprs.kt:305:9:305:10 | b1 | exprs.kt:285:1:346:1 | unaryExprs | LocalVariableDeclExpr | +| exprs.kt:305:20:305:20 | 1 | exprs.kt:285:1:346:1 | unaryExprs | IntegerLiteral | +| exprs.kt:306:5:306:6 | b0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:306:5:306:6 | b0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:306:5:306:8 | ...=... | exprs.kt:285:1:346:1 | unaryExprs | AssignExpr | +| exprs.kt:306:5:306:8 | | exprs.kt:285:1:346:1 | unaryExprs | StmtExpr | +| exprs.kt:306:5:306:8 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | +| exprs.kt:306:5:306:8 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | +| exprs.kt:306:5:306:8 | inc(...) | exprs.kt:285:1:346:1 | unaryExprs | MethodCall | +| exprs.kt:306:5:306:8 | tmp2 | exprs.kt:285:1:346:1 | unaryExprs | LocalVariableDeclExpr | +| exprs.kt:306:5:306:8 | tmp2 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:306:5:306:8 | tmp2 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:307:5:307:8 | | exprs.kt:285:1:346:1 | unaryExprs | StmtExpr | +| exprs.kt:307:5:307:8 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | +| exprs.kt:307:5:307:8 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | +| exprs.kt:307:5:307:8 | inc(...) | exprs.kt:285:1:346:1 | unaryExprs | MethodCall | +| exprs.kt:307:7:307:8 | ...=... | exprs.kt:285:1:346:1 | unaryExprs | AssignExpr | +| exprs.kt:307:7:307:8 | b0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:307:7:307:8 | b0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:307:7:307:8 | b0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:308:5:308:6 | b0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:308:5:308:6 | b0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:308:5:308:8 | ...=... | exprs.kt:285:1:346:1 | unaryExprs | AssignExpr | +| exprs.kt:308:5:308:8 | | exprs.kt:285:1:346:1 | unaryExprs | StmtExpr | +| exprs.kt:308:5:308:8 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | +| exprs.kt:308:5:308:8 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | +| exprs.kt:308:5:308:8 | dec(...) | exprs.kt:285:1:346:1 | unaryExprs | MethodCall | +| exprs.kt:308:5:308:8 | tmp3 | exprs.kt:285:1:346:1 | unaryExprs | LocalVariableDeclExpr | +| exprs.kt:308:5:308:8 | tmp3 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:308:5:308:8 | tmp3 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:309:5:309:8 | | exprs.kt:285:1:346:1 | unaryExprs | StmtExpr | +| exprs.kt:309:5:309:8 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | +| exprs.kt:309:5:309:8 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | +| exprs.kt:309:5:309:8 | dec(...) | exprs.kt:285:1:346:1 | unaryExprs | MethodCall | +| exprs.kt:309:7:309:8 | ...=... | exprs.kt:285:1:346:1 | unaryExprs | AssignExpr | +| exprs.kt:309:7:309:8 | b0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:309:7:309:8 | b0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:309:7:309:8 | b0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:310:5:310:6 | b0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:310:5:310:12 | inc(...) | exprs.kt:285:1:346:1 | unaryExprs | MethodCall | +| exprs.kt:310:8:310:12 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | +| exprs.kt:310:8:310:12 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | +| exprs.kt:311:5:311:6 | b0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:311:5:311:12 | dec(...) | exprs.kt:285:1:346:1 | unaryExprs | MethodCall | +| exprs.kt:311:8:311:12 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | +| exprs.kt:311:8:311:12 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | +| exprs.kt:312:5:312:6 | b1 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:312:5:312:12 | inc(...) | exprs.kt:285:1:346:1 | unaryExprs | MethodCall | +| exprs.kt:312:8:312:12 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | +| exprs.kt:312:8:312:12 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | +| exprs.kt:313:5:313:6 | b1 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:313:5:313:12 | dec(...) | exprs.kt:285:1:346:1 | unaryExprs | MethodCall | +| exprs.kt:313:8:313:12 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | +| exprs.kt:313:8:313:12 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | +| exprs.kt:314:5:314:5 | b | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:314:5:314:11 | ~... | exprs.kt:285:1:346:1 | unaryExprs | BitNotExpr | +| exprs.kt:314:7:314:11 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | +| exprs.kt:314:7:314:11 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | +| exprs.kt:316:5:316:6 | -... | exprs.kt:285:1:346:1 | unaryExprs | MinusExpr | +| exprs.kt:316:5:316:6 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | +| exprs.kt:316:5:316:6 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | +| exprs.kt:316:6:316:6 | s | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:317:5:317:6 | +... | exprs.kt:285:1:346:1 | unaryExprs | PlusExpr | +| exprs.kt:317:5:317:6 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | +| exprs.kt:317:5:317:6 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | +| exprs.kt:317:6:317:6 | s | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:318:9:318:10 | s0 | exprs.kt:285:1:346:1 | unaryExprs | LocalVariableDeclExpr | +| exprs.kt:318:21:318:21 | 1 | exprs.kt:285:1:346:1 | unaryExprs | IntegerLiteral | +| exprs.kt:319:9:319:10 | s1 | exprs.kt:285:1:346:1 | unaryExprs | LocalVariableDeclExpr | +| exprs.kt:319:21:319:21 | 1 | exprs.kt:285:1:346:1 | unaryExprs | IntegerLiteral | +| exprs.kt:320:5:320:6 | s0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:320:5:320:6 | s0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:320:5:320:8 | ...=... | exprs.kt:285:1:346:1 | unaryExprs | AssignExpr | +| exprs.kt:320:5:320:8 | | exprs.kt:285:1:346:1 | unaryExprs | StmtExpr | +| exprs.kt:320:5:320:8 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | +| exprs.kt:320:5:320:8 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | +| exprs.kt:320:5:320:8 | inc(...) | exprs.kt:285:1:346:1 | unaryExprs | MethodCall | +| exprs.kt:320:5:320:8 | tmp4 | exprs.kt:285:1:346:1 | unaryExprs | LocalVariableDeclExpr | +| exprs.kt:320:5:320:8 | tmp4 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:320:5:320:8 | tmp4 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:321:5:321:8 | | exprs.kt:285:1:346:1 | unaryExprs | StmtExpr | +| exprs.kt:321:5:321:8 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | +| exprs.kt:321:5:321:8 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | +| exprs.kt:321:5:321:8 | inc(...) | exprs.kt:285:1:346:1 | unaryExprs | MethodCall | +| exprs.kt:321:7:321:8 | ...=... | exprs.kt:285:1:346:1 | unaryExprs | AssignExpr | +| exprs.kt:321:7:321:8 | s0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:321:7:321:8 | s0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:321:7:321:8 | s0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:322:5:322:6 | s0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:322:5:322:6 | s0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:322:5:322:8 | ...=... | exprs.kt:285:1:346:1 | unaryExprs | AssignExpr | +| exprs.kt:322:5:322:8 | | exprs.kt:285:1:346:1 | unaryExprs | StmtExpr | +| exprs.kt:322:5:322:8 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | +| exprs.kt:322:5:322:8 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | +| exprs.kt:322:5:322:8 | dec(...) | exprs.kt:285:1:346:1 | unaryExprs | MethodCall | +| exprs.kt:322:5:322:8 | tmp5 | exprs.kt:285:1:346:1 | unaryExprs | LocalVariableDeclExpr | +| exprs.kt:322:5:322:8 | tmp5 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:322:5:322:8 | tmp5 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:323:5:323:8 | | exprs.kt:285:1:346:1 | unaryExprs | StmtExpr | +| exprs.kt:323:5:323:8 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | +| exprs.kt:323:5:323:8 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | +| exprs.kt:323:5:323:8 | dec(...) | exprs.kt:285:1:346:1 | unaryExprs | MethodCall | +| exprs.kt:323:7:323:8 | ...=... | exprs.kt:285:1:346:1 | unaryExprs | AssignExpr | +| exprs.kt:323:7:323:8 | s0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:323:7:323:8 | s0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:323:7:323:8 | s0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:324:5:324:6 | s0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:324:5:324:12 | inc(...) | exprs.kt:285:1:346:1 | unaryExprs | MethodCall | +| exprs.kt:324:8:324:12 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | +| exprs.kt:324:8:324:12 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | +| exprs.kt:325:5:325:6 | s0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:325:5:325:12 | dec(...) | exprs.kt:285:1:346:1 | unaryExprs | MethodCall | +| exprs.kt:325:8:325:12 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | +| exprs.kt:325:8:325:12 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | +| exprs.kt:326:5:326:6 | s1 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:326:5:326:12 | inc(...) | exprs.kt:285:1:346:1 | unaryExprs | MethodCall | +| exprs.kt:326:8:326:12 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | +| exprs.kt:326:8:326:12 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | +| exprs.kt:327:5:327:6 | s1 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:327:5:327:12 | dec(...) | exprs.kt:285:1:346:1 | unaryExprs | MethodCall | +| exprs.kt:327:8:327:12 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | +| exprs.kt:327:8:327:12 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | +| exprs.kt:328:5:328:5 | s | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:328:5:328:11 | ~... | exprs.kt:285:1:346:1 | unaryExprs | BitNotExpr | +| exprs.kt:328:7:328:11 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | +| exprs.kt:328:7:328:11 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | +| exprs.kt:330:5:330:6 | -... | exprs.kt:285:1:346:1 | unaryExprs | MinusExpr | +| exprs.kt:330:5:330:6 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | +| exprs.kt:330:5:330:6 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | +| exprs.kt:330:6:330:6 | l | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:331:5:331:6 | +... | exprs.kt:285:1:346:1 | unaryExprs | PlusExpr | +| exprs.kt:331:5:331:6 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | +| exprs.kt:331:5:331:6 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | +| exprs.kt:331:6:331:6 | l | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:332:9:332:10 | l0 | exprs.kt:285:1:346:1 | unaryExprs | LocalVariableDeclExpr | +| exprs.kt:332:20:332:20 | 1 | exprs.kt:285:1:346:1 | unaryExprs | LongLiteral | +| exprs.kt:333:9:333:10 | l1 | exprs.kt:285:1:346:1 | unaryExprs | LocalVariableDeclExpr | +| exprs.kt:333:20:333:20 | 1 | exprs.kt:285:1:346:1 | unaryExprs | LongLiteral | +| exprs.kt:334:5:334:6 | l0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:334:5:334:6 | l0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:334:5:334:8 | ...=... | exprs.kt:285:1:346:1 | unaryExprs | AssignExpr | +| exprs.kt:334:5:334:8 | | exprs.kt:285:1:346:1 | unaryExprs | StmtExpr | +| exprs.kt:334:5:334:8 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | +| exprs.kt:334:5:334:8 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | +| exprs.kt:334:5:334:8 | inc(...) | exprs.kt:285:1:346:1 | unaryExprs | MethodCall | +| exprs.kt:334:5:334:8 | tmp6 | exprs.kt:285:1:346:1 | unaryExprs | LocalVariableDeclExpr | +| exprs.kt:334:5:334:8 | tmp6 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:334:5:334:8 | tmp6 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:335:5:335:8 | | exprs.kt:285:1:346:1 | unaryExprs | StmtExpr | +| exprs.kt:335:5:335:8 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | +| exprs.kt:335:5:335:8 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | +| exprs.kt:335:5:335:8 | inc(...) | exprs.kt:285:1:346:1 | unaryExprs | MethodCall | +| exprs.kt:335:7:335:8 | ...=... | exprs.kt:285:1:346:1 | unaryExprs | AssignExpr | +| exprs.kt:335:7:335:8 | l0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:335:7:335:8 | l0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:335:7:335:8 | l0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:336:5:336:6 | l0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:336:5:336:6 | l0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:336:5:336:8 | ...=... | exprs.kt:285:1:346:1 | unaryExprs | AssignExpr | +| exprs.kt:336:5:336:8 | | exprs.kt:285:1:346:1 | unaryExprs | StmtExpr | +| exprs.kt:336:5:336:8 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | +| exprs.kt:336:5:336:8 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | +| exprs.kt:336:5:336:8 | dec(...) | exprs.kt:285:1:346:1 | unaryExprs | MethodCall | +| exprs.kt:336:5:336:8 | tmp7 | exprs.kt:285:1:346:1 | unaryExprs | LocalVariableDeclExpr | +| exprs.kt:336:5:336:8 | tmp7 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:336:5:336:8 | tmp7 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:337:5:337:8 | | exprs.kt:285:1:346:1 | unaryExprs | StmtExpr | +| exprs.kt:337:5:337:8 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | +| exprs.kt:337:5:337:8 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | +| exprs.kt:337:5:337:8 | dec(...) | exprs.kt:285:1:346:1 | unaryExprs | MethodCall | +| exprs.kt:337:7:337:8 | ...=... | exprs.kt:285:1:346:1 | unaryExprs | AssignExpr | +| exprs.kt:337:7:337:8 | l0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:337:7:337:8 | l0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:337:7:337:8 | l0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:338:5:338:6 | l0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:338:5:338:12 | inc(...) | exprs.kt:285:1:346:1 | unaryExprs | MethodCall | +| exprs.kt:338:8:338:12 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | +| exprs.kt:338:8:338:12 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | +| exprs.kt:339:5:339:6 | l0 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:339:5:339:12 | dec(...) | exprs.kt:285:1:346:1 | unaryExprs | MethodCall | +| exprs.kt:339:8:339:12 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | +| exprs.kt:339:8:339:12 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | +| exprs.kt:340:5:340:6 | l1 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:340:5:340:12 | inc(...) | exprs.kt:285:1:346:1 | unaryExprs | MethodCall | +| exprs.kt:340:8:340:12 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | +| exprs.kt:340:8:340:12 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | +| exprs.kt:341:5:341:6 | l1 | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:341:5:341:12 | dec(...) | exprs.kt:285:1:346:1 | unaryExprs | MethodCall | +| exprs.kt:341:8:341:12 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | +| exprs.kt:341:8:341:12 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | +| exprs.kt:342:5:342:5 | l | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:342:5:342:11 | ~... | exprs.kt:285:1:346:1 | unaryExprs | BitNotExpr | +| exprs.kt:342:7:342:11 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | +| exprs.kt:342:7:342:11 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | +| exprs.kt:344:5:344:6 | +... | exprs.kt:285:1:346:1 | unaryExprs | PlusExpr | +| exprs.kt:344:5:344:6 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | +| exprs.kt:344:5:344:6 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | +| exprs.kt:344:6:344:6 | f | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| exprs.kt:345:5:345:6 | -... | exprs.kt:285:1:346:1 | unaryExprs | MinusExpr | +| exprs.kt:345:5:345:6 | | exprs.kt:285:1:346:1 | unaryExprs | ImplicitCoercionToUnitExpr | +| exprs.kt:345:5:345:6 | Unit | exprs.kt:285:1:346:1 | unaryExprs | TypeAccess | +| exprs.kt:345:6:345:6 | f | exprs.kt:285:1:346:1 | unaryExprs | VarAccess | +| funcExprs.kt:1:1:1:46 | Unit | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:1:26:1:37 | Function0 | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:1:26:1:37 | Integer | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:1:42:1:42 | f | funcExprs.kt:1:1:1:46 | functionExpression0a | VarAccess | +| funcExprs.kt:1:42:1:44 | | funcExprs.kt:1:1:1:46 | functionExpression0a | ImplicitCoercionToUnitExpr | +| funcExprs.kt:1:42:1:44 | Unit | funcExprs.kt:1:1:1:46 | functionExpression0a | TypeAccess | +| funcExprs.kt:1:42:1:44 | invoke(...) | funcExprs.kt:1:1:1:46 | functionExpression0a | MethodCall | +| funcExprs.kt:2:1:2:47 | Unit | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:2:26:2:38 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| funcExprs.kt:2:26:2:38 | Function0 | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:2:26:2:38 | Object | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:2:43:2:43 | f | funcExprs.kt:2:1:2:47 | functionExpression0b | VarAccess | +| funcExprs.kt:2:43:2:45 | | funcExprs.kt:2:1:2:47 | functionExpression0b | ImplicitCoercionToUnitExpr | +| funcExprs.kt:2:43:2:45 | Unit | funcExprs.kt:2:1:2:47 | functionExpression0b | TypeAccess | +| funcExprs.kt:2:43:2:45 | invoke(...) | funcExprs.kt:2:1:2:47 | functionExpression0b | MethodCall | +| funcExprs.kt:3:1:3:46 | Unit | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:3:26:3:37 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| funcExprs.kt:3:26:3:37 | Function0 | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:3:26:3:37 | Object | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:3:42:3:42 | f | funcExprs.kt:3:1:3:46 | functionExpression0c | VarAccess | +| funcExprs.kt:3:42:3:44 | | funcExprs.kt:3:1:3:46 | functionExpression0c | ImplicitCoercionToUnitExpr | +| funcExprs.kt:3:42:3:44 | Unit | funcExprs.kt:3:1:3:46 | functionExpression0c | TypeAccess | +| funcExprs.kt:3:42:3:44 | invoke(...) | funcExprs.kt:3:1:3:46 | functionExpression0c | MethodCall | +| funcExprs.kt:4:1:4:58 | Unit | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:4:26:4:31 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:4:34:4:48 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| funcExprs.kt:4:34:4:48 | Function1 | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:4:34:4:48 | Integer | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:4:34:4:48 | Integer | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:4:53:4:53 | f | funcExprs.kt:4:1:4:58 | functionExpression1a | VarAccess | +| funcExprs.kt:4:53:4:56 | | funcExprs.kt:4:1:4:58 | functionExpression1a | ImplicitCoercionToUnitExpr | +| funcExprs.kt:4:53:4:56 | Unit | funcExprs.kt:4:1:4:58 | functionExpression1a | TypeAccess | +| funcExprs.kt:4:53:4:56 | invoke(...) | funcExprs.kt:4:1:4:58 | functionExpression1a | MethodCall | +| funcExprs.kt:4:55:4:55 | x | funcExprs.kt:4:1:4:58 | functionExpression1a | VarAccess | +| funcExprs.kt:5:1:5:60 | Unit | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:5:26:5:31 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:5:34:5:50 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| funcExprs.kt:5:34:5:50 | Function1 | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:5:34:5:50 | Object | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:5:34:5:50 | Object | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:5:55:5:55 | f | funcExprs.kt:5:1:5:60 | functionExpression1b | VarAccess | +| funcExprs.kt:5:55:5:58 | | funcExprs.kt:5:1:5:60 | functionExpression1b | ImplicitCoercionToUnitExpr | +| funcExprs.kt:5:55:5:58 | Unit | funcExprs.kt:5:1:5:60 | functionExpression1b | TypeAccess | +| funcExprs.kt:5:55:5:58 | invoke(...) | funcExprs.kt:5:1:5:60 | functionExpression1b | MethodCall | +| funcExprs.kt:5:57:5:57 | x | funcExprs.kt:5:1:5:60 | functionExpression1b | VarAccess | +| funcExprs.kt:6:1:6:78 | Unit | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:6:26:6:31 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:6:34:6:57 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| funcExprs.kt:6:34:6:57 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| funcExprs.kt:6:34:6:57 | FuncRef | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:6:34:6:57 | Function2 | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:6:34:6:57 | Integer | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:6:34:6:57 | Integer | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:6:62:6:62 | f | funcExprs.kt:6:1:6:78 | functionExpression1c | VarAccess | +| funcExprs.kt:6:62:6:76 | | funcExprs.kt:6:1:6:78 | functionExpression1c | ImplicitCoercionToUnitExpr | +| funcExprs.kt:6:62:6:76 | Unit | funcExprs.kt:6:1:6:78 | functionExpression1c | TypeAccess | +| funcExprs.kt:6:62:6:76 | invoke(...) | funcExprs.kt:6:1:6:78 | functionExpression1c | MethodCall | +| funcExprs.kt:6:64:6:72 | FuncRef | funcExprs.kt:6:1:6:78 | functionExpression1c | TypeAccess | +| funcExprs.kt:6:64:6:72 | new FuncRef(...) | funcExprs.kt:6:1:6:78 | functionExpression1c | ClassInstanceExpr | +| funcExprs.kt:6:75:6:75 | x | funcExprs.kt:6:1:6:78 | functionExpression1c | VarAccess | +| funcExprs.kt:7:1:7:65 | Unit | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:7:25:7:30 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:7:33:7:52 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| funcExprs.kt:7:33:7:52 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| funcExprs.kt:7:33:7:52 | Function2 | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:7:33:7:52 | Integer | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:7:33:7:52 | Integer | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:7:33:7:52 | Integer | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:7:57:7:57 | f | funcExprs.kt:7:1:7:65 | functionExpression2 | VarAccess | +| funcExprs.kt:7:57:7:63 | | funcExprs.kt:7:1:7:65 | functionExpression2 | ImplicitCoercionToUnitExpr | +| funcExprs.kt:7:57:7:63 | Unit | funcExprs.kt:7:1:7:65 | functionExpression2 | TypeAccess | +| funcExprs.kt:7:57:7:63 | invoke(...) | funcExprs.kt:7:1:7:65 | functionExpression2 | MethodCall | +| funcExprs.kt:7:59:7:59 | x | funcExprs.kt:7:1:7:65 | functionExpression2 | VarAccess | +| funcExprs.kt:7:62:7:62 | x | funcExprs.kt:7:1:7:65 | functionExpression2 | VarAccess | +| funcExprs.kt:8:1:8:63 | Unit | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:8:25:8:30 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:8:33:8:51 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| funcExprs.kt:8:33:8:51 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| funcExprs.kt:8:33:8:51 | Function2 | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:8:33:8:51 | Integer | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:8:33:8:51 | Integer | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:8:33:8:51 | Integer | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:8:56:8:56 | x | funcExprs.kt:8:1:8:63 | functionExpression3 | VarAccess | +| funcExprs.kt:8:58:8:58 | f | funcExprs.kt:8:1:8:63 | functionExpression3 | VarAccess | +| funcExprs.kt:8:58:8:61 | | funcExprs.kt:8:1:8:63 | functionExpression3 | ImplicitCoercionToUnitExpr | +| funcExprs.kt:8:58:8:61 | Unit | funcExprs.kt:8:1:8:63 | functionExpression3 | TypeAccess | +| funcExprs.kt:8:58:8:61 | invoke(...) | funcExprs.kt:8:1:8:63 | functionExpression3 | MethodCall | +| funcExprs.kt:8:60:8:60 | x | funcExprs.kt:8:1:8:63 | functionExpression3 | VarAccess | +| funcExprs.kt:9:1:9:74 | Unit | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:9:25:9:30 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:9:33:9:61 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| funcExprs.kt:9:33:9:61 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| funcExprs.kt:9:33:9:61 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| funcExprs.kt:9:33:9:61 | Double | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:9:33:9:61 | Function1> | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:9:33:9:61 | Function1 | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:9:33:9:61 | Integer | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:9:33:9:61 | Integer | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:9:66:9:66 | f | funcExprs.kt:9:1:9:74 | functionExpression4 | VarAccess | +| funcExprs.kt:9:66:9:69 | invoke(...) | funcExprs.kt:9:1:9:74 | functionExpression4 | MethodCall | +| funcExprs.kt:9:66:9:72 | | funcExprs.kt:9:1:9:74 | functionExpression4 | ImplicitCoercionToUnitExpr | +| funcExprs.kt:9:66:9:72 | Unit | funcExprs.kt:9:1:9:74 | functionExpression4 | TypeAccess | +| funcExprs.kt:9:66:9:72 | invoke(...) | funcExprs.kt:9:1:9:74 | functionExpression4 | MethodCall | +| funcExprs.kt:9:68:9:68 | x | funcExprs.kt:9:1:9:74 | functionExpression4 | VarAccess | +| funcExprs.kt:9:71:9:71 | x | funcExprs.kt:9:1:9:74 | functionExpression4 | VarAccess | +| funcExprs.kt:11:1:13:1 | Unit | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:11:26:11:31 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:11:34:11:154 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| funcExprs.kt:11:34:11:154 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| funcExprs.kt:11:34:11:154 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| funcExprs.kt:11:34:11:154 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| funcExprs.kt:11:34:11:154 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| funcExprs.kt:11:34:11:154 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| funcExprs.kt:11:34:11:154 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| funcExprs.kt:11:34:11:154 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| funcExprs.kt:11:34:11:154 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| funcExprs.kt:11:34:11:154 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| funcExprs.kt:11:34:11:154 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| funcExprs.kt:11:34:11:154 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| funcExprs.kt:11:34:11:154 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| funcExprs.kt:11:34:11:154 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| funcExprs.kt:11:34:11:154 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| funcExprs.kt:11:34:11:154 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| funcExprs.kt:11:34:11:154 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| funcExprs.kt:11:34:11:154 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| funcExprs.kt:11:34:11:154 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| funcExprs.kt:11:34:11:154 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| funcExprs.kt:11:34:11:154 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| funcExprs.kt:11:34:11:154 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| funcExprs.kt:11:34:11:154 | Function22 | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:11:34:11:154 | Integer | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:11:34:11:154 | Integer | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:11:34:11:154 | Integer | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:11:34:11:154 | Integer | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:11:34:11:154 | Integer | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:11:34:11:154 | Integer | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:11:34:11:154 | Integer | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:11:34:11:154 | Integer | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:11:34:11:154 | Integer | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:11:34:11:154 | Integer | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:11:34:11:154 | Integer | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:11:34:11:154 | Integer | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:11:34:11:154 | Integer | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:11:34:11:154 | Integer | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:11:34:11:154 | Integer | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:11:34:11:154 | Integer | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:11:34:11:154 | Integer | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:11:34:11:154 | Integer | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:11:34:11:154 | Integer | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:11:34:11:154 | Integer | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:11:34:11:154 | Integer | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:11:34:11:154 | Integer | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:11:34:11:154 | Unit | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:12:5:12:5 | f | funcExprs.kt:11:1:13:1 | functionExpression22 | VarAccess | +| funcExprs.kt:12:5:12:50 | invoke(...) | funcExprs.kt:11:1:13:1 | functionExpression22 | MethodCall | +| funcExprs.kt:12:7:12:7 | x | funcExprs.kt:11:1:13:1 | functionExpression22 | VarAccess | +| funcExprs.kt:12:9:12:9 | x | funcExprs.kt:11:1:13:1 | functionExpression22 | VarAccess | +| funcExprs.kt:12:11:12:11 | x | funcExprs.kt:11:1:13:1 | functionExpression22 | VarAccess | +| funcExprs.kt:12:13:12:13 | x | funcExprs.kt:11:1:13:1 | functionExpression22 | VarAccess | +| funcExprs.kt:12:15:12:15 | x | funcExprs.kt:11:1:13:1 | functionExpression22 | VarAccess | +| funcExprs.kt:12:17:12:17 | x | funcExprs.kt:11:1:13:1 | functionExpression22 | VarAccess | +| funcExprs.kt:12:19:12:19 | x | funcExprs.kt:11:1:13:1 | functionExpression22 | VarAccess | +| funcExprs.kt:12:21:12:21 | x | funcExprs.kt:11:1:13:1 | functionExpression22 | VarAccess | +| funcExprs.kt:12:23:12:23 | x | funcExprs.kt:11:1:13:1 | functionExpression22 | VarAccess | +| funcExprs.kt:12:25:12:25 | x | funcExprs.kt:11:1:13:1 | functionExpression22 | VarAccess | +| funcExprs.kt:12:27:12:27 | x | funcExprs.kt:11:1:13:1 | functionExpression22 | VarAccess | +| funcExprs.kt:12:29:12:29 | x | funcExprs.kt:11:1:13:1 | functionExpression22 | VarAccess | +| funcExprs.kt:12:31:12:31 | x | funcExprs.kt:11:1:13:1 | functionExpression22 | VarAccess | +| funcExprs.kt:12:33:12:33 | x | funcExprs.kt:11:1:13:1 | functionExpression22 | VarAccess | +| funcExprs.kt:12:35:12:35 | x | funcExprs.kt:11:1:13:1 | functionExpression22 | VarAccess | +| funcExprs.kt:12:37:12:37 | x | funcExprs.kt:11:1:13:1 | functionExpression22 | VarAccess | +| funcExprs.kt:12:39:12:39 | x | funcExprs.kt:11:1:13:1 | functionExpression22 | VarAccess | +| funcExprs.kt:12:41:12:41 | x | funcExprs.kt:11:1:13:1 | functionExpression22 | VarAccess | +| funcExprs.kt:12:43:12:43 | x | funcExprs.kt:11:1:13:1 | functionExpression22 | VarAccess | +| funcExprs.kt:12:45:12:45 | x | funcExprs.kt:11:1:13:1 | functionExpression22 | VarAccess | +| funcExprs.kt:12:47:12:47 | x | funcExprs.kt:11:1:13:1 | functionExpression22 | VarAccess | +| funcExprs.kt:12:49:12:49 | x | funcExprs.kt:11:1:13:1 | functionExpression22 | VarAccess | +| funcExprs.kt:14:1:16:1 | Unit | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:14:26:14:31 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:14:34:14:161 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| funcExprs.kt:14:34:14:161 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| funcExprs.kt:14:34:14:161 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| funcExprs.kt:14:34:14:161 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| funcExprs.kt:14:34:14:161 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| funcExprs.kt:14:34:14:161 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| funcExprs.kt:14:34:14:161 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| funcExprs.kt:14:34:14:161 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| funcExprs.kt:14:34:14:161 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| funcExprs.kt:14:34:14:161 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| funcExprs.kt:14:34:14:161 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| funcExprs.kt:14:34:14:161 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| funcExprs.kt:14:34:14:161 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| funcExprs.kt:14:34:14:161 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| funcExprs.kt:14:34:14:161 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| funcExprs.kt:14:34:14:161 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| funcExprs.kt:14:34:14:161 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| funcExprs.kt:14:34:14:161 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| funcExprs.kt:14:34:14:161 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| funcExprs.kt:14:34:14:161 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| funcExprs.kt:14:34:14:161 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| funcExprs.kt:14:34:14:161 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| funcExprs.kt:14:34:14:161 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| funcExprs.kt:14:34:14:161 | FunctionN | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:14:34:14:161 | Integer | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:14:34:14:161 | Integer | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:14:34:14:161 | Integer | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:14:34:14:161 | Integer | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:14:34:14:161 | Integer | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:14:34:14:161 | Integer | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:14:34:14:161 | Integer | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:14:34:14:161 | Integer | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:14:34:14:161 | Integer | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:14:34:14:161 | Integer | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:14:34:14:161 | Integer | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:14:34:14:161 | Integer | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:14:34:14:161 | Integer | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:14:34:14:161 | Integer | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:14:34:14:161 | Integer | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:14:34:14:161 | Integer | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:14:34:14:161 | Integer | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:14:34:14:161 | Integer | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:14:34:14:161 | Integer | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:14:34:14:161 | Integer | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:14:34:14:161 | Integer | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:14:34:14:161 | Integer | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:14:34:14:161 | Integer | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:14:34:14:161 | String | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:15:5:15:5 | f | funcExprs.kt:14:1:16:1 | functionExpression23 | VarAccess | +| funcExprs.kt:15:5:15:52 | 23 | funcExprs.kt:14:1:16:1 | functionExpression23 | IntegerLiteral | +| funcExprs.kt:15:5:15:52 | | funcExprs.kt:14:1:16:1 | functionExpression23 | ImplicitCoercionToUnitExpr | +| funcExprs.kt:15:5:15:52 | Object | funcExprs.kt:14:1:16:1 | functionExpression23 | TypeAccess | +| funcExprs.kt:15:5:15:52 | Unit | funcExprs.kt:14:1:16:1 | functionExpression23 | TypeAccess | +| funcExprs.kt:15:5:15:52 | invoke(...) | funcExprs.kt:14:1:16:1 | functionExpression23 | MethodCall | +| funcExprs.kt:15:5:15:52 | new Object[] | funcExprs.kt:14:1:16:1 | functionExpression23 | ArrayCreationExpr | +| funcExprs.kt:15:5:15:52 | {...} | funcExprs.kt:14:1:16:1 | functionExpression23 | ArrayInit | +| funcExprs.kt:15:7:15:7 | x | funcExprs.kt:14:1:16:1 | functionExpression23 | VarAccess | +| funcExprs.kt:15:9:15:9 | x | funcExprs.kt:14:1:16:1 | functionExpression23 | VarAccess | +| funcExprs.kt:15:11:15:11 | x | funcExprs.kt:14:1:16:1 | functionExpression23 | VarAccess | +| funcExprs.kt:15:13:15:13 | x | funcExprs.kt:14:1:16:1 | functionExpression23 | VarAccess | +| funcExprs.kt:15:15:15:15 | x | funcExprs.kt:14:1:16:1 | functionExpression23 | VarAccess | +| funcExprs.kt:15:17:15:17 | x | funcExprs.kt:14:1:16:1 | functionExpression23 | VarAccess | +| funcExprs.kt:15:19:15:19 | x | funcExprs.kt:14:1:16:1 | functionExpression23 | VarAccess | +| funcExprs.kt:15:21:15:21 | x | funcExprs.kt:14:1:16:1 | functionExpression23 | VarAccess | +| funcExprs.kt:15:23:15:23 | x | funcExprs.kt:14:1:16:1 | functionExpression23 | VarAccess | +| funcExprs.kt:15:25:15:25 | x | funcExprs.kt:14:1:16:1 | functionExpression23 | VarAccess | +| funcExprs.kt:15:27:15:27 | x | funcExprs.kt:14:1:16:1 | functionExpression23 | VarAccess | +| funcExprs.kt:15:29:15:29 | x | funcExprs.kt:14:1:16:1 | functionExpression23 | VarAccess | +| funcExprs.kt:15:31:15:31 | x | funcExprs.kt:14:1:16:1 | functionExpression23 | VarAccess | +| funcExprs.kt:15:33:15:33 | x | funcExprs.kt:14:1:16:1 | functionExpression23 | VarAccess | +| funcExprs.kt:15:35:15:35 | x | funcExprs.kt:14:1:16:1 | functionExpression23 | VarAccess | +| funcExprs.kt:15:37:15:37 | x | funcExprs.kt:14:1:16:1 | functionExpression23 | VarAccess | +| funcExprs.kt:15:39:15:39 | x | funcExprs.kt:14:1:16:1 | functionExpression23 | VarAccess | +| funcExprs.kt:15:41:15:41 | x | funcExprs.kt:14:1:16:1 | functionExpression23 | VarAccess | +| funcExprs.kt:15:43:15:43 | x | funcExprs.kt:14:1:16:1 | functionExpression23 | VarAccess | +| funcExprs.kt:15:45:15:45 | x | funcExprs.kt:14:1:16:1 | functionExpression23 | VarAccess | +| funcExprs.kt:15:47:15:47 | x | funcExprs.kt:14:1:16:1 | functionExpression23 | VarAccess | +| funcExprs.kt:15:49:15:49 | x | funcExprs.kt:14:1:16:1 | functionExpression23 | VarAccess | +| funcExprs.kt:15:51:15:51 | x | funcExprs.kt:14:1:16:1 | functionExpression23 | VarAccess | +| funcExprs.kt:17:1:19:1 | Unit | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:17:27:17:32 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:17:35:17:171 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| funcExprs.kt:17:35:17:171 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| funcExprs.kt:17:35:17:171 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| funcExprs.kt:17:35:17:171 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| funcExprs.kt:17:35:17:171 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| funcExprs.kt:17:35:17:171 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| funcExprs.kt:17:35:17:171 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| funcExprs.kt:17:35:17:171 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| funcExprs.kt:17:35:17:171 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| funcExprs.kt:17:35:17:171 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| funcExprs.kt:17:35:17:171 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| funcExprs.kt:17:35:17:171 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| funcExprs.kt:17:35:17:171 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| funcExprs.kt:17:35:17:171 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| funcExprs.kt:17:35:17:171 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| funcExprs.kt:17:35:17:171 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| funcExprs.kt:17:35:17:171 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| funcExprs.kt:17:35:17:171 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| funcExprs.kt:17:35:17:171 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| funcExprs.kt:17:35:17:171 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| funcExprs.kt:17:35:17:171 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| funcExprs.kt:17:35:17:171 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| funcExprs.kt:17:35:17:171 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| funcExprs.kt:17:35:17:171 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| funcExprs.kt:17:35:17:171 | FuncRef | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:17:35:17:171 | FunctionN | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:17:35:17:171 | Integer | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:17:35:17:171 | Integer | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:17:35:17:171 | Integer | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:17:35:17:171 | Integer | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:17:35:17:171 | Integer | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:17:35:17:171 | Integer | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:17:35:17:171 | Integer | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:17:35:17:171 | Integer | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:17:35:17:171 | Integer | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:17:35:17:171 | Integer | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:17:35:17:171 | Integer | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:17:35:17:171 | Integer | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:17:35:17:171 | Integer | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:17:35:17:171 | Integer | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:17:35:17:171 | Integer | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:17:35:17:171 | Integer | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:17:35:17:171 | Integer | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:17:35:17:171 | Integer | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:17:35:17:171 | Integer | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:17:35:17:171 | Integer | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:17:35:17:171 | Integer | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:17:35:17:171 | Integer | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:17:35:17:171 | Integer | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:17:35:17:171 | String | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:18:5:18:5 | f | funcExprs.kt:17:1:19:1 | functionExpression23c | VarAccess | +| funcExprs.kt:18:5:18:62 | 24 | funcExprs.kt:17:1:19:1 | functionExpression23c | IntegerLiteral | +| funcExprs.kt:18:5:18:62 | | funcExprs.kt:17:1:19:1 | functionExpression23c | ImplicitCoercionToUnitExpr | +| funcExprs.kt:18:5:18:62 | Object | funcExprs.kt:17:1:19:1 | functionExpression23c | TypeAccess | +| funcExprs.kt:18:5:18:62 | Unit | funcExprs.kt:17:1:19:1 | functionExpression23c | TypeAccess | +| funcExprs.kt:18:5:18:62 | invoke(...) | funcExprs.kt:17:1:19:1 | functionExpression23c | MethodCall | +| funcExprs.kt:18:5:18:62 | new Object[] | funcExprs.kt:17:1:19:1 | functionExpression23c | ArrayCreationExpr | +| funcExprs.kt:18:5:18:62 | {...} | funcExprs.kt:17:1:19:1 | functionExpression23c | ArrayInit | +| funcExprs.kt:18:7:18:15 | FuncRef | funcExprs.kt:17:1:19:1 | functionExpression23c | TypeAccess | +| funcExprs.kt:18:7:18:15 | new FuncRef(...) | funcExprs.kt:17:1:19:1 | functionExpression23c | ClassInstanceExpr | +| funcExprs.kt:18:17:18:17 | x | funcExprs.kt:17:1:19:1 | functionExpression23c | VarAccess | +| funcExprs.kt:18:19:18:19 | x | funcExprs.kt:17:1:19:1 | functionExpression23c | VarAccess | +| funcExprs.kt:18:21:18:21 | x | funcExprs.kt:17:1:19:1 | functionExpression23c | VarAccess | +| funcExprs.kt:18:23:18:23 | x | funcExprs.kt:17:1:19:1 | functionExpression23c | VarAccess | +| funcExprs.kt:18:25:18:25 | x | funcExprs.kt:17:1:19:1 | functionExpression23c | VarAccess | +| funcExprs.kt:18:27:18:27 | x | funcExprs.kt:17:1:19:1 | functionExpression23c | VarAccess | +| funcExprs.kt:18:29:18:29 | x | funcExprs.kt:17:1:19:1 | functionExpression23c | VarAccess | +| funcExprs.kt:18:31:18:31 | x | funcExprs.kt:17:1:19:1 | functionExpression23c | VarAccess | +| funcExprs.kt:18:33:18:33 | x | funcExprs.kt:17:1:19:1 | functionExpression23c | VarAccess | +| funcExprs.kt:18:35:18:35 | x | funcExprs.kt:17:1:19:1 | functionExpression23c | VarAccess | +| funcExprs.kt:18:37:18:37 | x | funcExprs.kt:17:1:19:1 | functionExpression23c | VarAccess | +| funcExprs.kt:18:39:18:39 | x | funcExprs.kt:17:1:19:1 | functionExpression23c | VarAccess | +| funcExprs.kt:18:41:18:41 | x | funcExprs.kt:17:1:19:1 | functionExpression23c | VarAccess | +| funcExprs.kt:18:43:18:43 | x | funcExprs.kt:17:1:19:1 | functionExpression23c | VarAccess | +| funcExprs.kt:18:45:18:45 | x | funcExprs.kt:17:1:19:1 | functionExpression23c | VarAccess | +| funcExprs.kt:18:47:18:47 | x | funcExprs.kt:17:1:19:1 | functionExpression23c | VarAccess | +| funcExprs.kt:18:49:18:49 | x | funcExprs.kt:17:1:19:1 | functionExpression23c | VarAccess | +| funcExprs.kt:18:51:18:51 | x | funcExprs.kt:17:1:19:1 | functionExpression23c | VarAccess | +| funcExprs.kt:18:53:18:53 | x | funcExprs.kt:17:1:19:1 | functionExpression23c | VarAccess | +| funcExprs.kt:18:55:18:55 | x | funcExprs.kt:17:1:19:1 | functionExpression23c | VarAccess | +| funcExprs.kt:18:57:18:57 | x | funcExprs.kt:17:1:19:1 | functionExpression23c | VarAccess | +| funcExprs.kt:18:59:18:59 | x | funcExprs.kt:17:1:19:1 | functionExpression23c | VarAccess | +| funcExprs.kt:18:61:18:61 | x | funcExprs.kt:17:1:19:1 | functionExpression23c | VarAccess | +| funcExprs.kt:21:1:52:1 | Unit | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:22:5:22:33 | FuncExprsKt | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:22:5:22:33 | functionExpression0a(...) | funcExprs.kt:21:1:52:1 | call | MethodCall | +| funcExprs.kt:22:26:22:33 | ...->... | funcExprs.kt:21:1:52:1 | call | LambdaExpr | +| funcExprs.kt:22:26:22:33 | Function0 | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:22:26:22:33 | Integer | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:22:26:22:33 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:22:31:22:31 | 5 | funcExprs.kt:22:26:22:33 | invoke | IntegerLiteral | +| funcExprs.kt:23:5:23:33 | FuncExprsKt | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:23:5:23:33 | functionExpression0b(...) | funcExprs.kt:21:1:52:1 | call | MethodCall | +| funcExprs.kt:23:26:23:33 | ...->... | funcExprs.kt:21:1:52:1 | call | LambdaExpr | +| funcExprs.kt:23:26:23:33 | Function0 | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:23:26:23:33 | Object | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:23:26:23:33 | Object | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:23:31:23:31 | 5 | funcExprs.kt:23:26:23:33 | invoke | IntegerLiteral | +| funcExprs.kt:24:5:24:33 | FuncExprsKt | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:24:5:24:33 | functionExpression0c(...) | funcExprs.kt:21:1:52:1 | call | MethodCall | +| funcExprs.kt:24:26:24:33 | ...->... | funcExprs.kt:21:1:52:1 | call | LambdaExpr | +| funcExprs.kt:24:26:24:33 | Function0 | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:24:26:24:33 | Object | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:24:26:24:33 | Object | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:24:31:24:31 | 5 | funcExprs.kt:24:26:24:33 | invoke | IntegerLiteral | +| funcExprs.kt:25:5:25:38 | FuncExprsKt | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:25:5:25:38 | functionExpression1a(...) | funcExprs.kt:21:1:52:1 | call | MethodCall | +| funcExprs.kt:25:26:25:26 | 5 | funcExprs.kt:21:1:52:1 | call | IntegerLiteral | +| funcExprs.kt:25:29:25:38 | ...->... | funcExprs.kt:21:1:52:1 | call | LambdaExpr | +| funcExprs.kt:25:29:25:38 | Function1 | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:25:29:25:38 | Integer | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:25:29:25:38 | Integer | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:25:29:25:38 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:25:31:25:31 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:25:36:25:36 | 5 | funcExprs.kt:25:29:25:38 | invoke | IntegerLiteral | +| funcExprs.kt:26:5:26:34 | FuncExprsKt | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:26:5:26:34 | functionExpression1a(...) | funcExprs.kt:21:1:52:1 | call | MethodCall | +| funcExprs.kt:26:26:26:26 | 5 | funcExprs.kt:21:1:52:1 | call | IntegerLiteral | +| funcExprs.kt:26:29:26:34 | ...->... | funcExprs.kt:21:1:52:1 | call | LambdaExpr | +| funcExprs.kt:26:29:26:34 | Function1 | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:26:29:26:34 | Integer | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:26:29:26:34 | Integer | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:26:29:26:34 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:26:29:26:34 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:26:31:26:32 | it | funcExprs.kt:26:29:26:34 | invoke | VarAccess | +| funcExprs.kt:27:5:27:43 | FuncExprsKt | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:27:5:27:43 | functionExpression1a(...) | funcExprs.kt:21:1:52:1 | call | MethodCall | +| funcExprs.kt:27:26:27:26 | 5 | funcExprs.kt:21:1:52:1 | call | IntegerLiteral | +| funcExprs.kt:27:29:27:42 | ...->... | funcExprs.kt:21:1:52:1 | call | LambdaExpr | +| funcExprs.kt:27:29:27:42 | Function1 | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:27:29:27:42 | Integer | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:27:29:27:42 | Integer | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:27:29:27:42 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:27:33:27:37 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:27:42:27:42 | 5 | funcExprs.kt:27:29:27:42 | invoke | IntegerLiteral | +| funcExprs.kt:28:5:28:39 | FuncExprsKt | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:28:5:28:39 | functionExpression1a(...) | funcExprs.kt:21:1:52:1 | call | MethodCall | +| funcExprs.kt:28:26:28:26 | 5 | funcExprs.kt:21:1:52:1 | call | IntegerLiteral | +| funcExprs.kt:28:29:28:38 | MyLambda | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:28:29:28:38 | new MyLambda(...) | funcExprs.kt:21:1:52:1 | call | ClassInstanceExpr | +| funcExprs.kt:29:5:29:37 | FuncExprsKt | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:29:5:29:37 | functionExpression1b(...) | funcExprs.kt:21:1:52:1 | call | MethodCall | +| funcExprs.kt:29:26:29:26 | 5 | funcExprs.kt:21:1:52:1 | call | IntegerLiteral | +| funcExprs.kt:29:29:29:37 | ...->... | funcExprs.kt:21:1:52:1 | call | LambdaExpr | +| funcExprs.kt:29:29:29:37 | Function1 | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:29:29:29:37 | Object | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:29:29:29:37 | Object | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:29:29:29:37 | Object | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:29:31:29:31 | Object | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:29:36:29:36 | a | funcExprs.kt:29:29:29:37 | invoke | VarAccess | +| funcExprs.kt:30:5:30:51 | FuncExprsKt | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:30:5:30:51 | functionExpression2(...) | funcExprs.kt:21:1:52:1 | call | MethodCall | +| funcExprs.kt:30:25:30:25 | 5 | funcExprs.kt:21:1:52:1 | call | IntegerLiteral | +| funcExprs.kt:30:28:30:50 | ...->... | funcExprs.kt:21:1:52:1 | call | LambdaExpr | +| funcExprs.kt:30:28:30:50 | Function2 | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:30:28:30:50 | Integer | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:30:28:30:50 | Integer | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:30:28:30:50 | Integer | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:30:28:30:50 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:30:32:30:37 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:30:40:30:45 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:30:50:30:50 | 5 | funcExprs.kt:30:28:30:50 | invoke | IntegerLiteral | +| funcExprs.kt:31:5:31:40 | FuncExprsKt | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:31:5:31:40 | functionExpression2(...) | funcExprs.kt:21:1:52:1 | call | MethodCall | +| funcExprs.kt:31:25:31:25 | 5 | funcExprs.kt:21:1:52:1 | call | IntegerLiteral | +| funcExprs.kt:31:28:31:40 | ...->... | funcExprs.kt:21:1:52:1 | call | LambdaExpr | +| funcExprs.kt:31:28:31:40 | Function2 | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:31:28:31:40 | Integer | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:31:28:31:40 | Integer | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:31:28:31:40 | Integer | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:31:28:31:40 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:31:30:31:30 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:31:33:31:33 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:31:38:31:38 | 5 | funcExprs.kt:31:28:31:40 | invoke | IntegerLiteral | +| funcExprs.kt:32:5:32:44 | FuncExprsKt | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:32:5:32:44 | functionExpression3(...) | funcExprs.kt:21:1:52:1 | call | MethodCall | +| funcExprs.kt:32:25:32:25 | 5 | funcExprs.kt:21:1:52:1 | call | IntegerLiteral | +| funcExprs.kt:32:28:32:44 | ...->... | funcExprs.kt:21:1:52:1 | call | LambdaExpr | +| funcExprs.kt:32:28:32:44 | Function2 | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:32:28:32:44 | Integer | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:32:28:32:44 | Integer | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:32:28:32:44 | Integer | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:32:28:32:44 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:32:28:32:44 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:32:30:32:30 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:32:35:32:38 | this | funcExprs.kt:32:28:32:44 | invoke | ExtensionReceiverAccess | +| funcExprs.kt:32:35:32:42 | ... + ... | funcExprs.kt:32:28:32:44 | invoke | AddExpr | +| funcExprs.kt:32:42:32:42 | a | funcExprs.kt:32:28:32:44 | invoke | VarAccess | +| funcExprs.kt:33:5:33:51 | FuncExprsKt | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:33:5:33:51 | functionExpression4(...) | funcExprs.kt:21:1:52:1 | call | MethodCall | +| funcExprs.kt:33:25:33:25 | 5 | funcExprs.kt:21:1:52:1 | call | IntegerLiteral | +| funcExprs.kt:33:28:33:51 | ...->... | funcExprs.kt:21:1:52:1 | call | LambdaExpr | +| funcExprs.kt:33:28:33:51 | Double | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:33:28:33:51 | Double | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:33:28:33:51 | Function1 | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:33:28:33:51 | Function1 | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:33:28:33:51 | Function1> | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:33:28:33:51 | Integer | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:33:28:33:51 | Integer | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:33:28:33:51 | Integer | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:33:30:33:30 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:33:37:33:47 | ...->... | funcExprs.kt:33:28:33:51 | invoke | LambdaExpr | +| funcExprs.kt:33:37:33:47 | Double | funcExprs.kt:33:28:33:51 | invoke | TypeAccess | +| funcExprs.kt:33:37:33:47 | Function1 | funcExprs.kt:33:28:33:51 | invoke | TypeAccess | +| funcExprs.kt:33:37:33:47 | Integer | funcExprs.kt:33:28:33:51 | invoke | TypeAccess | +| funcExprs.kt:33:37:33:47 | double | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:33:39:33:39 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:33:44:33:46 | 5.0 | funcExprs.kt:33:37:33:47 | invoke | DoubleLiteral | +| funcExprs.kt:35:5:35:112 | FuncExprsKt | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:35:5:35:112 | functionExpression22(...) | funcExprs.kt:21:1:52:1 | call | MethodCall | +| funcExprs.kt:35:26:35:26 | 5 | funcExprs.kt:21:1:52:1 | call | IntegerLiteral | +| funcExprs.kt:35:29:35:112 | ...->... | funcExprs.kt:21:1:52:1 | call | LambdaExpr | +| funcExprs.kt:35:29:35:112 | Function22 | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:35:29:35:112 | Integer | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:35:29:35:112 | Integer | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:35:29:35:112 | Integer | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:35:29:35:112 | Integer | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:35:29:35:112 | Integer | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:35:29:35:112 | Integer | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:35:29:35:112 | Integer | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:35:29:35:112 | Integer | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:35:29:35:112 | Integer | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:35:29:35:112 | Integer | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:35:29:35:112 | Integer | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:35:29:35:112 | Integer | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:35:29:35:112 | Integer | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:35:29:35:112 | Integer | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:35:29:35:112 | Integer | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:35:29:35:112 | Integer | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:35:29:35:112 | Integer | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:35:29:35:112 | Integer | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:35:29:35:112 | Integer | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:35:29:35:112 | Integer | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:35:29:35:112 | Integer | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:35:29:35:112 | Integer | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:35:29:35:112 | Unit | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:35:29:35:112 | Unit | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:35:30:35:31 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:35:33:35:34 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:35:36:35:37 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:35:39:35:40 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:35:42:35:43 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:35:45:35:46 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:35:48:35:49 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:35:51:35:52 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:35:54:35:55 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:35:57:35:58 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:35:60:35:62 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:35:64:35:66 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:35:68:35:70 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:35:72:35:74 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:35:76:35:78 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:35:80:35:82 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:35:84:35:86 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:35:88:35:90 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:35:92:35:94 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:35:96:35:98 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:35:100:35:102 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:35:104:35:106 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:35:111:35:111 | 5 | funcExprs.kt:35:29:35:112 | invoke | IntegerLiteral | +| funcExprs.kt:35:111:35:111 | | funcExprs.kt:35:29:35:112 | invoke | ImplicitCoercionToUnitExpr | +| funcExprs.kt:35:111:35:111 | Unit | funcExprs.kt:35:29:35:112 | invoke | TypeAccess | +| funcExprs.kt:36:5:36:117 | FuncExprsKt | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:36:5:36:117 | functionExpression23(...) | funcExprs.kt:21:1:52:1 | call | MethodCall | +| funcExprs.kt:36:26:36:26 | 5 | funcExprs.kt:21:1:52:1 | call | IntegerLiteral | +| funcExprs.kt:36:29:36:117 | 0 | funcExprs.kt:36:29:36:117 | invoke | IntegerLiteral | +| funcExprs.kt:36:29:36:117 | 1 | funcExprs.kt:36:29:36:117 | invoke | IntegerLiteral | +| funcExprs.kt:36:29:36:117 | 2 | funcExprs.kt:36:29:36:117 | invoke | IntegerLiteral | +| funcExprs.kt:36:29:36:117 | 3 | funcExprs.kt:36:29:36:117 | invoke | IntegerLiteral | +| funcExprs.kt:36:29:36:117 | 4 | funcExprs.kt:36:29:36:117 | invoke | IntegerLiteral | +| funcExprs.kt:36:29:36:117 | 5 | funcExprs.kt:36:29:36:117 | invoke | IntegerLiteral | +| funcExprs.kt:36:29:36:117 | 6 | funcExprs.kt:36:29:36:117 | invoke | IntegerLiteral | +| funcExprs.kt:36:29:36:117 | 7 | funcExprs.kt:36:29:36:117 | invoke | IntegerLiteral | +| funcExprs.kt:36:29:36:117 | 8 | funcExprs.kt:36:29:36:117 | invoke | IntegerLiteral | +| funcExprs.kt:36:29:36:117 | 9 | funcExprs.kt:36:29:36:117 | invoke | IntegerLiteral | +| funcExprs.kt:36:29:36:117 | 10 | funcExprs.kt:36:29:36:117 | invoke | IntegerLiteral | +| funcExprs.kt:36:29:36:117 | 11 | funcExprs.kt:36:29:36:117 | invoke | IntegerLiteral | +| funcExprs.kt:36:29:36:117 | 12 | funcExprs.kt:36:29:36:117 | invoke | IntegerLiteral | +| funcExprs.kt:36:29:36:117 | 13 | funcExprs.kt:36:29:36:117 | invoke | IntegerLiteral | +| funcExprs.kt:36:29:36:117 | 14 | funcExprs.kt:36:29:36:117 | invoke | IntegerLiteral | +| funcExprs.kt:36:29:36:117 | 15 | funcExprs.kt:36:29:36:117 | invoke | IntegerLiteral | +| funcExprs.kt:36:29:36:117 | 16 | funcExprs.kt:36:29:36:117 | invoke | IntegerLiteral | +| funcExprs.kt:36:29:36:117 | 17 | funcExprs.kt:36:29:36:117 | invoke | IntegerLiteral | +| funcExprs.kt:36:29:36:117 | 18 | funcExprs.kt:36:29:36:117 | invoke | IntegerLiteral | +| funcExprs.kt:36:29:36:117 | 19 | funcExprs.kt:36:29:36:117 | invoke | IntegerLiteral | +| funcExprs.kt:36:29:36:117 | 20 | funcExprs.kt:36:29:36:117 | invoke | IntegerLiteral | +| funcExprs.kt:36:29:36:117 | 21 | funcExprs.kt:36:29:36:117 | invoke | IntegerLiteral | +| funcExprs.kt:36:29:36:117 | 22 | funcExprs.kt:36:29:36:117 | invoke | IntegerLiteral | +| funcExprs.kt:36:29:36:117 | (...)... | funcExprs.kt:36:29:36:117 | invoke | CastExpr | +| funcExprs.kt:36:29:36:117 | (...)... | funcExprs.kt:36:29:36:117 | invoke | CastExpr | +| funcExprs.kt:36:29:36:117 | (...)... | funcExprs.kt:36:29:36:117 | invoke | CastExpr | +| funcExprs.kt:36:29:36:117 | (...)... | funcExprs.kt:36:29:36:117 | invoke | CastExpr | +| funcExprs.kt:36:29:36:117 | (...)... | funcExprs.kt:36:29:36:117 | invoke | CastExpr | +| funcExprs.kt:36:29:36:117 | (...)... | funcExprs.kt:36:29:36:117 | invoke | CastExpr | +| funcExprs.kt:36:29:36:117 | (...)... | funcExprs.kt:36:29:36:117 | invoke | CastExpr | +| funcExprs.kt:36:29:36:117 | (...)... | funcExprs.kt:36:29:36:117 | invoke | CastExpr | +| funcExprs.kt:36:29:36:117 | (...)... | funcExprs.kt:36:29:36:117 | invoke | CastExpr | +| funcExprs.kt:36:29:36:117 | (...)... | funcExprs.kt:36:29:36:117 | invoke | CastExpr | +| funcExprs.kt:36:29:36:117 | (...)... | funcExprs.kt:36:29:36:117 | invoke | CastExpr | +| funcExprs.kt:36:29:36:117 | (...)... | funcExprs.kt:36:29:36:117 | invoke | CastExpr | +| funcExprs.kt:36:29:36:117 | (...)... | funcExprs.kt:36:29:36:117 | invoke | CastExpr | +| funcExprs.kt:36:29:36:117 | (...)... | funcExprs.kt:36:29:36:117 | invoke | CastExpr | +| funcExprs.kt:36:29:36:117 | (...)... | funcExprs.kt:36:29:36:117 | invoke | CastExpr | +| funcExprs.kt:36:29:36:117 | (...)... | funcExprs.kt:36:29:36:117 | invoke | CastExpr | +| funcExprs.kt:36:29:36:117 | (...)... | funcExprs.kt:36:29:36:117 | invoke | CastExpr | +| funcExprs.kt:36:29:36:117 | (...)... | funcExprs.kt:36:29:36:117 | invoke | CastExpr | +| funcExprs.kt:36:29:36:117 | (...)... | funcExprs.kt:36:29:36:117 | invoke | CastExpr | +| funcExprs.kt:36:29:36:117 | (...)... | funcExprs.kt:36:29:36:117 | invoke | CastExpr | +| funcExprs.kt:36:29:36:117 | (...)... | funcExprs.kt:36:29:36:117 | invoke | CastExpr | +| funcExprs.kt:36:29:36:117 | (...)... | funcExprs.kt:36:29:36:117 | invoke | CastExpr | +| funcExprs.kt:36:29:36:117 | (...)... | funcExprs.kt:36:29:36:117 | invoke | CastExpr | +| funcExprs.kt:36:29:36:117 | ...->... | funcExprs.kt:21:1:52:1 | call | LambdaExpr | +| funcExprs.kt:36:29:36:117 | ...[...] | funcExprs.kt:36:29:36:117 | invoke | ArrayAccess | +| funcExprs.kt:36:29:36:117 | ...[...] | funcExprs.kt:36:29:36:117 | invoke | ArrayAccess | +| funcExprs.kt:36:29:36:117 | ...[...] | funcExprs.kt:36:29:36:117 | invoke | ArrayAccess | +| funcExprs.kt:36:29:36:117 | ...[...] | funcExprs.kt:36:29:36:117 | invoke | ArrayAccess | +| funcExprs.kt:36:29:36:117 | ...[...] | funcExprs.kt:36:29:36:117 | invoke | ArrayAccess | +| funcExprs.kt:36:29:36:117 | ...[...] | funcExprs.kt:36:29:36:117 | invoke | ArrayAccess | +| funcExprs.kt:36:29:36:117 | ...[...] | funcExprs.kt:36:29:36:117 | invoke | ArrayAccess | +| funcExprs.kt:36:29:36:117 | ...[...] | funcExprs.kt:36:29:36:117 | invoke | ArrayAccess | +| funcExprs.kt:36:29:36:117 | ...[...] | funcExprs.kt:36:29:36:117 | invoke | ArrayAccess | +| funcExprs.kt:36:29:36:117 | ...[...] | funcExprs.kt:36:29:36:117 | invoke | ArrayAccess | +| funcExprs.kt:36:29:36:117 | ...[...] | funcExprs.kt:36:29:36:117 | invoke | ArrayAccess | +| funcExprs.kt:36:29:36:117 | ...[...] | funcExprs.kt:36:29:36:117 | invoke | ArrayAccess | +| funcExprs.kt:36:29:36:117 | ...[...] | funcExprs.kt:36:29:36:117 | invoke | ArrayAccess | +| funcExprs.kt:36:29:36:117 | ...[...] | funcExprs.kt:36:29:36:117 | invoke | ArrayAccess | +| funcExprs.kt:36:29:36:117 | ...[...] | funcExprs.kt:36:29:36:117 | invoke | ArrayAccess | +| funcExprs.kt:36:29:36:117 | ...[...] | funcExprs.kt:36:29:36:117 | invoke | ArrayAccess | +| funcExprs.kt:36:29:36:117 | ...[...] | funcExprs.kt:36:29:36:117 | invoke | ArrayAccess | +| funcExprs.kt:36:29:36:117 | ...[...] | funcExprs.kt:36:29:36:117 | invoke | ArrayAccess | +| funcExprs.kt:36:29:36:117 | ...[...] | funcExprs.kt:36:29:36:117 | invoke | ArrayAccess | +| funcExprs.kt:36:29:36:117 | ...[...] | funcExprs.kt:36:29:36:117 | invoke | ArrayAccess | +| funcExprs.kt:36:29:36:117 | ...[...] | funcExprs.kt:36:29:36:117 | invoke | ArrayAccess | +| funcExprs.kt:36:29:36:117 | ...[...] | funcExprs.kt:36:29:36:117 | invoke | ArrayAccess | +| funcExprs.kt:36:29:36:117 | ...[...] | funcExprs.kt:36:29:36:117 | invoke | ArrayAccess | +| funcExprs.kt:36:29:36:117 | FunctionN | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:36:29:36:117 | String | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:36:29:36:117 | String | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:36:29:36:117 | a0 | funcExprs.kt:36:29:36:117 | invoke | VarAccess | +| funcExprs.kt:36:29:36:117 | a0 | funcExprs.kt:36:29:36:117 | invoke | VarAccess | +| funcExprs.kt:36:29:36:117 | a0 | funcExprs.kt:36:29:36:117 | invoke | VarAccess | +| funcExprs.kt:36:29:36:117 | a0 | funcExprs.kt:36:29:36:117 | invoke | VarAccess | +| funcExprs.kt:36:29:36:117 | a0 | funcExprs.kt:36:29:36:117 | invoke | VarAccess | +| funcExprs.kt:36:29:36:117 | a0 | funcExprs.kt:36:29:36:117 | invoke | VarAccess | +| funcExprs.kt:36:29:36:117 | a0 | funcExprs.kt:36:29:36:117 | invoke | VarAccess | +| funcExprs.kt:36:29:36:117 | a0 | funcExprs.kt:36:29:36:117 | invoke | VarAccess | +| funcExprs.kt:36:29:36:117 | a0 | funcExprs.kt:36:29:36:117 | invoke | VarAccess | +| funcExprs.kt:36:29:36:117 | a0 | funcExprs.kt:36:29:36:117 | invoke | VarAccess | +| funcExprs.kt:36:29:36:117 | a0 | funcExprs.kt:36:29:36:117 | invoke | VarAccess | +| funcExprs.kt:36:29:36:117 | a0 | funcExprs.kt:36:29:36:117 | invoke | VarAccess | +| funcExprs.kt:36:29:36:117 | a0 | funcExprs.kt:36:29:36:117 | invoke | VarAccess | +| funcExprs.kt:36:29:36:117 | a0 | funcExprs.kt:36:29:36:117 | invoke | VarAccess | +| funcExprs.kt:36:29:36:117 | a0 | funcExprs.kt:36:29:36:117 | invoke | VarAccess | +| funcExprs.kt:36:29:36:117 | a0 | funcExprs.kt:36:29:36:117 | invoke | VarAccess | +| funcExprs.kt:36:29:36:117 | a0 | funcExprs.kt:36:29:36:117 | invoke | VarAccess | +| funcExprs.kt:36:29:36:117 | a0 | funcExprs.kt:36:29:36:117 | invoke | VarAccess | +| funcExprs.kt:36:29:36:117 | a0 | funcExprs.kt:36:29:36:117 | invoke | VarAccess | +| funcExprs.kt:36:29:36:117 | a0 | funcExprs.kt:36:29:36:117 | invoke | VarAccess | +| funcExprs.kt:36:29:36:117 | a0 | funcExprs.kt:36:29:36:117 | invoke | VarAccess | +| funcExprs.kt:36:29:36:117 | a0 | funcExprs.kt:36:29:36:117 | invoke | VarAccess | +| funcExprs.kt:36:29:36:117 | a0 | funcExprs.kt:36:29:36:117 | invoke | VarAccess | +| funcExprs.kt:36:29:36:117 | int | funcExprs.kt:36:29:36:117 | invoke | TypeAccess | +| funcExprs.kt:36:29:36:117 | int | funcExprs.kt:36:29:36:117 | invoke | TypeAccess | +| funcExprs.kt:36:29:36:117 | int | funcExprs.kt:36:29:36:117 | invoke | TypeAccess | +| funcExprs.kt:36:29:36:117 | int | funcExprs.kt:36:29:36:117 | invoke | TypeAccess | +| funcExprs.kt:36:29:36:117 | int | funcExprs.kt:36:29:36:117 | invoke | TypeAccess | +| funcExprs.kt:36:29:36:117 | int | funcExprs.kt:36:29:36:117 | invoke | TypeAccess | +| funcExprs.kt:36:29:36:117 | int | funcExprs.kt:36:29:36:117 | invoke | TypeAccess | +| funcExprs.kt:36:29:36:117 | int | funcExprs.kt:36:29:36:117 | invoke | TypeAccess | +| funcExprs.kt:36:29:36:117 | int | funcExprs.kt:36:29:36:117 | invoke | TypeAccess | +| funcExprs.kt:36:29:36:117 | int | funcExprs.kt:36:29:36:117 | invoke | TypeAccess | +| funcExprs.kt:36:29:36:117 | int | funcExprs.kt:36:29:36:117 | invoke | TypeAccess | +| funcExprs.kt:36:29:36:117 | int | funcExprs.kt:36:29:36:117 | invoke | TypeAccess | +| funcExprs.kt:36:29:36:117 | int | funcExprs.kt:36:29:36:117 | invoke | TypeAccess | +| funcExprs.kt:36:29:36:117 | int | funcExprs.kt:36:29:36:117 | invoke | TypeAccess | +| funcExprs.kt:36:29:36:117 | int | funcExprs.kt:36:29:36:117 | invoke | TypeAccess | +| funcExprs.kt:36:29:36:117 | int | funcExprs.kt:36:29:36:117 | invoke | TypeAccess | +| funcExprs.kt:36:29:36:117 | int | funcExprs.kt:36:29:36:117 | invoke | TypeAccess | +| funcExprs.kt:36:29:36:117 | int | funcExprs.kt:36:29:36:117 | invoke | TypeAccess | +| funcExprs.kt:36:29:36:117 | int | funcExprs.kt:36:29:36:117 | invoke | TypeAccess | +| funcExprs.kt:36:29:36:117 | int | funcExprs.kt:36:29:36:117 | invoke | TypeAccess | +| funcExprs.kt:36:29:36:117 | int | funcExprs.kt:36:29:36:117 | invoke | TypeAccess | +| funcExprs.kt:36:29:36:117 | int | funcExprs.kt:36:29:36:117 | invoke | TypeAccess | +| funcExprs.kt:36:29:36:117 | int | funcExprs.kt:36:29:36:117 | invoke | TypeAccess | +| funcExprs.kt:36:29:36:117 | invoke(...) | funcExprs.kt:36:29:36:117 | invoke | MethodCall | +| funcExprs.kt:36:29:36:117 | this | funcExprs.kt:36:29:36:117 | invoke | ThisAccess | +| funcExprs.kt:36:30:36:31 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:36:33:36:34 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:36:36:36:37 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:36:39:36:40 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:36:42:36:43 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:36:45:36:46 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:36:48:36:49 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:36:51:36:52 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:36:54:36:55 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:36:57:36:58 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:36:60:36:62 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:36:64:36:66 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:36:68:36:70 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:36:72:36:74 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:36:76:36:78 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:36:80:36:82 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:36:84:36:86 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:36:88:36:90 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:36:92:36:94 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:36:96:36:98 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:36:100:36:102 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:36:104:36:106 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:36:108:36:110 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:36:115:36:116 | "" | funcExprs.kt:36:29:36:117 | invoke | StringLiteral | +| funcExprs.kt:38:5:38:39 | FuncExprsKt | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:38:5:38:39 | functionExpression0a(...) | funcExprs.kt:21:1:52:1 | call | MethodCall | +| funcExprs.kt:38:26:38:34 | FuncRef | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:38:26:38:34 | new FuncRef(...) | funcExprs.kt:21:1:52:1 | call | ClassInstanceExpr | +| funcExprs.kt:38:26:38:38 | 0 | funcExprs.kt:38:26:38:38 | | IntegerLiteral | +| funcExprs.kt:38:26:38:38 | ...::... | funcExprs.kt:21:1:52:1 | call | MemberRefExpr | +| funcExprs.kt:38:26:38:38 | ...=... | funcExprs.kt:38:26:38:38 | | AssignExpr | +| funcExprs.kt:38:26:38:38 | | funcExprs.kt:38:26:38:38 | | VarAccess | +| funcExprs.kt:38:26:38:38 | FuncRef | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:38:26:38:38 | Function0 | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:38:26:38:38 | Integer | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:38:26:38:38 | f0(...) | funcExprs.kt:38:26:38:38 | invoke | MethodCall | +| funcExprs.kt:38:26:38:38 | this | funcExprs.kt:38:26:38:38 | | ThisAccess | +| funcExprs.kt:38:26:38:38 | this | funcExprs.kt:38:26:38:38 | invoke | ThisAccess | +| funcExprs.kt:38:26:38:38 | this. | funcExprs.kt:38:26:38:38 | | VarAccess | +| funcExprs.kt:38:26:38:38 | this. | funcExprs.kt:38:26:38:38 | invoke | VarAccess | +| funcExprs.kt:39:5:39:37 | FuncExprsKt | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:39:5:39:37 | functionExpression0a(...) | funcExprs.kt:21:1:52:1 | call | MethodCall | +| funcExprs.kt:39:26:39:32 | Companion | funcExprs.kt:21:1:52:1 | call | VarAccess | +| funcExprs.kt:39:26:39:36 | 0 | funcExprs.kt:39:26:39:36 | | IntegerLiteral | +| funcExprs.kt:39:26:39:36 | ...::... | funcExprs.kt:21:1:52:1 | call | MemberRefExpr | +| funcExprs.kt:39:26:39:36 | ...=... | funcExprs.kt:39:26:39:36 | | AssignExpr | +| funcExprs.kt:39:26:39:36 | | funcExprs.kt:39:26:39:36 | | VarAccess | +| funcExprs.kt:39:26:39:36 | Companion | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:39:26:39:36 | Function0 | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:39:26:39:36 | Integer | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:39:26:39:36 | f0(...) | funcExprs.kt:39:26:39:36 | invoke | MethodCall | +| funcExprs.kt:39:26:39:36 | this | funcExprs.kt:39:26:39:36 | | ThisAccess | +| funcExprs.kt:39:26:39:36 | this | funcExprs.kt:39:26:39:36 | invoke | ThisAccess | +| funcExprs.kt:39:26:39:36 | this. | funcExprs.kt:39:26:39:36 | | VarAccess | +| funcExprs.kt:39:26:39:36 | this. | funcExprs.kt:39:26:39:36 | invoke | VarAccess | +| funcExprs.kt:40:5:40:42 | FuncExprsKt | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:40:5:40:42 | functionExpression1a(...) | funcExprs.kt:21:1:52:1 | call | MethodCall | +| funcExprs.kt:40:26:40:26 | 5 | funcExprs.kt:21:1:52:1 | call | IntegerLiteral | +| funcExprs.kt:40:29:40:37 | FuncRef | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:40:29:40:37 | new FuncRef(...) | funcExprs.kt:21:1:52:1 | call | ClassInstanceExpr | +| funcExprs.kt:40:29:40:41 | 1 | funcExprs.kt:40:29:40:41 | | IntegerLiteral | +| funcExprs.kt:40:29:40:41 | ...::... | funcExprs.kt:21:1:52:1 | call | MemberRefExpr | +| funcExprs.kt:40:29:40:41 | ...=... | funcExprs.kt:40:29:40:41 | | AssignExpr | +| funcExprs.kt:40:29:40:41 | | funcExprs.kt:40:29:40:41 | | VarAccess | +| funcExprs.kt:40:29:40:41 | FuncRef | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:40:29:40:41 | Function1 | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:40:29:40:41 | Integer | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:40:29:40:41 | Integer | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:40:29:40:41 | a0 | funcExprs.kt:40:29:40:41 | invoke | VarAccess | +| funcExprs.kt:40:29:40:41 | f1(...) | funcExprs.kt:40:29:40:41 | invoke | MethodCall | +| funcExprs.kt:40:29:40:41 | this | funcExprs.kt:40:29:40:41 | | ThisAccess | +| funcExprs.kt:40:29:40:41 | this | funcExprs.kt:40:29:40:41 | invoke | ThisAccess | +| funcExprs.kt:40:29:40:41 | this. | funcExprs.kt:40:29:40:41 | | VarAccess | +| funcExprs.kt:40:29:40:41 | this. | funcExprs.kt:40:29:40:41 | invoke | VarAccess | +| funcExprs.kt:41:5:41:40 | FuncExprsKt | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:41:5:41:40 | functionExpression1c(...) | funcExprs.kt:21:1:52:1 | call | MethodCall | +| funcExprs.kt:41:26:41:26 | 5 | funcExprs.kt:21:1:52:1 | call | IntegerLiteral | +| funcExprs.kt:41:29:41:39 | 2 | funcExprs.kt:41:29:41:39 | | IntegerLiteral | +| funcExprs.kt:41:29:41:39 | ...::... | funcExprs.kt:21:1:52:1 | call | MemberRefExpr | +| funcExprs.kt:41:29:41:39 | FuncRef | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:41:29:41:39 | Function2 | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:41:29:41:39 | Integer | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:41:29:41:39 | Integer | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:41:29:41:39 | a0 | funcExprs.kt:41:29:41:39 | invoke | VarAccess | +| funcExprs.kt:41:29:41:39 | a1 | funcExprs.kt:41:29:41:39 | invoke | VarAccess | +| funcExprs.kt:41:29:41:39 | f1(...) | funcExprs.kt:41:29:41:39 | invoke | MethodCall | +| funcExprs.kt:42:5:42:34 | FuncExprsKt | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:42:5:42:34 | functionExpression1a(...) | funcExprs.kt:21:1:52:1 | call | MethodCall | +| funcExprs.kt:42:26:42:26 | 5 | funcExprs.kt:21:1:52:1 | call | IntegerLiteral | +| funcExprs.kt:42:29:42:29 | 3 | funcExprs.kt:21:1:52:1 | call | IntegerLiteral | +| funcExprs.kt:42:29:42:33 | 1 | funcExprs.kt:42:29:42:33 | | IntegerLiteral | +| funcExprs.kt:42:29:42:33 | ...::... | funcExprs.kt:21:1:52:1 | call | MemberRefExpr | +| funcExprs.kt:42:29:42:33 | ...=... | funcExprs.kt:42:29:42:33 | | AssignExpr | +| funcExprs.kt:42:29:42:33 | | funcExprs.kt:42:29:42:33 | | VarAccess | +| funcExprs.kt:42:29:42:33 | FuncExprsKt | funcExprs.kt:42:29:42:33 | invoke | TypeAccess | +| funcExprs.kt:42:29:42:33 | Function1 | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:42:29:42:33 | Integer | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:42:29:42:33 | Integer | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:42:29:42:33 | a0 | funcExprs.kt:42:29:42:33 | invoke | VarAccess | +| funcExprs.kt:42:29:42:33 | f3(...) | funcExprs.kt:42:29:42:33 | invoke | MethodCall | +| funcExprs.kt:42:29:42:33 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:42:29:42:33 | this | funcExprs.kt:42:29:42:33 | | ThisAccess | +| funcExprs.kt:42:29:42:33 | this | funcExprs.kt:42:29:42:33 | invoke | ThisAccess | +| funcExprs.kt:42:29:42:33 | this. | funcExprs.kt:42:29:42:33 | | VarAccess | +| funcExprs.kt:42:29:42:33 | this. | funcExprs.kt:42:29:42:33 | invoke | VarAccess | +| funcExprs.kt:43:5:43:35 | FuncExprsKt | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:43:5:43:35 | functionExpression3(...) | funcExprs.kt:21:1:52:1 | call | MethodCall | +| funcExprs.kt:43:25:43:25 | 5 | funcExprs.kt:21:1:52:1 | call | IntegerLiteral | +| funcExprs.kt:43:28:43:34 | 2 | funcExprs.kt:43:28:43:34 | | IntegerLiteral | +| funcExprs.kt:43:28:43:34 | ...::... | funcExprs.kt:21:1:52:1 | call | MemberRefExpr | +| funcExprs.kt:43:28:43:34 | FuncExprsKt | funcExprs.kt:43:28:43:34 | invoke | TypeAccess | +| funcExprs.kt:43:28:43:34 | Function2 | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:43:28:43:34 | Integer | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:43:28:43:34 | Integer | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:43:28:43:34 | Integer | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:43:28:43:34 | a0 | funcExprs.kt:43:28:43:34 | invoke | VarAccess | +| funcExprs.kt:43:28:43:34 | a1 | funcExprs.kt:43:28:43:34 | invoke | VarAccess | +| funcExprs.kt:43:28:43:34 | f3(...) | funcExprs.kt:43:28:43:34 | invoke | MethodCall | +| funcExprs.kt:44:5:44:43 | FuncExprsKt | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:44:5:44:43 | functionExpression22(...) | funcExprs.kt:21:1:52:1 | call | MethodCall | +| funcExprs.kt:44:26:44:26 | 5 | funcExprs.kt:21:1:52:1 | call | IntegerLiteral | +| funcExprs.kt:44:29:44:37 | FuncRef | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:44:29:44:37 | new FuncRef(...) | funcExprs.kt:21:1:52:1 | call | ClassInstanceExpr | +| funcExprs.kt:44:29:44:42 | 22 | funcExprs.kt:44:29:44:42 | | IntegerLiteral | +| funcExprs.kt:44:29:44:42 | ...::... | funcExprs.kt:21:1:52:1 | call | MemberRefExpr | +| funcExprs.kt:44:29:44:42 | ...=... | funcExprs.kt:44:29:44:42 | | AssignExpr | +| funcExprs.kt:44:29:44:42 | | funcExprs.kt:44:29:44:42 | | VarAccess | +| funcExprs.kt:44:29:44:42 | FuncRef | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:44:29:44:42 | Function22 | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:44:29:44:42 | Integer | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:44:29:44:42 | Integer | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:44:29:44:42 | Integer | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:44:29:44:42 | Integer | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:44:29:44:42 | Integer | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:44:29:44:42 | Integer | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:44:29:44:42 | Integer | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:44:29:44:42 | Integer | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:44:29:44:42 | Integer | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:44:29:44:42 | Integer | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:44:29:44:42 | Integer | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:44:29:44:42 | Integer | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:44:29:44:42 | Integer | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:44:29:44:42 | Integer | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:44:29:44:42 | Integer | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:44:29:44:42 | Integer | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:44:29:44:42 | Integer | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:44:29:44:42 | Integer | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:44:29:44:42 | Integer | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:44:29:44:42 | Integer | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:44:29:44:42 | Integer | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:44:29:44:42 | Integer | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:44:29:44:42 | Unit | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:44:29:44:42 | a0 | funcExprs.kt:44:29:44:42 | invoke | VarAccess | +| funcExprs.kt:44:29:44:42 | a1 | funcExprs.kt:44:29:44:42 | invoke | VarAccess | +| funcExprs.kt:44:29:44:42 | a2 | funcExprs.kt:44:29:44:42 | invoke | VarAccess | +| funcExprs.kt:44:29:44:42 | a3 | funcExprs.kt:44:29:44:42 | invoke | VarAccess | +| funcExprs.kt:44:29:44:42 | a4 | funcExprs.kt:44:29:44:42 | invoke | VarAccess | +| funcExprs.kt:44:29:44:42 | a5 | funcExprs.kt:44:29:44:42 | invoke | VarAccess | +| funcExprs.kt:44:29:44:42 | a6 | funcExprs.kt:44:29:44:42 | invoke | VarAccess | +| funcExprs.kt:44:29:44:42 | a7 | funcExprs.kt:44:29:44:42 | invoke | VarAccess | +| funcExprs.kt:44:29:44:42 | a8 | funcExprs.kt:44:29:44:42 | invoke | VarAccess | +| funcExprs.kt:44:29:44:42 | a9 | funcExprs.kt:44:29:44:42 | invoke | VarAccess | +| funcExprs.kt:44:29:44:42 | a10 | funcExprs.kt:44:29:44:42 | invoke | VarAccess | +| funcExprs.kt:44:29:44:42 | a11 | funcExprs.kt:44:29:44:42 | invoke | VarAccess | +| funcExprs.kt:44:29:44:42 | a12 | funcExprs.kt:44:29:44:42 | invoke | VarAccess | +| funcExprs.kt:44:29:44:42 | a13 | funcExprs.kt:44:29:44:42 | invoke | VarAccess | +| funcExprs.kt:44:29:44:42 | a14 | funcExprs.kt:44:29:44:42 | invoke | VarAccess | +| funcExprs.kt:44:29:44:42 | a15 | funcExprs.kt:44:29:44:42 | invoke | VarAccess | +| funcExprs.kt:44:29:44:42 | a16 | funcExprs.kt:44:29:44:42 | invoke | VarAccess | +| funcExprs.kt:44:29:44:42 | a17 | funcExprs.kt:44:29:44:42 | invoke | VarAccess | +| funcExprs.kt:44:29:44:42 | a18 | funcExprs.kt:44:29:44:42 | invoke | VarAccess | +| funcExprs.kt:44:29:44:42 | a19 | funcExprs.kt:44:29:44:42 | invoke | VarAccess | +| funcExprs.kt:44:29:44:42 | a20 | funcExprs.kt:44:29:44:42 | invoke | VarAccess | +| funcExprs.kt:44:29:44:42 | a21 | funcExprs.kt:44:29:44:42 | invoke | VarAccess | +| funcExprs.kt:44:29:44:42 | f22(...) | funcExprs.kt:44:29:44:42 | invoke | MethodCall | +| funcExprs.kt:44:29:44:42 | this | funcExprs.kt:44:29:44:42 | | ThisAccess | +| funcExprs.kt:44:29:44:42 | this | funcExprs.kt:44:29:44:42 | invoke | ThisAccess | +| funcExprs.kt:44:29:44:42 | this. | funcExprs.kt:44:29:44:42 | | VarAccess | +| funcExprs.kt:44:29:44:42 | this. | funcExprs.kt:44:29:44:42 | invoke | VarAccess | +| funcExprs.kt:45:5:45:43 | FuncExprsKt | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:45:5:45:43 | functionExpression23(...) | funcExprs.kt:21:1:52:1 | call | MethodCall | +| funcExprs.kt:45:26:45:26 | 5 | funcExprs.kt:21:1:52:1 | call | IntegerLiteral | +| funcExprs.kt:45:29:45:37 | FuncRef | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:45:29:45:37 | new FuncRef(...) | funcExprs.kt:21:1:52:1 | call | ClassInstanceExpr | +| funcExprs.kt:45:29:45:42 | 0 | funcExprs.kt:45:29:45:42 | invoke | IntegerLiteral | +| funcExprs.kt:45:29:45:42 | 1 | funcExprs.kt:45:29:45:42 | invoke | IntegerLiteral | +| funcExprs.kt:45:29:45:42 | 2 | funcExprs.kt:45:29:45:42 | invoke | IntegerLiteral | +| funcExprs.kt:45:29:45:42 | 3 | funcExprs.kt:45:29:45:42 | invoke | IntegerLiteral | +| funcExprs.kt:45:29:45:42 | 4 | funcExprs.kt:45:29:45:42 | invoke | IntegerLiteral | +| funcExprs.kt:45:29:45:42 | 5 | funcExprs.kt:45:29:45:42 | invoke | IntegerLiteral | +| funcExprs.kt:45:29:45:42 | 6 | funcExprs.kt:45:29:45:42 | invoke | IntegerLiteral | +| funcExprs.kt:45:29:45:42 | 7 | funcExprs.kt:45:29:45:42 | invoke | IntegerLiteral | +| funcExprs.kt:45:29:45:42 | 8 | funcExprs.kt:45:29:45:42 | invoke | IntegerLiteral | +| funcExprs.kt:45:29:45:42 | 9 | funcExprs.kt:45:29:45:42 | invoke | IntegerLiteral | +| funcExprs.kt:45:29:45:42 | 10 | funcExprs.kt:45:29:45:42 | invoke | IntegerLiteral | +| funcExprs.kt:45:29:45:42 | 11 | funcExprs.kt:45:29:45:42 | invoke | IntegerLiteral | +| funcExprs.kt:45:29:45:42 | 12 | funcExprs.kt:45:29:45:42 | invoke | IntegerLiteral | +| funcExprs.kt:45:29:45:42 | 13 | funcExprs.kt:45:29:45:42 | invoke | IntegerLiteral | +| funcExprs.kt:45:29:45:42 | 14 | funcExprs.kt:45:29:45:42 | invoke | IntegerLiteral | +| funcExprs.kt:45:29:45:42 | 15 | funcExprs.kt:45:29:45:42 | invoke | IntegerLiteral | +| funcExprs.kt:45:29:45:42 | 16 | funcExprs.kt:45:29:45:42 | invoke | IntegerLiteral | +| funcExprs.kt:45:29:45:42 | 17 | funcExprs.kt:45:29:45:42 | invoke | IntegerLiteral | +| funcExprs.kt:45:29:45:42 | 18 | funcExprs.kt:45:29:45:42 | invoke | IntegerLiteral | +| funcExprs.kt:45:29:45:42 | 19 | funcExprs.kt:45:29:45:42 | invoke | IntegerLiteral | +| funcExprs.kt:45:29:45:42 | 20 | funcExprs.kt:45:29:45:42 | invoke | IntegerLiteral | +| funcExprs.kt:45:29:45:42 | 21 | funcExprs.kt:45:29:45:42 | invoke | IntegerLiteral | +| funcExprs.kt:45:29:45:42 | 22 | funcExprs.kt:45:29:45:42 | invoke | IntegerLiteral | +| funcExprs.kt:45:29:45:42 | 23 | funcExprs.kt:45:29:45:42 | | IntegerLiteral | +| funcExprs.kt:45:29:45:42 | (...)... | funcExprs.kt:45:29:45:42 | invoke | CastExpr | +| funcExprs.kt:45:29:45:42 | (...)... | funcExprs.kt:45:29:45:42 | invoke | CastExpr | +| funcExprs.kt:45:29:45:42 | (...)... | funcExprs.kt:45:29:45:42 | invoke | CastExpr | +| funcExprs.kt:45:29:45:42 | (...)... | funcExprs.kt:45:29:45:42 | invoke | CastExpr | +| funcExprs.kt:45:29:45:42 | (...)... | funcExprs.kt:45:29:45:42 | invoke | CastExpr | +| funcExprs.kt:45:29:45:42 | (...)... | funcExprs.kt:45:29:45:42 | invoke | CastExpr | +| funcExprs.kt:45:29:45:42 | (...)... | funcExprs.kt:45:29:45:42 | invoke | CastExpr | +| funcExprs.kt:45:29:45:42 | (...)... | funcExprs.kt:45:29:45:42 | invoke | CastExpr | +| funcExprs.kt:45:29:45:42 | (...)... | funcExprs.kt:45:29:45:42 | invoke | CastExpr | +| funcExprs.kt:45:29:45:42 | (...)... | funcExprs.kt:45:29:45:42 | invoke | CastExpr | +| funcExprs.kt:45:29:45:42 | (...)... | funcExprs.kt:45:29:45:42 | invoke | CastExpr | +| funcExprs.kt:45:29:45:42 | (...)... | funcExprs.kt:45:29:45:42 | invoke | CastExpr | +| funcExprs.kt:45:29:45:42 | (...)... | funcExprs.kt:45:29:45:42 | invoke | CastExpr | +| funcExprs.kt:45:29:45:42 | (...)... | funcExprs.kt:45:29:45:42 | invoke | CastExpr | +| funcExprs.kt:45:29:45:42 | (...)... | funcExprs.kt:45:29:45:42 | invoke | CastExpr | +| funcExprs.kt:45:29:45:42 | (...)... | funcExprs.kt:45:29:45:42 | invoke | CastExpr | +| funcExprs.kt:45:29:45:42 | (...)... | funcExprs.kt:45:29:45:42 | invoke | CastExpr | +| funcExprs.kt:45:29:45:42 | (...)... | funcExprs.kt:45:29:45:42 | invoke | CastExpr | +| funcExprs.kt:45:29:45:42 | (...)... | funcExprs.kt:45:29:45:42 | invoke | CastExpr | +| funcExprs.kt:45:29:45:42 | (...)... | funcExprs.kt:45:29:45:42 | invoke | CastExpr | +| funcExprs.kt:45:29:45:42 | (...)... | funcExprs.kt:45:29:45:42 | invoke | CastExpr | +| funcExprs.kt:45:29:45:42 | (...)... | funcExprs.kt:45:29:45:42 | invoke | CastExpr | +| funcExprs.kt:45:29:45:42 | (...)... | funcExprs.kt:45:29:45:42 | invoke | CastExpr | +| funcExprs.kt:45:29:45:42 | ...::... | funcExprs.kt:21:1:52:1 | call | MemberRefExpr | +| funcExprs.kt:45:29:45:42 | ...=... | funcExprs.kt:45:29:45:42 | | AssignExpr | +| funcExprs.kt:45:29:45:42 | ...[...] | funcExprs.kt:45:29:45:42 | invoke | ArrayAccess | +| funcExprs.kt:45:29:45:42 | ...[...] | funcExprs.kt:45:29:45:42 | invoke | ArrayAccess | +| funcExprs.kt:45:29:45:42 | ...[...] | funcExprs.kt:45:29:45:42 | invoke | ArrayAccess | +| funcExprs.kt:45:29:45:42 | ...[...] | funcExprs.kt:45:29:45:42 | invoke | ArrayAccess | +| funcExprs.kt:45:29:45:42 | ...[...] | funcExprs.kt:45:29:45:42 | invoke | ArrayAccess | +| funcExprs.kt:45:29:45:42 | ...[...] | funcExprs.kt:45:29:45:42 | invoke | ArrayAccess | +| funcExprs.kt:45:29:45:42 | ...[...] | funcExprs.kt:45:29:45:42 | invoke | ArrayAccess | +| funcExprs.kt:45:29:45:42 | ...[...] | funcExprs.kt:45:29:45:42 | invoke | ArrayAccess | +| funcExprs.kt:45:29:45:42 | ...[...] | funcExprs.kt:45:29:45:42 | invoke | ArrayAccess | +| funcExprs.kt:45:29:45:42 | ...[...] | funcExprs.kt:45:29:45:42 | invoke | ArrayAccess | +| funcExprs.kt:45:29:45:42 | ...[...] | funcExprs.kt:45:29:45:42 | invoke | ArrayAccess | +| funcExprs.kt:45:29:45:42 | ...[...] | funcExprs.kt:45:29:45:42 | invoke | ArrayAccess | +| funcExprs.kt:45:29:45:42 | ...[...] | funcExprs.kt:45:29:45:42 | invoke | ArrayAccess | +| funcExprs.kt:45:29:45:42 | ...[...] | funcExprs.kt:45:29:45:42 | invoke | ArrayAccess | +| funcExprs.kt:45:29:45:42 | ...[...] | funcExprs.kt:45:29:45:42 | invoke | ArrayAccess | +| funcExprs.kt:45:29:45:42 | ...[...] | funcExprs.kt:45:29:45:42 | invoke | ArrayAccess | +| funcExprs.kt:45:29:45:42 | ...[...] | funcExprs.kt:45:29:45:42 | invoke | ArrayAccess | +| funcExprs.kt:45:29:45:42 | ...[...] | funcExprs.kt:45:29:45:42 | invoke | ArrayAccess | +| funcExprs.kt:45:29:45:42 | ...[...] | funcExprs.kt:45:29:45:42 | invoke | ArrayAccess | +| funcExprs.kt:45:29:45:42 | ...[...] | funcExprs.kt:45:29:45:42 | invoke | ArrayAccess | +| funcExprs.kt:45:29:45:42 | ...[...] | funcExprs.kt:45:29:45:42 | invoke | ArrayAccess | +| funcExprs.kt:45:29:45:42 | ...[...] | funcExprs.kt:45:29:45:42 | invoke | ArrayAccess | +| funcExprs.kt:45:29:45:42 | ...[...] | funcExprs.kt:45:29:45:42 | invoke | ArrayAccess | +| funcExprs.kt:45:29:45:42 | | funcExprs.kt:45:29:45:42 | | VarAccess | +| funcExprs.kt:45:29:45:42 | FuncRef | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:45:29:45:42 | FunctionN | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:45:29:45:42 | String | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:45:29:45:42 | a0 | funcExprs.kt:45:29:45:42 | invoke | VarAccess | +| funcExprs.kt:45:29:45:42 | a0 | funcExprs.kt:45:29:45:42 | invoke | VarAccess | +| funcExprs.kt:45:29:45:42 | a0 | funcExprs.kt:45:29:45:42 | invoke | VarAccess | +| funcExprs.kt:45:29:45:42 | a0 | funcExprs.kt:45:29:45:42 | invoke | VarAccess | +| funcExprs.kt:45:29:45:42 | a0 | funcExprs.kt:45:29:45:42 | invoke | VarAccess | +| funcExprs.kt:45:29:45:42 | a0 | funcExprs.kt:45:29:45:42 | invoke | VarAccess | +| funcExprs.kt:45:29:45:42 | a0 | funcExprs.kt:45:29:45:42 | invoke | VarAccess | +| funcExprs.kt:45:29:45:42 | a0 | funcExprs.kt:45:29:45:42 | invoke | VarAccess | +| funcExprs.kt:45:29:45:42 | a0 | funcExprs.kt:45:29:45:42 | invoke | VarAccess | +| funcExprs.kt:45:29:45:42 | a0 | funcExprs.kt:45:29:45:42 | invoke | VarAccess | +| funcExprs.kt:45:29:45:42 | a0 | funcExprs.kt:45:29:45:42 | invoke | VarAccess | +| funcExprs.kt:45:29:45:42 | a0 | funcExprs.kt:45:29:45:42 | invoke | VarAccess | +| funcExprs.kt:45:29:45:42 | a0 | funcExprs.kt:45:29:45:42 | invoke | VarAccess | +| funcExprs.kt:45:29:45:42 | a0 | funcExprs.kt:45:29:45:42 | invoke | VarAccess | +| funcExprs.kt:45:29:45:42 | a0 | funcExprs.kt:45:29:45:42 | invoke | VarAccess | +| funcExprs.kt:45:29:45:42 | a0 | funcExprs.kt:45:29:45:42 | invoke | VarAccess | +| funcExprs.kt:45:29:45:42 | a0 | funcExprs.kt:45:29:45:42 | invoke | VarAccess | +| funcExprs.kt:45:29:45:42 | a0 | funcExprs.kt:45:29:45:42 | invoke | VarAccess | +| funcExprs.kt:45:29:45:42 | a0 | funcExprs.kt:45:29:45:42 | invoke | VarAccess | +| funcExprs.kt:45:29:45:42 | a0 | funcExprs.kt:45:29:45:42 | invoke | VarAccess | +| funcExprs.kt:45:29:45:42 | a0 | funcExprs.kt:45:29:45:42 | invoke | VarAccess | +| funcExprs.kt:45:29:45:42 | a0 | funcExprs.kt:45:29:45:42 | invoke | VarAccess | +| funcExprs.kt:45:29:45:42 | a0 | funcExprs.kt:45:29:45:42 | invoke | VarAccess | +| funcExprs.kt:45:29:45:42 | f23(...) | funcExprs.kt:45:29:45:42 | invoke | MethodCall | +| funcExprs.kt:45:29:45:42 | int | funcExprs.kt:45:29:45:42 | invoke | TypeAccess | +| funcExprs.kt:45:29:45:42 | int | funcExprs.kt:45:29:45:42 | invoke | TypeAccess | +| funcExprs.kt:45:29:45:42 | int | funcExprs.kt:45:29:45:42 | invoke | TypeAccess | +| funcExprs.kt:45:29:45:42 | int | funcExprs.kt:45:29:45:42 | invoke | TypeAccess | +| funcExprs.kt:45:29:45:42 | int | funcExprs.kt:45:29:45:42 | invoke | TypeAccess | +| funcExprs.kt:45:29:45:42 | int | funcExprs.kt:45:29:45:42 | invoke | TypeAccess | +| funcExprs.kt:45:29:45:42 | int | funcExprs.kt:45:29:45:42 | invoke | TypeAccess | +| funcExprs.kt:45:29:45:42 | int | funcExprs.kt:45:29:45:42 | invoke | TypeAccess | +| funcExprs.kt:45:29:45:42 | int | funcExprs.kt:45:29:45:42 | invoke | TypeAccess | +| funcExprs.kt:45:29:45:42 | int | funcExprs.kt:45:29:45:42 | invoke | TypeAccess | +| funcExprs.kt:45:29:45:42 | int | funcExprs.kt:45:29:45:42 | invoke | TypeAccess | +| funcExprs.kt:45:29:45:42 | int | funcExprs.kt:45:29:45:42 | invoke | TypeAccess | +| funcExprs.kt:45:29:45:42 | int | funcExprs.kt:45:29:45:42 | invoke | TypeAccess | +| funcExprs.kt:45:29:45:42 | int | funcExprs.kt:45:29:45:42 | invoke | TypeAccess | +| funcExprs.kt:45:29:45:42 | int | funcExprs.kt:45:29:45:42 | invoke | TypeAccess | +| funcExprs.kt:45:29:45:42 | int | funcExprs.kt:45:29:45:42 | invoke | TypeAccess | +| funcExprs.kt:45:29:45:42 | int | funcExprs.kt:45:29:45:42 | invoke | TypeAccess | +| funcExprs.kt:45:29:45:42 | int | funcExprs.kt:45:29:45:42 | invoke | TypeAccess | +| funcExprs.kt:45:29:45:42 | int | funcExprs.kt:45:29:45:42 | invoke | TypeAccess | +| funcExprs.kt:45:29:45:42 | int | funcExprs.kt:45:29:45:42 | invoke | TypeAccess | +| funcExprs.kt:45:29:45:42 | int | funcExprs.kt:45:29:45:42 | invoke | TypeAccess | +| funcExprs.kt:45:29:45:42 | int | funcExprs.kt:45:29:45:42 | invoke | TypeAccess | +| funcExprs.kt:45:29:45:42 | int | funcExprs.kt:45:29:45:42 | invoke | TypeAccess | +| funcExprs.kt:45:29:45:42 | this | funcExprs.kt:45:29:45:42 | | ThisAccess | +| funcExprs.kt:45:29:45:42 | this | funcExprs.kt:45:29:45:42 | invoke | ThisAccess | +| funcExprs.kt:45:29:45:42 | this. | funcExprs.kt:45:29:45:42 | | VarAccess | +| funcExprs.kt:45:29:45:42 | this. | funcExprs.kt:45:29:45:42 | invoke | VarAccess | +| funcExprs.kt:46:5:46:42 | FuncExprsKt | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:46:5:46:42 | functionExpression23c(...) | funcExprs.kt:21:1:52:1 | call | MethodCall | +| funcExprs.kt:46:27:46:27 | 5 | funcExprs.kt:21:1:52:1 | call | IntegerLiteral | +| funcExprs.kt:46:30:46:41 | 0 | funcExprs.kt:46:30:46:41 | invoke | IntegerLiteral | +| funcExprs.kt:46:30:46:41 | 1 | funcExprs.kt:46:30:46:41 | invoke | IntegerLiteral | +| funcExprs.kt:46:30:46:41 | 2 | funcExprs.kt:46:30:46:41 | invoke | IntegerLiteral | +| funcExprs.kt:46:30:46:41 | 3 | funcExprs.kt:46:30:46:41 | invoke | IntegerLiteral | +| funcExprs.kt:46:30:46:41 | 4 | funcExprs.kt:46:30:46:41 | invoke | IntegerLiteral | +| funcExprs.kt:46:30:46:41 | 5 | funcExprs.kt:46:30:46:41 | invoke | IntegerLiteral | +| funcExprs.kt:46:30:46:41 | 6 | funcExprs.kt:46:30:46:41 | invoke | IntegerLiteral | +| funcExprs.kt:46:30:46:41 | 7 | funcExprs.kt:46:30:46:41 | invoke | IntegerLiteral | +| funcExprs.kt:46:30:46:41 | 8 | funcExprs.kt:46:30:46:41 | invoke | IntegerLiteral | +| funcExprs.kt:46:30:46:41 | 9 | funcExprs.kt:46:30:46:41 | invoke | IntegerLiteral | +| funcExprs.kt:46:30:46:41 | 10 | funcExprs.kt:46:30:46:41 | invoke | IntegerLiteral | +| funcExprs.kt:46:30:46:41 | 11 | funcExprs.kt:46:30:46:41 | invoke | IntegerLiteral | +| funcExprs.kt:46:30:46:41 | 12 | funcExprs.kt:46:30:46:41 | invoke | IntegerLiteral | +| funcExprs.kt:46:30:46:41 | 13 | funcExprs.kt:46:30:46:41 | invoke | IntegerLiteral | +| funcExprs.kt:46:30:46:41 | 14 | funcExprs.kt:46:30:46:41 | invoke | IntegerLiteral | +| funcExprs.kt:46:30:46:41 | 15 | funcExprs.kt:46:30:46:41 | invoke | IntegerLiteral | +| funcExprs.kt:46:30:46:41 | 16 | funcExprs.kt:46:30:46:41 | invoke | IntegerLiteral | +| funcExprs.kt:46:30:46:41 | 17 | funcExprs.kt:46:30:46:41 | invoke | IntegerLiteral | +| funcExprs.kt:46:30:46:41 | 18 | funcExprs.kt:46:30:46:41 | invoke | IntegerLiteral | +| funcExprs.kt:46:30:46:41 | 19 | funcExprs.kt:46:30:46:41 | invoke | IntegerLiteral | +| funcExprs.kt:46:30:46:41 | 20 | funcExprs.kt:46:30:46:41 | invoke | IntegerLiteral | +| funcExprs.kt:46:30:46:41 | 21 | funcExprs.kt:46:30:46:41 | invoke | IntegerLiteral | +| funcExprs.kt:46:30:46:41 | 22 | funcExprs.kt:46:30:46:41 | invoke | IntegerLiteral | +| funcExprs.kt:46:30:46:41 | 23 | funcExprs.kt:46:30:46:41 | invoke | IntegerLiteral | +| funcExprs.kt:46:30:46:41 | 24 | funcExprs.kt:46:30:46:41 | | IntegerLiteral | +| funcExprs.kt:46:30:46:41 | (...)... | funcExprs.kt:46:30:46:41 | invoke | CastExpr | +| funcExprs.kt:46:30:46:41 | (...)... | funcExprs.kt:46:30:46:41 | invoke | CastExpr | +| funcExprs.kt:46:30:46:41 | (...)... | funcExprs.kt:46:30:46:41 | invoke | CastExpr | +| funcExprs.kt:46:30:46:41 | (...)... | funcExprs.kt:46:30:46:41 | invoke | CastExpr | +| funcExprs.kt:46:30:46:41 | (...)... | funcExprs.kt:46:30:46:41 | invoke | CastExpr | +| funcExprs.kt:46:30:46:41 | (...)... | funcExprs.kt:46:30:46:41 | invoke | CastExpr | +| funcExprs.kt:46:30:46:41 | (...)... | funcExprs.kt:46:30:46:41 | invoke | CastExpr | +| funcExprs.kt:46:30:46:41 | (...)... | funcExprs.kt:46:30:46:41 | invoke | CastExpr | +| funcExprs.kt:46:30:46:41 | (...)... | funcExprs.kt:46:30:46:41 | invoke | CastExpr | +| funcExprs.kt:46:30:46:41 | (...)... | funcExprs.kt:46:30:46:41 | invoke | CastExpr | +| funcExprs.kt:46:30:46:41 | (...)... | funcExprs.kt:46:30:46:41 | invoke | CastExpr | +| funcExprs.kt:46:30:46:41 | (...)... | funcExprs.kt:46:30:46:41 | invoke | CastExpr | +| funcExprs.kt:46:30:46:41 | (...)... | funcExprs.kt:46:30:46:41 | invoke | CastExpr | +| funcExprs.kt:46:30:46:41 | (...)... | funcExprs.kt:46:30:46:41 | invoke | CastExpr | +| funcExprs.kt:46:30:46:41 | (...)... | funcExprs.kt:46:30:46:41 | invoke | CastExpr | +| funcExprs.kt:46:30:46:41 | (...)... | funcExprs.kt:46:30:46:41 | invoke | CastExpr | +| funcExprs.kt:46:30:46:41 | (...)... | funcExprs.kt:46:30:46:41 | invoke | CastExpr | +| funcExprs.kt:46:30:46:41 | (...)... | funcExprs.kt:46:30:46:41 | invoke | CastExpr | +| funcExprs.kt:46:30:46:41 | (...)... | funcExprs.kt:46:30:46:41 | invoke | CastExpr | +| funcExprs.kt:46:30:46:41 | (...)... | funcExprs.kt:46:30:46:41 | invoke | CastExpr | +| funcExprs.kt:46:30:46:41 | (...)... | funcExprs.kt:46:30:46:41 | invoke | CastExpr | +| funcExprs.kt:46:30:46:41 | (...)... | funcExprs.kt:46:30:46:41 | invoke | CastExpr | +| funcExprs.kt:46:30:46:41 | (...)... | funcExprs.kt:46:30:46:41 | invoke | CastExpr | +| funcExprs.kt:46:30:46:41 | (...)... | funcExprs.kt:46:30:46:41 | invoke | CastExpr | +| funcExprs.kt:46:30:46:41 | ...::... | funcExprs.kt:21:1:52:1 | call | MemberRefExpr | +| funcExprs.kt:46:30:46:41 | ...[...] | funcExprs.kt:46:30:46:41 | invoke | ArrayAccess | +| funcExprs.kt:46:30:46:41 | ...[...] | funcExprs.kt:46:30:46:41 | invoke | ArrayAccess | +| funcExprs.kt:46:30:46:41 | ...[...] | funcExprs.kt:46:30:46:41 | invoke | ArrayAccess | +| funcExprs.kt:46:30:46:41 | ...[...] | funcExprs.kt:46:30:46:41 | invoke | ArrayAccess | +| funcExprs.kt:46:30:46:41 | ...[...] | funcExprs.kt:46:30:46:41 | invoke | ArrayAccess | +| funcExprs.kt:46:30:46:41 | ...[...] | funcExprs.kt:46:30:46:41 | invoke | ArrayAccess | +| funcExprs.kt:46:30:46:41 | ...[...] | funcExprs.kt:46:30:46:41 | invoke | ArrayAccess | +| funcExprs.kt:46:30:46:41 | ...[...] | funcExprs.kt:46:30:46:41 | invoke | ArrayAccess | +| funcExprs.kt:46:30:46:41 | ...[...] | funcExprs.kt:46:30:46:41 | invoke | ArrayAccess | +| funcExprs.kt:46:30:46:41 | ...[...] | funcExprs.kt:46:30:46:41 | invoke | ArrayAccess | +| funcExprs.kt:46:30:46:41 | ...[...] | funcExprs.kt:46:30:46:41 | invoke | ArrayAccess | +| funcExprs.kt:46:30:46:41 | ...[...] | funcExprs.kt:46:30:46:41 | invoke | ArrayAccess | +| funcExprs.kt:46:30:46:41 | ...[...] | funcExprs.kt:46:30:46:41 | invoke | ArrayAccess | +| funcExprs.kt:46:30:46:41 | ...[...] | funcExprs.kt:46:30:46:41 | invoke | ArrayAccess | +| funcExprs.kt:46:30:46:41 | ...[...] | funcExprs.kt:46:30:46:41 | invoke | ArrayAccess | +| funcExprs.kt:46:30:46:41 | ...[...] | funcExprs.kt:46:30:46:41 | invoke | ArrayAccess | +| funcExprs.kt:46:30:46:41 | ...[...] | funcExprs.kt:46:30:46:41 | invoke | ArrayAccess | +| funcExprs.kt:46:30:46:41 | ...[...] | funcExprs.kt:46:30:46:41 | invoke | ArrayAccess | +| funcExprs.kt:46:30:46:41 | ...[...] | funcExprs.kt:46:30:46:41 | invoke | ArrayAccess | +| funcExprs.kt:46:30:46:41 | ...[...] | funcExprs.kt:46:30:46:41 | invoke | ArrayAccess | +| funcExprs.kt:46:30:46:41 | ...[...] | funcExprs.kt:46:30:46:41 | invoke | ArrayAccess | +| funcExprs.kt:46:30:46:41 | ...[...] | funcExprs.kt:46:30:46:41 | invoke | ArrayAccess | +| funcExprs.kt:46:30:46:41 | ...[...] | funcExprs.kt:46:30:46:41 | invoke | ArrayAccess | +| funcExprs.kt:46:30:46:41 | ...[...] | funcExprs.kt:46:30:46:41 | invoke | ArrayAccess | +| funcExprs.kt:46:30:46:41 | FuncRef | funcExprs.kt:46:30:46:41 | invoke | TypeAccess | +| funcExprs.kt:46:30:46:41 | FunctionN | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:46:30:46:41 | String | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:46:30:46:41 | a0 | funcExprs.kt:46:30:46:41 | invoke | VarAccess | +| funcExprs.kt:46:30:46:41 | a0 | funcExprs.kt:46:30:46:41 | invoke | VarAccess | +| funcExprs.kt:46:30:46:41 | a0 | funcExprs.kt:46:30:46:41 | invoke | VarAccess | +| funcExprs.kt:46:30:46:41 | a0 | funcExprs.kt:46:30:46:41 | invoke | VarAccess | +| funcExprs.kt:46:30:46:41 | a0 | funcExprs.kt:46:30:46:41 | invoke | VarAccess | +| funcExprs.kt:46:30:46:41 | a0 | funcExprs.kt:46:30:46:41 | invoke | VarAccess | +| funcExprs.kt:46:30:46:41 | a0 | funcExprs.kt:46:30:46:41 | invoke | VarAccess | +| funcExprs.kt:46:30:46:41 | a0 | funcExprs.kt:46:30:46:41 | invoke | VarAccess | +| funcExprs.kt:46:30:46:41 | a0 | funcExprs.kt:46:30:46:41 | invoke | VarAccess | +| funcExprs.kt:46:30:46:41 | a0 | funcExprs.kt:46:30:46:41 | invoke | VarAccess | +| funcExprs.kt:46:30:46:41 | a0 | funcExprs.kt:46:30:46:41 | invoke | VarAccess | +| funcExprs.kt:46:30:46:41 | a0 | funcExprs.kt:46:30:46:41 | invoke | VarAccess | +| funcExprs.kt:46:30:46:41 | a0 | funcExprs.kt:46:30:46:41 | invoke | VarAccess | +| funcExprs.kt:46:30:46:41 | a0 | funcExprs.kt:46:30:46:41 | invoke | VarAccess | +| funcExprs.kt:46:30:46:41 | a0 | funcExprs.kt:46:30:46:41 | invoke | VarAccess | +| funcExprs.kt:46:30:46:41 | a0 | funcExprs.kt:46:30:46:41 | invoke | VarAccess | +| funcExprs.kt:46:30:46:41 | a0 | funcExprs.kt:46:30:46:41 | invoke | VarAccess | +| funcExprs.kt:46:30:46:41 | a0 | funcExprs.kt:46:30:46:41 | invoke | VarAccess | +| funcExprs.kt:46:30:46:41 | a0 | funcExprs.kt:46:30:46:41 | invoke | VarAccess | +| funcExprs.kt:46:30:46:41 | a0 | funcExprs.kt:46:30:46:41 | invoke | VarAccess | +| funcExprs.kt:46:30:46:41 | a0 | funcExprs.kt:46:30:46:41 | invoke | VarAccess | +| funcExprs.kt:46:30:46:41 | a0 | funcExprs.kt:46:30:46:41 | invoke | VarAccess | +| funcExprs.kt:46:30:46:41 | a0 | funcExprs.kt:46:30:46:41 | invoke | VarAccess | +| funcExprs.kt:46:30:46:41 | a0 | funcExprs.kt:46:30:46:41 | invoke | VarAccess | +| funcExprs.kt:46:30:46:41 | f23(...) | funcExprs.kt:46:30:46:41 | invoke | MethodCall | +| funcExprs.kt:46:30:46:41 | int | funcExprs.kt:46:30:46:41 | invoke | TypeAccess | +| funcExprs.kt:46:30:46:41 | int | funcExprs.kt:46:30:46:41 | invoke | TypeAccess | +| funcExprs.kt:46:30:46:41 | int | funcExprs.kt:46:30:46:41 | invoke | TypeAccess | +| funcExprs.kt:46:30:46:41 | int | funcExprs.kt:46:30:46:41 | invoke | TypeAccess | +| funcExprs.kt:46:30:46:41 | int | funcExprs.kt:46:30:46:41 | invoke | TypeAccess | +| funcExprs.kt:46:30:46:41 | int | funcExprs.kt:46:30:46:41 | invoke | TypeAccess | +| funcExprs.kt:46:30:46:41 | int | funcExprs.kt:46:30:46:41 | invoke | TypeAccess | +| funcExprs.kt:46:30:46:41 | int | funcExprs.kt:46:30:46:41 | invoke | TypeAccess | +| funcExprs.kt:46:30:46:41 | int | funcExprs.kt:46:30:46:41 | invoke | TypeAccess | +| funcExprs.kt:46:30:46:41 | int | funcExprs.kt:46:30:46:41 | invoke | TypeAccess | +| funcExprs.kt:46:30:46:41 | int | funcExprs.kt:46:30:46:41 | invoke | TypeAccess | +| funcExprs.kt:46:30:46:41 | int | funcExprs.kt:46:30:46:41 | invoke | TypeAccess | +| funcExprs.kt:46:30:46:41 | int | funcExprs.kt:46:30:46:41 | invoke | TypeAccess | +| funcExprs.kt:46:30:46:41 | int | funcExprs.kt:46:30:46:41 | invoke | TypeAccess | +| funcExprs.kt:46:30:46:41 | int | funcExprs.kt:46:30:46:41 | invoke | TypeAccess | +| funcExprs.kt:46:30:46:41 | int | funcExprs.kt:46:30:46:41 | invoke | TypeAccess | +| funcExprs.kt:46:30:46:41 | int | funcExprs.kt:46:30:46:41 | invoke | TypeAccess | +| funcExprs.kt:46:30:46:41 | int | funcExprs.kt:46:30:46:41 | invoke | TypeAccess | +| funcExprs.kt:46:30:46:41 | int | funcExprs.kt:46:30:46:41 | invoke | TypeAccess | +| funcExprs.kt:46:30:46:41 | int | funcExprs.kt:46:30:46:41 | invoke | TypeAccess | +| funcExprs.kt:46:30:46:41 | int | funcExprs.kt:46:30:46:41 | invoke | TypeAccess | +| funcExprs.kt:46:30:46:41 | int | funcExprs.kt:46:30:46:41 | invoke | TypeAccess | +| funcExprs.kt:46:30:46:41 | int | funcExprs.kt:46:30:46:41 | invoke | TypeAccess | +| funcExprs.kt:48:5:48:24 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:48:24:48:24 | 5 | funcExprs.kt:48:5:48:24 | local | IntegerLiteral | +| funcExprs.kt:49:5:49:33 | FuncExprsKt | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:49:5:49:33 | functionExpression0a(...) | funcExprs.kt:21:1:52:1 | call | MethodCall | +| funcExprs.kt:49:26:49:32 | 0 | funcExprs.kt:49:26:49:32 | | IntegerLiteral | +| funcExprs.kt:49:26:49:32 | ...::... | funcExprs.kt:21:1:52:1 | call | MemberRefExpr | +| funcExprs.kt:49:26:49:32 | Function0 | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:49:26:49:32 | Integer | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:49:26:49:32 | Object | funcExprs.kt:49:26:49:32 | invoke | TypeAccess | +| funcExprs.kt:49:26:49:32 | local(...) | funcExprs.kt:49:26:49:32 | invoke | MethodCall | +| funcExprs.kt:49:26:49:32 | new (...) | funcExprs.kt:49:26:49:32 | invoke | ClassInstanceExpr | +| funcExprs.kt:51:5:51:17 | FuncExprsKt | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:51:5:51:17 | FuncRef | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:51:5:51:17 | fn(...) | funcExprs.kt:21:1:52:1 | call | MethodCall | +| funcExprs.kt:51:8:51:16 | 0 | funcExprs.kt:51:8:51:16 | | IntegerLiteral | +| funcExprs.kt:51:8:51:16 | ...::... | funcExprs.kt:21:1:52:1 | call | MemberRefExpr | +| funcExprs.kt:51:8:51:16 | FuncRef | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:51:8:51:16 | FuncRef | funcExprs.kt:51:8:51:16 | invoke | TypeAccess | +| funcExprs.kt:51:8:51:16 | Function0 | funcExprs.kt:21:1:52:1 | call | TypeAccess | +| funcExprs.kt:51:8:51:16 | new FuncRef(...) | funcExprs.kt:51:8:51:16 | invoke | ClassInstanceExpr | +| funcExprs.kt:55:23:55:49 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:55:34:55:39 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:55:49:55:49 | 5 | funcExprs.kt:55:23:55:49 | invoke | IntegerLiteral | +| funcExprs.kt:58:1:58:25 | Unit | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:58:12:58:21 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| funcExprs.kt:58:12:58:21 | Function0 | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:58:12:58:21 | T | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:59:1:59:22 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:59:5:59:7 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:59:12:59:17 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:59:22:59:22 | 5 | funcExprs.kt:59:1:59:22 | f3 | IntegerLiteral | +| funcExprs.kt:63:9:63:25 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:63:25:63:25 | 5 | funcExprs.kt:63:9:63:25 | f0 | IntegerLiteral | +| funcExprs.kt:65:5:65:21 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:65:21:65:21 | 5 | funcExprs.kt:65:5:65:21 | f0 | IntegerLiteral | +| funcExprs.kt:66:5:66:27 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:66:12:66:17 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:66:27:66:27 | 5 | funcExprs.kt:66:5:66:27 | f1 | IntegerLiteral | +| funcExprs.kt:67:5:68:123 | Unit | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:67:13:67:19 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:67:22:67:28 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:67:31:67:37 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:67:40:67:46 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:67:49:67:55 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:67:58:67:64 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:67:67:67:73 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:67:76:67:82 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:67:85:67:91 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:67:94:67:100 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:67:103:67:110 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:68:13:68:20 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:68:23:68:30 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:68:33:68:40 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:68:43:68:50 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:68:53:68:60 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:68:63:68:69 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:68:72:68:79 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:68:82:68:89 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:68:92:68:99 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:68:102:68:109 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:68:112:68:119 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:69:5:70:135 | String | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:69:13:69:19 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:69:22:69:28 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:69:31:69:37 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:69:40:69:46 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:69:49:69:55 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:69:58:69:64 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:69:67:69:73 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:69:76:69:82 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:69:85:69:91 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:69:94:69:100 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:69:103:69:110 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:70:13:70:20 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:70:23:70:30 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:70:33:70:40 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:70:43:70:50 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:70:53:70:60 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:70:63:70:69 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:70:72:70:79 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:70:82:70:89 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:70:92:70:99 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:70:102:70:109 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:70:112:70:119 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:70:122:70:129 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:70:134:70:135 | "" | funcExprs.kt:69:5:70:135 | f23 | StringLiteral | +| funcExprs.kt:74:5:76:5 | Unit | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:75:9:75:22 | fn(...) | funcExprs.kt:74:5:76:5 | call | MethodCall | +| funcExprs.kt:75:9:75:22 | this | funcExprs.kt:74:5:76:5 | call | ThisAccess | +| funcExprs.kt:75:12:75:22 | ...->... | funcExprs.kt:74:5:76:5 | call | LambdaExpr | +| funcExprs.kt:75:12:75:22 | Function1>,String> | funcExprs.kt:74:5:76:5 | call | TypeAccess | +| funcExprs.kt:75:12:75:22 | Generic> | funcExprs.kt:74:5:76:5 | call | TypeAccess | +| funcExprs.kt:75:12:75:22 | Generic | funcExprs.kt:74:5:76:5 | call | TypeAccess | +| funcExprs.kt:75:12:75:22 | Integer | funcExprs.kt:74:5:76:5 | call | TypeAccess | +| funcExprs.kt:75:12:75:22 | String | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:75:12:75:22 | String | funcExprs.kt:74:5:76:5 | call | TypeAccess | +| funcExprs.kt:75:14:75:14 | Generic> | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:75:14:75:14 | Generic | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:75:14:75:14 | Integer | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:75:20:75:20 | "a" | funcExprs.kt:75:12:75:22 | invoke | StringLiteral | +| funcExprs.kt:77:13:77:60 | Unit | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:77:20:77:55 | ? ... | file://:0:0:0:0 | | WildcardTypeAccess | +| funcExprs.kt:77:20:77:55 | Function1>,String> | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:77:20:77:55 | Generic> | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:77:20:77:55 | Generic | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:77:20:77:55 | Integer | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:77:20:77:55 | String | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:82:9:96:1 | Unit | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:83:9:83:10 | l1 | funcExprs.kt:82:9:96:1 | fn | LocalVariableDeclExpr | +| funcExprs.kt:83:31:83:51 | ...->... | funcExprs.kt:82:9:96:1 | fn | LambdaExpr | +| funcExprs.kt:83:31:83:51 | Function1 | funcExprs.kt:82:9:96:1 | fn | TypeAccess | +| funcExprs.kt:83:31:83:51 | Integer | funcExprs.kt:82:9:96:1 | fn | TypeAccess | +| funcExprs.kt:83:31:83:51 | String | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:83:31:83:51 | String | funcExprs.kt:82:9:96:1 | fn | TypeAccess | +| funcExprs.kt:83:33:83:33 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:83:38:83:38 | i | funcExprs.kt:83:31:83:51 | invoke | VarAccess | +| funcExprs.kt:83:38:83:49 | toString(...) | funcExprs.kt:83:31:83:51 | invoke | MethodCall | +| funcExprs.kt:84:5:84:6 | l1 | funcExprs.kt:82:9:96:1 | fn | VarAccess | +| funcExprs.kt:84:5:84:16 | invoke(...) | funcExprs.kt:82:9:96:1 | fn | MethodCall | +| funcExprs.kt:84:8:84:16 | | funcExprs.kt:82:9:96:1 | fn | ImplicitCoercionToUnitExpr | +| funcExprs.kt:84:8:84:16 | Unit | funcExprs.kt:82:9:96:1 | fn | TypeAccess | +| funcExprs.kt:84:15:84:15 | 5 | funcExprs.kt:82:9:96:1 | fn | IntegerLiteral | +| funcExprs.kt:86:9:86:10 | l2 | funcExprs.kt:82:9:96:1 | fn | LocalVariableDeclExpr | +| funcExprs.kt:86:39:86:59 | ...->... | funcExprs.kt:82:9:96:1 | fn | LambdaExpr | +| funcExprs.kt:86:39:86:59 | Function1 | funcExprs.kt:82:9:96:1 | fn | TypeAccess | +| funcExprs.kt:86:39:86:59 | Integer | funcExprs.kt:82:9:96:1 | fn | TypeAccess | +| funcExprs.kt:86:39:86:59 | String | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:86:39:86:59 | String | funcExprs.kt:82:9:96:1 | fn | TypeAccess | +| funcExprs.kt:86:41:86:41 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:86:46:86:46 | i | funcExprs.kt:86:39:86:59 | invoke | VarAccess | +| funcExprs.kt:86:46:86:57 | toString(...) | funcExprs.kt:86:39:86:59 | invoke | MethodCall | +| funcExprs.kt:87:5:87:6 | l2 | funcExprs.kt:82:9:96:1 | fn | VarAccess | +| funcExprs.kt:87:5:87:16 | invoke(...) | funcExprs.kt:82:9:96:1 | fn | MethodCall | +| funcExprs.kt:87:8:87:16 | | funcExprs.kt:82:9:96:1 | fn | ImplicitCoercionToUnitExpr | +| funcExprs.kt:87:8:87:16 | Unit | funcExprs.kt:82:9:96:1 | fn | TypeAccess | +| funcExprs.kt:87:15:87:15 | 5 | funcExprs.kt:82:9:96:1 | fn | IntegerLiteral | +| funcExprs.kt:89:9:89:10 | l3 | funcExprs.kt:82:9:96:1 | fn | LocalVariableDeclExpr | +| funcExprs.kt:90:15:90:69 | 0 | funcExprs.kt:90:15:90:69 | invoke | IntegerLiteral | +| funcExprs.kt:90:15:90:69 | 1 | funcExprs.kt:90:15:90:69 | invoke | IntegerLiteral | +| funcExprs.kt:90:15:90:69 | 2 | funcExprs.kt:90:15:90:69 | invoke | IntegerLiteral | +| funcExprs.kt:90:15:90:69 | 3 | funcExprs.kt:90:15:90:69 | invoke | IntegerLiteral | +| funcExprs.kt:90:15:90:69 | 4 | funcExprs.kt:90:15:90:69 | invoke | IntegerLiteral | +| funcExprs.kt:90:15:90:69 | 5 | funcExprs.kt:90:15:90:69 | invoke | IntegerLiteral | +| funcExprs.kt:90:15:90:69 | 6 | funcExprs.kt:90:15:90:69 | invoke | IntegerLiteral | +| funcExprs.kt:90:15:90:69 | 7 | funcExprs.kt:90:15:90:69 | invoke | IntegerLiteral | +| funcExprs.kt:90:15:90:69 | 8 | funcExprs.kt:90:15:90:69 | invoke | IntegerLiteral | +| funcExprs.kt:90:15:90:69 | 9 | funcExprs.kt:90:15:90:69 | invoke | IntegerLiteral | +| funcExprs.kt:90:15:90:69 | 10 | funcExprs.kt:90:15:90:69 | invoke | IntegerLiteral | +| funcExprs.kt:90:15:90:69 | 11 | funcExprs.kt:90:15:90:69 | invoke | IntegerLiteral | +| funcExprs.kt:90:15:90:69 | 12 | funcExprs.kt:90:15:90:69 | invoke | IntegerLiteral | +| funcExprs.kt:90:15:90:69 | 13 | funcExprs.kt:90:15:90:69 | invoke | IntegerLiteral | +| funcExprs.kt:90:15:90:69 | 14 | funcExprs.kt:90:15:90:69 | invoke | IntegerLiteral | +| funcExprs.kt:90:15:90:69 | 15 | funcExprs.kt:90:15:90:69 | invoke | IntegerLiteral | +| funcExprs.kt:90:15:90:69 | 16 | funcExprs.kt:90:15:90:69 | invoke | IntegerLiteral | +| funcExprs.kt:90:15:90:69 | 17 | funcExprs.kt:90:15:90:69 | invoke | IntegerLiteral | +| funcExprs.kt:90:15:90:69 | 18 | funcExprs.kt:90:15:90:69 | invoke | IntegerLiteral | +| funcExprs.kt:90:15:90:69 | 19 | funcExprs.kt:90:15:90:69 | invoke | IntegerLiteral | +| funcExprs.kt:90:15:90:69 | 20 | funcExprs.kt:90:15:90:69 | invoke | IntegerLiteral | +| funcExprs.kt:90:15:90:69 | 21 | funcExprs.kt:90:15:90:69 | invoke | IntegerLiteral | +| funcExprs.kt:90:15:90:69 | 22 | funcExprs.kt:90:15:90:69 | invoke | IntegerLiteral | +| funcExprs.kt:90:15:90:69 | (...)... | funcExprs.kt:90:15:90:69 | invoke | CastExpr | +| funcExprs.kt:90:15:90:69 | (...)... | funcExprs.kt:90:15:90:69 | invoke | CastExpr | +| funcExprs.kt:90:15:90:69 | (...)... | funcExprs.kt:90:15:90:69 | invoke | CastExpr | +| funcExprs.kt:90:15:90:69 | (...)... | funcExprs.kt:90:15:90:69 | invoke | CastExpr | +| funcExprs.kt:90:15:90:69 | (...)... | funcExprs.kt:90:15:90:69 | invoke | CastExpr | +| funcExprs.kt:90:15:90:69 | (...)... | funcExprs.kt:90:15:90:69 | invoke | CastExpr | +| funcExprs.kt:90:15:90:69 | (...)... | funcExprs.kt:90:15:90:69 | invoke | CastExpr | +| funcExprs.kt:90:15:90:69 | (...)... | funcExprs.kt:90:15:90:69 | invoke | CastExpr | +| funcExprs.kt:90:15:90:69 | (...)... | funcExprs.kt:90:15:90:69 | invoke | CastExpr | +| funcExprs.kt:90:15:90:69 | (...)... | funcExprs.kt:90:15:90:69 | invoke | CastExpr | +| funcExprs.kt:90:15:90:69 | (...)... | funcExprs.kt:90:15:90:69 | invoke | CastExpr | +| funcExprs.kt:90:15:90:69 | (...)... | funcExprs.kt:90:15:90:69 | invoke | CastExpr | +| funcExprs.kt:90:15:90:69 | (...)... | funcExprs.kt:90:15:90:69 | invoke | CastExpr | +| funcExprs.kt:90:15:90:69 | (...)... | funcExprs.kt:90:15:90:69 | invoke | CastExpr | +| funcExprs.kt:90:15:90:69 | (...)... | funcExprs.kt:90:15:90:69 | invoke | CastExpr | +| funcExprs.kt:90:15:90:69 | (...)... | funcExprs.kt:90:15:90:69 | invoke | CastExpr | +| funcExprs.kt:90:15:90:69 | (...)... | funcExprs.kt:90:15:90:69 | invoke | CastExpr | +| funcExprs.kt:90:15:90:69 | (...)... | funcExprs.kt:90:15:90:69 | invoke | CastExpr | +| funcExprs.kt:90:15:90:69 | (...)... | funcExprs.kt:90:15:90:69 | invoke | CastExpr | +| funcExprs.kt:90:15:90:69 | (...)... | funcExprs.kt:90:15:90:69 | invoke | CastExpr | +| funcExprs.kt:90:15:90:69 | (...)... | funcExprs.kt:90:15:90:69 | invoke | CastExpr | +| funcExprs.kt:90:15:90:69 | (...)... | funcExprs.kt:90:15:90:69 | invoke | CastExpr | +| funcExprs.kt:90:15:90:69 | (...)... | funcExprs.kt:90:15:90:69 | invoke | CastExpr | +| funcExprs.kt:90:15:90:69 | ...->... | funcExprs.kt:82:9:96:1 | fn | LambdaExpr | +| funcExprs.kt:90:15:90:69 | ...[...] | funcExprs.kt:90:15:90:69 | invoke | ArrayAccess | +| funcExprs.kt:90:15:90:69 | ...[...] | funcExprs.kt:90:15:90:69 | invoke | ArrayAccess | +| funcExprs.kt:90:15:90:69 | ...[...] | funcExprs.kt:90:15:90:69 | invoke | ArrayAccess | +| funcExprs.kt:90:15:90:69 | ...[...] | funcExprs.kt:90:15:90:69 | invoke | ArrayAccess | +| funcExprs.kt:90:15:90:69 | ...[...] | funcExprs.kt:90:15:90:69 | invoke | ArrayAccess | +| funcExprs.kt:90:15:90:69 | ...[...] | funcExprs.kt:90:15:90:69 | invoke | ArrayAccess | +| funcExprs.kt:90:15:90:69 | ...[...] | funcExprs.kt:90:15:90:69 | invoke | ArrayAccess | +| funcExprs.kt:90:15:90:69 | ...[...] | funcExprs.kt:90:15:90:69 | invoke | ArrayAccess | +| funcExprs.kt:90:15:90:69 | ...[...] | funcExprs.kt:90:15:90:69 | invoke | ArrayAccess | +| funcExprs.kt:90:15:90:69 | ...[...] | funcExprs.kt:90:15:90:69 | invoke | ArrayAccess | +| funcExprs.kt:90:15:90:69 | ...[...] | funcExprs.kt:90:15:90:69 | invoke | ArrayAccess | +| funcExprs.kt:90:15:90:69 | ...[...] | funcExprs.kt:90:15:90:69 | invoke | ArrayAccess | +| funcExprs.kt:90:15:90:69 | ...[...] | funcExprs.kt:90:15:90:69 | invoke | ArrayAccess | +| funcExprs.kt:90:15:90:69 | ...[...] | funcExprs.kt:90:15:90:69 | invoke | ArrayAccess | +| funcExprs.kt:90:15:90:69 | ...[...] | funcExprs.kt:90:15:90:69 | invoke | ArrayAccess | +| funcExprs.kt:90:15:90:69 | ...[...] | funcExprs.kt:90:15:90:69 | invoke | ArrayAccess | +| funcExprs.kt:90:15:90:69 | ...[...] | funcExprs.kt:90:15:90:69 | invoke | ArrayAccess | +| funcExprs.kt:90:15:90:69 | ...[...] | funcExprs.kt:90:15:90:69 | invoke | ArrayAccess | +| funcExprs.kt:90:15:90:69 | ...[...] | funcExprs.kt:90:15:90:69 | invoke | ArrayAccess | +| funcExprs.kt:90:15:90:69 | ...[...] | funcExprs.kt:90:15:90:69 | invoke | ArrayAccess | +| funcExprs.kt:90:15:90:69 | ...[...] | funcExprs.kt:90:15:90:69 | invoke | ArrayAccess | +| funcExprs.kt:90:15:90:69 | ...[...] | funcExprs.kt:90:15:90:69 | invoke | ArrayAccess | +| funcExprs.kt:90:15:90:69 | ...[...] | funcExprs.kt:90:15:90:69 | invoke | ArrayAccess | +| funcExprs.kt:90:15:90:69 | FunctionN | funcExprs.kt:82:9:96:1 | fn | TypeAccess | +| funcExprs.kt:90:15:90:69 | String | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:90:15:90:69 | String | funcExprs.kt:82:9:96:1 | fn | TypeAccess | +| funcExprs.kt:90:15:90:69 | a0 | funcExprs.kt:90:15:90:69 | invoke | VarAccess | +| funcExprs.kt:90:15:90:69 | a0 | funcExprs.kt:90:15:90:69 | invoke | VarAccess | +| funcExprs.kt:90:15:90:69 | a0 | funcExprs.kt:90:15:90:69 | invoke | VarAccess | +| funcExprs.kt:90:15:90:69 | a0 | funcExprs.kt:90:15:90:69 | invoke | VarAccess | +| funcExprs.kt:90:15:90:69 | a0 | funcExprs.kt:90:15:90:69 | invoke | VarAccess | +| funcExprs.kt:90:15:90:69 | a0 | funcExprs.kt:90:15:90:69 | invoke | VarAccess | +| funcExprs.kt:90:15:90:69 | a0 | funcExprs.kt:90:15:90:69 | invoke | VarAccess | +| funcExprs.kt:90:15:90:69 | a0 | funcExprs.kt:90:15:90:69 | invoke | VarAccess | +| funcExprs.kt:90:15:90:69 | a0 | funcExprs.kt:90:15:90:69 | invoke | VarAccess | +| funcExprs.kt:90:15:90:69 | a0 | funcExprs.kt:90:15:90:69 | invoke | VarAccess | +| funcExprs.kt:90:15:90:69 | a0 | funcExprs.kt:90:15:90:69 | invoke | VarAccess | +| funcExprs.kt:90:15:90:69 | a0 | funcExprs.kt:90:15:90:69 | invoke | VarAccess | +| funcExprs.kt:90:15:90:69 | a0 | funcExprs.kt:90:15:90:69 | invoke | VarAccess | +| funcExprs.kt:90:15:90:69 | a0 | funcExprs.kt:90:15:90:69 | invoke | VarAccess | +| funcExprs.kt:90:15:90:69 | a0 | funcExprs.kt:90:15:90:69 | invoke | VarAccess | +| funcExprs.kt:90:15:90:69 | a0 | funcExprs.kt:90:15:90:69 | invoke | VarAccess | +| funcExprs.kt:90:15:90:69 | a0 | funcExprs.kt:90:15:90:69 | invoke | VarAccess | +| funcExprs.kt:90:15:90:69 | a0 | funcExprs.kt:90:15:90:69 | invoke | VarAccess | +| funcExprs.kt:90:15:90:69 | a0 | funcExprs.kt:90:15:90:69 | invoke | VarAccess | +| funcExprs.kt:90:15:90:69 | a0 | funcExprs.kt:90:15:90:69 | invoke | VarAccess | +| funcExprs.kt:90:15:90:69 | a0 | funcExprs.kt:90:15:90:69 | invoke | VarAccess | +| funcExprs.kt:90:15:90:69 | a0 | funcExprs.kt:90:15:90:69 | invoke | VarAccess | +| funcExprs.kt:90:15:90:69 | a0 | funcExprs.kt:90:15:90:69 | invoke | VarAccess | +| funcExprs.kt:90:15:90:69 | int | funcExprs.kt:90:15:90:69 | invoke | TypeAccess | +| funcExprs.kt:90:15:90:69 | int | funcExprs.kt:90:15:90:69 | invoke | TypeAccess | +| funcExprs.kt:90:15:90:69 | int | funcExprs.kt:90:15:90:69 | invoke | TypeAccess | +| funcExprs.kt:90:15:90:69 | int | funcExprs.kt:90:15:90:69 | invoke | TypeAccess | +| funcExprs.kt:90:15:90:69 | int | funcExprs.kt:90:15:90:69 | invoke | TypeAccess | +| funcExprs.kt:90:15:90:69 | int | funcExprs.kt:90:15:90:69 | invoke | TypeAccess | +| funcExprs.kt:90:15:90:69 | int | funcExprs.kt:90:15:90:69 | invoke | TypeAccess | +| funcExprs.kt:90:15:90:69 | int | funcExprs.kt:90:15:90:69 | invoke | TypeAccess | +| funcExprs.kt:90:15:90:69 | int | funcExprs.kt:90:15:90:69 | invoke | TypeAccess | +| funcExprs.kt:90:15:90:69 | int | funcExprs.kt:90:15:90:69 | invoke | TypeAccess | +| funcExprs.kt:90:15:90:69 | int | funcExprs.kt:90:15:90:69 | invoke | TypeAccess | +| funcExprs.kt:90:15:90:69 | int | funcExprs.kt:90:15:90:69 | invoke | TypeAccess | +| funcExprs.kt:90:15:90:69 | int | funcExprs.kt:90:15:90:69 | invoke | TypeAccess | +| funcExprs.kt:90:15:90:69 | int | funcExprs.kt:90:15:90:69 | invoke | TypeAccess | +| funcExprs.kt:90:15:90:69 | int | funcExprs.kt:90:15:90:69 | invoke | TypeAccess | +| funcExprs.kt:90:15:90:69 | int | funcExprs.kt:90:15:90:69 | invoke | TypeAccess | +| funcExprs.kt:90:15:90:69 | int | funcExprs.kt:90:15:90:69 | invoke | TypeAccess | +| funcExprs.kt:90:15:90:69 | int | funcExprs.kt:90:15:90:69 | invoke | TypeAccess | +| funcExprs.kt:90:15:90:69 | int | funcExprs.kt:90:15:90:69 | invoke | TypeAccess | +| funcExprs.kt:90:15:90:69 | int | funcExprs.kt:90:15:90:69 | invoke | TypeAccess | +| funcExprs.kt:90:15:90:69 | int | funcExprs.kt:90:15:90:69 | invoke | TypeAccess | +| funcExprs.kt:90:15:90:69 | int | funcExprs.kt:90:15:90:69 | invoke | TypeAccess | +| funcExprs.kt:90:15:90:69 | int | funcExprs.kt:90:15:90:69 | invoke | TypeAccess | +| funcExprs.kt:90:15:90:69 | invoke(...) | funcExprs.kt:90:15:90:69 | invoke | MethodCall | +| funcExprs.kt:90:15:90:69 | this | funcExprs.kt:90:15:90:69 | invoke | ThisAccess | +| funcExprs.kt:90:17:90:17 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:90:19:90:19 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:90:21:90:21 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:90:23:90:23 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:90:25:90:25 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:90:27:90:27 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:90:29:90:29 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:90:31:90:31 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:90:33:90:33 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:90:35:90:35 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:90:37:90:37 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:90:39:90:39 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:90:41:90:41 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:90:43:90:43 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:90:45:90:45 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:90:47:90:47 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:90:49:90:49 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:90:51:90:51 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:90:53:90:53 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:90:55:90:55 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:90:57:90:57 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:90:59:90:59 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:90:61:90:61 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:90:67:90:68 | "" | funcExprs.kt:90:15:90:69 | invoke | StringLiteral | +| funcExprs.kt:91:5:91:6 | l3 | funcExprs.kt:82:9:96:1 | fn | VarAccess | +| funcExprs.kt:91:5:91:60 | 23 | funcExprs.kt:82:9:96:1 | fn | IntegerLiteral | +| funcExprs.kt:91:5:91:60 | Object | funcExprs.kt:82:9:96:1 | fn | TypeAccess | +| funcExprs.kt:91:5:91:60 | invoke(...) | funcExprs.kt:82:9:96:1 | fn | MethodCall | +| funcExprs.kt:91:5:91:60 | new Object[] | funcExprs.kt:82:9:96:1 | fn | ArrayCreationExpr | +| funcExprs.kt:91:5:91:60 | {...} | funcExprs.kt:82:9:96:1 | fn | ArrayInit | +| funcExprs.kt:91:8:91:60 | | funcExprs.kt:82:9:96:1 | fn | ImplicitCoercionToUnitExpr | +| funcExprs.kt:91:8:91:60 | Unit | funcExprs.kt:82:9:96:1 | fn | TypeAccess | +| funcExprs.kt:91:15:91:15 | 1 | funcExprs.kt:82:9:96:1 | fn | IntegerLiteral | +| funcExprs.kt:91:17:91:17 | 2 | funcExprs.kt:82:9:96:1 | fn | IntegerLiteral | +| funcExprs.kt:91:19:91:19 | 3 | funcExprs.kt:82:9:96:1 | fn | IntegerLiteral | +| funcExprs.kt:91:21:91:21 | 4 | funcExprs.kt:82:9:96:1 | fn | IntegerLiteral | +| funcExprs.kt:91:23:91:23 | 5 | funcExprs.kt:82:9:96:1 | fn | IntegerLiteral | +| funcExprs.kt:91:25:91:25 | 6 | funcExprs.kt:82:9:96:1 | fn | IntegerLiteral | +| funcExprs.kt:91:27:91:27 | 7 | funcExprs.kt:82:9:96:1 | fn | IntegerLiteral | +| funcExprs.kt:91:29:91:29 | 8 | funcExprs.kt:82:9:96:1 | fn | IntegerLiteral | +| funcExprs.kt:91:31:91:31 | 9 | funcExprs.kt:82:9:96:1 | fn | IntegerLiteral | +| funcExprs.kt:91:33:91:33 | 0 | funcExprs.kt:82:9:96:1 | fn | IntegerLiteral | +| funcExprs.kt:91:35:91:35 | 1 | funcExprs.kt:82:9:96:1 | fn | IntegerLiteral | +| funcExprs.kt:91:37:91:37 | 2 | funcExprs.kt:82:9:96:1 | fn | IntegerLiteral | +| funcExprs.kt:91:39:91:39 | 3 | funcExprs.kt:82:9:96:1 | fn | IntegerLiteral | +| funcExprs.kt:91:41:91:41 | 4 | funcExprs.kt:82:9:96:1 | fn | IntegerLiteral | +| funcExprs.kt:91:43:91:43 | 5 | funcExprs.kt:82:9:96:1 | fn | IntegerLiteral | +| funcExprs.kt:91:45:91:45 | 6 | funcExprs.kt:82:9:96:1 | fn | IntegerLiteral | +| funcExprs.kt:91:47:91:47 | 7 | funcExprs.kt:82:9:96:1 | fn | IntegerLiteral | +| funcExprs.kt:91:49:91:49 | 8 | funcExprs.kt:82:9:96:1 | fn | IntegerLiteral | +| funcExprs.kt:91:51:91:51 | 9 | funcExprs.kt:82:9:96:1 | fn | IntegerLiteral | +| funcExprs.kt:91:53:91:53 | 0 | funcExprs.kt:82:9:96:1 | fn | IntegerLiteral | +| funcExprs.kt:91:55:91:55 | 1 | funcExprs.kt:82:9:96:1 | fn | IntegerLiteral | +| funcExprs.kt:91:57:91:57 | 2 | funcExprs.kt:82:9:96:1 | fn | IntegerLiteral | +| funcExprs.kt:91:59:91:59 | 3 | funcExprs.kt:82:9:96:1 | fn | IntegerLiteral | +| funcExprs.kt:93:9:93:10 | l4 | funcExprs.kt:82:9:96:1 | fn | LocalVariableDeclExpr | +| funcExprs.kt:94:15:94:67 | ...->... | funcExprs.kt:82:9:96:1 | fn | LambdaExpr | +| funcExprs.kt:94:15:94:67 | Function22 | funcExprs.kt:82:9:96:1 | fn | TypeAccess | +| funcExprs.kt:94:15:94:67 | Integer | funcExprs.kt:82:9:96:1 | fn | TypeAccess | +| funcExprs.kt:94:15:94:67 | Integer | funcExprs.kt:82:9:96:1 | fn | TypeAccess | +| funcExprs.kt:94:15:94:67 | Integer | funcExprs.kt:82:9:96:1 | fn | TypeAccess | +| funcExprs.kt:94:15:94:67 | Integer | funcExprs.kt:82:9:96:1 | fn | TypeAccess | +| funcExprs.kt:94:15:94:67 | Integer | funcExprs.kt:82:9:96:1 | fn | TypeAccess | +| funcExprs.kt:94:15:94:67 | Integer | funcExprs.kt:82:9:96:1 | fn | TypeAccess | +| funcExprs.kt:94:15:94:67 | Integer | funcExprs.kt:82:9:96:1 | fn | TypeAccess | +| funcExprs.kt:94:15:94:67 | Integer | funcExprs.kt:82:9:96:1 | fn | TypeAccess | +| funcExprs.kt:94:15:94:67 | Integer | funcExprs.kt:82:9:96:1 | fn | TypeAccess | +| funcExprs.kt:94:15:94:67 | Integer | funcExprs.kt:82:9:96:1 | fn | TypeAccess | +| funcExprs.kt:94:15:94:67 | Integer | funcExprs.kt:82:9:96:1 | fn | TypeAccess | +| funcExprs.kt:94:15:94:67 | Integer | funcExprs.kt:82:9:96:1 | fn | TypeAccess | +| funcExprs.kt:94:15:94:67 | Integer | funcExprs.kt:82:9:96:1 | fn | TypeAccess | +| funcExprs.kt:94:15:94:67 | Integer | funcExprs.kt:82:9:96:1 | fn | TypeAccess | +| funcExprs.kt:94:15:94:67 | Integer | funcExprs.kt:82:9:96:1 | fn | TypeAccess | +| funcExprs.kt:94:15:94:67 | Integer | funcExprs.kt:82:9:96:1 | fn | TypeAccess | +| funcExprs.kt:94:15:94:67 | Integer | funcExprs.kt:82:9:96:1 | fn | TypeAccess | +| funcExprs.kt:94:15:94:67 | Integer | funcExprs.kt:82:9:96:1 | fn | TypeAccess | +| funcExprs.kt:94:15:94:67 | Integer | funcExprs.kt:82:9:96:1 | fn | TypeAccess | +| funcExprs.kt:94:15:94:67 | Integer | funcExprs.kt:82:9:96:1 | fn | TypeAccess | +| funcExprs.kt:94:15:94:67 | Integer | funcExprs.kt:82:9:96:1 | fn | TypeAccess | +| funcExprs.kt:94:15:94:67 | Integer | funcExprs.kt:82:9:96:1 | fn | TypeAccess | +| funcExprs.kt:94:15:94:67 | String | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:94:15:94:67 | String | funcExprs.kt:82:9:96:1 | fn | TypeAccess | +| funcExprs.kt:94:17:94:17 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:94:19:94:19 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:94:21:94:21 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:94:23:94:23 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:94:25:94:25 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:94:27:94:27 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:94:29:94:29 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:94:31:94:31 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:94:33:94:33 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:94:35:94:35 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:94:37:94:37 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:94:39:94:39 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:94:41:94:41 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:94:43:94:43 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:94:45:94:45 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:94:47:94:47 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:94:49:94:49 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:94:51:94:51 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:94:53:94:53 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:94:55:94:55 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:94:57:94:57 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:94:59:94:59 | int | file://:0:0:0:0 | | TypeAccess | +| funcExprs.kt:94:65:94:66 | "" | funcExprs.kt:94:15:94:67 | invoke | StringLiteral | +| funcExprs.kt:95:5:95:6 | l4 | funcExprs.kt:82:9:96:1 | fn | VarAccess | +| funcExprs.kt:95:5:95:58 | invoke(...) | funcExprs.kt:82:9:96:1 | fn | MethodCall | +| funcExprs.kt:95:8:95:58 | | funcExprs.kt:82:9:96:1 | fn | ImplicitCoercionToUnitExpr | +| funcExprs.kt:95:8:95:58 | Unit | funcExprs.kt:82:9:96:1 | fn | TypeAccess | +| funcExprs.kt:95:15:95:15 | 1 | funcExprs.kt:82:9:96:1 | fn | IntegerLiteral | +| funcExprs.kt:95:17:95:17 | 2 | funcExprs.kt:82:9:96:1 | fn | IntegerLiteral | +| funcExprs.kt:95:19:95:19 | 3 | funcExprs.kt:82:9:96:1 | fn | IntegerLiteral | +| funcExprs.kt:95:21:95:21 | 4 | funcExprs.kt:82:9:96:1 | fn | IntegerLiteral | +| funcExprs.kt:95:23:95:23 | 5 | funcExprs.kt:82:9:96:1 | fn | IntegerLiteral | +| funcExprs.kt:95:25:95:25 | 6 | funcExprs.kt:82:9:96:1 | fn | IntegerLiteral | +| funcExprs.kt:95:27:95:27 | 7 | funcExprs.kt:82:9:96:1 | fn | IntegerLiteral | +| funcExprs.kt:95:29:95:29 | 8 | funcExprs.kt:82:9:96:1 | fn | IntegerLiteral | +| funcExprs.kt:95:31:95:31 | 9 | funcExprs.kt:82:9:96:1 | fn | IntegerLiteral | +| funcExprs.kt:95:33:95:33 | 0 | funcExprs.kt:82:9:96:1 | fn | IntegerLiteral | +| funcExprs.kt:95:35:95:35 | 1 | funcExprs.kt:82:9:96:1 | fn | IntegerLiteral | +| funcExprs.kt:95:37:95:37 | 2 | funcExprs.kt:82:9:96:1 | fn | IntegerLiteral | +| funcExprs.kt:95:39:95:39 | 3 | funcExprs.kt:82:9:96:1 | fn | IntegerLiteral | +| funcExprs.kt:95:41:95:41 | 4 | funcExprs.kt:82:9:96:1 | fn | IntegerLiteral | +| funcExprs.kt:95:43:95:43 | 5 | funcExprs.kt:82:9:96:1 | fn | IntegerLiteral | +| funcExprs.kt:95:45:95:45 | 6 | funcExprs.kt:82:9:96:1 | fn | IntegerLiteral | +| funcExprs.kt:95:47:95:47 | 7 | funcExprs.kt:82:9:96:1 | fn | IntegerLiteral | +| funcExprs.kt:95:49:95:49 | 8 | funcExprs.kt:82:9:96:1 | fn | IntegerLiteral | +| funcExprs.kt:95:51:95:51 | 9 | funcExprs.kt:82:9:96:1 | fn | IntegerLiteral | +| funcExprs.kt:95:53:95:53 | 0 | funcExprs.kt:82:9:96:1 | fn | IntegerLiteral | +| funcExprs.kt:95:55:95:55 | 1 | funcExprs.kt:82:9:96:1 | fn | IntegerLiteral | +| funcExprs.kt:95:57:95:57 | 2 | funcExprs.kt:82:9:96:1 | fn | IntegerLiteral | +| kFunctionInvoke.kt:4:5:4:24 | Unit | file://:0:0:0:0 | | TypeAccess | +| kFunctionInvoke.kt:4:11:4:19 | String | file://:0:0:0:0 | | TypeAccess | +| kFunctionInvoke.kt:7:1:10:1 | Unit | file://:0:0:0:0 | | TypeAccess | +| kFunctionInvoke.kt:7:12:7:15 | A | file://:0:0:0:0 | | TypeAccess | +| kFunctionInvoke.kt:7:18:7:26 | String | file://:0:0:0:0 | | TypeAccess | +| kFunctionInvoke.kt:8:9:8:14 | toCall | kFunctionInvoke.kt:7:1:10:1 | useRef | LocalVariableDeclExpr | +| kFunctionInvoke.kt:8:44:8:44 | a | kFunctionInvoke.kt:7:1:10:1 | useRef | VarAccess | +| kFunctionInvoke.kt:8:44:8:47 | 1 | kFunctionInvoke.kt:8:44:8:47 | | IntegerLiteral | +| kFunctionInvoke.kt:8:44:8:47 | ...::... | kFunctionInvoke.kt:7:1:10:1 | useRef | MemberRefExpr | +| kFunctionInvoke.kt:8:44:8:47 | ...=... | kFunctionInvoke.kt:8:44:8:47 | | AssignExpr | +| kFunctionInvoke.kt:8:44:8:47 | | kFunctionInvoke.kt:8:44:8:47 | | VarAccess | +| kFunctionInvoke.kt:8:44:8:47 | A | file://:0:0:0:0 | | TypeAccess | +| kFunctionInvoke.kt:8:44:8:47 | Function1 | kFunctionInvoke.kt:7:1:10:1 | useRef | TypeAccess | +| kFunctionInvoke.kt:8:44:8:47 | String | kFunctionInvoke.kt:7:1:10:1 | useRef | TypeAccess | +| kFunctionInvoke.kt:8:44:8:47 | Unit | kFunctionInvoke.kt:7:1:10:1 | useRef | TypeAccess | +| kFunctionInvoke.kt:8:44:8:47 | a0 | kFunctionInvoke.kt:8:44:8:47 | invoke | VarAccess | +| kFunctionInvoke.kt:8:44:8:47 | f(...) | kFunctionInvoke.kt:8:44:8:47 | invoke | MethodCall | +| kFunctionInvoke.kt:8:44:8:47 | this | kFunctionInvoke.kt:8:44:8:47 | | ThisAccess | +| kFunctionInvoke.kt:8:44:8:47 | this | kFunctionInvoke.kt:8:44:8:47 | invoke | ThisAccess | +| kFunctionInvoke.kt:8:44:8:47 | this. | kFunctionInvoke.kt:8:44:8:47 | | VarAccess | +| kFunctionInvoke.kt:8:44:8:47 | this. | kFunctionInvoke.kt:8:44:8:47 | invoke | VarAccess | +| kFunctionInvoke.kt:9:5:9:10 | toCall | kFunctionInvoke.kt:7:1:10:1 | useRef | VarAccess | +| kFunctionInvoke.kt:9:5:9:13 | invoke(...) | kFunctionInvoke.kt:7:1:10:1 | useRef | MethodCall | +| kFunctionInvoke.kt:9:12:9:12 | s | kFunctionInvoke.kt:7:1:10:1 | useRef | VarAccess | +| localFunctionCalls.kt:3:1:12:1 | Unit | file://:0:0:0:0 | | TypeAccess | +| localFunctionCalls.kt:4:9:4:9 | x | localFunctionCalls.kt:3:1:12:1 | x | LocalVariableDeclExpr | +| localFunctionCalls.kt:4:13:4:13 | 5 | localFunctionCalls.kt:3:1:12:1 | x | IntegerLiteral | +| localFunctionCalls.kt:5:5:5:29 | int | file://:0:0:0:0 | | TypeAccess | +| localFunctionCalls.kt:5:15:5:20 | int | file://:0:0:0:0 | | TypeAccess | +| localFunctionCalls.kt:5:25:5:25 | i | localFunctionCalls.kt:5:5:5:29 | a | VarAccess | +| localFunctionCalls.kt:5:25:5:29 | ... + ... | localFunctionCalls.kt:5:5:5:29 | a | AddExpr | +| localFunctionCalls.kt:5:29:5:29 | x | localFunctionCalls.kt:5:5:5:29 | a | VarAccess | +| localFunctionCalls.kt:6:5:6:5 | x | localFunctionCalls.kt:3:1:12:1 | x | VarAccess | +| localFunctionCalls.kt:6:5:6:9 | ...=... | localFunctionCalls.kt:3:1:12:1 | x | AssignExpr | +| localFunctionCalls.kt:6:9:6:9 | 6 | localFunctionCalls.kt:3:1:12:1 | x | IntegerLiteral | +| localFunctionCalls.kt:7:5:7:17 | | localFunctionCalls.kt:3:1:12:1 | x | ImplicitCoercionToUnitExpr | +| localFunctionCalls.kt:7:5:7:17 | Object | localFunctionCalls.kt:3:1:12:1 | x | TypeAccess | +| localFunctionCalls.kt:7:5:7:17 | String | localFunctionCalls.kt:3:1:12:1 | x | TypeAccess | +| localFunctionCalls.kt:7:5:7:17 | Unit | localFunctionCalls.kt:3:1:12:1 | x | TypeAccess | +| localFunctionCalls.kt:7:5:7:17 | a(...) | localFunctionCalls.kt:3:1:12:1 | x | MethodCall | +| localFunctionCalls.kt:7:5:7:17 | new (...) | localFunctionCalls.kt:3:1:12:1 | x | ClassInstanceExpr | +| localFunctionCalls.kt:7:15:7:16 | 42 | localFunctionCalls.kt:3:1:12:1 | x | IntegerLiteral | +| localFunctionCalls.kt:8:5:8:5 | x | localFunctionCalls.kt:3:1:12:1 | x | VarAccess | +| localFunctionCalls.kt:8:5:8:9 | ...=... | localFunctionCalls.kt:3:1:12:1 | x | AssignExpr | +| localFunctionCalls.kt:8:9:8:9 | 7 | localFunctionCalls.kt:3:1:12:1 | x | IntegerLiteral | +| localFunctionCalls.kt:9:5:9:34 | int | file://:0:0:0:0 | | TypeAccess | +| localFunctionCalls.kt:9:14:9:19 | C1 | file://:0:0:0:0 | | TypeAccess | +| localFunctionCalls.kt:9:14:9:19 | T1 | file://:0:0:0:0 | | TypeAccess | +| localFunctionCalls.kt:9:24:9:29 | int | file://:0:0:0:0 | | TypeAccess | +| localFunctionCalls.kt:9:34:9:34 | 5 | localFunctionCalls.kt:9:5:9:34 | f1 | IntegerLiteral | +| localFunctionCalls.kt:10:5:10:13 | C1 | localFunctionCalls.kt:3:1:12:1 | x | TypeAccess | +| localFunctionCalls.kt:10:5:10:13 | Integer | localFunctionCalls.kt:3:1:12:1 | x | TypeAccess | +| localFunctionCalls.kt:10:5:10:13 | new C1(...) | localFunctionCalls.kt:3:1:12:1 | x | ClassInstanceExpr | +| localFunctionCalls.kt:10:5:10:20 | Integer | localFunctionCalls.kt:3:1:12:1 | x | TypeAccess | +| localFunctionCalls.kt:10:5:10:20 | Object | localFunctionCalls.kt:3:1:12:1 | x | TypeAccess | +| localFunctionCalls.kt:10:5:10:20 | f1(...) | localFunctionCalls.kt:3:1:12:1 | x | MethodCall | +| localFunctionCalls.kt:10:5:10:20 | new (...) | localFunctionCalls.kt:3:1:12:1 | x | ClassInstanceExpr | +| localFunctionCalls.kt:10:15:10:20 | | localFunctionCalls.kt:3:1:12:1 | x | ImplicitCoercionToUnitExpr | +| localFunctionCalls.kt:10:15:10:20 | Unit | localFunctionCalls.kt:3:1:12:1 | x | TypeAccess | +| localFunctionCalls.kt:10:18:10:19 | 42 | localFunctionCalls.kt:3:1:12:1 | x | IntegerLiteral | +| localFunctionCalls.kt:11:5:11:13 | C1 | localFunctionCalls.kt:3:1:12:1 | x | TypeAccess | +| localFunctionCalls.kt:11:5:11:13 | Integer | localFunctionCalls.kt:3:1:12:1 | x | TypeAccess | +| localFunctionCalls.kt:11:5:11:13 | new C1(...) | localFunctionCalls.kt:3:1:12:1 | x | ClassInstanceExpr | +| localFunctionCalls.kt:11:5:11:20 | Integer | localFunctionCalls.kt:3:1:12:1 | x | TypeAccess | +| localFunctionCalls.kt:11:5:11:20 | Object | localFunctionCalls.kt:3:1:12:1 | x | TypeAccess | +| localFunctionCalls.kt:11:5:11:20 | f1(...) | localFunctionCalls.kt:3:1:12:1 | x | MethodCall | +| localFunctionCalls.kt:11:5:11:20 | new (...) | localFunctionCalls.kt:3:1:12:1 | x | ClassInstanceExpr | +| localFunctionCalls.kt:11:15:11:20 | | localFunctionCalls.kt:3:1:12:1 | x | ImplicitCoercionToUnitExpr | +| localFunctionCalls.kt:11:15:11:20 | Unit | localFunctionCalls.kt:3:1:12:1 | x | TypeAccess | +| localFunctionCalls.kt:11:18:11:19 | 42 | localFunctionCalls.kt:3:1:12:1 | x | IntegerLiteral | +| samConversion.kt:1:1:14:1 | Unit | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:1:10:1:19 | boolean | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:2:9:2:14 | isEven | samConversion.kt:1:1:14:1 | main | LocalVariableDeclExpr | +| samConversion.kt:2:18:2:45 | (...)... | samConversion.kt:1:1:14:1 | main | CastExpr | +| samConversion.kt:2:18:2:45 | ...=... | samConversion.kt:2:18:2:45 | | AssignExpr | +| samConversion.kt:2:18:2:45 | | samConversion.kt:2:18:2:45 | | VarAccess | +| samConversion.kt:2:18:2:45 | | samConversion.kt:2:18:2:45 | accept | VarAccess | +| samConversion.kt:2:18:2:45 | Boolean | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:2:18:2:45 | Function1 | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:2:18:2:45 | IntPredicate | samConversion.kt:1:1:14:1 | main | TypeAccess | +| samConversion.kt:2:18:2:45 | IntPredicate | samConversion.kt:1:1:14:1 | main | TypeAccess | +| samConversion.kt:2:18:2:45 | Integer | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:2:18:2:45 | boolean | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:2:18:2:45 | i | samConversion.kt:2:18:2:45 | accept | VarAccess | +| samConversion.kt:2:18:2:45 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:2:18:2:45 | invoke(...) | samConversion.kt:2:18:2:45 | accept | MethodCall | +| samConversion.kt:2:18:2:45 | new (...) | samConversion.kt:1:1:14:1 | main | ClassInstanceExpr | +| samConversion.kt:2:18:2:45 | this | samConversion.kt:2:18:2:45 | | ThisAccess | +| samConversion.kt:2:18:2:45 | this. | samConversion.kt:2:18:2:45 | | VarAccess | +| samConversion.kt:2:31:2:45 | ...->... | samConversion.kt:1:1:14:1 | main | LambdaExpr | +| samConversion.kt:2:31:2:45 | Boolean | samConversion.kt:1:1:14:1 | main | TypeAccess | +| samConversion.kt:2:31:2:45 | Function1 | samConversion.kt:1:1:14:1 | main | TypeAccess | +| samConversion.kt:2:31:2:45 | Integer | samConversion.kt:1:1:14:1 | main | TypeAccess | +| samConversion.kt:2:31:2:45 | boolean | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:2:31:2:45 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:2:33:2:34 | it | samConversion.kt:2:31:2:45 | invoke | VarAccess | +| samConversion.kt:2:33:2:38 | ... % ... | samConversion.kt:2:31:2:45 | invoke | RemExpr | +| samConversion.kt:2:33:2:43 | ... (value equals) ... | samConversion.kt:2:31:2:45 | invoke | ValueEQExpr | +| samConversion.kt:2:38:2:38 | 2 | samConversion.kt:2:31:2:45 | invoke | IntegerLiteral | +| samConversion.kt:2:43:2:43 | 0 | samConversion.kt:2:31:2:45 | invoke | IntegerLiteral | +| samConversion.kt:4:9:4:10 | i0 | samConversion.kt:1:1:14:1 | main | LocalVariableDeclExpr | +| samConversion.kt:4:14:4:42 | (...)... | samConversion.kt:1:1:14:1 | main | CastExpr | +| samConversion.kt:4:14:4:42 | ...=... | samConversion.kt:4:14:4:42 | | AssignExpr | +| samConversion.kt:4:14:4:42 | | samConversion.kt:4:14:4:42 | | VarAccess | +| samConversion.kt:4:14:4:42 | | samConversion.kt:4:14:4:42 | fn1 | VarAccess | +| samConversion.kt:4:14:4:42 | Function2 | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:4:14:4:42 | Integer | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:4:14:4:42 | Integer | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:4:14:4:42 | InterfaceFn1 | samConversion.kt:1:1:14:1 | main | TypeAccess | +| samConversion.kt:4:14:4:42 | InterfaceFn1 | samConversion.kt:1:1:14:1 | main | TypeAccess | +| samConversion.kt:4:14:4:42 | Unit | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:4:14:4:42 | Unit | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:4:14:4:42 | i | samConversion.kt:4:14:4:42 | fn1 | VarAccess | +| samConversion.kt:4:14:4:42 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:4:14:4:42 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:4:14:4:42 | invoke(...) | samConversion.kt:4:14:4:42 | fn1 | MethodCall | +| samConversion.kt:4:14:4:42 | j | samConversion.kt:4:14:4:42 | fn1 | VarAccess | +| samConversion.kt:4:14:4:42 | new (...) | samConversion.kt:1:1:14:1 | main | ClassInstanceExpr | +| samConversion.kt:4:14:4:42 | this | samConversion.kt:4:14:4:42 | | ThisAccess | +| samConversion.kt:4:14:4:42 | this. | samConversion.kt:4:14:4:42 | | VarAccess | +| samConversion.kt:4:27:4:42 | ...->... | samConversion.kt:1:1:14:1 | main | LambdaExpr | +| samConversion.kt:4:27:4:42 | Function2 | samConversion.kt:1:1:14:1 | main | TypeAccess | +| samConversion.kt:4:27:4:42 | Integer | samConversion.kt:1:1:14:1 | main | TypeAccess | +| samConversion.kt:4:27:4:42 | Integer | samConversion.kt:1:1:14:1 | main | TypeAccess | +| samConversion.kt:4:27:4:42 | Unit | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:4:27:4:42 | Unit | samConversion.kt:1:1:14:1 | main | TypeAccess | +| samConversion.kt:4:29:4:29 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:4:32:4:32 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:4:37:4:40 | INSTANCE | samConversion.kt:4:27:4:42 | invoke | VarAccess | +| samConversion.kt:5:9:5:10 | i1 | samConversion.kt:1:1:14:1 | main | LocalVariableDeclExpr | +| samConversion.kt:5:14:5:32 | (...)... | samConversion.kt:1:1:14:1 | main | CastExpr | +| samConversion.kt:5:14:5:32 | ...=... | samConversion.kt:5:14:5:32 | | AssignExpr | +| samConversion.kt:5:14:5:32 | | samConversion.kt:5:14:5:32 | | VarAccess | +| samConversion.kt:5:14:5:32 | | samConversion.kt:5:14:5:32 | fn1 | VarAccess | +| samConversion.kt:5:14:5:32 | Function2 | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:5:14:5:32 | Integer | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:5:14:5:32 | Integer | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:5:14:5:32 | InterfaceFn1 | samConversion.kt:1:1:14:1 | main | TypeAccess | +| samConversion.kt:5:14:5:32 | InterfaceFn1 | samConversion.kt:1:1:14:1 | main | TypeAccess | +| samConversion.kt:5:14:5:32 | Unit | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:5:14:5:32 | Unit | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:5:14:5:32 | i | samConversion.kt:5:14:5:32 | fn1 | VarAccess | +| samConversion.kt:5:14:5:32 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:5:14:5:32 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:5:14:5:32 | invoke(...) | samConversion.kt:5:14:5:32 | fn1 | MethodCall | +| samConversion.kt:5:14:5:32 | j | samConversion.kt:5:14:5:32 | fn1 | VarAccess | +| samConversion.kt:5:14:5:32 | new (...) | samConversion.kt:1:1:14:1 | main | ClassInstanceExpr | +| samConversion.kt:5:14:5:32 | this | samConversion.kt:5:14:5:32 | | ThisAccess | +| samConversion.kt:5:14:5:32 | this. | samConversion.kt:5:14:5:32 | | VarAccess | +| samConversion.kt:5:27:5:31 | 2 | samConversion.kt:5:27:5:31 | | IntegerLiteral | +| samConversion.kt:5:27:5:31 | ...::... | samConversion.kt:1:1:14:1 | main | MemberRefExpr | +| samConversion.kt:5:27:5:31 | Function2 | samConversion.kt:1:1:14:1 | main | TypeAccess | +| samConversion.kt:5:27:5:31 | Integer | samConversion.kt:1:1:14:1 | main | TypeAccess | +| samConversion.kt:5:27:5:31 | Integer | samConversion.kt:1:1:14:1 | main | TypeAccess | +| samConversion.kt:5:27:5:31 | SamConversionKt | samConversion.kt:5:27:5:31 | invoke | TypeAccess | +| samConversion.kt:5:27:5:31 | Unit | samConversion.kt:1:1:14:1 | main | TypeAccess | +| samConversion.kt:5:27:5:31 | a0 | samConversion.kt:5:27:5:31 | invoke | VarAccess | +| samConversion.kt:5:27:5:31 | a1 | samConversion.kt:5:27:5:31 | invoke | VarAccess | +| samConversion.kt:5:27:5:31 | fn2(...) | samConversion.kt:5:27:5:31 | invoke | MethodCall | +| samConversion.kt:7:9:7:9 | i | samConversion.kt:1:1:14:1 | main | LocalVariableDeclExpr | +| samConversion.kt:7:13:7:46 | (...)... | samConversion.kt:1:1:14:1 | main | CastExpr | +| samConversion.kt:7:13:7:46 | ...=... | samConversion.kt:7:13:7:46 | | AssignExpr | +| samConversion.kt:7:13:7:46 | | samConversion.kt:7:13:7:46 | | VarAccess | +| samConversion.kt:7:13:7:46 | | samConversion.kt:7:13:7:46 | ext | VarAccess | +| samConversion.kt:7:13:7:46 | Boolean | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:7:13:7:46 | Function2 | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:7:13:7:46 | Integer | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:7:13:7:46 | InterfaceFnExt1 | samConversion.kt:1:1:14:1 | main | TypeAccess | +| samConversion.kt:7:13:7:46 | InterfaceFnExt1 | samConversion.kt:1:1:14:1 | main | TypeAccess | +| samConversion.kt:7:13:7:46 | String | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:7:13:7:46 | String | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:7:13:7:46 | boolean | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:7:13:7:46 | i | samConversion.kt:7:13:7:46 | ext | VarAccess | +| samConversion.kt:7:13:7:46 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:7:13:7:46 | invoke(...) | samConversion.kt:7:13:7:46 | ext | MethodCall | +| samConversion.kt:7:13:7:46 | new (...) | samConversion.kt:1:1:14:1 | main | ClassInstanceExpr | +| samConversion.kt:7:13:7:46 | this | samConversion.kt:7:13:7:46 | | ThisAccess | +| samConversion.kt:7:13:7:46 | this | samConversion.kt:7:13:7:46 | ext | ExtensionReceiverAccess | +| samConversion.kt:7:13:7:46 | this. | samConversion.kt:7:13:7:46 | | VarAccess | +| samConversion.kt:7:29:7:46 | ...->... | samConversion.kt:1:1:14:1 | main | LambdaExpr | +| samConversion.kt:7:29:7:46 | Boolean | samConversion.kt:1:1:14:1 | main | TypeAccess | +| samConversion.kt:7:29:7:46 | Function2 | samConversion.kt:1:1:14:1 | main | TypeAccess | +| samConversion.kt:7:29:7:46 | Integer | samConversion.kt:1:1:14:1 | main | TypeAccess | +| samConversion.kt:7:29:7:46 | String | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:7:29:7:46 | String | samConversion.kt:1:1:14:1 | main | TypeAccess | +| samConversion.kt:7:29:7:46 | boolean | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:7:31:7:31 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:7:36:7:39 | this | samConversion.kt:7:29:7:46 | invoke | ExtensionReceiverAccess | +| samConversion.kt:7:36:7:45 | ... (value equals) ... | samConversion.kt:7:29:7:46 | invoke | ValueEQExpr | +| samConversion.kt:7:44:7:45 | "" | samConversion.kt:7:29:7:46 | invoke | StringLiteral | +| samConversion.kt:9:9:9:9 | x | samConversion.kt:1:1:14:1 | main | LocalVariableDeclExpr | +| samConversion.kt:9:13:13:6 | (...)... | samConversion.kt:1:1:14:1 | main | CastExpr | +| samConversion.kt:9:13:13:6 | ...=... | samConversion.kt:9:13:13:6 | | AssignExpr | +| samConversion.kt:9:13:13:6 | | samConversion.kt:9:13:13:6 | | VarAccess | +| samConversion.kt:9:13:13:6 | | samConversion.kt:9:13:13:6 | accept | VarAccess | +| samConversion.kt:9:13:13:6 | Boolean | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:9:13:13:6 | Function1 | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:9:13:13:6 | IntPredicate | samConversion.kt:1:1:14:1 | main | TypeAccess | +| samConversion.kt:9:13:13:6 | IntPredicate | samConversion.kt:1:1:14:1 | main | TypeAccess | +| samConversion.kt:9:13:13:6 | Integer | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:9:13:13:6 | boolean | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:9:13:13:6 | i | samConversion.kt:9:13:13:6 | accept | VarAccess | +| samConversion.kt:9:13:13:6 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:9:13:13:6 | invoke(...) | samConversion.kt:9:13:13:6 | accept | MethodCall | +| samConversion.kt:9:13:13:6 | new (...) | samConversion.kt:1:1:14:1 | main | ClassInstanceExpr | +| samConversion.kt:9:13:13:6 | this | samConversion.kt:9:13:13:6 | | ThisAccess | +| samConversion.kt:9:13:13:6 | this. | samConversion.kt:9:13:13:6 | | VarAccess | +| samConversion.kt:9:26:13:5 | true | samConversion.kt:1:1:14:1 | main | BooleanLiteral | +| samConversion.kt:9:26:13:5 | when ... | samConversion.kt:1:1:14:1 | main | WhenExpr | +| samConversion.kt:9:30:9:30 | b | samConversion.kt:1:1:14:1 | main | VarAccess | +| samConversion.kt:9:33:11:5 | ...->... | samConversion.kt:1:1:14:1 | main | LambdaExpr | +| samConversion.kt:9:33:11:5 | Boolean | samConversion.kt:1:1:14:1 | main | TypeAccess | +| samConversion.kt:9:33:11:5 | Function1 | samConversion.kt:1:1:14:1 | main | TypeAccess | +| samConversion.kt:9:33:11:5 | Integer | samConversion.kt:1:1:14:1 | main | TypeAccess | +| samConversion.kt:9:33:11:5 | boolean | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:10:13:10:13 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:10:18:10:18 | j | samConversion.kt:9:33:11:5 | invoke | VarAccess | +| samConversion.kt:10:18:10:22 | ... % ... | samConversion.kt:9:33:11:5 | invoke | RemExpr | +| samConversion.kt:10:18:10:27 | ... (value equals) ... | samConversion.kt:9:33:11:5 | invoke | ValueEQExpr | +| samConversion.kt:10:22:10:22 | 2 | samConversion.kt:9:33:11:5 | invoke | IntegerLiteral | +| samConversion.kt:10:27:10:27 | 0 | samConversion.kt:9:33:11:5 | invoke | IntegerLiteral | +| samConversion.kt:11:12:13:5 | ...->... | samConversion.kt:1:1:14:1 | main | LambdaExpr | +| samConversion.kt:11:12:13:5 | Boolean | samConversion.kt:1:1:14:1 | main | TypeAccess | +| samConversion.kt:11:12:13:5 | Function1 | samConversion.kt:1:1:14:1 | main | TypeAccess | +| samConversion.kt:11:12:13:5 | Integer | samConversion.kt:1:1:14:1 | main | TypeAccess | +| samConversion.kt:11:12:13:5 | boolean | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:12:13:12:13 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:12:18:12:18 | j | samConversion.kt:11:12:13:5 | invoke | VarAccess | +| samConversion.kt:12:18:12:22 | ... % ... | samConversion.kt:11:12:13:5 | invoke | RemExpr | +| samConversion.kt:12:18:12:27 | ... (value equals) ... | samConversion.kt:11:12:13:5 | invoke | ValueEQExpr | +| samConversion.kt:12:22:12:22 | 2 | samConversion.kt:11:12:13:5 | invoke | IntegerLiteral | +| samConversion.kt:12:27:12:27 | 1 | samConversion.kt:11:12:13:5 | invoke | IntegerLiteral | +| samConversion.kt:17:5:17:31 | boolean | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:17:16:17:21 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:20:1:20:27 | Unit | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:20:9:20:14 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:20:17:20:22 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:23:5:23:27 | Unit | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:23:13:23:18 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:23:21:23:26 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:27:5:27:35 | boolean | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:27:9:27:14 | String | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:27:20:27:25 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:31:5:33:53 | boolean | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:31:16:31:22 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:31:25:31:31 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:31:34:31:40 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:31:43:31:49 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:31:52:31:58 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:31:61:31:67 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:31:70:31:76 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:31:79:31:85 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:31:88:31:94 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:31:97:31:103 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:32:16:32:23 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:32:26:32:33 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:32:36:32:43 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:32:46:32:53 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:32:56:32:63 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:32:66:32:73 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:32:76:32:83 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:32:86:32:93 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:32:96:32:103 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:32:106:32:113 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:33:16:33:23 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:33:26:33:33 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:33:36:33:43 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:36:1:38:52 | boolean | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:36:8:36:14 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:36:17:36:23 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:36:26:36:32 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:36:35:36:41 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:36:44:36:50 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:36:53:36:59 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:36:62:36:68 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:36:71:36:77 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:36:80:36:86 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:36:89:36:95 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:37:8:37:15 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:37:18:37:25 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:37:28:37:35 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:37:38:37:45 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:37:48:37:55 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:37:58:37:65 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:37:68:37:75 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:37:78:37:85 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:37:88:37:95 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:37:98:37:105 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:38:8:38:15 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:38:18:38:25 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:38:28:38:35 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:38:49:38:52 | true | samConversion.kt:36:1:38:52 | ff | BooleanLiteral | +| samConversion.kt:40:1:47:1 | Unit | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:40:8:40:19 | boolean | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:41:9:41:9 | a | samConversion.kt:40:1:47:1 | fn | LocalVariableDeclExpr | +| samConversion.kt:41:13:41:16 | 0 | samConversion.kt:41:13:41:16 | invoke | IntegerLiteral | +| samConversion.kt:41:13:41:16 | 1 | samConversion.kt:41:13:41:16 | invoke | IntegerLiteral | +| samConversion.kt:41:13:41:16 | 2 | samConversion.kt:41:13:41:16 | invoke | IntegerLiteral | +| samConversion.kt:41:13:41:16 | 3 | samConversion.kt:41:13:41:16 | invoke | IntegerLiteral | +| samConversion.kt:41:13:41:16 | 4 | samConversion.kt:41:13:41:16 | invoke | IntegerLiteral | +| samConversion.kt:41:13:41:16 | 5 | samConversion.kt:41:13:41:16 | invoke | IntegerLiteral | +| samConversion.kt:41:13:41:16 | 6 | samConversion.kt:41:13:41:16 | invoke | IntegerLiteral | +| samConversion.kt:41:13:41:16 | 7 | samConversion.kt:41:13:41:16 | invoke | IntegerLiteral | +| samConversion.kt:41:13:41:16 | 8 | samConversion.kt:41:13:41:16 | invoke | IntegerLiteral | +| samConversion.kt:41:13:41:16 | 9 | samConversion.kt:41:13:41:16 | invoke | IntegerLiteral | +| samConversion.kt:41:13:41:16 | 10 | samConversion.kt:41:13:41:16 | invoke | IntegerLiteral | +| samConversion.kt:41:13:41:16 | 11 | samConversion.kt:41:13:41:16 | invoke | IntegerLiteral | +| samConversion.kt:41:13:41:16 | 12 | samConversion.kt:41:13:41:16 | invoke | IntegerLiteral | +| samConversion.kt:41:13:41:16 | 13 | samConversion.kt:41:13:41:16 | invoke | IntegerLiteral | +| samConversion.kt:41:13:41:16 | 14 | samConversion.kt:41:13:41:16 | invoke | IntegerLiteral | +| samConversion.kt:41:13:41:16 | 15 | samConversion.kt:41:13:41:16 | invoke | IntegerLiteral | +| samConversion.kt:41:13:41:16 | 16 | samConversion.kt:41:13:41:16 | invoke | IntegerLiteral | +| samConversion.kt:41:13:41:16 | 17 | samConversion.kt:41:13:41:16 | invoke | IntegerLiteral | +| samConversion.kt:41:13:41:16 | 18 | samConversion.kt:41:13:41:16 | invoke | IntegerLiteral | +| samConversion.kt:41:13:41:16 | 19 | samConversion.kt:41:13:41:16 | invoke | IntegerLiteral | +| samConversion.kt:41:13:41:16 | 20 | samConversion.kt:41:13:41:16 | invoke | IntegerLiteral | +| samConversion.kt:41:13:41:16 | 21 | samConversion.kt:41:13:41:16 | invoke | IntegerLiteral | +| samConversion.kt:41:13:41:16 | 22 | samConversion.kt:41:13:41:16 | invoke | IntegerLiteral | +| samConversion.kt:41:13:41:16 | 23 | samConversion.kt:41:13:41:16 | | IntegerLiteral | +| samConversion.kt:41:13:41:16 | (...)... | samConversion.kt:41:13:41:16 | invoke | CastExpr | +| samConversion.kt:41:13:41:16 | (...)... | samConversion.kt:41:13:41:16 | invoke | CastExpr | +| samConversion.kt:41:13:41:16 | (...)... | samConversion.kt:41:13:41:16 | invoke | CastExpr | +| samConversion.kt:41:13:41:16 | (...)... | samConversion.kt:41:13:41:16 | invoke | CastExpr | +| samConversion.kt:41:13:41:16 | (...)... | samConversion.kt:41:13:41:16 | invoke | CastExpr | +| samConversion.kt:41:13:41:16 | (...)... | samConversion.kt:41:13:41:16 | invoke | CastExpr | +| samConversion.kt:41:13:41:16 | (...)... | samConversion.kt:41:13:41:16 | invoke | CastExpr | +| samConversion.kt:41:13:41:16 | (...)... | samConversion.kt:41:13:41:16 | invoke | CastExpr | +| samConversion.kt:41:13:41:16 | (...)... | samConversion.kt:41:13:41:16 | invoke | CastExpr | +| samConversion.kt:41:13:41:16 | (...)... | samConversion.kt:41:13:41:16 | invoke | CastExpr | +| samConversion.kt:41:13:41:16 | (...)... | samConversion.kt:41:13:41:16 | invoke | CastExpr | +| samConversion.kt:41:13:41:16 | (...)... | samConversion.kt:41:13:41:16 | invoke | CastExpr | +| samConversion.kt:41:13:41:16 | (...)... | samConversion.kt:41:13:41:16 | invoke | CastExpr | +| samConversion.kt:41:13:41:16 | (...)... | samConversion.kt:41:13:41:16 | invoke | CastExpr | +| samConversion.kt:41:13:41:16 | (...)... | samConversion.kt:41:13:41:16 | invoke | CastExpr | +| samConversion.kt:41:13:41:16 | (...)... | samConversion.kt:41:13:41:16 | invoke | CastExpr | +| samConversion.kt:41:13:41:16 | (...)... | samConversion.kt:41:13:41:16 | invoke | CastExpr | +| samConversion.kt:41:13:41:16 | (...)... | samConversion.kt:41:13:41:16 | invoke | CastExpr | +| samConversion.kt:41:13:41:16 | (...)... | samConversion.kt:41:13:41:16 | invoke | CastExpr | +| samConversion.kt:41:13:41:16 | (...)... | samConversion.kt:41:13:41:16 | invoke | CastExpr | +| samConversion.kt:41:13:41:16 | (...)... | samConversion.kt:41:13:41:16 | invoke | CastExpr | +| samConversion.kt:41:13:41:16 | (...)... | samConversion.kt:41:13:41:16 | invoke | CastExpr | +| samConversion.kt:41:13:41:16 | (...)... | samConversion.kt:41:13:41:16 | invoke | CastExpr | +| samConversion.kt:41:13:41:16 | ...::... | samConversion.kt:40:1:47:1 | fn | MemberRefExpr | +| samConversion.kt:41:13:41:16 | ...[...] | samConversion.kt:41:13:41:16 | invoke | ArrayAccess | +| samConversion.kt:41:13:41:16 | ...[...] | samConversion.kt:41:13:41:16 | invoke | ArrayAccess | +| samConversion.kt:41:13:41:16 | ...[...] | samConversion.kt:41:13:41:16 | invoke | ArrayAccess | +| samConversion.kt:41:13:41:16 | ...[...] | samConversion.kt:41:13:41:16 | invoke | ArrayAccess | +| samConversion.kt:41:13:41:16 | ...[...] | samConversion.kt:41:13:41:16 | invoke | ArrayAccess | +| samConversion.kt:41:13:41:16 | ...[...] | samConversion.kt:41:13:41:16 | invoke | ArrayAccess | +| samConversion.kt:41:13:41:16 | ...[...] | samConversion.kt:41:13:41:16 | invoke | ArrayAccess | +| samConversion.kt:41:13:41:16 | ...[...] | samConversion.kt:41:13:41:16 | invoke | ArrayAccess | +| samConversion.kt:41:13:41:16 | ...[...] | samConversion.kt:41:13:41:16 | invoke | ArrayAccess | +| samConversion.kt:41:13:41:16 | ...[...] | samConversion.kt:41:13:41:16 | invoke | ArrayAccess | +| samConversion.kt:41:13:41:16 | ...[...] | samConversion.kt:41:13:41:16 | invoke | ArrayAccess | +| samConversion.kt:41:13:41:16 | ...[...] | samConversion.kt:41:13:41:16 | invoke | ArrayAccess | +| samConversion.kt:41:13:41:16 | ...[...] | samConversion.kt:41:13:41:16 | invoke | ArrayAccess | +| samConversion.kt:41:13:41:16 | ...[...] | samConversion.kt:41:13:41:16 | invoke | ArrayAccess | +| samConversion.kt:41:13:41:16 | ...[...] | samConversion.kt:41:13:41:16 | invoke | ArrayAccess | +| samConversion.kt:41:13:41:16 | ...[...] | samConversion.kt:41:13:41:16 | invoke | ArrayAccess | +| samConversion.kt:41:13:41:16 | ...[...] | samConversion.kt:41:13:41:16 | invoke | ArrayAccess | +| samConversion.kt:41:13:41:16 | ...[...] | samConversion.kt:41:13:41:16 | invoke | ArrayAccess | +| samConversion.kt:41:13:41:16 | ...[...] | samConversion.kt:41:13:41:16 | invoke | ArrayAccess | +| samConversion.kt:41:13:41:16 | ...[...] | samConversion.kt:41:13:41:16 | invoke | ArrayAccess | +| samConversion.kt:41:13:41:16 | ...[...] | samConversion.kt:41:13:41:16 | invoke | ArrayAccess | +| samConversion.kt:41:13:41:16 | ...[...] | samConversion.kt:41:13:41:16 | invoke | ArrayAccess | +| samConversion.kt:41:13:41:16 | ...[...] | samConversion.kt:41:13:41:16 | invoke | ArrayAccess | +| samConversion.kt:41:13:41:16 | Boolean | samConversion.kt:40:1:47:1 | fn | TypeAccess | +| samConversion.kt:41:13:41:16 | FunctionN | samConversion.kt:40:1:47:1 | fn | TypeAccess | +| samConversion.kt:41:13:41:16 | SamConversionKt | samConversion.kt:41:13:41:16 | invoke | TypeAccess | +| samConversion.kt:41:13:41:16 | a0 | samConversion.kt:41:13:41:16 | invoke | VarAccess | +| samConversion.kt:41:13:41:16 | a0 | samConversion.kt:41:13:41:16 | invoke | VarAccess | +| samConversion.kt:41:13:41:16 | a0 | samConversion.kt:41:13:41:16 | invoke | VarAccess | +| samConversion.kt:41:13:41:16 | a0 | samConversion.kt:41:13:41:16 | invoke | VarAccess | +| samConversion.kt:41:13:41:16 | a0 | samConversion.kt:41:13:41:16 | invoke | VarAccess | +| samConversion.kt:41:13:41:16 | a0 | samConversion.kt:41:13:41:16 | invoke | VarAccess | +| samConversion.kt:41:13:41:16 | a0 | samConversion.kt:41:13:41:16 | invoke | VarAccess | +| samConversion.kt:41:13:41:16 | a0 | samConversion.kt:41:13:41:16 | invoke | VarAccess | +| samConversion.kt:41:13:41:16 | a0 | samConversion.kt:41:13:41:16 | invoke | VarAccess | +| samConversion.kt:41:13:41:16 | a0 | samConversion.kt:41:13:41:16 | invoke | VarAccess | +| samConversion.kt:41:13:41:16 | a0 | samConversion.kt:41:13:41:16 | invoke | VarAccess | +| samConversion.kt:41:13:41:16 | a0 | samConversion.kt:41:13:41:16 | invoke | VarAccess | +| samConversion.kt:41:13:41:16 | a0 | samConversion.kt:41:13:41:16 | invoke | VarAccess | +| samConversion.kt:41:13:41:16 | a0 | samConversion.kt:41:13:41:16 | invoke | VarAccess | +| samConversion.kt:41:13:41:16 | a0 | samConversion.kt:41:13:41:16 | invoke | VarAccess | +| samConversion.kt:41:13:41:16 | a0 | samConversion.kt:41:13:41:16 | invoke | VarAccess | +| samConversion.kt:41:13:41:16 | a0 | samConversion.kt:41:13:41:16 | invoke | VarAccess | +| samConversion.kt:41:13:41:16 | a0 | samConversion.kt:41:13:41:16 | invoke | VarAccess | +| samConversion.kt:41:13:41:16 | a0 | samConversion.kt:41:13:41:16 | invoke | VarAccess | +| samConversion.kt:41:13:41:16 | a0 | samConversion.kt:41:13:41:16 | invoke | VarAccess | +| samConversion.kt:41:13:41:16 | a0 | samConversion.kt:41:13:41:16 | invoke | VarAccess | +| samConversion.kt:41:13:41:16 | a0 | samConversion.kt:41:13:41:16 | invoke | VarAccess | +| samConversion.kt:41:13:41:16 | a0 | samConversion.kt:41:13:41:16 | invoke | VarAccess | +| samConversion.kt:41:13:41:16 | ff(...) | samConversion.kt:41:13:41:16 | invoke | MethodCall | +| samConversion.kt:41:13:41:16 | int | samConversion.kt:41:13:41:16 | invoke | TypeAccess | +| samConversion.kt:41:13:41:16 | int | samConversion.kt:41:13:41:16 | invoke | TypeAccess | +| samConversion.kt:41:13:41:16 | int | samConversion.kt:41:13:41:16 | invoke | TypeAccess | +| samConversion.kt:41:13:41:16 | int | samConversion.kt:41:13:41:16 | invoke | TypeAccess | +| samConversion.kt:41:13:41:16 | int | samConversion.kt:41:13:41:16 | invoke | TypeAccess | +| samConversion.kt:41:13:41:16 | int | samConversion.kt:41:13:41:16 | invoke | TypeAccess | +| samConversion.kt:41:13:41:16 | int | samConversion.kt:41:13:41:16 | invoke | TypeAccess | +| samConversion.kt:41:13:41:16 | int | samConversion.kt:41:13:41:16 | invoke | TypeAccess | +| samConversion.kt:41:13:41:16 | int | samConversion.kt:41:13:41:16 | invoke | TypeAccess | +| samConversion.kt:41:13:41:16 | int | samConversion.kt:41:13:41:16 | invoke | TypeAccess | +| samConversion.kt:41:13:41:16 | int | samConversion.kt:41:13:41:16 | invoke | TypeAccess | +| samConversion.kt:41:13:41:16 | int | samConversion.kt:41:13:41:16 | invoke | TypeAccess | +| samConversion.kt:41:13:41:16 | int | samConversion.kt:41:13:41:16 | invoke | TypeAccess | +| samConversion.kt:41:13:41:16 | int | samConversion.kt:41:13:41:16 | invoke | TypeAccess | +| samConversion.kt:41:13:41:16 | int | samConversion.kt:41:13:41:16 | invoke | TypeAccess | +| samConversion.kt:41:13:41:16 | int | samConversion.kt:41:13:41:16 | invoke | TypeAccess | +| samConversion.kt:41:13:41:16 | int | samConversion.kt:41:13:41:16 | invoke | TypeAccess | +| samConversion.kt:41:13:41:16 | int | samConversion.kt:41:13:41:16 | invoke | TypeAccess | +| samConversion.kt:41:13:41:16 | int | samConversion.kt:41:13:41:16 | invoke | TypeAccess | +| samConversion.kt:41:13:41:16 | int | samConversion.kt:41:13:41:16 | invoke | TypeAccess | +| samConversion.kt:41:13:41:16 | int | samConversion.kt:41:13:41:16 | invoke | TypeAccess | +| samConversion.kt:41:13:41:16 | int | samConversion.kt:41:13:41:16 | invoke | TypeAccess | +| samConversion.kt:41:13:41:16 | int | samConversion.kt:41:13:41:16 | invoke | TypeAccess | +| samConversion.kt:42:9:42:9 | b | samConversion.kt:40:1:47:1 | fn | LocalVariableDeclExpr | +| samConversion.kt:42:13:42:32 | 23 | samConversion.kt:42:13:42:32 | accept | IntegerLiteral | +| samConversion.kt:42:13:42:32 | (...)... | samConversion.kt:40:1:47:1 | fn | CastExpr | +| samConversion.kt:42:13:42:32 | ...=... | samConversion.kt:42:13:42:32 | | AssignExpr | +| samConversion.kt:42:13:42:32 | | samConversion.kt:42:13:42:32 | | VarAccess | +| samConversion.kt:42:13:42:32 | | samConversion.kt:42:13:42:32 | accept | VarAccess | +| samConversion.kt:42:13:42:32 | BigArityPredicate | samConversion.kt:40:1:47:1 | fn | TypeAccess | +| samConversion.kt:42:13:42:32 | BigArityPredicate | samConversion.kt:40:1:47:1 | fn | TypeAccess | +| samConversion.kt:42:13:42:32 | Boolean | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:42:13:42:32 | FunctionN | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:42:13:42:32 | Object | samConversion.kt:42:13:42:32 | accept | TypeAccess | +| samConversion.kt:42:13:42:32 | boolean | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:42:13:42:32 | i0 | samConversion.kt:42:13:42:32 | accept | VarAccess | +| samConversion.kt:42:13:42:32 | i1 | samConversion.kt:42:13:42:32 | accept | VarAccess | +| samConversion.kt:42:13:42:32 | i2 | samConversion.kt:42:13:42:32 | accept | VarAccess | +| samConversion.kt:42:13:42:32 | i3 | samConversion.kt:42:13:42:32 | accept | VarAccess | +| samConversion.kt:42:13:42:32 | i4 | samConversion.kt:42:13:42:32 | accept | VarAccess | +| samConversion.kt:42:13:42:32 | i5 | samConversion.kt:42:13:42:32 | accept | VarAccess | +| samConversion.kt:42:13:42:32 | i6 | samConversion.kt:42:13:42:32 | accept | VarAccess | +| samConversion.kt:42:13:42:32 | i7 | samConversion.kt:42:13:42:32 | accept | VarAccess | +| samConversion.kt:42:13:42:32 | i8 | samConversion.kt:42:13:42:32 | accept | VarAccess | +| samConversion.kt:42:13:42:32 | i9 | samConversion.kt:42:13:42:32 | accept | VarAccess | +| samConversion.kt:42:13:42:32 | i10 | samConversion.kt:42:13:42:32 | accept | VarAccess | +| samConversion.kt:42:13:42:32 | i11 | samConversion.kt:42:13:42:32 | accept | VarAccess | +| samConversion.kt:42:13:42:32 | i12 | samConversion.kt:42:13:42:32 | accept | VarAccess | +| samConversion.kt:42:13:42:32 | i13 | samConversion.kt:42:13:42:32 | accept | VarAccess | +| samConversion.kt:42:13:42:32 | i14 | samConversion.kt:42:13:42:32 | accept | VarAccess | +| samConversion.kt:42:13:42:32 | i15 | samConversion.kt:42:13:42:32 | accept | VarAccess | +| samConversion.kt:42:13:42:32 | i16 | samConversion.kt:42:13:42:32 | accept | VarAccess | +| samConversion.kt:42:13:42:32 | i17 | samConversion.kt:42:13:42:32 | accept | VarAccess | +| samConversion.kt:42:13:42:32 | i18 | samConversion.kt:42:13:42:32 | accept | VarAccess | +| samConversion.kt:42:13:42:32 | i19 | samConversion.kt:42:13:42:32 | accept | VarAccess | +| samConversion.kt:42:13:42:32 | i20 | samConversion.kt:42:13:42:32 | accept | VarAccess | +| samConversion.kt:42:13:42:32 | i21 | samConversion.kt:42:13:42:32 | accept | VarAccess | +| samConversion.kt:42:13:42:32 | i22 | samConversion.kt:42:13:42:32 | accept | VarAccess | +| samConversion.kt:42:13:42:32 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:42:13:42:32 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:42:13:42:32 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:42:13:42:32 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:42:13:42:32 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:42:13:42:32 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:42:13:42:32 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:42:13:42:32 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:42:13:42:32 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:42:13:42:32 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:42:13:42:32 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:42:13:42:32 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:42:13:42:32 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:42:13:42:32 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:42:13:42:32 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:42:13:42:32 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:42:13:42:32 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:42:13:42:32 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:42:13:42:32 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:42:13:42:32 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:42:13:42:32 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:42:13:42:32 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:42:13:42:32 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:42:13:42:32 | invoke(...) | samConversion.kt:42:13:42:32 | accept | MethodCall | +| samConversion.kt:42:13:42:32 | new (...) | samConversion.kt:40:1:47:1 | fn | ClassInstanceExpr | +| samConversion.kt:42:13:42:32 | new Object[] | samConversion.kt:42:13:42:32 | accept | ArrayCreationExpr | +| samConversion.kt:42:13:42:32 | this | samConversion.kt:42:13:42:32 | | ThisAccess | +| samConversion.kt:42:13:42:32 | this. | samConversion.kt:42:13:42:32 | | VarAccess | +| samConversion.kt:42:13:42:32 | {...} | samConversion.kt:42:13:42:32 | accept | ArrayInit | +| samConversion.kt:42:31:42:31 | a | samConversion.kt:40:1:47:1 | fn | VarAccess | +| samConversion.kt:43:9:43:9 | c | samConversion.kt:40:1:47:1 | fn | LocalVariableDeclExpr | +| samConversion.kt:43:13:45:68 | 23 | samConversion.kt:43:13:45:68 | accept | IntegerLiteral | +| samConversion.kt:43:13:45:68 | (...)... | samConversion.kt:40:1:47:1 | fn | CastExpr | +| samConversion.kt:43:13:45:68 | ...=... | samConversion.kt:43:13:45:68 | | AssignExpr | +| samConversion.kt:43:13:45:68 | | samConversion.kt:43:13:45:68 | | VarAccess | +| samConversion.kt:43:13:45:68 | | samConversion.kt:43:13:45:68 | accept | VarAccess | +| samConversion.kt:43:13:45:68 | BigArityPredicate | samConversion.kt:40:1:47:1 | fn | TypeAccess | +| samConversion.kt:43:13:45:68 | BigArityPredicate | samConversion.kt:40:1:47:1 | fn | TypeAccess | +| samConversion.kt:43:13:45:68 | Boolean | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:43:13:45:68 | FunctionN | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:43:13:45:68 | Object | samConversion.kt:43:13:45:68 | accept | TypeAccess | +| samConversion.kt:43:13:45:68 | boolean | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:43:13:45:68 | i0 | samConversion.kt:43:13:45:68 | accept | VarAccess | +| samConversion.kt:43:13:45:68 | i1 | samConversion.kt:43:13:45:68 | accept | VarAccess | +| samConversion.kt:43:13:45:68 | i2 | samConversion.kt:43:13:45:68 | accept | VarAccess | +| samConversion.kt:43:13:45:68 | i3 | samConversion.kt:43:13:45:68 | accept | VarAccess | +| samConversion.kt:43:13:45:68 | i4 | samConversion.kt:43:13:45:68 | accept | VarAccess | +| samConversion.kt:43:13:45:68 | i5 | samConversion.kt:43:13:45:68 | accept | VarAccess | +| samConversion.kt:43:13:45:68 | i6 | samConversion.kt:43:13:45:68 | accept | VarAccess | +| samConversion.kt:43:13:45:68 | i7 | samConversion.kt:43:13:45:68 | accept | VarAccess | +| samConversion.kt:43:13:45:68 | i8 | samConversion.kt:43:13:45:68 | accept | VarAccess | +| samConversion.kt:43:13:45:68 | i9 | samConversion.kt:43:13:45:68 | accept | VarAccess | +| samConversion.kt:43:13:45:68 | i10 | samConversion.kt:43:13:45:68 | accept | VarAccess | +| samConversion.kt:43:13:45:68 | i11 | samConversion.kt:43:13:45:68 | accept | VarAccess | +| samConversion.kt:43:13:45:68 | i12 | samConversion.kt:43:13:45:68 | accept | VarAccess | +| samConversion.kt:43:13:45:68 | i13 | samConversion.kt:43:13:45:68 | accept | VarAccess | +| samConversion.kt:43:13:45:68 | i14 | samConversion.kt:43:13:45:68 | accept | VarAccess | +| samConversion.kt:43:13:45:68 | i15 | samConversion.kt:43:13:45:68 | accept | VarAccess | +| samConversion.kt:43:13:45:68 | i16 | samConversion.kt:43:13:45:68 | accept | VarAccess | +| samConversion.kt:43:13:45:68 | i17 | samConversion.kt:43:13:45:68 | accept | VarAccess | +| samConversion.kt:43:13:45:68 | i18 | samConversion.kt:43:13:45:68 | accept | VarAccess | +| samConversion.kt:43:13:45:68 | i19 | samConversion.kt:43:13:45:68 | accept | VarAccess | +| samConversion.kt:43:13:45:68 | i20 | samConversion.kt:43:13:45:68 | accept | VarAccess | +| samConversion.kt:43:13:45:68 | i21 | samConversion.kt:43:13:45:68 | accept | VarAccess | +| samConversion.kt:43:13:45:68 | i22 | samConversion.kt:43:13:45:68 | accept | VarAccess | +| samConversion.kt:43:13:45:68 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:43:13:45:68 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:43:13:45:68 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:43:13:45:68 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:43:13:45:68 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:43:13:45:68 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:43:13:45:68 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:43:13:45:68 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:43:13:45:68 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:43:13:45:68 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:43:13:45:68 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:43:13:45:68 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:43:13:45:68 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:43:13:45:68 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:43:13:45:68 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:43:13:45:68 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:43:13:45:68 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:43:13:45:68 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:43:13:45:68 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:43:13:45:68 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:43:13:45:68 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:43:13:45:68 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:43:13:45:68 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:43:13:45:68 | invoke(...) | samConversion.kt:43:13:45:68 | accept | MethodCall | +| samConversion.kt:43:13:45:68 | new (...) | samConversion.kt:40:1:47:1 | fn | ClassInstanceExpr | +| samConversion.kt:43:13:45:68 | new Object[] | samConversion.kt:43:13:45:68 | accept | ArrayCreationExpr | +| samConversion.kt:43:13:45:68 | this | samConversion.kt:43:13:45:68 | | ThisAccess | +| samConversion.kt:43:13:45:68 | this. | samConversion.kt:43:13:45:68 | | VarAccess | +| samConversion.kt:43:13:45:68 | {...} | samConversion.kt:43:13:45:68 | accept | ArrayInit | +| samConversion.kt:43:31:45:68 | 0 | samConversion.kt:43:31:45:68 | invoke | IntegerLiteral | +| samConversion.kt:43:31:45:68 | 1 | samConversion.kt:43:31:45:68 | invoke | IntegerLiteral | +| samConversion.kt:43:31:45:68 | 2 | samConversion.kt:43:31:45:68 | invoke | IntegerLiteral | +| samConversion.kt:43:31:45:68 | 3 | samConversion.kt:43:31:45:68 | invoke | IntegerLiteral | +| samConversion.kt:43:31:45:68 | 4 | samConversion.kt:43:31:45:68 | invoke | IntegerLiteral | +| samConversion.kt:43:31:45:68 | 5 | samConversion.kt:43:31:45:68 | invoke | IntegerLiteral | +| samConversion.kt:43:31:45:68 | 6 | samConversion.kt:43:31:45:68 | invoke | IntegerLiteral | +| samConversion.kt:43:31:45:68 | 7 | samConversion.kt:43:31:45:68 | invoke | IntegerLiteral | +| samConversion.kt:43:31:45:68 | 8 | samConversion.kt:43:31:45:68 | invoke | IntegerLiteral | +| samConversion.kt:43:31:45:68 | 9 | samConversion.kt:43:31:45:68 | invoke | IntegerLiteral | +| samConversion.kt:43:31:45:68 | 10 | samConversion.kt:43:31:45:68 | invoke | IntegerLiteral | +| samConversion.kt:43:31:45:68 | 11 | samConversion.kt:43:31:45:68 | invoke | IntegerLiteral | +| samConversion.kt:43:31:45:68 | 12 | samConversion.kt:43:31:45:68 | invoke | IntegerLiteral | +| samConversion.kt:43:31:45:68 | 13 | samConversion.kt:43:31:45:68 | invoke | IntegerLiteral | +| samConversion.kt:43:31:45:68 | 14 | samConversion.kt:43:31:45:68 | invoke | IntegerLiteral | +| samConversion.kt:43:31:45:68 | 15 | samConversion.kt:43:31:45:68 | invoke | IntegerLiteral | +| samConversion.kt:43:31:45:68 | 16 | samConversion.kt:43:31:45:68 | invoke | IntegerLiteral | +| samConversion.kt:43:31:45:68 | 17 | samConversion.kt:43:31:45:68 | invoke | IntegerLiteral | +| samConversion.kt:43:31:45:68 | 18 | samConversion.kt:43:31:45:68 | invoke | IntegerLiteral | +| samConversion.kt:43:31:45:68 | 19 | samConversion.kt:43:31:45:68 | invoke | IntegerLiteral | +| samConversion.kt:43:31:45:68 | 20 | samConversion.kt:43:31:45:68 | invoke | IntegerLiteral | +| samConversion.kt:43:31:45:68 | 21 | samConversion.kt:43:31:45:68 | invoke | IntegerLiteral | +| samConversion.kt:43:31:45:68 | 22 | samConversion.kt:43:31:45:68 | invoke | IntegerLiteral | +| samConversion.kt:43:31:45:68 | (...)... | samConversion.kt:43:31:45:68 | invoke | CastExpr | +| samConversion.kt:43:31:45:68 | (...)... | samConversion.kt:43:31:45:68 | invoke | CastExpr | +| samConversion.kt:43:31:45:68 | (...)... | samConversion.kt:43:31:45:68 | invoke | CastExpr | +| samConversion.kt:43:31:45:68 | (...)... | samConversion.kt:43:31:45:68 | invoke | CastExpr | +| samConversion.kt:43:31:45:68 | (...)... | samConversion.kt:43:31:45:68 | invoke | CastExpr | +| samConversion.kt:43:31:45:68 | (...)... | samConversion.kt:43:31:45:68 | invoke | CastExpr | +| samConversion.kt:43:31:45:68 | (...)... | samConversion.kt:43:31:45:68 | invoke | CastExpr | +| samConversion.kt:43:31:45:68 | (...)... | samConversion.kt:43:31:45:68 | invoke | CastExpr | +| samConversion.kt:43:31:45:68 | (...)... | samConversion.kt:43:31:45:68 | invoke | CastExpr | +| samConversion.kt:43:31:45:68 | (...)... | samConversion.kt:43:31:45:68 | invoke | CastExpr | +| samConversion.kt:43:31:45:68 | (...)... | samConversion.kt:43:31:45:68 | invoke | CastExpr | +| samConversion.kt:43:31:45:68 | (...)... | samConversion.kt:43:31:45:68 | invoke | CastExpr | +| samConversion.kt:43:31:45:68 | (...)... | samConversion.kt:43:31:45:68 | invoke | CastExpr | +| samConversion.kt:43:31:45:68 | (...)... | samConversion.kt:43:31:45:68 | invoke | CastExpr | +| samConversion.kt:43:31:45:68 | (...)... | samConversion.kt:43:31:45:68 | invoke | CastExpr | +| samConversion.kt:43:31:45:68 | (...)... | samConversion.kt:43:31:45:68 | invoke | CastExpr | +| samConversion.kt:43:31:45:68 | (...)... | samConversion.kt:43:31:45:68 | invoke | CastExpr | +| samConversion.kt:43:31:45:68 | (...)... | samConversion.kt:43:31:45:68 | invoke | CastExpr | +| samConversion.kt:43:31:45:68 | (...)... | samConversion.kt:43:31:45:68 | invoke | CastExpr | +| samConversion.kt:43:31:45:68 | (...)... | samConversion.kt:43:31:45:68 | invoke | CastExpr | +| samConversion.kt:43:31:45:68 | (...)... | samConversion.kt:43:31:45:68 | invoke | CastExpr | +| samConversion.kt:43:31:45:68 | (...)... | samConversion.kt:43:31:45:68 | invoke | CastExpr | +| samConversion.kt:43:31:45:68 | (...)... | samConversion.kt:43:31:45:68 | invoke | CastExpr | +| samConversion.kt:43:31:45:68 | ...->... | samConversion.kt:40:1:47:1 | fn | LambdaExpr | +| samConversion.kt:43:31:45:68 | ...[...] | samConversion.kt:43:31:45:68 | invoke | ArrayAccess | +| samConversion.kt:43:31:45:68 | ...[...] | samConversion.kt:43:31:45:68 | invoke | ArrayAccess | +| samConversion.kt:43:31:45:68 | ...[...] | samConversion.kt:43:31:45:68 | invoke | ArrayAccess | +| samConversion.kt:43:31:45:68 | ...[...] | samConversion.kt:43:31:45:68 | invoke | ArrayAccess | +| samConversion.kt:43:31:45:68 | ...[...] | samConversion.kt:43:31:45:68 | invoke | ArrayAccess | +| samConversion.kt:43:31:45:68 | ...[...] | samConversion.kt:43:31:45:68 | invoke | ArrayAccess | +| samConversion.kt:43:31:45:68 | ...[...] | samConversion.kt:43:31:45:68 | invoke | ArrayAccess | +| samConversion.kt:43:31:45:68 | ...[...] | samConversion.kt:43:31:45:68 | invoke | ArrayAccess | +| samConversion.kt:43:31:45:68 | ...[...] | samConversion.kt:43:31:45:68 | invoke | ArrayAccess | +| samConversion.kt:43:31:45:68 | ...[...] | samConversion.kt:43:31:45:68 | invoke | ArrayAccess | +| samConversion.kt:43:31:45:68 | ...[...] | samConversion.kt:43:31:45:68 | invoke | ArrayAccess | +| samConversion.kt:43:31:45:68 | ...[...] | samConversion.kt:43:31:45:68 | invoke | ArrayAccess | +| samConversion.kt:43:31:45:68 | ...[...] | samConversion.kt:43:31:45:68 | invoke | ArrayAccess | +| samConversion.kt:43:31:45:68 | ...[...] | samConversion.kt:43:31:45:68 | invoke | ArrayAccess | +| samConversion.kt:43:31:45:68 | ...[...] | samConversion.kt:43:31:45:68 | invoke | ArrayAccess | +| samConversion.kt:43:31:45:68 | ...[...] | samConversion.kt:43:31:45:68 | invoke | ArrayAccess | +| samConversion.kt:43:31:45:68 | ...[...] | samConversion.kt:43:31:45:68 | invoke | ArrayAccess | +| samConversion.kt:43:31:45:68 | ...[...] | samConversion.kt:43:31:45:68 | invoke | ArrayAccess | +| samConversion.kt:43:31:45:68 | ...[...] | samConversion.kt:43:31:45:68 | invoke | ArrayAccess | +| samConversion.kt:43:31:45:68 | ...[...] | samConversion.kt:43:31:45:68 | invoke | ArrayAccess | +| samConversion.kt:43:31:45:68 | ...[...] | samConversion.kt:43:31:45:68 | invoke | ArrayAccess | +| samConversion.kt:43:31:45:68 | ...[...] | samConversion.kt:43:31:45:68 | invoke | ArrayAccess | +| samConversion.kt:43:31:45:68 | ...[...] | samConversion.kt:43:31:45:68 | invoke | ArrayAccess | +| samConversion.kt:43:31:45:68 | Boolean | samConversion.kt:40:1:47:1 | fn | TypeAccess | +| samConversion.kt:43:31:45:68 | FunctionN | samConversion.kt:40:1:47:1 | fn | TypeAccess | +| samConversion.kt:43:31:45:68 | a0 | samConversion.kt:43:31:45:68 | invoke | VarAccess | +| samConversion.kt:43:31:45:68 | a0 | samConversion.kt:43:31:45:68 | invoke | VarAccess | +| samConversion.kt:43:31:45:68 | a0 | samConversion.kt:43:31:45:68 | invoke | VarAccess | +| samConversion.kt:43:31:45:68 | a0 | samConversion.kt:43:31:45:68 | invoke | VarAccess | +| samConversion.kt:43:31:45:68 | a0 | samConversion.kt:43:31:45:68 | invoke | VarAccess | +| samConversion.kt:43:31:45:68 | a0 | samConversion.kt:43:31:45:68 | invoke | VarAccess | +| samConversion.kt:43:31:45:68 | a0 | samConversion.kt:43:31:45:68 | invoke | VarAccess | +| samConversion.kt:43:31:45:68 | a0 | samConversion.kt:43:31:45:68 | invoke | VarAccess | +| samConversion.kt:43:31:45:68 | a0 | samConversion.kt:43:31:45:68 | invoke | VarAccess | +| samConversion.kt:43:31:45:68 | a0 | samConversion.kt:43:31:45:68 | invoke | VarAccess | +| samConversion.kt:43:31:45:68 | a0 | samConversion.kt:43:31:45:68 | invoke | VarAccess | +| samConversion.kt:43:31:45:68 | a0 | samConversion.kt:43:31:45:68 | invoke | VarAccess | +| samConversion.kt:43:31:45:68 | a0 | samConversion.kt:43:31:45:68 | invoke | VarAccess | +| samConversion.kt:43:31:45:68 | a0 | samConversion.kt:43:31:45:68 | invoke | VarAccess | +| samConversion.kt:43:31:45:68 | a0 | samConversion.kt:43:31:45:68 | invoke | VarAccess | +| samConversion.kt:43:31:45:68 | a0 | samConversion.kt:43:31:45:68 | invoke | VarAccess | +| samConversion.kt:43:31:45:68 | a0 | samConversion.kt:43:31:45:68 | invoke | VarAccess | +| samConversion.kt:43:31:45:68 | a0 | samConversion.kt:43:31:45:68 | invoke | VarAccess | +| samConversion.kt:43:31:45:68 | a0 | samConversion.kt:43:31:45:68 | invoke | VarAccess | +| samConversion.kt:43:31:45:68 | a0 | samConversion.kt:43:31:45:68 | invoke | VarAccess | +| samConversion.kt:43:31:45:68 | a0 | samConversion.kt:43:31:45:68 | invoke | VarAccess | +| samConversion.kt:43:31:45:68 | a0 | samConversion.kt:43:31:45:68 | invoke | VarAccess | +| samConversion.kt:43:31:45:68 | a0 | samConversion.kt:43:31:45:68 | invoke | VarAccess | +| samConversion.kt:43:31:45:68 | boolean | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:43:31:45:68 | int | samConversion.kt:43:31:45:68 | invoke | TypeAccess | +| samConversion.kt:43:31:45:68 | int | samConversion.kt:43:31:45:68 | invoke | TypeAccess | +| samConversion.kt:43:31:45:68 | int | samConversion.kt:43:31:45:68 | invoke | TypeAccess | +| samConversion.kt:43:31:45:68 | int | samConversion.kt:43:31:45:68 | invoke | TypeAccess | +| samConversion.kt:43:31:45:68 | int | samConversion.kt:43:31:45:68 | invoke | TypeAccess | +| samConversion.kt:43:31:45:68 | int | samConversion.kt:43:31:45:68 | invoke | TypeAccess | +| samConversion.kt:43:31:45:68 | int | samConversion.kt:43:31:45:68 | invoke | TypeAccess | +| samConversion.kt:43:31:45:68 | int | samConversion.kt:43:31:45:68 | invoke | TypeAccess | +| samConversion.kt:43:31:45:68 | int | samConversion.kt:43:31:45:68 | invoke | TypeAccess | +| samConversion.kt:43:31:45:68 | int | samConversion.kt:43:31:45:68 | invoke | TypeAccess | +| samConversion.kt:43:31:45:68 | int | samConversion.kt:43:31:45:68 | invoke | TypeAccess | +| samConversion.kt:43:31:45:68 | int | samConversion.kt:43:31:45:68 | invoke | TypeAccess | +| samConversion.kt:43:31:45:68 | int | samConversion.kt:43:31:45:68 | invoke | TypeAccess | +| samConversion.kt:43:31:45:68 | int | samConversion.kt:43:31:45:68 | invoke | TypeAccess | +| samConversion.kt:43:31:45:68 | int | samConversion.kt:43:31:45:68 | invoke | TypeAccess | +| samConversion.kt:43:31:45:68 | int | samConversion.kt:43:31:45:68 | invoke | TypeAccess | +| samConversion.kt:43:31:45:68 | int | samConversion.kt:43:31:45:68 | invoke | TypeAccess | +| samConversion.kt:43:31:45:68 | int | samConversion.kt:43:31:45:68 | invoke | TypeAccess | +| samConversion.kt:43:31:45:68 | int | samConversion.kt:43:31:45:68 | invoke | TypeAccess | +| samConversion.kt:43:31:45:68 | int | samConversion.kt:43:31:45:68 | invoke | TypeAccess | +| samConversion.kt:43:31:45:68 | int | samConversion.kt:43:31:45:68 | invoke | TypeAccess | +| samConversion.kt:43:31:45:68 | int | samConversion.kt:43:31:45:68 | invoke | TypeAccess | +| samConversion.kt:43:31:45:68 | int | samConversion.kt:43:31:45:68 | invoke | TypeAccess | +| samConversion.kt:43:31:45:68 | invoke(...) | samConversion.kt:43:31:45:68 | invoke | MethodCall | +| samConversion.kt:43:31:45:68 | this | samConversion.kt:43:31:45:68 | invoke | ThisAccess | +| samConversion.kt:43:32:43:38 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:43:41:43:47 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:43:50:43:56 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:43:59:43:65 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:43:68:43:74 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:43:77:43:83 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:43:86:43:92 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:43:95:43:101 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:43:104:43:110 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:43:113:43:119 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:44:32:44:39 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:44:42:44:49 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:44:52:44:59 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:44:62:44:69 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:44:72:44:79 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:44:82:44:89 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:44:92:44:99 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:44:102:44:109 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:44:112:44:119 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:44:122:44:129 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:45:32:45:39 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:45:42:45:49 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:45:52:45:59 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:45:64:45:67 | true | samConversion.kt:43:31:45:68 | invoke | BooleanLiteral | +| samConversion.kt:46:9:46:9 | d | samConversion.kt:40:1:47:1 | fn | LocalVariableDeclExpr | +| samConversion.kt:46:13:46:44 | (...)... | samConversion.kt:40:1:47:1 | fn | CastExpr | +| samConversion.kt:46:13:46:44 | ...=... | samConversion.kt:46:13:46:44 | | AssignExpr | +| samConversion.kt:46:13:46:44 | | samConversion.kt:46:13:46:44 | | VarAccess | +| samConversion.kt:46:13:46:44 | | samConversion.kt:46:13:46:44 | fn | VarAccess | +| samConversion.kt:46:13:46:44 | Boolean | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:46:13:46:44 | Function1 | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:46:13:46:44 | Integer | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:46:13:46:44 | Integer | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:46:13:46:44 | Integer | samConversion.kt:40:1:47:1 | fn | TypeAccess | +| samConversion.kt:46:13:46:44 | Integer | samConversion.kt:40:1:47:1 | fn | TypeAccess | +| samConversion.kt:46:13:46:44 | SomePredicate | samConversion.kt:40:1:47:1 | fn | TypeAccess | +| samConversion.kt:46:13:46:44 | SomePredicate | samConversion.kt:40:1:47:1 | fn | TypeAccess | +| samConversion.kt:46:13:46:44 | boolean | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:46:13:46:44 | i | samConversion.kt:46:13:46:44 | fn | VarAccess | +| samConversion.kt:46:13:46:44 | invoke(...) | samConversion.kt:46:13:46:44 | fn | MethodCall | +| samConversion.kt:46:13:46:44 | new (...) | samConversion.kt:40:1:47:1 | fn | ClassInstanceExpr | +| samConversion.kt:46:13:46:44 | this | samConversion.kt:46:13:46:44 | | ThisAccess | +| samConversion.kt:46:13:46:44 | this. | samConversion.kt:46:13:46:44 | | VarAccess | +| samConversion.kt:46:32:46:44 | ...->... | samConversion.kt:40:1:47:1 | fn | LambdaExpr | +| samConversion.kt:46:32:46:44 | Boolean | samConversion.kt:40:1:47:1 | fn | TypeAccess | +| samConversion.kt:46:32:46:44 | Function1 | samConversion.kt:40:1:47:1 | fn | TypeAccess | +| samConversion.kt:46:32:46:44 | Integer | samConversion.kt:40:1:47:1 | fn | TypeAccess | +| samConversion.kt:46:32:46:44 | boolean | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:46:34:46:34 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:46:39:46:42 | true | samConversion.kt:46:32:46:44 | invoke | BooleanLiteral | +| samConversion.kt:50:5:50:25 | boolean | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:50:12:50:15 | T | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:54:13:54:35 | Unit | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:54:21:54:26 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:54:29:54:34 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:57:9:60:1 | Unit | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:58:9:58:10 | i0 | samConversion.kt:57:9:60:1 | test | LocalVariableDeclExpr | +| samConversion.kt:58:14:58:45 | (...)... | samConversion.kt:57:9:60:1 | test | CastExpr | +| samConversion.kt:58:14:58:45 | ...=... | samConversion.kt:58:14:58:45 | | AssignExpr | +| samConversion.kt:58:14:58:45 | | samConversion.kt:58:14:58:45 | | VarAccess | +| samConversion.kt:58:14:58:45 | | samConversion.kt:58:14:58:45 | fn1 | VarAccess | +| samConversion.kt:58:14:58:45 | Function2 | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:58:14:58:45 | Integer | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:58:14:58:45 | Integer | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:58:14:58:45 | InterfaceFn1Sus | samConversion.kt:57:9:60:1 | test | TypeAccess | +| samConversion.kt:58:14:58:45 | InterfaceFn1Sus | samConversion.kt:57:9:60:1 | test | TypeAccess | +| samConversion.kt:58:14:58:45 | Unit | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:58:14:58:45 | Unit | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:58:14:58:45 | i | samConversion.kt:58:14:58:45 | fn1 | VarAccess | +| samConversion.kt:58:14:58:45 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:58:14:58:45 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:58:14:58:45 | invoke(...) | samConversion.kt:58:14:58:45 | fn1 | MethodCall | +| samConversion.kt:58:14:58:45 | j | samConversion.kt:58:14:58:45 | fn1 | VarAccess | +| samConversion.kt:58:14:58:45 | new (...) | samConversion.kt:57:9:60:1 | test | ClassInstanceExpr | +| samConversion.kt:58:14:58:45 | this | samConversion.kt:58:14:58:45 | | ThisAccess | +| samConversion.kt:58:14:58:45 | this. | samConversion.kt:58:14:58:45 | | VarAccess | +| samConversion.kt:58:30:58:45 | ...->... | samConversion.kt:57:9:60:1 | test | LambdaExpr | +| samConversion.kt:58:30:58:45 | Function2 | samConversion.kt:57:9:60:1 | test | TypeAccess | +| samConversion.kt:58:30:58:45 | Integer | samConversion.kt:57:9:60:1 | test | TypeAccess | +| samConversion.kt:58:30:58:45 | Integer | samConversion.kt:57:9:60:1 | test | TypeAccess | +| samConversion.kt:58:30:58:45 | Unit | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:58:30:58:45 | Unit | samConversion.kt:57:9:60:1 | test | TypeAccess | +| samConversion.kt:58:32:58:32 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:58:35:58:35 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:58:40:58:43 | INSTANCE | samConversion.kt:58:30:58:45 | invoke | VarAccess | +| samConversion.kt:59:5:59:6 | i0 | samConversion.kt:57:9:60:1 | test | VarAccess | +| samConversion.kt:59:5:59:15 | fn1(...) | samConversion.kt:57:9:60:1 | test | MethodCall | +| samConversion.kt:59:12:59:12 | 1 | samConversion.kt:57:9:60:1 | test | IntegerLiteral | +| samConversion.kt:59:14:59:14 | 2 | samConversion.kt:57:9:60:1 | test | IntegerLiteral | +| samConversion.kt:63:5:63:13 | ...=... | samConversion.kt:62:1:64:1 | PropertyRefsTest | KtInitializerAssignExpr | +| samConversion.kt:63:5:63:13 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:63:5:63:13 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:63:5:63:13 | this | samConversion.kt:63:5:63:13 | getX | ThisAccess | +| samConversion.kt:63:5:63:13 | this.x | samConversion.kt:63:5:63:13 | getX | VarAccess | +| samConversion.kt:63:5:63:13 | x | samConversion.kt:62:1:64:1 | PropertyRefsTest | VarAccess | +| samConversion.kt:63:13:63:13 | 1 | samConversion.kt:62:1:64:1 | PropertyRefsTest | IntegerLiteral | +| samConversion.kt:67:5:67:37 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:67:11:67:31 | PropertyRefsTest | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:71:5:71:16 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:74:1:77:1 | Unit | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:74:22:74:42 | PropertyRefsTest | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:75:9:75:13 | test1 | samConversion.kt:74:1:77:1 | propertyRefsTest | LocalVariableDeclExpr | +| samConversion.kt:75:17:75:33 | (...)... | samConversion.kt:74:1:77:1 | propertyRefsTest | CastExpr | +| samConversion.kt:75:17:75:33 | ...=... | samConversion.kt:75:17:75:33 | | AssignExpr | +| samConversion.kt:75:17:75:33 | | samConversion.kt:75:17:75:33 | | VarAccess | +| samConversion.kt:75:17:75:33 | | samConversion.kt:75:17:75:33 | f | VarAccess | +| samConversion.kt:75:17:75:33 | Function0 | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:75:17:75:33 | IntGetter | samConversion.kt:74:1:77:1 | propertyRefsTest | TypeAccess | +| samConversion.kt:75:17:75:33 | IntGetter | samConversion.kt:74:1:77:1 | propertyRefsTest | TypeAccess | +| samConversion.kt:75:17:75:33 | Integer | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:75:17:75:33 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:75:17:75:33 | invoke(...) | samConversion.kt:75:17:75:33 | f | MethodCall | +| samConversion.kt:75:17:75:33 | new (...) | samConversion.kt:74:1:77:1 | propertyRefsTest | ClassInstanceExpr | +| samConversion.kt:75:17:75:33 | this | samConversion.kt:75:17:75:33 | | ThisAccess | +| samConversion.kt:75:17:75:33 | this. | samConversion.kt:75:17:75:33 | | VarAccess | +| samConversion.kt:75:27:75:29 | prt | samConversion.kt:74:1:77:1 | propertyRefsTest | VarAccess | +| samConversion.kt:75:27:75:32 | ...::... | samConversion.kt:74:1:77:1 | propertyRefsTest | PropertyRefExpr | +| samConversion.kt:75:27:75:32 | ...=... | samConversion.kt:75:27:75:32 | | AssignExpr | +| samConversion.kt:75:27:75:32 | | samConversion.kt:75:27:75:32 | | VarAccess | +| samConversion.kt:75:27:75:32 | Integer | samConversion.kt:74:1:77:1 | propertyRefsTest | TypeAccess | +| samConversion.kt:75:27:75:32 | KProperty0 | samConversion.kt:74:1:77:1 | propertyRefsTest | TypeAccess | +| samConversion.kt:75:27:75:32 | PropertyRefsTest | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:75:27:75:32 | get(...) | samConversion.kt:75:27:75:32 | invoke | MethodCall | +| samConversion.kt:75:27:75:32 | getX(...) | samConversion.kt:75:27:75:32 | get | MethodCall | +| samConversion.kt:75:27:75:32 | this | samConversion.kt:75:27:75:32 | | ThisAccess | +| samConversion.kt:75:27:75:32 | this | samConversion.kt:75:27:75:32 | get | ThisAccess | +| samConversion.kt:75:27:75:32 | this | samConversion.kt:75:27:75:32 | invoke | ThisAccess | +| samConversion.kt:75:27:75:32 | this. | samConversion.kt:75:27:75:32 | | VarAccess | +| samConversion.kt:75:27:75:32 | this. | samConversion.kt:75:27:75:32 | get | VarAccess | +| samConversion.kt:76:9:76:13 | test2 | samConversion.kt:74:1:77:1 | propertyRefsTest | LocalVariableDeclExpr | +| samConversion.kt:76:17:76:55 | (...)... | samConversion.kt:74:1:77:1 | propertyRefsTest | CastExpr | +| samConversion.kt:76:17:76:55 | ...=... | samConversion.kt:76:17:76:55 | | AssignExpr | +| samConversion.kt:76:17:76:55 | | samConversion.kt:76:17:76:55 | | VarAccess | +| samConversion.kt:76:17:76:55 | | samConversion.kt:76:17:76:55 | f | VarAccess | +| samConversion.kt:76:17:76:55 | Function1 | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:76:17:76:55 | Integer | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:76:17:76:55 | PropertyRefsGetter | samConversion.kt:74:1:77:1 | propertyRefsTest | TypeAccess | +| samConversion.kt:76:17:76:55 | PropertyRefsGetter | samConversion.kt:74:1:77:1 | propertyRefsTest | TypeAccess | +| samConversion.kt:76:17:76:55 | PropertyRefsTest | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:76:17:76:55 | PropertyRefsTest | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:76:17:76:55 | int | file://:0:0:0:0 | | TypeAccess | +| samConversion.kt:76:17:76:55 | invoke(...) | samConversion.kt:76:17:76:55 | f | MethodCall | +| samConversion.kt:76:17:76:55 | new (...) | samConversion.kt:74:1:77:1 | propertyRefsTest | ClassInstanceExpr | +| samConversion.kt:76:17:76:55 | prt | samConversion.kt:76:17:76:55 | f | VarAccess | +| samConversion.kt:76:17:76:55 | this | samConversion.kt:76:17:76:55 | | ThisAccess | +| samConversion.kt:76:17:76:55 | this. | samConversion.kt:76:17:76:55 | | VarAccess | +| samConversion.kt:76:36:76:54 | ...::... | samConversion.kt:74:1:77:1 | propertyRefsTest | PropertyRefExpr | +| samConversion.kt:76:36:76:54 | Integer | samConversion.kt:74:1:77:1 | propertyRefsTest | TypeAccess | +| samConversion.kt:76:36:76:54 | KProperty1 | samConversion.kt:74:1:77:1 | propertyRefsTest | TypeAccess | +| samConversion.kt:76:36:76:54 | PropertyRefsTest | samConversion.kt:74:1:77:1 | propertyRefsTest | TypeAccess | +| samConversion.kt:76:36:76:54 | a0 | samConversion.kt:76:36:76:54 | get | VarAccess | +| samConversion.kt:76:36:76:54 | a0 | samConversion.kt:76:36:76:54 | invoke | VarAccess | +| samConversion.kt:76:36:76:54 | get(...) | samConversion.kt:76:36:76:54 | invoke | MethodCall | +| samConversion.kt:76:36:76:54 | getX(...) | samConversion.kt:76:36:76:54 | get | MethodCall | +| samConversion.kt:76:36:76:54 | this | samConversion.kt:76:36:76:54 | invoke | ThisAccess | +| whenExpr.kt:1:1:9:1 | int | file://:0:0:0:0 | | TypeAccess | +| whenExpr.kt:1:14:1:19 | int | file://:0:0:0:0 | | TypeAccess | +| whenExpr.kt:2:10:8:3 | | whenExpr.kt:1:1:9:1 | testWhen | StmtExpr | +| whenExpr.kt:2:10:8:3 | when ... | whenExpr.kt:1:1:9:1 | testWhen | WhenExpr | +| whenExpr.kt:2:15:2:15 | i | whenExpr.kt:1:1:9:1 | testWhen | VarAccess | +| whenExpr.kt:2:15:2:15 | tmp0_subject | whenExpr.kt:1:1:9:1 | testWhen | LocalVariableDeclExpr | +| whenExpr.kt:3:5:3:5 | 0 | whenExpr.kt:1:1:9:1 | testWhen | IntegerLiteral | +| whenExpr.kt:3:5:3:5 | ... (value equals) ... | whenExpr.kt:1:1:9:1 | testWhen | ValueEQExpr | +| whenExpr.kt:3:5:3:5 | tmp0_subject | whenExpr.kt:1:1:9:1 | testWhen | VarAccess | +| whenExpr.kt:3:10:3:10 | 1 | whenExpr.kt:1:1:9:1 | testWhen | IntegerLiteral | +| whenExpr.kt:4:5:4:5 | 1 | whenExpr.kt:1:1:9:1 | testWhen | IntegerLiteral | +| whenExpr.kt:4:5:4:5 | ... (value equals) ... | whenExpr.kt:1:1:9:1 | testWhen | ValueEQExpr | +| whenExpr.kt:4:5:4:5 | tmp0_subject | whenExpr.kt:1:1:9:1 | testWhen | VarAccess | +| whenExpr.kt:4:10:4:10 | 2 | whenExpr.kt:1:1:9:1 | testWhen | IntegerLiteral | +| whenExpr.kt:5:5:5:5 | 2 | whenExpr.kt:1:1:9:1 | testWhen | IntegerLiteral | +| whenExpr.kt:5:5:5:5 | ... (value equals) ... | whenExpr.kt:1:1:9:1 | testWhen | ValueEQExpr | +| whenExpr.kt:5:5:5:5 | tmp0_subject | whenExpr.kt:1:1:9:1 | testWhen | VarAccess | +| whenExpr.kt:5:17:5:17 | 3 | whenExpr.kt:1:1:9:1 | testWhen | IntegerLiteral | +| whenExpr.kt:6:5:6:5 | 3 | whenExpr.kt:1:1:9:1 | testWhen | IntegerLiteral | +| whenExpr.kt:6:5:6:5 | ... (value equals) ... | whenExpr.kt:1:1:9:1 | testWhen | ValueEQExpr | +| whenExpr.kt:6:5:6:5 | tmp0_subject | whenExpr.kt:1:1:9:1 | testWhen | VarAccess | +| whenExpr.kt:6:16:6:44 | Exception | whenExpr.kt:1:1:9:1 | testWhen | TypeAccess | +| whenExpr.kt:6:16:6:44 | new Exception(...) | whenExpr.kt:1:1:9:1 | testWhen | ClassInstanceExpr | +| whenExpr.kt:6:27:6:42 | "No threes please" | whenExpr.kt:1:1:9:1 | testWhen | StringLiteral | +| whenExpr.kt:7:13:7:15 | 999 | whenExpr.kt:1:1:9:1 | testWhen | IntegerLiteral | +| whenExpr.kt:7:13:7:15 | true | whenExpr.kt:1:1:9:1 | testWhen | BooleanLiteral | diff --git a/java/ql/test-kotlin2/library-tests/exprs/exprs.kt b/java/ql/test-kotlin2/library-tests/exprs/exprs.kt new file mode 100644 index 00000000000..faaddfe1cdb --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/exprs/exprs.kt @@ -0,0 +1,358 @@ +import java.awt.Polygon +import java.awt.Rectangle +import kotlin.experimental.* +fun topLevelMethod(x: Int, y: Int, + byx: Byte, byy: Byte, + sx: Short, sy: Short, + lx: Long, ly: Long, + dx: Double, dy: Double, + fx: Float, fy: Float, + ): Int { + val i1 = 1 + val i2 = x + y + val i3 = x - y + val i4 = x / y + val i5 = x % y + val i6 = x shl y + val i7 = x shr y + val i8 = x ushr y + val i9 = x and y + val i10 = x or y + val i11 = x xor y + val i12 = x.inv() + val i13 = x == y + val i14 = x != y + val i15 = x < y + val i16 = x <= y + val i17 = x > y + val i18 = x >= y + val i19 = x === y + val i20 = x !== y + val i21 = x in x .. y + val i22 = x !in x .. y + + val by1 = 1.0 + val by2 = byx + byy + val by3 = byx - byy + val by4 = byx / byy + val by5 = byx % byy + val by6 = byx == byy + val by7 = byx != byy + val by8 = byx < byy + val by9 = byx <= byy + val by10 = byx > byy + val by11 = byx >= byy + val by12 = byx === byy + val by13 = byx !== byy + val by14 = byx or byy + val by15 = byx and byy + val by16 = byx xor byy + + val s1 = 1.0 + val s2 = sx + sy + val s3 = sx - sy + val s4 = sx / sy + val s5 = sx % sy + val s6 = sx == sy + val s7 = sx != sy + val s8 = sx < sy + val s9 = sx <= sy + val s10 = sx > sy + val s11 = sx >= sy + val s12 = sx === sy + val s13 = sx !== sy + val s14 = sx or sy + val s15 = sx and sy + val s16 = sx xor sy + + val l1 = 1.0 + val l2 = lx + ly + val l3 = lx - ly + val l4 = lx / ly + val l5 = lx % ly + val l6 = lx shl y + val l7 = lx shr y + val l8 = lx ushr y + val l9 = lx and ly + val l10 = lx or ly + val l11 = lx xor ly + val l12 = lx.inv() + val l13 = lx == ly + val l14 = lx != ly + val l15 = lx < ly + val l16 = lx <= ly + val l17 = lx > ly + val l18 = lx >= ly + val l19 = lx === ly + val l20 = lx !== ly + + val d1 = 1.0 + val d2 = dx + dy + val d3 = dx - dy + val d4 = dx / dy + val d5 = dx % dy + val d6 = dx == dy + val d7 = dx != dy + val d8 = dx < dy + val d9 = dx <= dy + val d10 = dx > dy + val d11 = dx >= dy + val d12 = dx === dy + val d13 = dx !== dy + + val f1 = 1.0 + val f2 = fx + fy + val f3 = fx - fy + val f4 = fx / fy + val f5 = fx % fy + val f6 = fx == fy + val f7 = fx != fy + val f8 = fx < fy + val f9 = fx <= fy + val f10 = fx > fy + val f11 = fx >= fy + val f12 = fx === fy + val f13 = fx !== fy + + val b1 = true + val b2 = false + val b3 = b1 && b2 + val b4 = b1 || b2 + val b5 = !b1 + + val c = 'x' + val str = "string lit" + val strWithQuote = "string \" lit" + val b6 = i1 is Int + val b7 = i1 !is Int + val b8 = b7 as Boolean + val str1: String = "string lit" + val str2: String? = "string lit" + val str3: String? = null + val str4: String = "foo $str1 bar $str2 baz" + val str5: String = "foo ${str1 + str2} bar ${str2 + str1} baz" + val str6 = str1 + str2 + + var variable = 10 + while (variable > 0) { + variable-- + } + + return 123 + 456 +} + +fun getClass() { + val d = true::class +} + +class C(val n: Int) { + fun foo(): C { return C(42) } +} + +open class Root {} +class Subclass1: Root() {} +class Subclass2: Root() {} + +fun typeTests(x: Root, y: Subclass1) { + if(x is Subclass1) { + val x1: Subclass1 = x + } + val y1: Subclass1 = if (x is Subclass1) { x } else { y } + var q = 1 + if (x is Subclass1) { q = 2 } else { q = 3 } +} + +fun foo(p: Polygon) { + val r = p.getBounds() + if(r != null) { + val r2: Rectangle = r + val height = r2.height + r2.height = 3 + } +} + +enum class Direction { + NORTH, SOUTH, WEST, EAST +} + +enum class Color(val rgb: Int) { + RED(0xFF0000), + GREEN(0x00FF00), + BLUE(0x0000FF) +} + +fun enums() { + val south = Direction.SOUTH + val green = Color.GREEN +} + +interface Interface1 {} + +class Class1 { + val a1 = 1 + private fun getObject() : Any { + val a2 = 2 + return object : Interface1 { + val a3: String = (a1 + a2).toString() + } + } +} + +fun notNullAssertion(x: Any?) { + val y: Any = x!! +} + +class Class2 { + fun x(aa: Any?, s: String?) { + + val a = aa.toString() + val b0 = s.plus(5) + val b1 = s + 5 + val b2 = s!!.plus(5) + val b3 = s!! + 5 + val c0 = enumValues() + val c1 = Color.values() + val d0 = enumValueOf("GREEN") + val d1 = Color.valueOf("GREEN") + } +} + +fun todo() { + TODO() +} + +class SomeClass1 {} +fun fnClassRef() { + val x = SomeClass1::class +} + +fun equalityTests(notNullPrimitive: Int, nullablePrimitive: Int?, notNullReftype: String, nullableReftype: String?) { + val b1 = notNullPrimitive == notNullPrimitive + val b2 = notNullPrimitive == nullablePrimitive + val b3 = nullablePrimitive == nullablePrimitive + val b4 = notNullReftype == notNullReftype + val b5 = notNullReftype == nullableReftype + val b6 = nullableReftype == nullableReftype + val b7 = notNullPrimitive != notNullPrimitive + val b8 = notNullPrimitive != nullablePrimitive + val b9 = nullablePrimitive != nullablePrimitive + val b10 = notNullReftype != notNullReftype + val b11 = notNullReftype != nullableReftype + val b12 = nullableReftype != nullableReftype + val b13 = notNullPrimitive == null + val b14 = nullablePrimitive == null + val b15 = notNullReftype == null + val b16 = nullableReftype == null + val b17 = notNullPrimitive != null + val b18 = nullablePrimitive != null + val b19 = notNullReftype != null + val b20 = nullableReftype != null +} + +fun mulOperators(x: Int, y: Int, + byx: Byte, byy: Byte, + sx: Short, sy: Short, + lx: Long, ly: Long, + dx: Double, dy: Double, + fx: Float, fy: Float) { + + val i = x * y + val b = byx * byy + val l = lx * ly + val d = dx * dy + val f = fx * fy + +} + +fun inPlaceOperators() { + + var updated = 0 + updated += 1 + updated -= 1 + updated *= 1 + updated /= 1 + updated %= 1 + +} + +inline fun > getEnumValues() = enumValues() + +fun callToEnumValues() { + enumValues() + getEnumValues() +} + +fun unaryExprs(i: Int, d: Double, b: Byte, s: Short, l: Long, f: Float) { + -i + +i + -d + +d + var i0 = 1 + val i1 = 1 + i0++ + ++i0 + i0-- + --i0 + i0.inc() + i0.dec() + i1.inc() + i1.dec() + i.inv() + + -b + +b + var b0: Byte = 1 + val b1: Byte = 1 + b0++ + ++b0 + b0-- + --b0 + b0.inc() + b0.dec() + b1.inc() + b1.dec() + b.inv() + + -s + +s + var s0: Short = 1 + val s1: Short = 1 + s0++ + ++s0 + s0-- + --s0 + s0.inc() + s0.dec() + s1.inc() + s1.dec() + s.inv() + + -l + +l + var l0: Long = 1 + val l1: Long = 1 + l0++ + ++l0 + l0-- + --l0 + l0.inc() + l0.dec() + l1.inc() + l1.dec() + l.inv() + + +f + -f +} + +// Diagnostic Matches: % Couldn't find a Java equivalent function to kotlin.Byte.dec in java.lang.Byte % +// Diagnostic Matches: % Couldn't find a Java equivalent function to kotlin.Byte.inc in java.lang.Byte % +// Diagnostic Matches: % Couldn't find a Java equivalent function to kotlin.Byte.toInt in java.lang.Byte % +// Diagnostic Matches: % Couldn't find a Java equivalent function to kotlin.Int.dec in java.lang.Integer % +// Diagnostic Matches: % Couldn't find a Java equivalent function to kotlin.Int.inc in java.lang.Integer % +// Diagnostic Matches: % Couldn't find a Java equivalent function to kotlin.Int.rangeTo in java.lang.Integer % +// Diagnostic Matches: % Couldn't find a Java equivalent function to kotlin.Short.inc in java.lang.Short % +// Diagnostic Matches: % Couldn't find a Java equivalent function to kotlin.Short.dec in java.lang.Short % +// Diagnostic Matches: % Couldn't find a Java equivalent function to kotlin.Short.toInt in java.lang.Short % +// Diagnostic Matches: % Couldn't find a Java equivalent function to kotlin.Long.dec in java.lang.Long % +// Diagnostic Matches: % Couldn't find a Java equivalent function to kotlin.Long.inc in java.lang.Long % diff --git a/java/ql/test-kotlin2/library-tests/exprs/exprs.ql b/java/ql/test-kotlin2/library-tests/exprs/exprs.ql new file mode 100644 index 00000000000..b39528a55e4 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/exprs/exprs.ql @@ -0,0 +1,39 @@ +import java + +newtype TMaybeElement = + TElement(Element e) or + TNoElement() + +class MaybeElement extends TMaybeElement { + abstract string toString(); + + abstract Location getLocation(); +} + +class YesMaybeElement extends MaybeElement { + Element e; + + YesMaybeElement() { this = TElement(e) } + + override string toString() { result = e.toString() } + + override Location getLocation() { result = e.getLocation() } +} + +class NoMaybeElement extends MaybeElement { + NoMaybeElement() { this = TNoElement() } + + override string toString() { result = "" } + + override Location getLocation() { none() } +} + +MaybeElement enclosingCallable(Expr e) { + if exists(e.getEnclosingCallable()) + then result = TElement(e.getEnclosingCallable()) + else result = TNoElement() +} + +from Expr e +where e.getFile().isSourceFile() +select e, enclosingCallable(e), e.getPrimaryQlClasses() diff --git a/java/ql/test-kotlin2/library-tests/exprs/funcExprs.expected b/java/ql/test-kotlin2/library-tests/exprs/funcExprs.expected new file mode 100644 index 00000000000..b79725a80e3 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/exprs/funcExprs.expected @@ -0,0 +1,253 @@ +lambdaExpr +| delegatedProperties.kt:6:32:9:9 | ...->... | stmt body | delegatedProperties.kt:6:32:9:9 | invoke | invoke() | delegatedProperties.kt:6:32:9:9 | new Function0(...) { ... } | +| funcExprs.kt:22:26:22:33 | ...->... | stmt body | funcExprs.kt:22:26:22:33 | invoke | invoke() | funcExprs.kt:22:26:22:33 | new Function0(...) { ... } | +| funcExprs.kt:23:26:23:33 | ...->... | stmt body | funcExprs.kt:23:26:23:33 | invoke | invoke() | funcExprs.kt:23:26:23:33 | new Function0(...) { ... } | +| funcExprs.kt:24:26:24:33 | ...->... | stmt body | funcExprs.kt:24:26:24:33 | invoke | invoke() | funcExprs.kt:24:26:24:33 | new Function0(...) { ... } | +| funcExprs.kt:25:29:25:38 | ...->... | stmt body | funcExprs.kt:25:29:25:38 | invoke | invoke(int) | funcExprs.kt:25:29:25:38 | new Function1(...) { ... } | +| funcExprs.kt:26:29:26:34 | ...->... | stmt body | funcExprs.kt:26:29:26:34 | invoke | invoke(int) | funcExprs.kt:26:29:26:34 | new Function1(...) { ... } | +| funcExprs.kt:27:29:27:42 | ...->... | stmt body | funcExprs.kt:27:29:27:42 | invoke | invoke(int) | funcExprs.kt:27:29:27:42 | new Function1(...) { ... } | +| funcExprs.kt:29:29:29:37 | ...->... | stmt body | funcExprs.kt:29:29:29:37 | invoke | invoke(java.lang.Object) | funcExprs.kt:29:29:29:37 | new Function1(...) { ... } | +| funcExprs.kt:30:28:30:50 | ...->... | stmt body | funcExprs.kt:30:28:30:50 | invoke | invoke(int,int) | funcExprs.kt:30:28:30:50 | new Function2(...) { ... } | +| funcExprs.kt:31:28:31:40 | ...->... | stmt body | funcExprs.kt:31:28:31:40 | invoke | invoke(int,int) | funcExprs.kt:31:28:31:40 | new Function2(...) { ... } | +| funcExprs.kt:32:28:32:44 | ...->... | stmt body | funcExprs.kt:32:28:32:44 | invoke | invoke(int,int) | funcExprs.kt:32:28:32:44 | new Function2(...) { ... } | +| funcExprs.kt:33:28:33:51 | ...->... | stmt body | funcExprs.kt:33:28:33:51 | invoke | invoke(int) | funcExprs.kt:33:28:33:51 | new Function1>(...) { ... } | +| funcExprs.kt:33:37:33:47 | ...->... | stmt body | funcExprs.kt:33:37:33:47 | invoke | invoke(int) | funcExprs.kt:33:37:33:47 | new Function1(...) { ... } | +| funcExprs.kt:35:29:35:112 | ...->... | stmt body | funcExprs.kt:35:29:35:112 | invoke | invoke(int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int) | funcExprs.kt:35:29:35:112 | new Function22(...) { ... } | +| funcExprs.kt:36:29:36:117 | ...->... | stmt body | funcExprs.kt:36:29:36:117 | invoke | invoke(int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int) | funcExprs.kt:36:29:36:117 | new FunctionN(...) { ... } | +| funcExprs.kt:75:12:75:22 | ...->... | stmt body | funcExprs.kt:75:12:75:22 | invoke | invoke(Class3.Generic) | funcExprs.kt:75:12:75:22 | new Function1>,String>(...) { ... } | +| funcExprs.kt:83:31:83:51 | ...->... | stmt body | funcExprs.kt:83:31:83:51 | invoke | invoke(int) | funcExprs.kt:83:31:83:51 | new Function1(...) { ... } | +| funcExprs.kt:86:39:86:59 | ...->... | stmt body | funcExprs.kt:86:39:86:59 | invoke | invoke(int) | funcExprs.kt:86:39:86:59 | new Function1(...) { ... } | +| funcExprs.kt:90:15:90:69 | ...->... | stmt body | funcExprs.kt:90:15:90:69 | invoke | invoke(int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int) | funcExprs.kt:90:15:90:69 | new FunctionN(...) { ... } | +| funcExprs.kt:94:15:94:67 | ...->... | stmt body | funcExprs.kt:94:15:94:67 | invoke | invoke(int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int) | funcExprs.kt:94:15:94:67 | new Function22(...) { ... } | +| samConversion.kt:2:31:2:45 | ...->... | stmt body | samConversion.kt:2:31:2:45 | invoke | invoke(int) | samConversion.kt:2:31:2:45 | new Function1(...) { ... } | +| samConversion.kt:4:27:4:42 | ...->... | stmt body | samConversion.kt:4:27:4:42 | invoke | invoke(int,int) | samConversion.kt:4:27:4:42 | new Function2(...) { ... } | +| samConversion.kt:7:29:7:46 | ...->... | stmt body | samConversion.kt:7:29:7:46 | invoke | invoke(java.lang.String,int) | samConversion.kt:7:29:7:46 | new Function2(...) { ... } | +| samConversion.kt:9:33:11:5 | ...->... | stmt body | samConversion.kt:9:33:11:5 | invoke | invoke(int) | samConversion.kt:9:33:11:5 | new Function1(...) { ... } | +| samConversion.kt:11:12:13:5 | ...->... | stmt body | samConversion.kt:11:12:13:5 | invoke | invoke(int) | samConversion.kt:11:12:13:5 | new Function1(...) { ... } | +| samConversion.kt:43:31:45:68 | ...->... | stmt body | samConversion.kt:43:31:45:68 | invoke | invoke(int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int) | samConversion.kt:43:31:45:68 | new FunctionN(...) { ... } | +| samConversion.kt:46:32:46:44 | ...->... | stmt body | samConversion.kt:46:32:46:44 | invoke | invoke(int) | samConversion.kt:46:32:46:44 | new Function1(...) { ... } | +| samConversion.kt:58:30:58:45 | ...->... | stmt body | samConversion.kt:58:30:58:45 | invoke | invoke(int,int) | samConversion.kt:58:30:58:45 | new Function2(...) { ... } | +memberRefExprs +| funcExprs.kt:38:26:38:38 | ...::... | funcExprs.kt:38:26:38:38 | invoke | invoke() | funcExprs.kt:38:26:38:38 | new Function0(...) { ... } | +| funcExprs.kt:39:26:39:36 | ...::... | funcExprs.kt:39:26:39:36 | invoke | invoke() | funcExprs.kt:39:26:39:36 | new Function0(...) { ... } | +| funcExprs.kt:40:29:40:41 | ...::... | funcExprs.kt:40:29:40:41 | invoke | invoke(int) | funcExprs.kt:40:29:40:41 | new Function1(...) { ... } | +| funcExprs.kt:41:29:41:39 | ...::... | funcExprs.kt:41:29:41:39 | invoke | invoke(FuncRef,int) | funcExprs.kt:41:29:41:39 | new Function2(...) { ... } | +| funcExprs.kt:42:29:42:33 | ...::... | funcExprs.kt:42:29:42:33 | invoke | invoke(int) | funcExprs.kt:42:29:42:33 | new Function1(...) { ... } | +| funcExprs.kt:43:28:43:34 | ...::... | funcExprs.kt:43:28:43:34 | invoke | invoke(int,int) | funcExprs.kt:43:28:43:34 | new Function2(...) { ... } | +| funcExprs.kt:44:29:44:42 | ...::... | funcExprs.kt:44:29:44:42 | invoke | invoke(int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int) | funcExprs.kt:44:29:44:42 | new Function22(...) { ... } | +| funcExprs.kt:45:29:45:42 | ...::... | funcExprs.kt:45:29:45:42 | invoke | invoke(java.lang.Object[]) | funcExprs.kt:45:29:45:42 | new FunctionN(...) { ... } | +| funcExprs.kt:46:30:46:41 | ...::... | funcExprs.kt:46:30:46:41 | invoke | invoke(java.lang.Object[]) | funcExprs.kt:46:30:46:41 | new FunctionN(...) { ... } | +| funcExprs.kt:49:26:49:32 | ...::... | funcExprs.kt:49:26:49:32 | invoke | invoke() | funcExprs.kt:49:26:49:32 | new Function0(...) { ... } | +| funcExprs.kt:51:8:51:16 | ...::... | funcExprs.kt:51:8:51:16 | invoke | invoke() | funcExprs.kt:51:8:51:16 | new Function0(...) { ... } | +| kFunctionInvoke.kt:8:44:8:47 | ...::... | kFunctionInvoke.kt:8:44:8:47 | invoke | invoke(java.lang.String) | kFunctionInvoke.kt:8:44:8:47 | new Function1(...) { ... } | +| samConversion.kt:5:27:5:31 | ...::... | samConversion.kt:5:27:5:31 | invoke | invoke(int,int) | samConversion.kt:5:27:5:31 | new Function2(...) { ... } | +| samConversion.kt:41:13:41:16 | ...::... | samConversion.kt:41:13:41:16 | invoke | invoke(java.lang.Object[]) | samConversion.kt:41:13:41:16 | new FunctionN(...) { ... } | +lambda_modifiers +| delegatedProperties.kt:6:32:9:9 | ...->... | delegatedProperties.kt:6:32:9:9 | invoke | final, override, public | +| funcExprs.kt:22:26:22:33 | ...->... | funcExprs.kt:22:26:22:33 | invoke | final, override, public | +| funcExprs.kt:23:26:23:33 | ...->... | funcExprs.kt:23:26:23:33 | invoke | final, override, public | +| funcExprs.kt:24:26:24:33 | ...->... | funcExprs.kt:24:26:24:33 | invoke | final, override, public | +| funcExprs.kt:25:29:25:38 | ...->... | funcExprs.kt:25:29:25:38 | invoke | final, override, public | +| funcExprs.kt:26:29:26:34 | ...->... | funcExprs.kt:26:29:26:34 | invoke | final, override, public | +| funcExprs.kt:27:29:27:42 | ...->... | funcExprs.kt:27:29:27:42 | invoke | final, override, public | +| funcExprs.kt:29:29:29:37 | ...->... | funcExprs.kt:29:29:29:37 | invoke | final, override, public | +| funcExprs.kt:30:28:30:50 | ...->... | funcExprs.kt:30:28:30:50 | invoke | final, override, public | +| funcExprs.kt:31:28:31:40 | ...->... | funcExprs.kt:31:28:31:40 | invoke | final, override, public | +| funcExprs.kt:32:28:32:44 | ...->... | funcExprs.kt:32:28:32:44 | invoke | final, override, public | +| funcExprs.kt:33:28:33:51 | ...->... | funcExprs.kt:33:28:33:51 | invoke | final, override, public | +| funcExprs.kt:33:37:33:47 | ...->... | funcExprs.kt:33:37:33:47 | invoke | final, override, public | +| funcExprs.kt:35:29:35:112 | ...->... | funcExprs.kt:35:29:35:112 | invoke | final, override, public | +| funcExprs.kt:36:29:36:117 | ...->... | funcExprs.kt:36:29:36:117 | invoke | final, public | +| funcExprs.kt:36:29:36:117 | ...->... | funcExprs.kt:36:29:36:117 | invoke | override, public | +| funcExprs.kt:75:12:75:22 | ...->... | funcExprs.kt:75:12:75:22 | invoke | final, override, public | +| funcExprs.kt:83:31:83:51 | ...->... | funcExprs.kt:83:31:83:51 | invoke | final, override, public | +| funcExprs.kt:86:39:86:59 | ...->... | funcExprs.kt:86:39:86:59 | invoke | final, override, public, suspend | +| funcExprs.kt:90:15:90:69 | ...->... | funcExprs.kt:90:15:90:69 | invoke | final, public | +| funcExprs.kt:90:15:90:69 | ...->... | funcExprs.kt:90:15:90:69 | invoke | override, public | +| funcExprs.kt:94:15:94:67 | ...->... | funcExprs.kt:94:15:94:67 | invoke | final, override, public, suspend | +| samConversion.kt:2:31:2:45 | ...->... | samConversion.kt:2:31:2:45 | invoke | final, override, public | +| samConversion.kt:4:27:4:42 | ...->... | samConversion.kt:4:27:4:42 | invoke | final, override, public | +| samConversion.kt:7:29:7:46 | ...->... | samConversion.kt:7:29:7:46 | invoke | final, override, public | +| samConversion.kt:9:33:11:5 | ...->... | samConversion.kt:9:33:11:5 | invoke | final, override, public | +| samConversion.kt:11:12:13:5 | ...->... | samConversion.kt:11:12:13:5 | invoke | final, override, public | +| samConversion.kt:43:31:45:68 | ...->... | samConversion.kt:43:31:45:68 | invoke | final, public | +| samConversion.kt:43:31:45:68 | ...->... | samConversion.kt:43:31:45:68 | invoke | override, public | +| samConversion.kt:46:32:46:44 | ...->... | samConversion.kt:46:32:46:44 | invoke | final, override, public | +| samConversion.kt:58:30:58:45 | ...->... | samConversion.kt:58:30:58:45 | invoke | final, override, public, suspend | +anon_class_member_modifiers +| delegatedProperties.kt:6:24:9:9 | new KProperty0(...) { ... } | delegatedProperties.kt:6:24:9:9 | get | override, public | +| delegatedProperties.kt:6:24:9:9 | new KProperty0(...) { ... } | delegatedProperties.kt:6:24:9:9 | invoke | override, public | +| delegatedProperties.kt:6:32:9:9 | new Function0(...) { ... } | delegatedProperties.kt:6:32:9:9 | invoke | final, override, public | +| delegatedProperties.kt:19:31:19:51 | new KMutableProperty0(...) { ... } | delegatedProperties.kt:19:31:19:51 | get | override, public | +| delegatedProperties.kt:19:31:19:51 | new KMutableProperty0(...) { ... } | delegatedProperties.kt:19:31:19:51 | get | override, public | +| delegatedProperties.kt:19:31:19:51 | new KMutableProperty0(...) { ... } | delegatedProperties.kt:19:31:19:51 | invoke | override, public | +| delegatedProperties.kt:19:31:19:51 | new KMutableProperty0(...) { ... } | delegatedProperties.kt:19:31:19:51 | invoke | override, public | +| delegatedProperties.kt:19:31:19:51 | new KMutableProperty0(...) { ... } | delegatedProperties.kt:19:31:19:51 | set | override, public | +| delegatedProperties.kt:19:31:19:51 | new KMutableProperty0(...) { ... } | delegatedProperties.kt:19:31:19:51 | set | override, public | +| delegatedProperties.kt:23:26:23:31 | new KProperty0(...) { ... } | delegatedProperties.kt:23:26:23:31 | get | override, public | +| delegatedProperties.kt:23:26:23:31 | new KProperty0(...) { ... } | delegatedProperties.kt:23:26:23:31 | invoke | override, public | +| delegatedProperties.kt:25:64:31:9 | new ReadWriteProperty(...) { ... } | delegatedProperties.kt:26:13:26:28 | getCurValue | final, public | +| delegatedProperties.kt:25:64:31:9 | new ReadWriteProperty(...) { ... } | delegatedProperties.kt:26:13:26:28 | setCurValue | final, public | +| delegatedProperties.kt:25:64:31:9 | new ReadWriteProperty(...) { ... } | delegatedProperties.kt:27:22:27:88 | getValue | override, public | +| delegatedProperties.kt:25:64:31:9 | new ReadWriteProperty(...) { ... } | delegatedProperties.kt:28:22:30:13 | setValue | override, public | +| delegatedProperties.kt:33:27:33:47 | new KProperty0(...) { ... } | delegatedProperties.kt:33:27:33:47 | get | override, public | +| delegatedProperties.kt:33:27:33:47 | new KProperty0(...) { ... } | delegatedProperties.kt:33:27:33:47 | invoke | override, public | +| delegatedProperties.kt:34:28:34:48 | new KMutableProperty0(...) { ... } | delegatedProperties.kt:34:28:34:48 | get | override, public | +| delegatedProperties.kt:34:28:34:48 | new KMutableProperty0(...) { ... } | delegatedProperties.kt:34:28:34:48 | get | override, public | +| delegatedProperties.kt:34:28:34:48 | new KMutableProperty0(...) { ... } | delegatedProperties.kt:34:28:34:48 | invoke | override, public | +| delegatedProperties.kt:34:28:34:48 | new KMutableProperty0(...) { ... } | delegatedProperties.kt:34:28:34:48 | invoke | override, public | +| delegatedProperties.kt:34:28:34:48 | new KMutableProperty0(...) { ... } | delegatedProperties.kt:34:28:34:48 | set | override, public | +| delegatedProperties.kt:34:28:34:48 | new KMutableProperty0(...) { ... } | delegatedProperties.kt:34:28:34:48 | set | override, public | +| delegatedProperties.kt:39:31:39:51 | new KProperty0(...) { ... } | delegatedProperties.kt:39:31:39:51 | get | override, public | +| delegatedProperties.kt:39:31:39:51 | new KProperty0(...) { ... } | delegatedProperties.kt:39:31:39:51 | get | override, public | +| delegatedProperties.kt:39:31:39:51 | new KProperty0(...) { ... } | delegatedProperties.kt:39:31:39:51 | invoke | override, public | +| delegatedProperties.kt:39:31:39:51 | new KProperty0(...) { ... } | delegatedProperties.kt:39:31:39:51 | invoke | override, public | +| delegatedProperties.kt:42:27:42:47 | new KMutableProperty1(...) { ... } | delegatedProperties.kt:42:27:42:47 | get | override, public | +| delegatedProperties.kt:42:27:42:47 | new KMutableProperty1(...) { ... } | delegatedProperties.kt:42:27:42:47 | get | override, public | +| delegatedProperties.kt:42:27:42:47 | new KMutableProperty1(...) { ... } | delegatedProperties.kt:42:27:42:47 | invoke | override, public | +| delegatedProperties.kt:42:27:42:47 | new KMutableProperty1(...) { ... } | delegatedProperties.kt:42:27:42:47 | invoke | override, public | +| delegatedProperties.kt:42:27:42:47 | new KMutableProperty1(...) { ... } | delegatedProperties.kt:42:27:42:47 | set | override, public | +| delegatedProperties.kt:42:27:42:47 | new KMutableProperty1(...) { ... } | delegatedProperties.kt:42:27:42:47 | set | override, public | +| delegatedProperties.kt:66:33:66:50 | new KMutableProperty1(...) { ... } | delegatedProperties.kt:66:33:66:50 | get | override, public | +| delegatedProperties.kt:66:33:66:50 | new KMutableProperty1(...) { ... } | delegatedProperties.kt:66:33:66:50 | get | override, public | +| delegatedProperties.kt:66:33:66:50 | new KMutableProperty1(...) { ... } | delegatedProperties.kt:66:33:66:50 | invoke | override, public | +| delegatedProperties.kt:66:33:66:50 | new KMutableProperty1(...) { ... } | delegatedProperties.kt:66:33:66:50 | invoke | override, public | +| delegatedProperties.kt:66:33:66:50 | new KMutableProperty1(...) { ... } | delegatedProperties.kt:66:33:66:50 | set | override, public | +| delegatedProperties.kt:66:33:66:50 | new KMutableProperty1(...) { ... } | delegatedProperties.kt:66:33:66:50 | set | override, public | +| delegatedProperties.kt:66:36:66:50 | new KMutableProperty0(...) { ... } | delegatedProperties.kt:66:36:66:50 | get | override, public | +| delegatedProperties.kt:66:36:66:50 | new KMutableProperty0(...) { ... } | delegatedProperties.kt:66:36:66:50 | invoke | override, public | +| delegatedProperties.kt:66:36:66:50 | new KMutableProperty0(...) { ... } | delegatedProperties.kt:66:36:66:50 | set | override, public | +| delegatedProperties.kt:67:33:67:53 | new KMutableProperty1(...) { ... } | delegatedProperties.kt:67:33:67:53 | get | override, public | +| delegatedProperties.kt:67:33:67:53 | new KMutableProperty1(...) { ... } | delegatedProperties.kt:67:33:67:53 | get | override, public | +| delegatedProperties.kt:67:33:67:53 | new KMutableProperty1(...) { ... } | delegatedProperties.kt:67:33:67:53 | invoke | override, public | +| delegatedProperties.kt:67:33:67:53 | new KMutableProperty1(...) { ... } | delegatedProperties.kt:67:33:67:53 | invoke | override, public | +| delegatedProperties.kt:67:33:67:53 | new KMutableProperty1(...) { ... } | delegatedProperties.kt:67:33:67:53 | set | override, public | +| delegatedProperties.kt:67:33:67:53 | new KMutableProperty1(...) { ... } | delegatedProperties.kt:67:33:67:53 | set | override, public | +| delegatedProperties.kt:67:36:67:53 | new KMutableProperty1(...) { ... } | delegatedProperties.kt:67:36:67:53 | get | override, public | +| delegatedProperties.kt:67:36:67:53 | new KMutableProperty1(...) { ... } | delegatedProperties.kt:67:36:67:53 | invoke | override, public | +| delegatedProperties.kt:67:36:67:53 | new KMutableProperty1(...) { ... } | delegatedProperties.kt:67:36:67:53 | set | override, public | +| delegatedProperties.kt:69:36:69:56 | new KMutableProperty1(...) { ... } | delegatedProperties.kt:69:36:69:56 | get | override, public | +| delegatedProperties.kt:69:36:69:56 | new KMutableProperty1(...) { ... } | delegatedProperties.kt:69:36:69:56 | get | override, public | +| delegatedProperties.kt:69:36:69:56 | new KMutableProperty1(...) { ... } | delegatedProperties.kt:69:36:69:56 | invoke | override, public | +| delegatedProperties.kt:69:36:69:56 | new KMutableProperty1(...) { ... } | delegatedProperties.kt:69:36:69:56 | invoke | override, public | +| delegatedProperties.kt:69:36:69:56 | new KMutableProperty1(...) { ... } | delegatedProperties.kt:69:36:69:56 | set | override, public | +| delegatedProperties.kt:69:36:69:56 | new KMutableProperty1(...) { ... } | delegatedProperties.kt:69:36:69:56 | set | override, public | +| delegatedProperties.kt:69:39:69:56 | new KMutableProperty0(...) { ... } | delegatedProperties.kt:69:39:69:56 | get | override, public | +| delegatedProperties.kt:69:39:69:56 | new KMutableProperty0(...) { ... } | delegatedProperties.kt:69:39:69:56 | invoke | override, public | +| delegatedProperties.kt:69:39:69:56 | new KMutableProperty0(...) { ... } | delegatedProperties.kt:69:39:69:56 | set | override, public | +| delegatedProperties.kt:70:36:70:59 | new KMutableProperty1(...) { ... } | delegatedProperties.kt:70:36:70:59 | get | override, public | +| delegatedProperties.kt:70:36:70:59 | new KMutableProperty1(...) { ... } | delegatedProperties.kt:70:36:70:59 | get | override, public | +| delegatedProperties.kt:70:36:70:59 | new KMutableProperty1(...) { ... } | delegatedProperties.kt:70:36:70:59 | invoke | override, public | +| delegatedProperties.kt:70:36:70:59 | new KMutableProperty1(...) { ... } | delegatedProperties.kt:70:36:70:59 | invoke | override, public | +| delegatedProperties.kt:70:36:70:59 | new KMutableProperty1(...) { ... } | delegatedProperties.kt:70:36:70:59 | set | override, public | +| delegatedProperties.kt:70:36:70:59 | new KMutableProperty1(...) { ... } | delegatedProperties.kt:70:36:70:59 | set | override, public | +| delegatedProperties.kt:70:39:70:59 | new KMutableProperty1(...) { ... } | delegatedProperties.kt:70:39:70:59 | get | override, public | +| delegatedProperties.kt:70:39:70:59 | new KMutableProperty1(...) { ... } | delegatedProperties.kt:70:39:70:59 | invoke | override, public | +| delegatedProperties.kt:70:39:70:59 | new KMutableProperty1(...) { ... } | delegatedProperties.kt:70:39:70:59 | set | override, public | +| delegatedProperties.kt:72:36:72:56 | new KProperty1(...) { ... } | delegatedProperties.kt:72:36:72:56 | get | override, public | +| delegatedProperties.kt:72:36:72:56 | new KProperty1(...) { ... } | delegatedProperties.kt:72:36:72:56 | invoke | override, public | +| delegatedProperties.kt:72:39:72:56 | new KProperty0(...) { ... } | delegatedProperties.kt:72:39:72:56 | get | override, public | +| delegatedProperties.kt:72:39:72:56 | new KProperty0(...) { ... } | delegatedProperties.kt:72:39:72:56 | invoke | override, public | +| delegatedProperties.kt:73:36:73:56 | new KProperty1(...) { ... } | delegatedProperties.kt:73:36:73:56 | get | override, public | +| delegatedProperties.kt:73:36:73:56 | new KProperty1(...) { ... } | delegatedProperties.kt:73:36:73:56 | invoke | override, public | +| delegatedProperties.kt:73:39:73:56 | new KProperty1(...) { ... } | delegatedProperties.kt:73:39:73:56 | get | override, public | +| delegatedProperties.kt:73:39:73:56 | new KProperty1(...) { ... } | delegatedProperties.kt:73:39:73:56 | invoke | override, public | +| delegatedProperties.kt:75:39:75:78 | new KProperty1(...) { ... } | delegatedProperties.kt:75:39:75:78 | get | override, public | +| delegatedProperties.kt:75:39:75:78 | new KProperty1(...) { ... } | delegatedProperties.kt:75:39:75:78 | invoke | override, public | +| delegatedProperties.kt:75:42:75:78 | new KProperty0(...) { ... } | delegatedProperties.kt:75:42:75:78 | get | override, public | +| delegatedProperties.kt:75:42:75:78 | new KProperty0(...) { ... } | delegatedProperties.kt:75:42:75:78 | invoke | override, public | +| delegatedProperties.kt:77:34:77:49 | new KMutableProperty1(...) { ... } | delegatedProperties.kt:77:34:77:49 | get | override, public | +| delegatedProperties.kt:77:34:77:49 | new KMutableProperty1(...) { ... } | delegatedProperties.kt:77:34:77:49 | get | override, public | +| delegatedProperties.kt:77:34:77:49 | new KMutableProperty1(...) { ... } | delegatedProperties.kt:77:34:77:49 | invoke | override, public | +| delegatedProperties.kt:77:34:77:49 | new KMutableProperty1(...) { ... } | delegatedProperties.kt:77:34:77:49 | invoke | override, public | +| delegatedProperties.kt:77:34:77:49 | new KMutableProperty1(...) { ... } | delegatedProperties.kt:77:34:77:49 | set | override, public | +| delegatedProperties.kt:77:34:77:49 | new KMutableProperty1(...) { ... } | delegatedProperties.kt:77:34:77:49 | set | override, public | +| delegatedProperties.kt:77:37:77:49 | new KMutableProperty0(...) { ... } | delegatedProperties.kt:77:37:77:49 | get | override, public | +| delegatedProperties.kt:77:37:77:49 | new KMutableProperty0(...) { ... } | delegatedProperties.kt:77:37:77:49 | invoke | override, public | +| delegatedProperties.kt:77:37:77:49 | new KMutableProperty0(...) { ... } | delegatedProperties.kt:77:37:77:49 | set | override, public | +| delegatedProperties.kt:79:18:79:38 | new KProperty1(...) { ... } | delegatedProperties.kt:79:18:79:38 | get | override, public | +| delegatedProperties.kt:79:18:79:38 | new KProperty1(...) { ... } | delegatedProperties.kt:79:18:79:38 | invoke | override, public | +| delegatedProperties.kt:79:21:79:38 | new KProperty0(...) { ... } | delegatedProperties.kt:79:21:79:38 | get | override, public | +| delegatedProperties.kt:79:21:79:38 | new KProperty0(...) { ... } | delegatedProperties.kt:79:21:79:38 | invoke | override, public | +| delegatedProperties.kt:82:37:82:54 | new KMutableProperty0(...) { ... } | delegatedProperties.kt:82:37:82:54 | get | override, public | +| delegatedProperties.kt:82:37:82:54 | new KMutableProperty0(...) { ... } | delegatedProperties.kt:82:37:82:54 | get | override, public | +| delegatedProperties.kt:82:37:82:54 | new KMutableProperty0(...) { ... } | delegatedProperties.kt:82:37:82:54 | invoke | override, public | +| delegatedProperties.kt:82:37:82:54 | new KMutableProperty0(...) { ... } | delegatedProperties.kt:82:37:82:54 | invoke | override, public | +| delegatedProperties.kt:82:37:82:54 | new KMutableProperty0(...) { ... } | delegatedProperties.kt:82:37:82:54 | set | override, public | +| delegatedProperties.kt:82:37:82:54 | new KMutableProperty0(...) { ... } | delegatedProperties.kt:82:37:82:54 | set | override, public | +| delegatedProperties.kt:82:40:82:54 | new KMutableProperty0(...) { ... } | delegatedProperties.kt:82:40:82:54 | get | override, public | +| delegatedProperties.kt:82:40:82:54 | new KMutableProperty0(...) { ... } | delegatedProperties.kt:82:40:82:54 | invoke | override, public | +| delegatedProperties.kt:82:40:82:54 | new KMutableProperty0(...) { ... } | delegatedProperties.kt:82:40:82:54 | set | override, public | +| delegatedProperties.kt:87:31:87:46 | new KMutableProperty1(...) { ... } | delegatedProperties.kt:87:31:87:46 | get | override, public | +| delegatedProperties.kt:87:31:87:46 | new KMutableProperty1(...) { ... } | delegatedProperties.kt:87:31:87:46 | get | override, public | +| delegatedProperties.kt:87:31:87:46 | new KMutableProperty1(...) { ... } | delegatedProperties.kt:87:31:87:46 | invoke | override, public | +| delegatedProperties.kt:87:31:87:46 | new KMutableProperty1(...) { ... } | delegatedProperties.kt:87:31:87:46 | invoke | override, public | +| delegatedProperties.kt:87:31:87:46 | new KMutableProperty1(...) { ... } | delegatedProperties.kt:87:31:87:46 | set | override, public | +| delegatedProperties.kt:87:31:87:46 | new KMutableProperty1(...) { ... } | delegatedProperties.kt:87:31:87:46 | set | override, public | +| delegatedProperties.kt:87:34:87:46 | new KMutableProperty0(...) { ... } | delegatedProperties.kt:87:34:87:46 | get | override, public | +| delegatedProperties.kt:87:34:87:46 | new KMutableProperty0(...) { ... } | delegatedProperties.kt:87:34:87:46 | invoke | override, public | +| delegatedProperties.kt:87:34:87:46 | new KMutableProperty0(...) { ... } | delegatedProperties.kt:87:34:87:46 | set | override, public | +| exprs.kt:195:16:197:9 | new Interface1(...) { ... } | exprs.kt:196:13:196:49 | getA3 | final, public | +| funcExprs.kt:22:26:22:33 | new Function0(...) { ... } | funcExprs.kt:22:26:22:33 | invoke | final, override, public | +| funcExprs.kt:23:26:23:33 | new Function0(...) { ... } | funcExprs.kt:23:26:23:33 | invoke | final, override, public | +| funcExprs.kt:24:26:24:33 | new Function0(...) { ... } | funcExprs.kt:24:26:24:33 | invoke | final, override, public | +| funcExprs.kt:25:29:25:38 | new Function1(...) { ... } | funcExprs.kt:25:29:25:38 | invoke | final, override, public | +| funcExprs.kt:26:29:26:34 | new Function1(...) { ... } | funcExprs.kt:26:29:26:34 | invoke | final, override, public | +| funcExprs.kt:27:29:27:42 | new Function1(...) { ... } | funcExprs.kt:27:29:27:42 | invoke | final, override, public | +| funcExprs.kt:29:29:29:37 | new Function1(...) { ... } | funcExprs.kt:29:29:29:37 | invoke | final, override, public | +| funcExprs.kt:30:28:30:50 | new Function2(...) { ... } | funcExprs.kt:30:28:30:50 | invoke | final, override, public | +| funcExprs.kt:31:28:31:40 | new Function2(...) { ... } | funcExprs.kt:31:28:31:40 | invoke | final, override, public | +| funcExprs.kt:32:28:32:44 | new Function2(...) { ... } | funcExprs.kt:32:28:32:44 | invoke | final, override, public | +| funcExprs.kt:33:28:33:51 | new Function1>(...) { ... } | funcExprs.kt:33:28:33:51 | invoke | final, override, public | +| funcExprs.kt:33:37:33:47 | new Function1(...) { ... } | funcExprs.kt:33:37:33:47 | invoke | final, override, public | +| funcExprs.kt:35:29:35:112 | new Function22(...) { ... } | funcExprs.kt:35:29:35:112 | invoke | final, override, public | +| funcExprs.kt:36:29:36:117 | new FunctionN(...) { ... } | funcExprs.kt:36:29:36:117 | invoke | final, public | +| funcExprs.kt:36:29:36:117 | new FunctionN(...) { ... } | funcExprs.kt:36:29:36:117 | invoke | override, public | +| funcExprs.kt:38:26:38:38 | new Function0(...) { ... } | funcExprs.kt:38:26:38:38 | invoke | override, public | +| funcExprs.kt:39:26:39:36 | new Function0(...) { ... } | funcExprs.kt:39:26:39:36 | invoke | override, public | +| funcExprs.kt:40:29:40:41 | new Function1(...) { ... } | funcExprs.kt:40:29:40:41 | invoke | override, public | +| funcExprs.kt:41:29:41:39 | new Function2(...) { ... } | funcExprs.kt:41:29:41:39 | invoke | override, public | +| funcExprs.kt:42:29:42:33 | new Function1(...) { ... } | funcExprs.kt:42:29:42:33 | invoke | override, public | +| funcExprs.kt:43:28:43:34 | new Function2(...) { ... } | funcExprs.kt:43:28:43:34 | invoke | override, public | +| funcExprs.kt:44:29:44:42 | new Function22(...) { ... } | funcExprs.kt:44:29:44:42 | invoke | override, public | +| funcExprs.kt:45:29:45:42 | new FunctionN(...) { ... } | funcExprs.kt:45:29:45:42 | invoke | override, public | +| funcExprs.kt:46:30:46:41 | new FunctionN(...) { ... } | funcExprs.kt:46:30:46:41 | invoke | override, public | +| funcExprs.kt:49:26:49:32 | new Function0(...) { ... } | funcExprs.kt:49:26:49:32 | invoke | override, public | +| funcExprs.kt:51:8:51:16 | new Function0(...) { ... } | funcExprs.kt:51:8:51:16 | invoke | override, public | +| funcExprs.kt:75:12:75:22 | new Function1>,String>(...) { ... } | funcExprs.kt:75:12:75:22 | invoke | final, override, public | +| funcExprs.kt:83:31:83:51 | new Function1(...) { ... } | funcExprs.kt:83:31:83:51 | invoke | final, override, public | +| funcExprs.kt:86:39:86:59 | new Function1(...) { ... } | funcExprs.kt:86:39:86:59 | invoke | final, override, public, suspend | +| funcExprs.kt:90:15:90:69 | new FunctionN(...) { ... } | funcExprs.kt:90:15:90:69 | invoke | final, public | +| funcExprs.kt:90:15:90:69 | new FunctionN(...) { ... } | funcExprs.kt:90:15:90:69 | invoke | override, public | +| funcExprs.kt:94:15:94:67 | new Function22(...) { ... } | funcExprs.kt:94:15:94:67 | invoke | final, override, public, suspend | +| kFunctionInvoke.kt:8:44:8:47 | new Function1(...) { ... } | kFunctionInvoke.kt:8:44:8:47 | invoke | override, public | +| samConversion.kt:2:18:2:45 | new IntPredicate(...) { ... } | samConversion.kt:2:18:2:45 | accept | final, override, public | +| samConversion.kt:2:31:2:45 | new Function1(...) { ... } | samConversion.kt:2:31:2:45 | invoke | final, override, public | +| samConversion.kt:4:14:4:42 | new InterfaceFn1(...) { ... } | samConversion.kt:4:14:4:42 | fn1 | final, override, public | +| samConversion.kt:4:27:4:42 | new Function2(...) { ... } | samConversion.kt:4:27:4:42 | invoke | final, override, public | +| samConversion.kt:5:14:5:32 | new InterfaceFn1(...) { ... } | samConversion.kt:5:14:5:32 | fn1 | final, override, public | +| samConversion.kt:5:27:5:31 | new Function2(...) { ... } | samConversion.kt:5:27:5:31 | invoke | override, public | +| samConversion.kt:7:13:7:46 | new InterfaceFnExt1(...) { ... } | samConversion.kt:7:13:7:46 | ext | final, override, public | +| samConversion.kt:7:29:7:46 | new Function2(...) { ... } | samConversion.kt:7:29:7:46 | invoke | final, override, public | +| samConversion.kt:9:13:13:6 | new IntPredicate(...) { ... } | samConversion.kt:9:13:13:6 | accept | final, override, public | +| samConversion.kt:9:33:11:5 | new Function1(...) { ... } | samConversion.kt:9:33:11:5 | invoke | final, override, public | +| samConversion.kt:11:12:13:5 | new Function1(...) { ... } | samConversion.kt:11:12:13:5 | invoke | final, override, public | +| samConversion.kt:41:13:41:16 | new FunctionN(...) { ... } | samConversion.kt:41:13:41:16 | invoke | override, public | +| samConversion.kt:42:13:42:32 | new BigArityPredicate(...) { ... } | samConversion.kt:42:13:42:32 | accept | final, override, public | +| samConversion.kt:43:13:45:68 | new BigArityPredicate(...) { ... } | samConversion.kt:43:13:45:68 | accept | final, override, public | +| samConversion.kt:43:31:45:68 | new FunctionN(...) { ... } | samConversion.kt:43:31:45:68 | invoke | final, public | +| samConversion.kt:43:31:45:68 | new FunctionN(...) { ... } | samConversion.kt:43:31:45:68 | invoke | override, public | +| samConversion.kt:46:13:46:44 | new SomePredicate(...) { ... } | samConversion.kt:46:13:46:44 | fn | final, override, public | +| samConversion.kt:46:32:46:44 | new Function1(...) { ... } | samConversion.kt:46:32:46:44 | invoke | final, override, public | +| samConversion.kt:58:14:58:45 | new InterfaceFn1Sus(...) { ... } | samConversion.kt:58:14:58:45 | fn1 | final, override, public, suspend | +| samConversion.kt:58:30:58:45 | new Function2(...) { ... } | samConversion.kt:58:30:58:45 | invoke | final, override, public, suspend | +| samConversion.kt:75:17:75:33 | new IntGetter(...) { ... } | samConversion.kt:75:17:75:33 | f | final, override, public | +| samConversion.kt:75:27:75:32 | new KProperty0(...) { ... } | samConversion.kt:75:27:75:32 | get | override, public | +| samConversion.kt:75:27:75:32 | new KProperty0(...) { ... } | samConversion.kt:75:27:75:32 | invoke | override, public | +| samConversion.kt:76:17:76:55 | new PropertyRefsGetter(...) { ... } | samConversion.kt:76:17:76:55 | f | final, override, public | +| samConversion.kt:76:36:76:54 | new KProperty1(...) { ... } | samConversion.kt:76:36:76:54 | get | override, public | +| samConversion.kt:76:36:76:54 | new KProperty1(...) { ... } | samConversion.kt:76:36:76:54 | invoke | override, public | +nonOverrideInvoke +| funcExprs.kt:36:29:36:117 | ...->... | funcExprs.kt:36:29:36:117 | invoke | 23 | +| funcExprs.kt:90:15:90:69 | ...->... | funcExprs.kt:90:15:90:69 | invoke | 23 | +| samConversion.kt:43:31:45:68 | ...->... | samConversion.kt:43:31:45:68 | invoke | 23 | diff --git a/java/ql/test-kotlin2/library-tests/exprs/funcExprs.kt b/java/ql/test-kotlin2/library-tests/exprs/funcExprs.kt new file mode 100644 index 00000000000..ac7e7912072 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/exprs/funcExprs.kt @@ -0,0 +1,96 @@ +fun functionExpression0a(f: () -> Int) { f() } +fun functionExpression0b(f: () -> Any?) { f() } +fun functionExpression0c(f: () -> Any) { f() } +fun functionExpression1a(x: Int, f: (Int) -> Int) { f(x) } +fun functionExpression1b(x: Int, f: (Any?) -> Any?) { f(x) } +fun functionExpression1c(x: Int, f: (FuncRef, Int) -> Int) { f(FuncRef(), x) } +fun functionExpression2(x: Int, f: (Int, Int) -> Int) { f(x, x) } +fun functionExpression3(x: Int, f: Int.(Int) -> Int) { x.f(x) } +fun functionExpression4(x: Int, f: (Int) -> ((Int) -> Double)) { f(x)(x) } + +fun functionExpression22(x: Int, f: (Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int) -> Unit) { + f(x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x) +} +fun functionExpression23(x: Int, f: (Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int) -> String) { + f(x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x) +} +fun functionExpression23c(x: Int, f: (FuncRef, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int) -> String) { + f(FuncRef(),x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x) +} + +fun call() { + functionExpression0a { -> 5 } + functionExpression0b { -> 5 } + functionExpression0c { -> 5 } + functionExpression1a(5) { a -> 5 } + functionExpression1a(5) { it } + functionExpression1a(5, fun(_:Int) = 5) + functionExpression1a(5, MyLambda()) + functionExpression1b(5) { a -> a} + functionExpression2(5, fun(_: Int, _: Int) = 5) + functionExpression2(5) { _, _ -> 5 } + functionExpression3(5) { a -> this + a } + functionExpression4(5) { a -> ( { b -> 5.0} ) } + + functionExpression22(5) {a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21 -> 5} + functionExpression23(5) {a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22 -> ""} + + functionExpression0a(FuncRef()::f0) + functionExpression0a(FuncRef::f0) + functionExpression1a(5, FuncRef()::f1) + functionExpression1c(5, FuncRef::f1) + functionExpression1a(5, 3::f3) + functionExpression3(5, Int::f3) + functionExpression22(5, FuncRef()::f22) + functionExpression23(5, FuncRef()::f23) + functionExpression23c(5, FuncRef::f23) + + fun local(): Int = 5 + functionExpression0a(::local) + + fn(::FuncRef) +} + +class MyLambda: (Int) -> Int { + override operator fun invoke(x: Int): Int = 5 +} + +fun fn(l: () -> T) {} +fun Int.f3(a: Int) = 5 + +class FuncRef { + companion object { + fun f0(): Int = 5 + } + fun f0(): Int = 5 + fun f1(a: Int): Int = 5 + fun f22(a0: Int, a1: Int, a2: Int, a3: Int, a4: Int, a5: Int, a6: Int, a7: Int, a8: Int, a9: Int, a10: Int, + a11: Int, a12: Int, a13: Int, a14: Int, a15: Int, a16:Int, a17: Int, a18: Int, a19: Int, a20: Int, a21: Int) {} + fun f23(a0: Int, a1: Int, a2: Int, a3: Int, a4: Int, a5: Int, a6: Int, a7: Int, a8: Int, a9: Int, a10: Int, + a11: Int, a12: Int, a13: Int, a14: Int, a15: Int, a16:Int, a17: Int, a18: Int, a19: Int, a20: Int, a21: Int, a22: Int) = "" +} + +class Class3 { + fun call() { + fn { a -> "a"} + } + private fun fn(f: (Generic>) -> String) { } + + class Generic { } +} + +suspend fun fn() { + val l1: (Int) -> String = { i -> i.toString() } + l1.invoke(5) // calls kotlin/jvm/functions/Function1.invoke + + val l2: suspend (Int) -> String = { i -> i.toString() } + l2.invoke(5) // calls kotlin/jvm/functions/Function2.invoke + + val l3: (Int,Int,Int,Int,Int,Int,Int,Int,Int,Int,Int,Int,Int,Int,Int,Int,Int,Int,Int,Int,Int,Int,Int) -> String + = { _,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_ -> ""} + l3.invoke(1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3) // 23 args, calls kotlin/jvm/functions/FunctionN.invoke + + val l4: suspend (Int,Int,Int,Int,Int,Int,Int,Int,Int,Int,Int,Int,Int,Int,Int,Int,Int,Int,Int,Int,Int,Int) -> String + = { _,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_ -> ""} + l4.invoke(1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2) // 22 args, calls kotlin/jvm/functions/FunctionN.invoke +} diff --git a/java/ql/test-kotlin2/library-tests/exprs/funcExprs.ql b/java/ql/test-kotlin2/library-tests/exprs/funcExprs.ql new file mode 100644 index 00000000000..f6e233336f3 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/exprs/funcExprs.ql @@ -0,0 +1,42 @@ +import java + +private string getLambdaBody(LambdaExpr le) { + le.hasExprBody() and result = "expr body" + or + le.hasStmtBody() and result = "stmt body" +} + +query predicate lambdaExpr(LambdaExpr le, string body, Method m, string signature, AnonymousClass an) { + getLambdaBody(le) = body and + le.asMethod() = m and + signature = m.getSignature() and + le.getAnonymousClass() = an +} + +query predicate memberRefExprs(MemberRefExpr e, Method m, string signature, AnonymousClass an) { + e.asMethod() = m and + signature = m.getSignature() and + e.getAnonymousClass() = an +} + +query predicate lambda_modifiers(LambdaExpr le, Method m, string modifiers) { + le.getAnonymousClass().getAMethod() = m and + modifiers = concat(string s | m.hasModifier(s) | s, ", ") +} + +query predicate anon_class_member_modifiers(AnonymousClass ac, Method m, string modifiers) { + ac.getAMethod() = m and + modifiers = concat(string s | m.hasModifier(s) | s, ", ") +} + +query predicate nonOverrideInvoke(LambdaExpr le, Method m, int pCount) { + le.getAnonymousClass().getAMethod() = m and + not m.hasModifier("override") and + m.getName() = "invoke" and + pCount = m.getNumberOfParameters() and + exists(Method mOtherInvoke | + le.getAnonymousClass().getAMethod() = mOtherInvoke and + mOtherInvoke.hasModifier("override") and + mOtherInvoke.getName() = "invoke" + ) +} diff --git a/java/ql/test-kotlin2/library-tests/exprs/kFunctionInvoke.kt b/java/ql/test-kotlin2/library-tests/exprs/kFunctionInvoke.kt new file mode 100644 index 00000000000..3ed4c52f14f --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/exprs/kFunctionInvoke.kt @@ -0,0 +1,10 @@ +import kotlin.reflect.* + +class A { + fun f(s: String) { } +} + +fun useRef(a: A, s: String) { + val toCall: KFunction1 = a::f + toCall(s) +} diff --git a/java/ql/test-kotlin2/library-tests/exprs/localFunctionCalls.kt b/java/ql/test-kotlin2/library-tests/exprs/localFunctionCalls.kt new file mode 100644 index 00000000000..75cb379aa85 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/exprs/localFunctionCalls.kt @@ -0,0 +1,14 @@ +package foo.bar + +fun x() { + var x = 5 + fun a(i: Int) = i + x + x = 6 + a(42) + x = 7 + fun C1.f1(i: Int) = 5 + C1().f1(42) + C1().f1(42) +} + +class C1 {} diff --git a/java/ql/test-kotlin2/library-tests/exprs/samConversion.kt b/java/ql/test-kotlin2/library-tests/exprs/samConversion.kt new file mode 100644 index 00000000000..1952ab342c9 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/exprs/samConversion.kt @@ -0,0 +1,77 @@ +fun main(b: Boolean) { + val isEven = IntPredicate { it % 2 == 0 } + + val i0 = InterfaceFn1 { a, b -> Unit } + val i1 = InterfaceFn1(::fn2) + + val i = InterfaceFnExt1 { i -> this == ""} + + val x = IntPredicate(if (b) { + j -> j % 2 == 0 + } else { + j -> j % 2 == 1 + }) +} + +fun interface IntPredicate { + fun accept(i: Int): Boolean +} + +fun fn2(i: Int, j: Int) { } + +fun interface InterfaceFn1 { + fun fn1(i: Int, j: Int) +} + +fun interface InterfaceFnExt1 { + fun String.ext(i: Int): Boolean +} + +fun interface BigArityPredicate { + fun accept(i0: Int, i1: Int, i2: Int, i3: Int, i4: Int, i5: Int, i6: Int, i7: Int, i8: Int, i9: Int, + i10: Int, i11: Int, i12: Int, i13: Int, i14: Int, i15: Int, i16: Int, i17: Int, i18: Int, i19: Int, + i20: Int, i21: Int, i22: Int): Boolean +} + +fun ff(i0: Int, i1: Int, i2: Int, i3: Int, i4: Int, i5: Int, i6: Int, i7: Int, i8: Int, i9: Int, + i10: Int, i11: Int, i12: Int, i13: Int, i14: Int, i15: Int, i16: Int, i17: Int, i18: Int, i19: Int, + i20: Int, i21: Int, i22: Int): Boolean = true + +fun fn(boo: Boolean) { + val a = ::ff + val b = BigArityPredicate(a) + val c = BigArityPredicate {i0: Int, i1: Int, i2: Int, i3: Int, i4: Int, i5: Int, i6: Int, i7: Int, i8: Int, i9: Int, + i10: Int, i11: Int, i12: Int, i13: Int, i14: Int, i15: Int, i16: Int, i17: Int, i18: Int, i19: Int, + i20: Int, i21: Int, i22: Int -> true} + val d = SomePredicate { a -> true } +} + +fun interface SomePredicate { + fun fn(i: T): Boolean +} + +fun interface InterfaceFn1Sus { + suspend fun fn1(i: Int, j: Int) +} + +suspend fun test() { + val i0 = InterfaceFn1Sus { a, b -> Unit } + i0.fn1(1,2) +} + +class PropertyRefsTest { + val x = 1 +} + +fun interface PropertyRefsGetter { + fun f(prt: PropertyRefsTest): Int +} + +fun interface IntGetter { + fun f(): Int +} + +fun propertyRefsTest(prt: PropertyRefsTest) { + val test1 = IntGetter(prt::x) + val test2 = PropertyRefsGetter(PropertyRefsTest::x) +} diff --git a/java/ql/test-kotlin2/library-tests/exprs/unaryOp.expected b/java/ql/test-kotlin2/library-tests/exprs/unaryOp.expected new file mode 100644 index 00000000000..03b5d64a7f4 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/exprs/unaryOp.expected @@ -0,0 +1,23 @@ +| exprs.kt:22:15:22:21 | ~... | exprs.kt:22:15:22:15 | x | +| exprs.kt:32:15:32:26 | !... | exprs.kt:32:15:32:26 | contains(...) | +| exprs.kt:79:15:79:22 | ~... | exprs.kt:79:15:79:16 | lx | +| exprs.kt:121:14:121:16 | !... | exprs.kt:121:15:121:16 | b1 | +| exprs.kt:202:19:202:20 | ...!! | exprs.kt:202:18:202:18 | x | +| exprs.kt:211:20:211:21 | ...!! | exprs.kt:211:19:211:19 | s | +| exprs.kt:212:20:212:21 | ...!! | exprs.kt:212:19:212:19 | s | +| exprs.kt:286:5:286:6 | -... | exprs.kt:286:6:286:6 | i | +| exprs.kt:287:5:287:6 | +... | exprs.kt:287:6:287:6 | i | +| exprs.kt:288:5:288:6 | -... | exprs.kt:288:6:288:6 | d | +| exprs.kt:289:5:289:6 | +... | exprs.kt:289:6:289:6 | d | +| exprs.kt:300:5:300:11 | ~... | exprs.kt:300:5:300:5 | i | +| exprs.kt:302:5:302:6 | -... | exprs.kt:302:6:302:6 | b | +| exprs.kt:303:5:303:6 | +... | exprs.kt:303:6:303:6 | b | +| exprs.kt:314:5:314:11 | ~... | exprs.kt:314:5:314:5 | b | +| exprs.kt:316:5:316:6 | -... | exprs.kt:316:6:316:6 | s | +| exprs.kt:317:5:317:6 | +... | exprs.kt:317:6:317:6 | s | +| exprs.kt:328:5:328:11 | ~... | exprs.kt:328:5:328:5 | s | +| exprs.kt:330:5:330:6 | -... | exprs.kt:330:6:330:6 | l | +| exprs.kt:331:5:331:6 | +... | exprs.kt:331:6:331:6 | l | +| exprs.kt:342:5:342:11 | ~... | exprs.kt:342:5:342:5 | l | +| exprs.kt:344:5:344:6 | +... | exprs.kt:344:6:344:6 | f | +| exprs.kt:345:5:345:6 | -... | exprs.kt:345:6:345:6 | f | diff --git a/java/ql/test-kotlin2/library-tests/exprs/unaryOp.ql b/java/ql/test-kotlin2/library-tests/exprs/unaryOp.ql new file mode 100644 index 00000000000..9e7359e1e07 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/exprs/unaryOp.ql @@ -0,0 +1,36 @@ +import java + +newtype TMaybeElement = + TElement(Element e) or + TNoElement() + +class MaybeElement extends TMaybeElement { + abstract string toString(); + + abstract Location getLocation(); +} + +class YesMaybeElement extends MaybeElement { + Element e; + + YesMaybeElement() { this = TElement(e) } + + override string toString() { result = e.toString() } + + override Location getLocation() { result = e.getLocation() } +} + +class NoMaybeElement extends MaybeElement { + NoMaybeElement() { this = TNoElement() } + + override string toString() { result = "" } + + override Location getLocation() { none() } +} + +MaybeElement op(UnaryExpr e) { + if exists(e.getExpr()) then result = TElement(e.getExpr()) else result = TNoElement() +} + +from Expr e +select e, op(e) diff --git a/java/ql/test-kotlin2/library-tests/exprs/whenExpr.kt b/java/ql/test-kotlin2/library-tests/exprs/whenExpr.kt new file mode 100644 index 00000000000..891f5d0f43b --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/exprs/whenExpr.kt @@ -0,0 +1,10 @@ +fun testWhen(i: Int): Int { + return when(i) { + 0 -> 1 + 1 -> 2 + 2 -> return 3 + 3 -> throw Exception("No threes please") + else -> 999 + } +} + diff --git a/java/ql/test-kotlin2/library-tests/exprs_typeaccess/A.kt b/java/ql/test-kotlin2/library-tests/exprs_typeaccess/A.kt new file mode 100644 index 00000000000..b5ba839d2f8 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/exprs_typeaccess/A.kt @@ -0,0 +1,26 @@ + +class A { + class C { + fun fn(){ + val a = C>() + } + } + + constructor() { + println("") + } + + val prop = this.fn(1) + + fun fn() {} + fun fn(i: C>) = i + fun fn(i: Int) : Int { + val x = this.fn(1) + val e = Enu.A + return B.x + } + + enum class Enu { + A, B, C + } +} diff --git a/java/ql/test-kotlin2/library-tests/exprs_typeaccess/B.java b/java/ql/test-kotlin2/library-tests/exprs_typeaccess/B.java new file mode 100644 index 00000000000..1c0df071c5a --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/exprs_typeaccess/B.java @@ -0,0 +1,25 @@ +public class B { + public B() { + ; + } + + public void fn() { } + public C> fn(C> i) { return i; } + public int fn(int i) { + int x = this.fn(1); + Enu e = Enu.A; + return B.x; + } + + public static class C { + public void fn() { + new C>(); + } + } + + public static enum Enu { + A, B, C + } + + public static final int x = 5; +} diff --git a/java/ql/test-kotlin2/library-tests/exprs_typeaccess/PrintAst.expected b/java/ql/test-kotlin2/library-tests/exprs_typeaccess/PrintAst.expected new file mode 100644 index 00000000000..e3bd90271e6 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/exprs_typeaccess/PrintAst.expected @@ -0,0 +1,176 @@ +A.kt: +# 0| [CompilationUnit] A +# 2| 1: [Class] A +# 3| 3: [Class,GenericType,ParameterizedType] C +#-----| -2: (Generic Parameters) +# 3| 0: [TypeVariable] T +# 3| 1: [Constructor] C +# 3| 5: [BlockStmt] { ... } +# 3| 0: [SuperConstructorInvocationStmt] super(...) +# 3| 1: [BlockStmt] { ... } +# 4| 2: [Method] fn +# 4| 3: [TypeAccess] Unit +# 4| 5: [BlockStmt] { ... } +# 5| 0: [LocalVariableDeclStmt] var ...; +# 5| 1: [LocalVariableDeclExpr] a +# 5| 0: [ClassInstanceExpr] new C>(...) +# 5| -3: [TypeAccess] C> +# 5| 0: [TypeAccess] C +# 5| 0: [TypeAccess] Integer +# 9| 5: [Constructor] A +# 9| 5: [BlockStmt] { ... } +# 9| 0: [SuperConstructorInvocationStmt] super(...) +# 9| 1: [BlockStmt] { ... } +# 13| 0: [ExprStmt] ; +# 13| 0: [KtInitializerAssignExpr] ...=... +# 13| 0: [VarAccess] prop +# 10| 2: [ExprStmt] ; +# 10| 0: [MethodCall] println(...) +# 10| -1: [TypeAccess] ConsoleKt +# 10| 0: [StringLiteral] "" +# 13| 6: [Method] getProp +# 13| 3: [TypeAccess] int +# 13| 5: [BlockStmt] { ... } +# 13| 0: [ReturnStmt] return ... +# 13| 0: [VarAccess] this.prop +# 13| -1: [ThisAccess] this +# 13| 7: [FieldDeclaration] int prop; +# 13| -1: [TypeAccess] int +# 13| 0: [MethodCall] fn(...) +# 13| -1: [ThisAccess] A.this +# 13| 0: [TypeAccess] A +# 13| 0: [IntegerLiteral] 1 +# 15| 8: [Method] fn +# 15| 3: [TypeAccess] Unit +# 15| 5: [BlockStmt] { ... } +# 16| 9: [Method] fn +# 16| 3: [TypeAccess] C> +# 16| 0: [TypeAccess] C +# 16| 0: [TypeAccess] Integer +#-----| 4: (Parameters) +# 16| 0: [Parameter] i +# 16| 0: [TypeAccess] C> +# 16| 0: [TypeAccess] C +# 16| 0: [TypeAccess] Integer +# 16| 5: [BlockStmt] { ... } +# 16| 0: [ReturnStmt] return ... +# 16| 0: [VarAccess] i +# 17| 10: [Method] fn +# 17| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 17| 0: [Parameter] i +# 17| 0: [TypeAccess] int +# 17| 5: [BlockStmt] { ... } +# 18| 0: [LocalVariableDeclStmt] var ...; +# 18| 1: [LocalVariableDeclExpr] x +# 18| 0: [MethodCall] fn(...) +# 18| -1: [ThisAccess] this +# 18| 0: [IntegerLiteral] 1 +# 19| 1: [LocalVariableDeclStmt] var ...; +# 19| 1: [LocalVariableDeclExpr] e +# 19| 0: [VarAccess] Enu.A +# 19| -1: [TypeAccess] Enu +# 20| 2: [ReturnStmt] return ... +# 20| 0: [VarAccess] B.x +# 20| -1: [TypeAccess] B +# 23| 11: [Class] Enu +# 23| 2: [Constructor] Enu +# 23| 5: [BlockStmt] { ... } +# 23| 0: [ExprStmt] ; +# 23| 0: [ClassInstanceExpr] new Enum(...) +# 23| -3: [TypeAccess] Enum +# 23| 0: [TypeAccess] Enu +# 23| 0: [NullLiteral] null +# 23| 1: [IntegerLiteral] 0 +# 23| 1: [BlockStmt] { ... } +# 23| 3: [Method] getEntries +# 23| 3: [TypeAccess] EnumEntries +# 23| 0: [TypeAccess] Enu +# 23| 4: [Method] valueOf +# 23| 3: [TypeAccess] Enu +#-----| 4: (Parameters) +# 23| 0: [Parameter] value +# 23| 0: [TypeAccess] String +# 23| 5: [Method] values +# 23| 3: [TypeAccess] Enu[] +# 23| 0: [TypeAccess] Enu +# 24| 6: [FieldDeclaration] Enu A; +# 24| -1: [TypeAccess] Enu +# 24| 0: [ClassInstanceExpr] new Enu(...) +# 24| -3: [TypeAccess] Enu +# 24| 7: [FieldDeclaration] Enu B; +# 24| -1: [TypeAccess] Enu +# 24| 0: [ClassInstanceExpr] new Enu(...) +# 24| -3: [TypeAccess] Enu +# 24| 8: [FieldDeclaration] Enu C; +# 24| -1: [TypeAccess] Enu +# 24| 0: [ClassInstanceExpr] new Enu(...) +# 24| -3: [TypeAccess] Enu +B.java: +# 0| [CompilationUnit] B +# 1| 1: [Class] B +# 2| 2: [Constructor] B +# 2| 5: [BlockStmt] { ... } +# 3| 1: [EmptyStmt] ; +# 6| 3: [Method] fn +# 6| 3: [TypeAccess] void +# 6| 5: [BlockStmt] { ... } +# 7| 4: [Method] fn +# 7| 3: [TypeAccess] C> +# 7| 0: [TypeAccess] C +# 7| 0: [TypeAccess] Integer +#-----| 4: (Parameters) +# 7| 0: [Parameter] i +# 7| 0: [TypeAccess] C> +# 7| 0: [TypeAccess] C +# 7| 0: [TypeAccess] Integer +# 7| 5: [BlockStmt] { ... } +# 7| 0: [ReturnStmt] return ... +# 7| 0: [VarAccess] i +# 8| 5: [Method] fn +# 8| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 8| 0: [Parameter] i +# 8| 0: [TypeAccess] int +# 8| 5: [BlockStmt] { ... } +# 9| 0: [LocalVariableDeclStmt] var ...; +# 9| 0: [TypeAccess] int +# 9| 1: [LocalVariableDeclExpr] x +# 9| 0: [MethodCall] fn(...) +# 9| -1: [ThisAccess] this +# 9| 0: [IntegerLiteral] 1 +# 10| 1: [LocalVariableDeclStmt] var ...; +# 10| 0: [TypeAccess] Enu +# 10| 1: [LocalVariableDeclExpr] e +# 10| 0: [VarAccess] Enu.A +# 10| -1: [TypeAccess] Enu +# 11| 2: [ReturnStmt] return ... +# 11| 0: [VarAccess] B.x +# 11| -1: [TypeAccess] B +# 14| 6: [Class,GenericType,ParameterizedType] C +#-----| -2: (Generic Parameters) +# 14| 0: [TypeVariable] T +# 15| 2: [Method] fn +# 15| 3: [TypeAccess] void +# 15| 5: [BlockStmt] { ... } +# 16| 0: [ExprStmt] ; +# 16| 0: [ClassInstanceExpr] new C>(...) +# 16| -3: [TypeAccess] C> +# 16| 0: [TypeAccess] C +# 16| 0: [TypeAccess] Integer +# 20| 7: [Class] Enu +# 21| 3: [FieldDeclaration] Enu A; +# 21| -1: [TypeAccess] Enu +# 21| 0: [ClassInstanceExpr] new Enu(...) +# 21| -3: [TypeAccess] Enu +# 21| 4: [FieldDeclaration] Enu B; +# 21| -1: [TypeAccess] Enu +# 21| 0: [ClassInstanceExpr] new Enu(...) +# 21| -3: [TypeAccess] Enu +# 21| 5: [FieldDeclaration] Enu C; +# 21| -1: [TypeAccess] Enu +# 21| 0: [ClassInstanceExpr] new Enu(...) +# 21| -3: [TypeAccess] Enu +# 24| 8: [FieldDeclaration] int x; +# 24| -1: [TypeAccess] int +# 24| 0: [IntegerLiteral] 5 diff --git a/java/ql/test-kotlin2/library-tests/exprs_typeaccess/PrintAst.qlref b/java/ql/test-kotlin2/library-tests/exprs_typeaccess/PrintAst.qlref new file mode 100644 index 00000000000..c7fd5faf239 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/exprs_typeaccess/PrintAst.qlref @@ -0,0 +1 @@ +semmle/code/java/PrintAst.ql \ No newline at end of file diff --git a/java/ql/test-kotlin2/library-tests/extensions/A.java b/java/ql/test-kotlin2/library-tests/extensions/A.java new file mode 100644 index 00000000000..acb3b819de5 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/extensions/A.java @@ -0,0 +1,5 @@ +class A { + void method() { + ExtensionsKt.someFun(new SomeClass(), ""); + } +} \ No newline at end of file diff --git a/java/ql/test-kotlin2/library-tests/extensions/extensions.kt b/java/ql/test-kotlin2/library-tests/extensions/extensions.kt new file mode 100644 index 00000000000..b5bc5b8c2cb --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/extensions/extensions.kt @@ -0,0 +1,32 @@ + +class SomeClass { + fun someClassMethod(p1: String) {} +} +class AnotherClass { + fun anotherClassMethod(p1: String) {} +} + +fun SomeClass.someFun(p1: String) {} +fun AnotherClass.anotherFun(p1: String) {} + +fun SomeClass.bothFun(p1: String) {} +fun AnotherClass.bothFun(p1: String) {} + +fun SomeClass.bothFunDiffTypes(p1: Int): Int { return 5 } +fun AnotherClass.bothFunDiffTypes(p1: String): String { return "Foo" } + +fun String.bar(p1: String): String { return "Bar" } + +fun foo() { + SomeClass().someClassMethod("foo") + SomeClass().someFun("foo") + SomeClass().bothFun("foo") + SomeClass().bothFunDiffTypes(1) + AnotherClass().anotherClassMethod("foo") + AnotherClass().anotherFun("foo") + AnotherClass().bothFun("foo") + AnotherClass().bothFunDiffTypes("foo") + "someString".bar("foo") + fun String.baz(p1: String): String { return "Baz" } + "someString".baz("bazParam") +} diff --git a/java/ql/test-kotlin2/library-tests/extensions/methodaccesses.expected b/java/ql/test-kotlin2/library-tests/extensions/methodaccesses.expected new file mode 100644 index 00000000000..f5866408d05 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/extensions/methodaccesses.expected @@ -0,0 +1,20 @@ +| A.java:3:9:3:49 | someFun(...) | A.java:3:9:3:20 | ExtensionsKt | A.java:3:30:3:44 | new SomeClass(...) | +| A.java:3:9:3:49 | someFun(...) | A.java:3:9:3:20 | ExtensionsKt | A.java:3:47:3:48 | "" | +| extensions.kt:21:5:21:38 | someClassMethod(...) | extensions.kt:21:5:21:15 | new SomeClass(...) | extensions.kt:21:33:21:37 | "foo" | +| extensions.kt:22:5:22:30 | someFun(...) | extensions.kt:22:5:22:30 | ExtensionsKt | extensions.kt:22:5:22:15 | new SomeClass(...) | +| extensions.kt:22:5:22:30 | someFun(...) | extensions.kt:22:5:22:30 | ExtensionsKt | extensions.kt:22:25:22:29 | "foo" | +| extensions.kt:23:5:23:30 | bothFun(...) | extensions.kt:23:5:23:30 | ExtensionsKt | extensions.kt:23:5:23:15 | new SomeClass(...) | +| extensions.kt:23:5:23:30 | bothFun(...) | extensions.kt:23:5:23:30 | ExtensionsKt | extensions.kt:23:25:23:29 | "foo" | +| extensions.kt:24:5:24:35 | bothFunDiffTypes(...) | extensions.kt:24:5:24:35 | ExtensionsKt | extensions.kt:24:5:24:15 | new SomeClass(...) | +| extensions.kt:24:5:24:35 | bothFunDiffTypes(...) | extensions.kt:24:5:24:35 | ExtensionsKt | extensions.kt:24:34:24:34 | 1 | +| extensions.kt:25:5:25:44 | anotherClassMethod(...) | extensions.kt:25:5:25:18 | new AnotherClass(...) | extensions.kt:25:39:25:43 | "foo" | +| extensions.kt:26:5:26:36 | anotherFun(...) | extensions.kt:26:5:26:36 | ExtensionsKt | extensions.kt:26:5:26:18 | new AnotherClass(...) | +| extensions.kt:26:5:26:36 | anotherFun(...) | extensions.kt:26:5:26:36 | ExtensionsKt | extensions.kt:26:31:26:35 | "foo" | +| extensions.kt:27:5:27:33 | bothFun(...) | extensions.kt:27:5:27:33 | ExtensionsKt | extensions.kt:27:5:27:18 | new AnotherClass(...) | +| extensions.kt:27:5:27:33 | bothFun(...) | extensions.kt:27:5:27:33 | ExtensionsKt | extensions.kt:27:28:27:32 | "foo" | +| extensions.kt:28:5:28:42 | bothFunDiffTypes(...) | extensions.kt:28:5:28:42 | ExtensionsKt | extensions.kt:28:5:28:18 | new AnotherClass(...) | +| extensions.kt:28:5:28:42 | bothFunDiffTypes(...) | extensions.kt:28:5:28:42 | ExtensionsKt | extensions.kt:28:37:28:41 | "foo" | +| extensions.kt:29:5:29:27 | bar(...) | extensions.kt:29:5:29:27 | ExtensionsKt | extensions.kt:29:5:29:16 | "someString" | +| extensions.kt:29:5:29:27 | bar(...) | extensions.kt:29:5:29:27 | ExtensionsKt | extensions.kt:29:22:29:26 | "foo" | +| extensions.kt:31:5:31:32 | baz(...) | extensions.kt:31:5:31:32 | new (...) | extensions.kt:31:5:31:16 | "someString" | +| extensions.kt:31:5:31:32 | baz(...) | extensions.kt:31:5:31:32 | new (...) | extensions.kt:31:22:31:31 | "bazParam" | diff --git a/java/ql/test-kotlin2/library-tests/extensions/methodaccesses.ql b/java/ql/test-kotlin2/library-tests/extensions/methodaccesses.ql new file mode 100644 index 00000000000..460b91d7fcc --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/extensions/methodaccesses.ql @@ -0,0 +1,7 @@ +import java + +// For extension methods we use JVM bytecode representation: +// * the qualifier is the dispatch receiver expression, and +// * the extension receiver expression is the 0th argument. +from MethodCall ma +select ma, ma.getQualifier(), ma.getAnArgument() diff --git a/java/ql/test-kotlin2/library-tests/extensions/methods.expected b/java/ql/test-kotlin2/library-tests/extensions/methods.expected new file mode 100644 index 00000000000..3c2e4114a78 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/extensions/methods.expected @@ -0,0 +1,12 @@ +| A.java:2:10:2:15 | method | file://:0:0:0:0 | void | +| extensions.kt:3:5:3:38 | someClassMethod | file://:0:0:0:0 | void | +| extensions.kt:6:5:6:41 | anotherClassMethod | file://:0:0:0:0 | void | +| extensions.kt:9:1:9:36 | someFun | file://:0:0:0:0 | void | +| extensions.kt:10:1:10:42 | anotherFun | file://:0:0:0:0 | void | +| extensions.kt:12:1:12:36 | bothFun | file://:0:0:0:0 | void | +| extensions.kt:13:1:13:39 | bothFun | file://:0:0:0:0 | void | +| extensions.kt:15:1:15:57 | bothFunDiffTypes | file://:0:0:0:0 | int | +| extensions.kt:16:1:16:70 | bothFunDiffTypes | file:///String.class:0:0:0:0 | String | +| extensions.kt:18:1:18:51 | bar | file:///String.class:0:0:0:0 | String | +| extensions.kt:20:1:32:1 | foo | file://:0:0:0:0 | void | +| extensions.kt:30:5:30:55 | baz | file:///String.class:0:0:0:0 | String | diff --git a/java/ql/test-kotlin2/library-tests/extensions/methods.ql b/java/ql/test-kotlin2/library-tests/extensions/methods.ql new file mode 100644 index 00000000000..5cbcc98807b --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/extensions/methods.ql @@ -0,0 +1,16 @@ +import java + +// Stop external filepaths from appearing in the results +class ClassOrInterfaceLocation extends ClassOrInterface { + override predicate hasLocationInfo(string path, int sl, int sc, int el, int ec) { + exists(string fullPath | super.hasLocationInfo(fullPath, sl, sc, el, ec) | + if exists(this.getFile().getRelativePath()) + then path = fullPath + else path = fullPath.regexpReplaceAll(".*/", "/") + ) + } +} + +from Method m +where m.fromSource() +select m, m.getReturnType() diff --git a/java/ql/test-kotlin2/library-tests/extensions/parameters.expected b/java/ql/test-kotlin2/library-tests/extensions/parameters.expected new file mode 100644 index 00000000000..dcec117c784 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/extensions/parameters.expected @@ -0,0 +1,49 @@ +#select +| extensions.kt:3:5:3:38 | someClassMethod | extensions.kt:3:25:3:34 | p1 | 0 | +| extensions.kt:6:5:6:41 | anotherClassMethod | extensions.kt:6:28:6:37 | p1 | 0 | +| extensions.kt:9:1:9:36 | someFun | extensions.kt:9:5:9:13 | | 0 | +| extensions.kt:9:1:9:36 | someFun | extensions.kt:9:23:9:32 | p1 | 1 | +| extensions.kt:10:1:10:42 | anotherFun | extensions.kt:10:5:10:16 | | 0 | +| extensions.kt:10:1:10:42 | anotherFun | extensions.kt:10:29:10:38 | p1 | 1 | +| extensions.kt:12:1:12:36 | bothFun | extensions.kt:12:5:12:13 | | 0 | +| extensions.kt:12:1:12:36 | bothFun | extensions.kt:12:23:12:32 | p1 | 1 | +| extensions.kt:13:1:13:39 | bothFun | extensions.kt:13:5:13:16 | | 0 | +| extensions.kt:13:1:13:39 | bothFun | extensions.kt:13:26:13:35 | p1 | 1 | +| extensions.kt:15:1:15:57 | bothFunDiffTypes | extensions.kt:15:5:15:13 | | 0 | +| extensions.kt:15:1:15:57 | bothFunDiffTypes | extensions.kt:15:32:15:38 | p1 | 1 | +| extensions.kt:16:1:16:70 | bothFunDiffTypes | extensions.kt:16:5:16:16 | | 0 | +| extensions.kt:16:1:16:70 | bothFunDiffTypes | extensions.kt:16:35:16:44 | p1 | 1 | +| extensions.kt:18:1:18:51 | bar | extensions.kt:18:5:18:10 | | 0 | +| extensions.kt:18:1:18:51 | bar | extensions.kt:18:16:18:25 | p1 | 1 | +| extensions.kt:30:5:30:55 | baz | extensions.kt:30:9:30:14 | | 0 | +| extensions.kt:30:5:30:55 | baz | extensions.kt:30:20:30:29 | p1 | 1 | +parametersWithArgs +| extensions.kt:3:25:3:34 | p1 | 0 | extensions.kt:21:33:21:37 | "foo" | +| extensions.kt:6:28:6:37 | p1 | 0 | extensions.kt:25:39:25:43 | "foo" | +| extensions.kt:9:5:9:13 | | 0 | A.java:3:30:3:44 | new SomeClass(...) | +| extensions.kt:9:5:9:13 | | 0 | extensions.kt:22:5:22:15 | new SomeClass(...) | +| extensions.kt:9:23:9:32 | p1 | 1 | A.java:3:47:3:48 | "" | +| extensions.kt:9:23:9:32 | p1 | 1 | extensions.kt:22:25:22:29 | "foo" | +| extensions.kt:10:5:10:16 | | 0 | extensions.kt:26:5:26:18 | new AnotherClass(...) | +| extensions.kt:10:29:10:38 | p1 | 1 | extensions.kt:26:31:26:35 | "foo" | +| extensions.kt:12:5:12:13 | | 0 | extensions.kt:23:5:23:15 | new SomeClass(...) | +| extensions.kt:12:23:12:32 | p1 | 1 | extensions.kt:23:25:23:29 | "foo" | +| extensions.kt:13:5:13:16 | | 0 | extensions.kt:27:5:27:18 | new AnotherClass(...) | +| extensions.kt:13:26:13:35 | p1 | 1 | extensions.kt:27:28:27:32 | "foo" | +| extensions.kt:15:5:15:13 | | 0 | extensions.kt:24:5:24:15 | new SomeClass(...) | +| extensions.kt:15:32:15:38 | p1 | 1 | extensions.kt:24:34:24:34 | 1 | +| extensions.kt:16:5:16:16 | | 0 | extensions.kt:28:5:28:18 | new AnotherClass(...) | +| extensions.kt:16:35:16:44 | p1 | 1 | extensions.kt:28:37:28:41 | "foo" | +| extensions.kt:18:5:18:10 | | 0 | extensions.kt:29:5:29:16 | "someString" | +| extensions.kt:18:16:18:25 | p1 | 1 | extensions.kt:29:22:29:26 | "foo" | +| extensions.kt:30:9:30:14 | | 0 | extensions.kt:31:5:31:16 | "someString" | +| extensions.kt:30:20:30:29 | p1 | 1 | extensions.kt:31:22:31:31 | "bazParam" | +extensionParameter +| extensions.kt:9:5:9:13 | | +| extensions.kt:10:5:10:16 | | +| extensions.kt:12:5:12:13 | | +| extensions.kt:13:5:13:16 | | +| extensions.kt:15:5:15:13 | | +| extensions.kt:16:5:16:16 | | +| extensions.kt:18:5:18:10 | | +| extensions.kt:30:9:30:14 | | diff --git a/java/ql/test-kotlin2/library-tests/extensions/parameters.ql b/java/ql/test-kotlin2/library-tests/extensions/parameters.ql new file mode 100644 index 00000000000..6fcdd939aa6 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/extensions/parameters.ql @@ -0,0 +1,11 @@ +import java + +from Method m, int n +where m.fromSource() +select m, m.getParameter(n), n + +query predicate parametersWithArgs(Parameter p, int idx, Expr arg) { + p.fromSource() and p.getPosition() = idx and p.getAnArgument() = arg +} + +query predicate extensionParameter(Parameter p) { p.isExtensionParameter() } diff --git a/java/ql/test-kotlin2/library-tests/extensions_recursion/element.expected b/java/ql/test-kotlin2/library-tests/extensions_recursion/element.expected new file mode 100644 index 00000000000..547c41524b9 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/extensions_recursion/element.expected @@ -0,0 +1,26 @@ +| file://:0:0:0:0 | | Package | +| test.kt:0:0:0:0 | TestKt | Class | +| test.kt:0:0:0:0 | test | CompilationUnit | +| test.kt:2:1:4:1 | bar | ExtensionMethod | +| test.kt:2:1:4:1 | boolean | TypeAccess | +| test.kt:2:6:2:6 | T | TypeVariable | +| test.kt:2:9:2:14 | | Parameter | +| test.kt:2:9:2:14 | Foo | TypeAccess | +| test.kt:2:9:2:14 | T | TypeAccess | +| test.kt:2:31:4:1 | { ... } | BlockStmt | +| test.kt:3:5:3:15 | return ... | ReturnStmt | +| test.kt:3:12:3:15 | true | BooleanLiteral | +| test.kt:6:1:10:1 | Foo | Class, GenericType, ParameterizedType | +| test.kt:6:1:10:1 | Foo | Constructor | +| test.kt:6:1:10:1 | super(...) | SuperConstructorInvocationStmt | +| test.kt:6:1:10:1 | { ... } | BlockStmt | +| test.kt:6:1:10:1 | { ... } | BlockStmt | +| test.kt:6:11:6:11 | T | TypeVariable | +| test.kt:7:5:9:5 | boolean | TypeAccess | +| test.kt:7:5:9:5 | foo | Method | +| test.kt:7:24:9:5 | { ... } | BlockStmt | +| test.kt:8:9:8:20 | return ... | ReturnStmt | +| test.kt:8:16:8:20 | T | TypeAccess | +| test.kt:8:16:8:20 | TestKt | TypeAccess | +| test.kt:8:16:8:20 | bar(...) | MethodCall | +| test.kt:8:16:8:20 | this | ThisAccess | diff --git a/java/ql/test-kotlin2/library-tests/extensions_recursion/element.ql b/java/ql/test-kotlin2/library-tests/extensions_recursion/element.ql new file mode 100644 index 00000000000..c0e578f7d39 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/extensions_recursion/element.ql @@ -0,0 +1,5 @@ +import java + +from Element e +where e.fromSource() +select e, concat(e.getAPrimaryQlClass(), ", ") diff --git a/java/ql/test-kotlin2/library-tests/extensions_recursion/test.kt b/java/ql/test-kotlin2/library-tests/extensions_recursion/test.kt new file mode 100644 index 00000000000..9d03c16fa6f --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/extensions_recursion/test.kt @@ -0,0 +1,11 @@ + +fun Foo.bar(): Boolean { + return true +} + +class Foo { + fun foo(): Boolean { + return bar() + } +} + diff --git a/java/ql/test-kotlin2/library-tests/fake_overrides/all_java/A.java b/java/ql/test-kotlin2/library-tests/fake_overrides/all_java/A.java new file mode 100644 index 00000000000..702cdfc159c --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/fake_overrides/all_java/A.java @@ -0,0 +1,32 @@ + +public class A { + void foo(OB.B z) { + int foo = z.someFun(); + } +} + +class OB extends OC { + class B extends OC.C { + } +} + +class OC { + class C { + int someFun() { + return 5; + } + } +} + +class D1 {} +class D2 {} + +class E1 {} +class E2 {} + +class F1 {} +class F2 {} + +class G1 {} +class G2 {} + diff --git a/java/ql/test-kotlin2/library-tests/fake_overrides/all_java/call.expected b/java/ql/test-kotlin2/library-tests/fake_overrides/all_java/call.expected new file mode 100644 index 00000000000..6d632ddcfd9 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/fake_overrides/all_java/call.expected @@ -0,0 +1 @@ +| A.java:4:19:4:29 | someFun(...) | OC$C.class:0:0:0:0 | someFun | OC$C.class:0:0:0:0 | C | OC.class:0:0:0:0 | OC | diff --git a/java/ql/test-kotlin2/library-tests/fake_overrides/all_java/call.ql b/java/ql/test-kotlin2/library-tests/fake_overrides/all_java/call.ql new file mode 100644 index 00000000000..4ef71d42342 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/fake_overrides/all_java/call.ql @@ -0,0 +1,5 @@ +import java + +from MethodCall c +select c, c.getCallee(), c.getCallee().getDeclaringType(), + c.getCallee().getDeclaringType().(NestedType).getEnclosingType() diff --git a/java/ql/test-kotlin2/library-tests/fake_overrides/all_kotlin/A.kt b/java/ql/test-kotlin2/library-tests/fake_overrides/all_kotlin/A.kt new file mode 100644 index 00000000000..4cb6b42dba5 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/fake_overrides/all_kotlin/A.kt @@ -0,0 +1,32 @@ + +class A { + fun foo(z: OB.B) { + val foo = z.someFun() + } +} + +class OB: OC() { + public inner class B: OC.C() { + } +} + +open class OC { + open inner class C { + fun someFun(): Int { + return 5 + } + } +} + +class D1 {} +class D2 {} + +class E1 {} +class E2 {} + +class F1 {} +class F2 {} + +class G1 {} +class G2 {} + diff --git a/java/ql/test-kotlin2/library-tests/fake_overrides/all_kotlin/call.expected b/java/ql/test-kotlin2/library-tests/fake_overrides/all_kotlin/call.expected new file mode 100644 index 00000000000..6858bf0dc79 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/fake_overrides/all_kotlin/call.expected @@ -0,0 +1 @@ +| A.kt:4:19:4:29 | someFun(...) | file:///!unknown-binary-location/OC$C.class:0:0:0:0 | someFun | file:///!unknown-binary-location/OC$C.class:0:0:0:0 | C | file:///!unknown-binary-location/OC.class:0:0:0:0 | OC | diff --git a/java/ql/test-kotlin2/library-tests/fake_overrides/all_kotlin/call.ql b/java/ql/test-kotlin2/library-tests/fake_overrides/all_kotlin/call.ql new file mode 100644 index 00000000000..4ef71d42342 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/fake_overrides/all_kotlin/call.ql @@ -0,0 +1,5 @@ +import java + +from MethodCall c +select c, c.getCallee(), c.getCallee().getDeclaringType(), + c.getCallee().getDeclaringType().(NestedType).getEnclosingType() diff --git a/java/ql/test-kotlin2/library-tests/fake_overrides/kotlin_calling_java/A.kt b/java/ql/test-kotlin2/library-tests/fake_overrides/kotlin_calling_java/A.kt new file mode 100644 index 00000000000..8482210e238 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/fake_overrides/kotlin_calling_java/A.kt @@ -0,0 +1,13 @@ + +class A { + fun foo(z: OB.B) { + val foo = z.someFun() + } +} + +class E1 {} +class E2 {} + +class G1 {} +class G2 {} + diff --git a/java/ql/test-kotlin2/library-tests/fake_overrides/kotlin_calling_java/OB.java b/java/ql/test-kotlin2/library-tests/fake_overrides/kotlin_calling_java/OB.java new file mode 100644 index 00000000000..422da0c3699 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/fake_overrides/kotlin_calling_java/OB.java @@ -0,0 +1,20 @@ + +public class OB extends OC { + public class B extends OC.C { + } +} + +class OC { + public class C { + int someFun() { + return 5; + } + } +} + +class D1 {} +class D2 {} + +class F1 {} +class F2 {} + diff --git a/java/ql/test-kotlin2/library-tests/fake_overrides/kotlin_calling_java/call.expected b/java/ql/test-kotlin2/library-tests/fake_overrides/kotlin_calling_java/call.expected new file mode 100644 index 00000000000..6858bf0dc79 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/fake_overrides/kotlin_calling_java/call.expected @@ -0,0 +1 @@ +| A.kt:4:19:4:29 | someFun(...) | file:///!unknown-binary-location/OC$C.class:0:0:0:0 | someFun | file:///!unknown-binary-location/OC$C.class:0:0:0:0 | C | file:///!unknown-binary-location/OC.class:0:0:0:0 | OC | diff --git a/java/ql/test-kotlin2/library-tests/fake_overrides/kotlin_calling_java/call.ql b/java/ql/test-kotlin2/library-tests/fake_overrides/kotlin_calling_java/call.ql new file mode 100644 index 00000000000..4ef71d42342 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/fake_overrides/kotlin_calling_java/call.ql @@ -0,0 +1,5 @@ +import java + +from MethodCall c +select c, c.getCallee(), c.getCallee().getDeclaringType(), + c.getCallee().getDeclaringType().(NestedType).getEnclosingType() diff --git a/java/ql/test-kotlin2/library-tests/field-initializer-flow/test.expected b/java/ql/test-kotlin2/library-tests/field-initializer-flow/test.expected new file mode 100644 index 00000000000..5c6353b87c9 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/field-initializer-flow/test.expected @@ -0,0 +1,3 @@ +isFinalField +| test.kt:3:3:3:18 | x | +#select diff --git a/java/ql/test-kotlin2/library-tests/field-initializer-flow/test.kt b/java/ql/test-kotlin2/library-tests/field-initializer-flow/test.kt new file mode 100644 index 00000000000..a8598658da4 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/field-initializer-flow/test.kt @@ -0,0 +1,11 @@ +class Test { + + val x = "Source" + + fun test() { + sink(x) + } + + fun sink(s: String) { } + +} diff --git a/java/ql/test-kotlin2/library-tests/field-initializer-flow/test.ql b/java/ql/test-kotlin2/library-tests/field-initializer-flow/test.ql new file mode 100644 index 00000000000..7d42aebe7fb --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/field-initializer-flow/test.ql @@ -0,0 +1,20 @@ +import java +import semmle.code.java.dataflow.DataFlow + +module Config implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node n) { n.asExpr().(StringLiteral).getValue() = "Source" } + + predicate isSink(DataFlow::Node n) { + n.asExpr().(Argument).getCall().getCallee().getName() = "sink" + } +} + +module Flow = DataFlow::Global; + +query predicate isFinalField(Field f) { + exists(FieldDeclaration f2 | f = f2.getAField()) and f.isFinal() +} + +from DataFlow::Node source, DataFlow::Node sink +where Flow::flow(source, sink) +select source, sink diff --git a/java/ql/test-kotlin2/library-tests/files/otherfile.kt b/java/ql/test-kotlin2/library-tests/files/otherfile.kt new file mode 100644 index 00000000000..3be0843b407 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/files/otherfile.kt @@ -0,0 +1,3 @@ +package main + +class DefinedOtherFile { } \ No newline at end of file diff --git a/java/ql/test-kotlin2/library-tests/files/test.expected b/java/ql/test-kotlin2/library-tests/files/test.expected new file mode 100644 index 00000000000..ccc50916f9a --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/files/test.expected @@ -0,0 +1,5 @@ +| test.kt:7:3:7:11 | b | String | String.class | 0 | +| test.kt:8:3:8:24 | c | List | List.class | 0 | +| test.kt:9:3:9:28 | d | List | List.class | 0 | +| test.kt:10:3:10:24 | e | DefinedHere | DefinedHere.class | 0 | +| test.kt:11:3:11:29 | f | DefinedOtherFile | DefinedOtherFile.class | 0 | diff --git a/java/ql/test-kotlin2/library-tests/files/test.kt b/java/ql/test-kotlin2/library-tests/files/test.kt new file mode 100644 index 00000000000..2a5cb618f92 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/files/test.kt @@ -0,0 +1,14 @@ +package main + +import kotlin.collections.MutableList + +fun test( + a: Int, + b: String, + c: MutableList, + d: MutableList, + e: DefinedHere, + f: DefinedOtherFile +) { } + +class DefinedHere { } \ No newline at end of file diff --git a/java/ql/test-kotlin2/library-tests/files/test.ql b/java/ql/test-kotlin2/library-tests/files/test.ql new file mode 100644 index 00000000000..f4738d75a99 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/files/test.ql @@ -0,0 +1,6 @@ +import java + +from Parameter p +where p.fromSource() +select p, p.getType().toString(), p.getType().getFile().getBaseName(), + p.getType().getLocation().getStartLine() diff --git a/java/ql/test-kotlin2/library-tests/for-array-iterators/test.expected b/java/ql/test-kotlin2/library-tests/for-array-iterators/test.expected new file mode 100644 index 00000000000..e69de29bb2d diff --git a/java/ql/test-kotlin2/library-tests/for-array-iterators/test.kt b/java/ql/test-kotlin2/library-tests/for-array-iterators/test.kt new file mode 100644 index 00000000000..2da3a6e1e0e --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/for-array-iterators/test.kt @@ -0,0 +1,11 @@ +fun test(x: Array, y: Array<*>, z: IntArray): Int { + + var ret = 0 + + for (el in x) { ret += 1 } + for (el in y) { ret += 1 } + for (el in z) { ret += 1 } + + return ret + +} diff --git a/java/ql/test-kotlin2/library-tests/for-array-iterators/test.ql b/java/ql/test-kotlin2/library-tests/for-array-iterators/test.ql new file mode 100644 index 00000000000..6c6c9603324 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/for-array-iterators/test.ql @@ -0,0 +1,4 @@ +import java + +from MethodCall ma +select ma diff --git a/java/ql/test-kotlin2/library-tests/function-n/test.expected b/java/ql/test-kotlin2/library-tests/function-n/test.expected new file mode 100644 index 00000000000..baeab0d74e8 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/function-n/test.expected @@ -0,0 +1,3 @@ +| test.kt:4:5:4:138 | f1 | FunctionN | String | +| test.kt:5:5:5:134 | f2 | FunctionN | ? extends T1 | +| test.kt:6:5:6:110 | f3 | FunctionN | ? extends T3 | diff --git a/java/ql/test-kotlin2/library-tests/function-n/test.kt b/java/ql/test-kotlin2/library-tests/function-n/test.kt new file mode 100644 index 00000000000..1e1860a9ac4 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/function-n/test.kt @@ -0,0 +1,8 @@ +class TakesLambdas { + + fun test( + f1: (Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int) -> String, + f2: (Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int) -> T1, + f3: (T2, T2, T2, T2, T2, T2, T2, T2, T2, T2, T2, T2, T2, T2, T2, T2, T2, T2, T2, T2, T2, T2, T2, T2) -> T3) { } + +} diff --git a/java/ql/test-kotlin2/library-tests/function-n/test.ql b/java/ql/test-kotlin2/library-tests/function-n/test.ql new file mode 100644 index 00000000000..870eb169f88 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/function-n/test.ql @@ -0,0 +1,5 @@ +import java + +from Parameter p +where p.getCallable().fromSource() +select p, p.getType().toString(), p.getType().(ParameterizedType).getATypeArgument().toString() diff --git a/java/ql/test-kotlin2/library-tests/generic-inner-classes/KotlinUser.kt b/java/ql/test-kotlin2/library-tests/generic-inner-classes/KotlinUser.kt new file mode 100644 index 00000000000..b3f607fce78 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/generic-inner-classes/KotlinUser.kt @@ -0,0 +1,18 @@ +package testuser + +class User { + + fun test() { + + val a = OuterGeneric().InnerGeneric("hello") + val a2 = OuterGeneric().InnerGeneric("hello") + val b = OuterGeneric().InnerNotGeneric() + val c = OuterNotGeneric().InnerGeneric() + + val result1 = a.returnsecond(0, "hello") + val result2 = b.identity(5) + val result3 = c.identity("world") + + } + +} diff --git a/java/ql/test-kotlin2/library-tests/generic-inner-classes/OuterGeneric.kt b/java/ql/test-kotlin2/library-tests/generic-inner-classes/OuterGeneric.kt new file mode 100644 index 00000000000..616e1d3aefd --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/generic-inner-classes/OuterGeneric.kt @@ -0,0 +1,22 @@ +package testuser + +public class OuterGeneric { + + public inner class InnerNotGeneric { + + fun identity(t: T): T { return t } + + } + + public inner class InnerGeneric { + + constructor() { } + + constructor(s: S) { } + + fun returnsecond(t: T, s: S): S { return s; } + + } + +} + diff --git a/java/ql/test-kotlin2/library-tests/generic-inner-classes/OuterNotGeneric.kt b/java/ql/test-kotlin2/library-tests/generic-inner-classes/OuterNotGeneric.kt new file mode 100644 index 00000000000..f1b9f6dc2d5 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/generic-inner-classes/OuterNotGeneric.kt @@ -0,0 +1,11 @@ +package testuser + +public class OuterNotGeneric { + + public inner class InnerGeneric { + + fun identity(s: S): S { return s } + + } + +} diff --git a/java/ql/test-kotlin2/library-tests/generic-inner-classes/test.expected b/java/ql/test-kotlin2/library-tests/generic-inner-classes/test.expected new file mode 100644 index 00000000000..8b8a4753c5d --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/generic-inner-classes/test.expected @@ -0,0 +1,60 @@ +callArgs +| KotlinUser.kt:7:13:7:31 | new OuterGeneric(...) | KotlinUser.kt:7:13:7:31 | OuterGeneric | -3 | +| KotlinUser.kt:7:33:7:61 | new InnerGeneric(...) | KotlinUser.kt:7:13:7:31 | new OuterGeneric(...) | -2 | +| KotlinUser.kt:7:33:7:61 | new InnerGeneric(...) | KotlinUser.kt:7:33:7:61 | InnerGeneric | -3 | +| KotlinUser.kt:7:33:7:61 | new InnerGeneric(...) | KotlinUser.kt:7:54:7:60 | "hello" | 0 | +| KotlinUser.kt:8:14:8:32 | new OuterGeneric(...) | KotlinUser.kt:8:14:8:32 | OuterGeneric | -3 | +| KotlinUser.kt:8:34:8:54 | new InnerGeneric(...) | KotlinUser.kt:8:14:8:32 | new OuterGeneric(...) | -2 | +| KotlinUser.kt:8:34:8:54 | new InnerGeneric(...) | KotlinUser.kt:8:34:8:54 | InnerGeneric | -3 | +| KotlinUser.kt:8:34:8:54 | new InnerGeneric(...) | KotlinUser.kt:8:47:8:53 | "hello" | 0 | +| KotlinUser.kt:9:13:9:31 | new OuterGeneric(...) | KotlinUser.kt:9:13:9:31 | OuterGeneric | -3 | +| KotlinUser.kt:9:33:9:49 | new InnerNotGeneric<>(...) | KotlinUser.kt:9:13:9:31 | new OuterGeneric(...) | -2 | +| KotlinUser.kt:9:33:9:49 | new InnerNotGeneric<>(...) | KotlinUser.kt:9:33:9:49 | InnerNotGeneric<> | -3 | +| KotlinUser.kt:10:13:10:29 | new OuterNotGeneric(...) | KotlinUser.kt:10:13:10:29 | OuterNotGeneric | -3 | +| KotlinUser.kt:10:31:10:52 | new InnerGeneric(...) | KotlinUser.kt:10:13:10:29 | new OuterNotGeneric(...) | -2 | +| KotlinUser.kt:10:31:10:52 | new InnerGeneric(...) | KotlinUser.kt:10:31:10:52 | InnerGeneric | -3 | +| KotlinUser.kt:12:19:12:44 | returnsecond(...) | KotlinUser.kt:12:19:12:19 | a | -1 | +| KotlinUser.kt:12:19:12:44 | returnsecond(...) | KotlinUser.kt:12:34:12:34 | 0 | 0 | +| KotlinUser.kt:12:19:12:44 | returnsecond(...) | KotlinUser.kt:12:37:12:43 | "hello" | 1 | +| KotlinUser.kt:13:19:13:31 | identity(...) | KotlinUser.kt:13:19:13:19 | b | -1 | +| KotlinUser.kt:13:19:13:31 | identity(...) | KotlinUser.kt:13:30:13:30 | 5 | 0 | +| KotlinUser.kt:14:19:14:37 | identity(...) | KotlinUser.kt:14:19:14:19 | c | -1 | +| KotlinUser.kt:14:19:14:37 | identity(...) | KotlinUser.kt:14:30:14:36 | "world" | 0 | +genericTypes +| OuterGeneric.kt:3:1:21:1 | OuterGeneric | OuterGeneric.kt:3:27:3:27 | T | +| OuterGeneric.kt:11:3:19:3 | InnerGeneric | OuterGeneric.kt:11:35:11:35 | S | +| OuterNotGeneric.kt:5:3:9:3 | InnerGeneric | OuterNotGeneric.kt:5:35:5:35 | S | +paramTypes +| OuterGeneric.kt:3:1:21:1 | OuterGeneric | T | +| OuterGeneric.kt:11:3:19:3 | InnerGeneric | S | +| OuterNotGeneric.kt:5:3:9:3 | InnerGeneric | S | +| file:///!unknown-binary-location/testuser/OuterGeneric$InnerGeneric.class:0:0:0:0 | InnerGeneric | String | +| file:///!unknown-binary-location/testuser/OuterGeneric.class:0:0:0:0 | OuterGeneric | Integer | +| file:///!unknown-binary-location/testuser/OuterNotGeneric$InnerGeneric.class:0:0:0:0 | InnerGeneric | String | +constructors +| KotlinUser.kt:3:1:18:1 | User | +| OuterGeneric.kt:3:1:21:1 | OuterGeneric | +| OuterGeneric.kt:5:3:9:3 | InnerNotGeneric | +| OuterGeneric.kt:13:5:13:21 | InnerGeneric | +| OuterGeneric.kt:15:5:15:25 | InnerGeneric | +| OuterNotGeneric.kt:3:1:11:1 | OuterNotGeneric | +| OuterNotGeneric.kt:5:3:9:3 | InnerGeneric | +| file:///!unknown-binary-location/testuser/OuterGeneric$InnerGeneric.class:0:0:0:0 | InnerGeneric | +| file:///!unknown-binary-location/testuser/OuterGeneric$InnerGeneric.class:0:0:0:0 | InnerGeneric | +| file:///!unknown-binary-location/testuser/OuterGeneric$InnerNotGeneric.class:0:0:0:0 | InnerNotGeneric<> | +| file:///!unknown-binary-location/testuser/OuterGeneric.class:0:0:0:0 | OuterGeneric | +| file:///!unknown-binary-location/testuser/OuterNotGeneric$InnerGeneric.class:0:0:0:0 | InnerGeneric | +nestedTypes +| OuterGeneric.kt:5:3:9:3 | InnerNotGeneric | OuterGeneric.kt:3:1:21:1 | OuterGeneric | +| OuterGeneric.kt:11:3:19:3 | InnerGeneric | OuterGeneric.kt:3:1:21:1 | OuterGeneric | +| OuterNotGeneric.kt:5:3:9:3 | InnerGeneric | OuterNotGeneric.kt:3:1:11:1 | OuterNotGeneric | +| file:///!unknown-binary-location/testuser/OuterGeneric$InnerGeneric.class:0:0:0:0 | InnerGeneric | file:///!unknown-binary-location/testuser/OuterGeneric.class:0:0:0:0 | OuterGeneric | +| file:///!unknown-binary-location/testuser/OuterGeneric$InnerNotGeneric.class:0:0:0:0 | InnerNotGeneric<> | file:///!unknown-binary-location/testuser/OuterGeneric.class:0:0:0:0 | OuterGeneric | +| file:///!unknown-binary-location/testuser/OuterNotGeneric$InnerGeneric.class:0:0:0:0 | InnerGeneric | OuterNotGeneric.kt:3:1:11:1 | OuterNotGeneric | +#select +| KotlinUser.kt:7:13:7:31 | new OuterGeneric(...) | file:///!unknown-binary-location/testuser/OuterGeneric.class:0:0:0:0 | OuterGeneric | file:///!unknown-binary-location/testuser/OuterGeneric.class:0:0:0:0 | OuterGeneric | KotlinUser.kt:7:13:7:31 | Integer | +| KotlinUser.kt:7:33:7:61 | new InnerGeneric(...) | file:///!unknown-binary-location/testuser/OuterGeneric$InnerGeneric.class:0:0:0:0 | InnerGeneric | file:///!unknown-binary-location/testuser/OuterGeneric$InnerGeneric.class:0:0:0:0 | InnerGeneric | KotlinUser.kt:7:33:7:61 | String | +| KotlinUser.kt:8:14:8:32 | new OuterGeneric(...) | file:///!unknown-binary-location/testuser/OuterGeneric.class:0:0:0:0 | OuterGeneric | file:///!unknown-binary-location/testuser/OuterGeneric.class:0:0:0:0 | OuterGeneric | KotlinUser.kt:8:14:8:32 | Integer | +| KotlinUser.kt:8:34:8:54 | new InnerGeneric(...) | file:///!unknown-binary-location/testuser/OuterGeneric$InnerGeneric.class:0:0:0:0 | InnerGeneric | file:///!unknown-binary-location/testuser/OuterGeneric$InnerGeneric.class:0:0:0:0 | InnerGeneric | KotlinUser.kt:8:34:8:54 | String | +| KotlinUser.kt:9:13:9:31 | new OuterGeneric(...) | file:///!unknown-binary-location/testuser/OuterGeneric.class:0:0:0:0 | OuterGeneric | file:///!unknown-binary-location/testuser/OuterGeneric.class:0:0:0:0 | OuterGeneric | KotlinUser.kt:9:13:9:31 | Integer | +| KotlinUser.kt:10:31:10:52 | new InnerGeneric(...) | file:///!unknown-binary-location/testuser/OuterNotGeneric$InnerGeneric.class:0:0:0:0 | InnerGeneric | file:///!unknown-binary-location/testuser/OuterNotGeneric$InnerGeneric.class:0:0:0:0 | InnerGeneric | KotlinUser.kt:10:31:10:52 | String | diff --git a/java/ql/test-kotlin2/library-tests/generic-inner-classes/test.ql b/java/ql/test-kotlin2/library-tests/generic-inner-classes/test.ql new file mode 100644 index 00000000000..9729007e9ce --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/generic-inner-classes/test.ql @@ -0,0 +1,28 @@ +import java + +query predicate callArgs(Call gc, Expr arg, int idx) { + arg.getParent() = gc and idx = arg.getIndex() +} + +query predicate genericTypes(GenericType rt, TypeVariable param) { + rt.getPackage().getName() = "testuser" and + param = rt.getATypeParameter() +} + +query predicate paramTypes(ParameterizedType rt, string typeArg) { + rt.getPackage().getName() = "testuser" and + typeArg = rt.getATypeArgument().toString() +} + +query predicate constructors(Constructor c) { + c.getDeclaringType().getPackage().getName() = "testuser" +} + +query predicate nestedTypes(NestedType nt, RefType parent) { + nt.getPackage().getName() = "testuser" and + parent = nt.getEnclosingType() +} + +from ClassInstanceExpr cie +where cie.getFile().isSourceFile() +select cie, cie.getConstructedType(), cie.getConstructor(), cie.getATypeArgument() diff --git a/java/ql/test-kotlin2/library-tests/generic-instance-methods/Test.java b/java/ql/test-kotlin2/library-tests/generic-instance-methods/Test.java new file mode 100644 index 00000000000..028b9d40c9b --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/generic-instance-methods/Test.java @@ -0,0 +1,33 @@ +class Generic2 { + + public Generic2(T init) { stored = init; } + + private T stored; + + T identity2(T param) { return identity(param); } + T identity(T param) { return param; } + T getter() { return stored; } + void setter(T param) { stored = param; } + +} + +public class Test { + + public static void user() { + + Generic2 invariant = new Generic2("hello world"); + invariant.identity("hello world"); + invariant.identity2("hello world"); + + Generic2 projectedOut = invariant; + projectedOut.getter(); + + Generic2 projectedIn = invariant; + projectedIn.setter("hi planet"); + projectedIn.getter(); + + } + +} + + diff --git a/java/ql/test-kotlin2/library-tests/generic-instance-methods/test.expected b/java/ql/test-kotlin2/library-tests/generic-instance-methods/test.expected new file mode 100644 index 00000000000..d4a8aa109e8 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/generic-instance-methods/test.expected @@ -0,0 +1,85 @@ +calls +| Test.java:7:33:7:47 | identity(...) | Test.java:7:5:7:13 | identity2 | Test.java:1:7:1:14 | Generic2 | Test.java:8:5:8:12 | identity | Test.java:1:7:1:14 | Generic2 | +| Test.java:19:5:19:37 | identity(...) | Test.java:16:22:16:25 | user | Test.java:14:14:14:17 | Test | Generic2.class:0:0:0:0 | identity | Generic2.class:0:0:0:0 | Generic2 | +| Test.java:20:5:20:38 | identity2(...) | Test.java:16:22:16:25 | user | Test.java:14:14:14:17 | Test | Generic2.class:0:0:0:0 | identity2 | Generic2.class:0:0:0:0 | Generic2 | +| Test.java:23:5:23:25 | getter(...) | Test.java:16:22:16:25 | user | Test.java:14:14:14:17 | Test | Generic2.class:0:0:0:0 | getter | Generic2.class:0:0:0:0 | Generic2 | +| Test.java:26:5:26:35 | setter(...) | Test.java:16:22:16:25 | user | Test.java:14:14:14:17 | Test | Generic2.class:0:0:0:0 | setter | Generic2.class:0:0:0:0 | Generic2 | +| Test.java:27:5:27:24 | getter(...) | Test.java:16:22:16:25 | user | Test.java:14:14:14:17 | Test | Generic2.class:0:0:0:0 | getter | Generic2.class:0:0:0:0 | Generic2 | +| test.kt:5:32:5:46 | identity(...) | test.kt:5:3:5:46 | identity2 | test.kt:1:1:13:1 | Generic | test.kt:6:3:6:35 | identity | test.kt:1:1:13:1 | Generic | +| test.kt:7:21:7:26 | getStored(...) | test.kt:7:3:7:26 | getter | test.kt:1:1:13:1 | Generic | test.kt:3:3:3:19 | getStored | test.kt:1:1:13:1 | Generic | +| test.kt:8:26:8:39 | setStored(...) | test.kt:8:3:8:41 | setter | test.kt:1:1:13:1 | Generic | test.kt:3:3:3:19 | setStored | test.kt:1:1:13:1 | Generic | +| test.kt:11:44:11:70 | privateid(...) | test.kt:11:3:11:70 | callPrivateId | test.kt:1:1:13:1 | Generic | file:///!unknown-binary-location/Generic.class:0:0:0:0 | privateid | file:///!unknown-binary-location/Generic.class:0:0:0:0 | Generic | +| test.kt:18:3:18:35 | identity(...) | test.kt:15:1:28:1 | user | test.kt:0:0:0:0 | TestKt | file:///!unknown-binary-location/Generic.class:0:0:0:0 | identity | file:///!unknown-binary-location/Generic.class:0:0:0:0 | Generic | +| test.kt:19:3:19:36 | identity2(...) | test.kt:15:1:28:1 | user | test.kt:0:0:0:0 | TestKt | file:///!unknown-binary-location/Generic.class:0:0:0:0 | identity2 | file:///!unknown-binary-location/Generic.class:0:0:0:0 | Generic | +| test.kt:22:3:22:23 | getter(...) | test.kt:15:1:28:1 | user | test.kt:0:0:0:0 | TestKt | file:///!unknown-binary-location/Generic.class:0:0:0:0 | getter | file:///!unknown-binary-location/Generic.class:0:0:0:0 | Generic | +| test.kt:25:3:25:33 | setter(...) | test.kt:15:1:28:1 | user | test.kt:0:0:0:0 | TestKt | file:///!unknown-binary-location/Generic.class:0:0:0:0 | setter | file:///!unknown-binary-location/Generic.class:0:0:0:0 | Generic | +| test.kt:26:3:26:22 | getter(...) | test.kt:15:1:28:1 | user | test.kt:0:0:0:0 | TestKt | file:///!unknown-binary-location/Generic.class:0:0:0:0 | getter | file:///!unknown-binary-location/Generic.class:0:0:0:0 | Generic | +constructors +| Generic2.class:0:0:0:0 | Generic2 | Generic2.class:0:0:0:0 | Generic2 | Generic2() | | void | Test.java:1:7:1:14 | Generic2 | Test.java:3:10:3:17 | Generic2 | +| Generic2.class:0:0:0:0 | Generic2 | Generic2.class:0:0:0:0 | Generic2 | Generic2(java.lang.String) | String | void | Test.java:1:7:1:14 | Generic2 | Test.java:3:10:3:17 | Generic2 | +| Generic2.class:0:0:0:0 | Generic2 | Generic2.class:0:0:0:0 | Generic2 | Generic2(java.lang.String) | String | void | Test.java:1:7:1:14 | Generic2 | Test.java:3:10:3:17 | Generic2 | +| Test.java:1:7:1:14 | Generic2 | Test.java:3:10:3:17 | Generic2 | Generic2(java.lang.Object) | T | void | Test.java:1:7:1:14 | Generic2 | Test.java:3:10:3:17 | Generic2 | +| Test.java:14:14:14:17 | Test | Test.java:14:14:14:17 | Test | Test() | No parameters | void | Test.java:14:14:14:17 | Test | Test.java:14:14:14:17 | Test | +| file:///!unknown-binary-location/Generic.class:0:0:0:0 | Generic | file:///!unknown-binary-location/Generic.class:0:0:0:0 | Generic | Generic(java.lang.Void) | Void | void | test.kt:1:1:13:1 | Generic | test.kt:1:17:1:25 | Generic | +| file:///!unknown-binary-location/Generic.class:0:0:0:0 | Generic | file:///!unknown-binary-location/Generic.class:0:0:0:0 | Generic | Generic(java.lang.String) | String | void | test.kt:1:1:13:1 | Generic | test.kt:1:17:1:25 | Generic | +| file:///!unknown-binary-location/Generic.class:0:0:0:0 | Generic | file:///!unknown-binary-location/Generic.class:0:0:0:0 | Generic | Generic(java.lang.String) | String | void | test.kt:1:1:13:1 | Generic | test.kt:1:17:1:25 | Generic | +| test.kt:1:1:13:1 | Generic | test.kt:1:17:1:25 | Generic | Generic(java.lang.Object) | T | void | test.kt:1:1:13:1 | Generic | test.kt:1:17:1:25 | Generic | +constructorCalls +| Test.java:18:34:18:68 | new Generic2(...) | Generic2.class:0:0:0:0 | Generic2 | +| test.kt:17:19:17:48 | new Generic(...) | file:///!unknown-binary-location/Generic.class:0:0:0:0 | Generic | +refTypes +| Test.java:1:7:1:14 | Generic2 | +| Test.java:1:16:1:16 | T | +| Test.java:14:14:14:17 | Test | +| test.kt:0:0:0:0 | TestKt | +| test.kt:1:1:13:1 | Generic | +| test.kt:1:15:1:15 | T | +#select +| Generic2.class:0:0:0:0 | Generic2 | Generic2.class:0:0:0:0 | getter | getter() | No parameters | String | Test.java:1:7:1:14 | Generic2 | Test.java:9:5:9:10 | getter | +| Generic2.class:0:0:0:0 | Generic2 | Generic2.class:0:0:0:0 | identity | identity() | | String | Test.java:1:7:1:14 | Generic2 | Test.java:8:5:8:12 | identity | +| Generic2.class:0:0:0:0 | Generic2 | Generic2.class:0:0:0:0 | identity2 | identity2() | | String | Test.java:1:7:1:14 | Generic2 | Test.java:7:5:7:13 | identity2 | +| Generic2.class:0:0:0:0 | Generic2 | Generic2.class:0:0:0:0 | setter | setter() | | void | Test.java:1:7:1:14 | Generic2 | Test.java:10:8:10:13 | setter | +| Generic2.class:0:0:0:0 | Generic2 | Generic2.class:0:0:0:0 | getter | getter() | No parameters | Object | Test.java:1:7:1:14 | Generic2 | Test.java:9:5:9:10 | getter | +| Generic2.class:0:0:0:0 | Generic2 | Generic2.class:0:0:0:0 | identity | identity(java.lang.String) | String | Object | Test.java:1:7:1:14 | Generic2 | Test.java:8:5:8:12 | identity | +| Generic2.class:0:0:0:0 | Generic2 | Generic2.class:0:0:0:0 | identity2 | identity2(java.lang.String) | String | Object | Test.java:1:7:1:14 | Generic2 | Test.java:7:5:7:13 | identity2 | +| Generic2.class:0:0:0:0 | Generic2 | Generic2.class:0:0:0:0 | setter | setter(java.lang.String) | String | void | Test.java:1:7:1:14 | Generic2 | Test.java:10:8:10:13 | setter | +| Generic2.class:0:0:0:0 | Generic2 | Generic2.class:0:0:0:0 | getter | getter() | No parameters | String | Test.java:1:7:1:14 | Generic2 | Test.java:9:5:9:10 | getter | +| Generic2.class:0:0:0:0 | Generic2 | Generic2.class:0:0:0:0 | identity | identity(java.lang.String) | String | String | Test.java:1:7:1:14 | Generic2 | Test.java:8:5:8:12 | identity | +| Generic2.class:0:0:0:0 | Generic2 | Generic2.class:0:0:0:0 | identity2 | identity2(java.lang.String) | String | String | Test.java:1:7:1:14 | Generic2 | Test.java:7:5:7:13 | identity2 | +| Generic2.class:0:0:0:0 | Generic2 | Generic2.class:0:0:0:0 | setter | setter(java.lang.String) | String | void | Test.java:1:7:1:14 | Generic2 | Test.java:10:8:10:13 | setter | +| Test.java:1:7:1:14 | Generic2 | Test.java:7:5:7:13 | identity2 | identity2(java.lang.Object) | T | T | Test.java:1:7:1:14 | Generic2 | Test.java:7:5:7:13 | identity2 | +| Test.java:1:7:1:14 | Generic2 | Test.java:8:5:8:12 | identity | identity(java.lang.Object) | T | T | Test.java:1:7:1:14 | Generic2 | Test.java:8:5:8:12 | identity | +| Test.java:1:7:1:14 | Generic2 | Test.java:9:5:9:10 | getter | getter() | No parameters | T | Test.java:1:7:1:14 | Generic2 | Test.java:9:5:9:10 | getter | +| Test.java:1:7:1:14 | Generic2 | Test.java:10:8:10:13 | setter | setter(java.lang.Object) | T | void | Test.java:1:7:1:14 | Generic2 | Test.java:10:8:10:13 | setter | +| Test.java:14:14:14:17 | Test | Test.java:16:22:16:25 | user | user() | No parameters | void | Test.java:14:14:14:17 | Test | Test.java:16:22:16:25 | user | +| file:///!unknown-binary-location/Generic.class:0:0:0:0 | Generic | file:///!unknown-binary-location/Generic.class:0:0:0:0 | callPrivateId | callPrivateId(Generic) | Generic | String | test.kt:1:1:13:1 | Generic | test.kt:11:3:11:70 | callPrivateId | +| file:///!unknown-binary-location/Generic.class:0:0:0:0 | Generic | file:///!unknown-binary-location/Generic.class:0:0:0:0 | getStored | getStored() | No parameters | String | test.kt:1:1:13:1 | Generic | test.kt:3:3:3:19 | getStored | +| file:///!unknown-binary-location/Generic.class:0:0:0:0 | Generic | file:///!unknown-binary-location/Generic.class:0:0:0:0 | getter | getter() | No parameters | String | test.kt:1:1:13:1 | Generic | test.kt:7:3:7:26 | getter | +| file:///!unknown-binary-location/Generic.class:0:0:0:0 | Generic | file:///!unknown-binary-location/Generic.class:0:0:0:0 | identity | identity(java.lang.Void) | Void | String | test.kt:1:1:13:1 | Generic | test.kt:6:3:6:35 | identity | +| file:///!unknown-binary-location/Generic.class:0:0:0:0 | Generic | file:///!unknown-binary-location/Generic.class:0:0:0:0 | identity2 | identity2(java.lang.Void) | Void | String | test.kt:1:1:13:1 | Generic | test.kt:5:3:5:46 | identity2 | +| file:///!unknown-binary-location/Generic.class:0:0:0:0 | Generic | file:///!unknown-binary-location/Generic.class:0:0:0:0 | setStored | setStored(java.lang.Void) | Void | void | test.kt:1:1:13:1 | Generic | test.kt:3:3:3:19 | setStored | +| file:///!unknown-binary-location/Generic.class:0:0:0:0 | Generic | file:///!unknown-binary-location/Generic.class:0:0:0:0 | setter | setter(java.lang.Void) | Void | void | test.kt:1:1:13:1 | Generic | test.kt:8:3:8:41 | setter | +| file:///!unknown-binary-location/Generic.class:0:0:0:0 | Generic | file:///!unknown-binary-location/Generic.class:0:0:0:0 | callPrivateId | callPrivateId(Generic) | Generic | String | test.kt:1:1:13:1 | Generic | test.kt:11:3:11:70 | callPrivateId | +| file:///!unknown-binary-location/Generic.class:0:0:0:0 | Generic | file:///!unknown-binary-location/Generic.class:0:0:0:0 | getStored | getStored() | No parameters | Object | test.kt:1:1:13:1 | Generic | test.kt:3:3:3:19 | getStored | +| file:///!unknown-binary-location/Generic.class:0:0:0:0 | Generic | file:///!unknown-binary-location/Generic.class:0:0:0:0 | getter | getter() | No parameters | Object | test.kt:1:1:13:1 | Generic | test.kt:7:3:7:26 | getter | +| file:///!unknown-binary-location/Generic.class:0:0:0:0 | Generic | file:///!unknown-binary-location/Generic.class:0:0:0:0 | identity | identity(java.lang.String) | String | Object | test.kt:1:1:13:1 | Generic | test.kt:6:3:6:35 | identity | +| file:///!unknown-binary-location/Generic.class:0:0:0:0 | Generic | file:///!unknown-binary-location/Generic.class:0:0:0:0 | identity2 | identity2(java.lang.String) | String | Object | test.kt:1:1:13:1 | Generic | test.kt:5:3:5:46 | identity2 | +| file:///!unknown-binary-location/Generic.class:0:0:0:0 | Generic | file:///!unknown-binary-location/Generic.class:0:0:0:0 | setStored | setStored(java.lang.String) | String | void | test.kt:1:1:13:1 | Generic | test.kt:3:3:3:19 | setStored | +| file:///!unknown-binary-location/Generic.class:0:0:0:0 | Generic | file:///!unknown-binary-location/Generic.class:0:0:0:0 | setter | setter(java.lang.String) | String | void | test.kt:1:1:13:1 | Generic | test.kt:8:3:8:41 | setter | +| file:///!unknown-binary-location/Generic.class:0:0:0:0 | Generic | file:///!unknown-binary-location/Generic.class:0:0:0:0 | callPrivateId | callPrivateId(Generic) | Generic | String | test.kt:1:1:13:1 | Generic | test.kt:11:3:11:70 | callPrivateId | +| file:///!unknown-binary-location/Generic.class:0:0:0:0 | Generic | file:///!unknown-binary-location/Generic.class:0:0:0:0 | getStored | getStored() | No parameters | String | test.kt:1:1:13:1 | Generic | test.kt:3:3:3:19 | getStored | +| file:///!unknown-binary-location/Generic.class:0:0:0:0 | Generic | file:///!unknown-binary-location/Generic.class:0:0:0:0 | getter | getter() | No parameters | String | test.kt:1:1:13:1 | Generic | test.kt:7:3:7:26 | getter | +| file:///!unknown-binary-location/Generic.class:0:0:0:0 | Generic | file:///!unknown-binary-location/Generic.class:0:0:0:0 | identity | identity(java.lang.String) | String | String | test.kt:1:1:13:1 | Generic | test.kt:6:3:6:35 | identity | +| file:///!unknown-binary-location/Generic.class:0:0:0:0 | Generic | file:///!unknown-binary-location/Generic.class:0:0:0:0 | identity2 | identity2(java.lang.String) | String | String | test.kt:1:1:13:1 | Generic | test.kt:5:3:5:46 | identity2 | +| file:///!unknown-binary-location/Generic.class:0:0:0:0 | Generic | file:///!unknown-binary-location/Generic.class:0:0:0:0 | privateid | privateid(java.lang.String) | String | String | test.kt:1:1:13:1 | Generic | test.kt:10:3:10:41 | privateid | +| file:///!unknown-binary-location/Generic.class:0:0:0:0 | Generic | file:///!unknown-binary-location/Generic.class:0:0:0:0 | setStored | setStored(java.lang.String) | String | void | test.kt:1:1:13:1 | Generic | test.kt:3:3:3:19 | setStored | +| file:///!unknown-binary-location/Generic.class:0:0:0:0 | Generic | file:///!unknown-binary-location/Generic.class:0:0:0:0 | setter | setter(java.lang.String) | String | void | test.kt:1:1:13:1 | Generic | test.kt:8:3:8:41 | setter | +| test.kt:0:0:0:0 | TestKt | test.kt:15:1:28:1 | user | user() | No parameters | void | test.kt:0:0:0:0 | TestKt | test.kt:15:1:28:1 | user | +| test.kt:1:1:13:1 | Generic | test.kt:3:3:3:19 | getStored | getStored() | No parameters | T | test.kt:1:1:13:1 | Generic | test.kt:3:3:3:19 | getStored | +| test.kt:1:1:13:1 | Generic | test.kt:3:3:3:19 | setStored | setStored(java.lang.Object) | T | void | test.kt:1:1:13:1 | Generic | test.kt:3:3:3:19 | setStored | +| test.kt:1:1:13:1 | Generic | test.kt:5:3:5:46 | identity2 | identity2(java.lang.Object) | T | T | test.kt:1:1:13:1 | Generic | test.kt:5:3:5:46 | identity2 | +| test.kt:1:1:13:1 | Generic | test.kt:6:3:6:35 | identity | identity(java.lang.Object) | T | T | test.kt:1:1:13:1 | Generic | test.kt:6:3:6:35 | identity | +| test.kt:1:1:13:1 | Generic | test.kt:7:3:7:26 | getter | getter() | No parameters | T | test.kt:1:1:13:1 | Generic | test.kt:7:3:7:26 | getter | +| test.kt:1:1:13:1 | Generic | test.kt:8:3:8:41 | setter | setter(java.lang.Object) | T | void | test.kt:1:1:13:1 | Generic | test.kt:8:3:8:41 | setter | +| test.kt:1:1:13:1 | Generic | test.kt:10:3:10:41 | privateid | privateid(java.lang.Object) | T | T | test.kt:1:1:13:1 | Generic | test.kt:10:3:10:41 | privateid | +| test.kt:1:1:13:1 | Generic | test.kt:11:3:11:70 | callPrivateId | callPrivateId(Generic) | Generic | String | test.kt:1:1:13:1 | Generic | test.kt:11:3:11:70 | callPrivateId | diff --git a/java/ql/test-kotlin2/library-tests/generic-instance-methods/test.kt b/java/ql/test-kotlin2/library-tests/generic-instance-methods/test.kt new file mode 100644 index 00000000000..064d4e654ba --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/generic-instance-methods/test.kt @@ -0,0 +1,28 @@ +class Generic(init: T) { + + var stored = init + + fun identity2(param: T): T = identity(param) + fun identity(param: T): T = param + fun getter(): T = stored + fun setter(param: T) { stored = param } + + private fun privateid(param: T) = param + fun callPrivateId(gs: Generic) = gs.privateid("hello world") + +} + +fun user() { + + val invariant = Generic("hello world") + invariant.identity("hello world") + invariant.identity2("hello world") + + val projectedOut: Generic = invariant + projectedOut.getter() + + val projectedIn: Generic = invariant + projectedIn.setter("hi planet") + projectedIn.getter() + +} diff --git a/java/ql/test-kotlin2/library-tests/generic-instance-methods/test.ql b/java/ql/test-kotlin2/library-tests/generic-instance-methods/test.ql new file mode 100644 index 00000000000..7540a27bed6 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/generic-instance-methods/test.ql @@ -0,0 +1,46 @@ +import java + +string paramTypeIfPresent(Callable m) { + if exists(m.getAParamType()) + then result = m.getAParamType().toString() + else result = "No parameters" +} + +query predicate calls( + MethodCall ma, Callable caller, RefType callerType, Callable called, RefType calledType +) { + ma.getEnclosingCallable() = caller and + ma.getCallee() = called and + caller.fromSource() and + callerType = caller.getDeclaringType() and + calledType = called.getDeclaringType() +} + +query predicate constructors( + RefType t, Constructor c, string signature, string paramType, string returnType, + RefType sourceDeclType, Constructor sourceDecl +) { + t.getSourceDeclaration().fromSource() and + c.getDeclaringType() = t and + signature = c.getSignature() and + paramType = paramTypeIfPresent(c) and + returnType = c.getReturnType().toString() and + sourceDecl = c.getSourceDeclaration() and + sourceDeclType = sourceDecl.getDeclaringType() +} + +query predicate constructorCalls(ConstructorCall cc, Constructor callee) { + callee = cc.getConstructor() and + callee.getSourceDeclaration().fromSource() +} + +query predicate refTypes(RefType rt) { rt.fromSource() } + +from RefType t, Method m, Method sourceDecl, RefType sourceDeclType +where + t.getSourceDeclaration().fromSource() and + m.getDeclaringType() = t and + sourceDecl = m.getSourceDeclaration() and + sourceDeclType = sourceDecl.getDeclaringType() +select t, m, m.getSignature(), paramTypeIfPresent(m), m.getReturnType().toString(), sourceDeclType, + sourceDecl diff --git a/java/ql/test-kotlin2/library-tests/generic-methods/ClassWithParams.kt b/java/ql/test-kotlin2/library-tests/generic-methods/ClassWithParams.kt new file mode 100644 index 00000000000..698728780e9 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/generic-methods/ClassWithParams.kt @@ -0,0 +1,10 @@ +public class ClassWithParams { + + fun noTypeParams() { } + + fun instanceHasTypeParam(s : S?) { } + + fun instanceHasTypeParamUsesClassTypeParam(s : S?, t: T?) { } + +} + diff --git a/java/ql/test-kotlin2/library-tests/generic-methods/ClassWithoutParams.kt b/java/ql/test-kotlin2/library-tests/generic-methods/ClassWithoutParams.kt new file mode 100644 index 00000000000..841dbd813e5 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/generic-methods/ClassWithoutParams.kt @@ -0,0 +1,7 @@ +public class ClassWithoutParams { + + fun noTypeParams() { } + + fun hasTypeParams(t : T?) { } + +} diff --git a/java/ql/test-kotlin2/library-tests/generic-methods/kttest.kt b/java/ql/test-kotlin2/library-tests/generic-methods/kttest.kt new file mode 100644 index 00000000000..56e8069f34b --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/generic-methods/kttest.kt @@ -0,0 +1,17 @@ +fun test() { + + val cwp = ClassWithoutParams() + cwp.noTypeParams(); + cwp.hasTypeParams(null) + + val specialised = ClassWithParams() + specialised.noTypeParams() + specialised.instanceHasTypeParam(null) + specialised.instanceHasTypeParamUsesClassTypeParam(null, null) + + val wildcard : ClassWithParams = ClassWithParams() + wildcard.noTypeParams() + wildcard.instanceHasTypeParam(null) + wildcard.instanceHasTypeParamUsesClassTypeParam(null, null) + +} diff --git a/java/ql/test-kotlin2/library-tests/generic-methods/test.expected b/java/ql/test-kotlin2/library-tests/generic-methods/test.expected new file mode 100644 index 00000000000..2b7bada1317 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/generic-methods/test.expected @@ -0,0 +1,7 @@ +| kttest.kt:5:5:5:7 | cwp | ClassWithoutParams.kt:5:3:5:35 | hasTypeParams | hasTypeParams(java.lang.Object) | T | ClassWithoutParams.kt:1:1:7:1 | ClassWithoutParams | +| kttest.kt:9:5:9:15 | specialised | file:///!unknown-binary-location/ClassWithParams.class:0:0:0:0 | instanceHasTypeParam | instanceHasTypeParam(java.lang.Object) | S | file:///!unknown-binary-location/ClassWithParams.class:0:0:0:0 | ClassWithParams | +| kttest.kt:10:5:10:15 | specialised | file:///!unknown-binary-location/ClassWithParams.class:0:0:0:0 | instanceHasTypeParamUsesClassTypeParam | instanceHasTypeParamUsesClassTypeParam(java.lang.Object,java.lang.String) | S | file:///!unknown-binary-location/ClassWithParams.class:0:0:0:0 | ClassWithParams | +| kttest.kt:10:5:10:15 | specialised | file:///!unknown-binary-location/ClassWithParams.class:0:0:0:0 | instanceHasTypeParamUsesClassTypeParam | instanceHasTypeParamUsesClassTypeParam(java.lang.Object,java.lang.String) | String | file:///!unknown-binary-location/ClassWithParams.class:0:0:0:0 | ClassWithParams | +| kttest.kt:14:5:14:12 | wildcard | file:///!unknown-binary-location/ClassWithParams.class:0:0:0:0 | instanceHasTypeParam | instanceHasTypeParam(java.lang.Object) | S | file:///!unknown-binary-location/ClassWithParams.class:0:0:0:0 | ClassWithParams | +| kttest.kt:15:5:15:12 | wildcard | file:///!unknown-binary-location/ClassWithParams.class:0:0:0:0 | instanceHasTypeParamUsesClassTypeParam | instanceHasTypeParamUsesClassTypeParam(java.lang.Object,java.lang.Void) | S | file:///!unknown-binary-location/ClassWithParams.class:0:0:0:0 | ClassWithParams | +| kttest.kt:15:5:15:12 | wildcard | file:///!unknown-binary-location/ClassWithParams.class:0:0:0:0 | instanceHasTypeParamUsesClassTypeParam | instanceHasTypeParamUsesClassTypeParam(java.lang.Object,java.lang.Void) | Void | file:///!unknown-binary-location/ClassWithParams.class:0:0:0:0 | ClassWithParams | diff --git a/java/ql/test-kotlin2/library-tests/generic-methods/test.ql b/java/ql/test-kotlin2/library-tests/generic-methods/test.ql new file mode 100644 index 00000000000..fb67d4b38d0 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/generic-methods/test.ql @@ -0,0 +1,5 @@ +import java + +from MethodCall ma +select ma.getQualifier(), ma.getCallee(), ma.getCallee().getSignature(), + ma.getCallee().getAParamType().toString(), ma.getCallee().getDeclaringType() diff --git a/java/ql/test-kotlin2/library-tests/generic-selective-extraction/Test.java b/java/ql/test-kotlin2/library-tests/generic-selective-extraction/Test.java new file mode 100644 index 00000000000..6129c67dcdc --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/generic-selective-extraction/Test.java @@ -0,0 +1,23 @@ +public class Test { + + public T field; + public T method() { return field; } + +} + +class FieldUsed {} +class MethodUsed {} +class ConstructorUsed {} +class NeitherUsed {} + +class User { + + public static void test(Test neitherUsed, Test methodUsed, Test fieldUsed) { + + fieldUsed.field = null; + methodUsed.method(); + Test constructorUsed = new Test(); + + } + +} diff --git a/java/ql/test-kotlin2/library-tests/generic-selective-extraction/Test.kt b/java/ql/test-kotlin2/library-tests/generic-selective-extraction/Test.kt new file mode 100644 index 00000000000..a1efb682806 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/generic-selective-extraction/Test.kt @@ -0,0 +1,27 @@ +class TestKt { + + var field: T? = null + @JvmField + var rawField: T? = null + fun method() = field + +} + +class FieldUsedKt {} +class RawFieldUsedKt {} +class MethodUsedKt {} +class ConstructorUsedKt {} +class NeitherUsedKt {} + +class UserKt { + + fun test(neitherUsed: TestKt, methodUsed: TestKt, fieldUsed: TestKt, rawFieldUsed: TestKt) { + + fieldUsed.field = null + rawFieldUsed.rawField = null + methodUsed.method() + val constructorUsed = TestKt() + + } + +} diff --git a/java/ql/test-kotlin2/library-tests/generic-selective-extraction/test.expected b/java/ql/test-kotlin2/library-tests/generic-selective-extraction/test.expected new file mode 100644 index 00000000000..d64054af2f7 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/generic-selective-extraction/test.expected @@ -0,0 +1,52 @@ +| Test.class:0:0:0:0 | Test | Test.class:0:0:0:0 | Test | +| Test.class:0:0:0:0 | Test | Test.class:0:0:0:0 | method | +| Test.class:0:0:0:0 | Test | Test.class:0:0:0:0 | Test | +| Test.class:0:0:0:0 | Test | Test.class:0:0:0:0 | method | +| Test.java:1:14:1:17 | Test | Test.java:1:14:1:17 | Test | +| Test.java:1:14:1:17 | Test | Test.java:3:12:3:16 | field | +| Test.java:1:14:1:17 | Test | Test.java:4:12:4:17 | method | +| Test.java:8:7:8:15 | FieldUsed | Test.java:8:7:8:15 | FieldUsed | +| Test.java:9:7:9:16 | MethodUsed | Test.java:9:7:9:16 | MethodUsed | +| Test.java:10:7:10:21 | ConstructorUsed | Test.java:10:7:10:21 | ConstructorUsed | +| Test.java:11:7:11:17 | NeitherUsed | Test.java:11:7:11:17 | NeitherUsed | +| Test.java:13:7:13:10 | User | Test.java:13:7:13:10 | User | +| Test.java:13:7:13:10 | User | Test.java:15:22:15:25 | test | +| Test.kt:1:1:8:1 | TestKt | Test.kt:1:1:8:1 | TestKt | +| Test.kt:1:1:8:1 | TestKt | Test.kt:3:3:3:22 | field | +| Test.kt:1:1:8:1 | TestKt | Test.kt:3:3:3:22 | getField | +| Test.kt:1:1:8:1 | TestKt | Test.kt:3:3:3:22 | setField | +| Test.kt:1:1:8:1 | TestKt | Test.kt:4:3:5:25 | getRawField | +| Test.kt:1:1:8:1 | TestKt | Test.kt:4:3:5:25 | rawField | +| Test.kt:1:1:8:1 | TestKt | Test.kt:4:3:5:25 | setRawField | +| Test.kt:1:1:8:1 | TestKt | Test.kt:6:3:6:22 | method | +| Test.kt:10:1:10:20 | FieldUsedKt | Test.kt:10:1:10:20 | FieldUsedKt | +| Test.kt:11:1:11:23 | RawFieldUsedKt | Test.kt:11:1:11:23 | RawFieldUsedKt | +| Test.kt:12:1:12:21 | MethodUsedKt | Test.kt:12:1:12:21 | MethodUsedKt | +| Test.kt:13:1:13:26 | ConstructorUsedKt | Test.kt:13:1:13:26 | ConstructorUsedKt | +| Test.kt:14:1:14:22 | NeitherUsedKt | Test.kt:14:1:14:22 | NeitherUsedKt | +| Test.kt:16:1:27:1 | UserKt | Test.kt:16:1:27:1 | UserKt | +| Test.kt:16:1:27:1 | UserKt | Test.kt:18:3:25:3 | test | +| file:///!unknown-binary-location/TestKt.class:0:0:0:0 | TestKt | file:///!unknown-binary-location/TestKt.class:0:0:0:0 | TestKt | +| file:///!unknown-binary-location/TestKt.class:0:0:0:0 | TestKt | file:///!unknown-binary-location/TestKt.class:0:0:0:0 | getField | +| file:///!unknown-binary-location/TestKt.class:0:0:0:0 | TestKt | file:///!unknown-binary-location/TestKt.class:0:0:0:0 | getRawField | +| file:///!unknown-binary-location/TestKt.class:0:0:0:0 | TestKt | file:///!unknown-binary-location/TestKt.class:0:0:0:0 | method | +| file:///!unknown-binary-location/TestKt.class:0:0:0:0 | TestKt | file:///!unknown-binary-location/TestKt.class:0:0:0:0 | setField | +| file:///!unknown-binary-location/TestKt.class:0:0:0:0 | TestKt | file:///!unknown-binary-location/TestKt.class:0:0:0:0 | setRawField | +| file:///!unknown-binary-location/TestKt.class:0:0:0:0 | TestKt | file:///!unknown-binary-location/TestKt.class:0:0:0:0 | TestKt | +| file:///!unknown-binary-location/TestKt.class:0:0:0:0 | TestKt | file:///!unknown-binary-location/TestKt.class:0:0:0:0 | getField | +| file:///!unknown-binary-location/TestKt.class:0:0:0:0 | TestKt | file:///!unknown-binary-location/TestKt.class:0:0:0:0 | getRawField | +| file:///!unknown-binary-location/TestKt.class:0:0:0:0 | TestKt | file:///!unknown-binary-location/TestKt.class:0:0:0:0 | method | +| file:///!unknown-binary-location/TestKt.class:0:0:0:0 | TestKt | file:///!unknown-binary-location/TestKt.class:0:0:0:0 | setField | +| file:///!unknown-binary-location/TestKt.class:0:0:0:0 | TestKt | file:///!unknown-binary-location/TestKt.class:0:0:0:0 | setRawField | +| file:///!unknown-binary-location/TestKt.class:0:0:0:0 | TestKt | file:///!unknown-binary-location/TestKt.class:0:0:0:0 | TestKt | +| file:///!unknown-binary-location/TestKt.class:0:0:0:0 | TestKt | file:///!unknown-binary-location/TestKt.class:0:0:0:0 | getField | +| file:///!unknown-binary-location/TestKt.class:0:0:0:0 | TestKt | file:///!unknown-binary-location/TestKt.class:0:0:0:0 | getRawField | +| file:///!unknown-binary-location/TestKt.class:0:0:0:0 | TestKt | file:///!unknown-binary-location/TestKt.class:0:0:0:0 | method | +| file:///!unknown-binary-location/TestKt.class:0:0:0:0 | TestKt | file:///!unknown-binary-location/TestKt.class:0:0:0:0 | setField | +| file:///!unknown-binary-location/TestKt.class:0:0:0:0 | TestKt | file:///!unknown-binary-location/TestKt.class:0:0:0:0 | setRawField | +| file:///!unknown-binary-location/TestKt.class:0:0:0:0 | TestKt | file:///!unknown-binary-location/TestKt.class:0:0:0:0 | TestKt | +| file:///!unknown-binary-location/TestKt.class:0:0:0:0 | TestKt | file:///!unknown-binary-location/TestKt.class:0:0:0:0 | getField | +| file:///!unknown-binary-location/TestKt.class:0:0:0:0 | TestKt | file:///!unknown-binary-location/TestKt.class:0:0:0:0 | getRawField | +| file:///!unknown-binary-location/TestKt.class:0:0:0:0 | TestKt | file:///!unknown-binary-location/TestKt.class:0:0:0:0 | method | +| file:///!unknown-binary-location/TestKt.class:0:0:0:0 | TestKt | file:///!unknown-binary-location/TestKt.class:0:0:0:0 | setField | +| file:///!unknown-binary-location/TestKt.class:0:0:0:0 | TestKt | file:///!unknown-binary-location/TestKt.class:0:0:0:0 | setRawField | diff --git a/java/ql/test-kotlin2/library-tests/generic-selective-extraction/test.ql b/java/ql/test-kotlin2/library-tests/generic-selective-extraction/test.ql new file mode 100644 index 00000000000..c610849cb86 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/generic-selective-extraction/test.ql @@ -0,0 +1,7 @@ +import java + +from RefType rt, Member m +where + rt.getSourceDeclaration().fromSource() and + m.getDeclaringType() = rt +select rt, m diff --git a/java/ql/test-kotlin2/library-tests/generic-type-bounds/test.expected b/java/ql/test-kotlin2/library-tests/generic-type-bounds/test.expected new file mode 100644 index 00000000000..15777aaef53 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/generic-type-bounds/test.expected @@ -0,0 +1,11 @@ +classTVs +| test.kt:1:12:1:21 | T | test.kt:1:1:5:1 | Test | Number | +| test.kt:1:24:1:28 | S | test.kt:1:1:5:1 | Test | T | +| test.kt:1:31:1:31 | R | test.kt:1:1:5:1 | Test | Object | +| test.kt:7:22:7:22 | P | test.kt:7:1:7:67 | MultipleBounds | List | +| test.kt:7:22:7:22 | P | test.kt:7:1:7:67 | MultipleBounds | Set | +| test.kt:9:22:9:42 | T | test.kt:9:1:9:47 | RecursiveBound | RecursiveBound | +| test.kt:11:28:11:57 | T | test.kt:11:1:11:94 | MutualRecursiveBound | MutualRecursiveBound | +| test.kt:11:60:11:89 | S | test.kt:11:1:11:94 | MutualRecursiveBound | MutualRecursiveBound | +functionTVs +| test.kt:3:8:3:17 | Q | test.kt:3:3:3:26 | f | Number | diff --git a/java/ql/test-kotlin2/library-tests/generic-type-bounds/test.kt b/java/ql/test-kotlin2/library-tests/generic-type-bounds/test.kt new file mode 100644 index 00000000000..9621b79137a --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/generic-type-bounds/test.kt @@ -0,0 +1,11 @@ +class Test { + + fun f() { } + +} + +class MultipleBounds

where P : List, P : Set { } + +class RecursiveBound> { } + +class MutualRecursiveBound, S : MutualRecursiveBound> { } diff --git a/java/ql/test-kotlin2/library-tests/generic-type-bounds/test.ql b/java/ql/test-kotlin2/library-tests/generic-type-bounds/test.ql new file mode 100644 index 00000000000..39ac000343f --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/generic-type-bounds/test.ql @@ -0,0 +1,13 @@ +import java + +query predicate classTVs(TypeVariable tv, GenericType declType, string bound) { + tv.getGenericType() = declType and + tv.getUpperBoundType().toString() = bound and + declType.fromSource() +} + +query predicate functionTVs(TypeVariable tv, GenericCallable callable, string bound) { + tv.getGenericCallable() = callable and + tv.getUpperBoundType().toString() = bound and + callable.fromSource() +} diff --git a/java/ql/test-kotlin2/library-tests/generics-location/A.java b/java/ql/test-kotlin2/library-tests/generics-location/A.java new file mode 100644 index 00000000000..808787174eb --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/generics-location/A.java @@ -0,0 +1,11 @@ +package main; + +public class A { + public void fn() { + A a0 = new A(); + A a1 = new A(); + + B b0 = new B(); + B b1 = new B(); + } +} diff --git a/java/ql/test-kotlin2/library-tests/generics-location/generics.kt b/java/ql/test-kotlin2/library-tests/generics-location/generics.kt new file mode 100644 index 00000000000..c269ceffea3 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/generics-location/generics.kt @@ -0,0 +1,11 @@ +package main + +class B { + fun fn() { + val a0 = A() + val a1 = A() + + val b0 = B() + val b1 = B() + } +} diff --git a/java/ql/test-kotlin2/library-tests/generics-location/locations.expected b/java/ql/test-kotlin2/library-tests/generics-location/locations.expected new file mode 100644 index 00000000000..2cd1f0ead27 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/generics-location/locations.expected @@ -0,0 +1,25 @@ +classLocations +| main.A | A.class:0:0:0:0 | A.class:0:0:0:0 | +| main.A | A.java:3:14:3:14 | A.java:3:14:3:14 | +| main.A | A.class:0:0:0:0 | A.class:0:0:0:0 | +| main.A | file:///!unknown-binary-location/main/A.class:0:0:0:0 | file:///!unknown-binary-location/main/A.class:0:0:0:0 | +| main.A | A.class:0:0:0:0 | A.class:0:0:0:0 | +| main.A | file:///!unknown-binary-location/main/A.class:0:0:0:0 | file:///!unknown-binary-location/main/A.class:0:0:0:0 | +| main.B | generics.kt:3:1:11:1 | generics.kt:3:1:11:1 | +| main.B | generics-location.testproj/test.class.files/main/B.class:0:0:0:0 | generics-location.testproj/test.class.files/main/B.class:0:0:0:0 | +| main.B | file:///!unknown-binary-location/main/B.class:0:0:0:0 | file:///!unknown-binary-location/main/B.class:0:0:0:0 | +| main.B | file:///!unknown-binary-location/main/B.class:0:0:0:0 | file:///!unknown-binary-location/main/B.class:0:0:0:0 | +| main.B | generics-location.testproj/test.class.files/main/B.class:0:0:0:0 | generics-location.testproj/test.class.files/main/B.class:0:0:0:0 | +callableLocations +| main.A.fn | A.class:0:0:0:0 | A.class:0:0:0:0 | +| main.A.fn | A.java:4:17:4:18 | A.java:4:17:4:18 | +| main.A.fn | A.class:0:0:0:0 | A.class:0:0:0:0 | +| main.A.fn | file:///!unknown-binary-location/main/A.class:0:0:0:0 | file:///!unknown-binary-location/main/A.class:0:0:0:0 | +| main.A.fn | A.class:0:0:0:0 | A.class:0:0:0:0 | +| main.A.fn | file:///!unknown-binary-location/main/A.class:0:0:0:0 | file:///!unknown-binary-location/main/A.class:0:0:0:0 | +| main.B.fn | generics-location.testproj/test.class.files/main/B.class:0:0:0:0 | generics-location.testproj/test.class.files/main/B.class:0:0:0:0 | +| main.B.fn | generics.kt:4:5:10:5 | generics.kt:4:5:10:5 | +| main.B.fn | generics-location.testproj/test.class.files/main/B.class:0:0:0:0 | generics-location.testproj/test.class.files/main/B.class:0:0:0:0 | +| main.B.fn | file:///!unknown-binary-location/main/B.class:0:0:0:0 | file:///!unknown-binary-location/main/B.class:0:0:0:0 | +| main.B.fn | file:///!unknown-binary-location/main/B.class:0:0:0:0 | file:///!unknown-binary-location/main/B.class:0:0:0:0 | +| main.B.fn | generics-location.testproj/test.class.files/main/B.class:0:0:0:0 | generics-location.testproj/test.class.files/main/B.class:0:0:0:0 | diff --git a/java/ql/test-kotlin2/library-tests/generics-location/locations.ql b/java/ql/test-kotlin2/library-tests/generics-location/locations.ql new file mode 100644 index 00000000000..39796f4773b --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/generics-location/locations.ql @@ -0,0 +1,17 @@ +import java + +query predicate classLocations(string name, Location location) { + exists(Class type | + type.getQualifiedName() = name and + type.getSourceDeclaration().getName() in ["A", "B"] and + hasLocation(type, location) + ) +} + +query predicate callableLocations(string name, Location location) { + exists(Callable callable | + callable.getQualifiedName() = name and + callable.getName() = "fn" and + hasLocation(callable, location) + ) +} diff --git a/java/ql/test-kotlin2/library-tests/generics/PrintAst.expected b/java/ql/test-kotlin2/library-tests/generics/PrintAst.expected new file mode 100644 index 00000000000..31b7baca385 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/generics/PrintAst.expected @@ -0,0 +1,259 @@ +generics.kt: +# 0| [CompilationUnit] generics +# 0| 1: [Class] GenericsKt +# 3| 1: [ExtensionMethod] f0 +#-----| 2: (Generic Parameters) +# 3| 0: [TypeVariable] S +# 3| 3: [TypeAccess] S +#-----| 4: (Parameters) +# 3| 0: [Parameter] +# 3| 0: [TypeAccess] int +# 3| 1: [Parameter] s +# 3| 0: [TypeAccess] S +# 3| 5: [BlockStmt] { ... } +# 4| 0: [ReturnStmt] return ... +# 4| 0: [VarAccess] s +# 7| 2: [ExtensionMethod] f1 +#-----| 2: (Generic Parameters) +# 7| 0: [TypeVariable] S +# 7| 3: [TypeAccess] C0 +# 7| 0: [TypeAccess] S +#-----| 4: (Parameters) +# 7| 0: [Parameter] +# 7| 0: [TypeAccess] int +# 7| 1: [Parameter] s +# 7| 0: [TypeAccess] S +# 7| 5: [BlockStmt] { ... } +# 8| 0: [ReturnStmt] return ... +# 8| 0: [NullLiteral] null +# 24| 3: [Method] m +# 24| 3: [TypeAccess] Unit +# 24| 5: [BlockStmt] { ... } +# 25| 0: [LocalVariableDeclStmt] var ...; +# 25| 1: [LocalVariableDeclExpr] c1 +# 25| 0: [ClassInstanceExpr] new C1(...) +# 25| -3: [TypeAccess] C1 +# 25| 0: [TypeAccess] Integer +# 25| 1: [TypeAccess] Integer +# 25| 0: [IntegerLiteral] 1 +# 26| 1: [ExprStmt] ; +# 26| 0: [MethodCall] f1(...) +# 26| -1: [VarAccess] c1 +# 26| 0: [IntegerLiteral] 2 +# 27| 2: [LocalVariableDeclStmt] var ...; +# 27| 1: [LocalVariableDeclExpr] x1 +# 27| 0: [MethodCall] 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(...) +# 28| -3: [TypeAccess] C1 +# 28| 0: [TypeAccess] String +# 28| 1: [TypeAccess] Integer +# 28| 0: [StringLiteral] "" +# 29| 4: [ExprStmt] ; +# 29| 0: [MethodCall] f1(...) +# 29| -1: [VarAccess] c2 +# 29| 0: [StringLiteral] "a" +# 30| 5: [LocalVariableDeclStmt] var ...; +# 30| 1: [LocalVariableDeclExpr] x2 +# 30| 0: [MethodCall] 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] ; +# 32| 0: [MethodCall] 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(...) +# 33| -3: [TypeAccess] C0 +# 33| 0: [TypeAccess] Integer +# 11| 2: [Class,GenericType,ParameterizedType] C0 +#-----| -2: (Generic Parameters) +# 11| 0: [TypeVariable] V +# 11| 1: [Constructor] C0 +# 11| 5: [BlockStmt] { ... } +# 11| 0: [SuperConstructorInvocationStmt] super(...) +# 11| 1: [BlockStmt] { ... } +# 13| 4: [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| 0: [TypeAccess] T +# 13| 5: [BlockStmt] { ... } +# 13| 0: [SuperConstructorInvocationStmt] super(...) +# 13| 1: [BlockStmt] { ... } +# 13| 0: [ExprStmt] ; +# 13| 0: [KtInitializerAssignExpr] ...=... +# 13| 0: [VarAccess] t +# 13| 2: [FieldDeclaration] T t; +# 13| -1: [TypeAccess] T +# 13| 0: [VarAccess] t +# 13| 3: [Method] getT +# 13| 3: [TypeAccess] T +# 13| 5: [BlockStmt] { ... } +# 13| 0: [ReturnStmt] return ... +# 13| 0: [VarAccess] this.t +# 13| -1: [ThisAccess] this +# 14| 4: [Method] f1 +# 14| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 14| 0: [Parameter] t +# 14| 0: [TypeAccess] T +# 14| 5: [BlockStmt] { ... } +# 15| 5: [Method] f2 +#-----| 2: (Generic Parameters) +# 15| 0: [TypeVariable] U +# 15| 3: [TypeAccess] C1 +# 15| 0: [TypeAccess] U +# 15| 1: [TypeAccess] U +#-----| 4: (Parameters) +# 15| 0: [Parameter] u +# 15| 0: [TypeAccess] U +# 15| 5: [BlockStmt] { ... } +# 16| 0: [ReturnStmt] return ... +# 16| 0: [ClassInstanceExpr] new C1(...) +# 16| -3: [TypeAccess] C1 +# 16| 0: [TypeAccess] U +# 16| 1: [TypeAccess] U +# 16| 0: [VarAccess] u +# 20| 6: [Class] C2 +# 20| 1: [Constructor] C2 +# 20| 5: [BlockStmt] { ... } +# 20| 0: [SuperConstructorInvocationStmt] super(...) +# 20| 1: [BlockStmt] { ... } +# 21| 2: [Method] f4 +#-----| 2: (Generic Parameters) +# 21| 0: [TypeVariable] P +# 21| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 21| 0: [Parameter] p +# 21| 0: [TypeAccess] P +# 21| 5: [BlockStmt] { ... } +# 36| 7: [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: [BlockStmt] { ... } +# 38| 2: [Method] m +# 38| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 38| 0: [Parameter] s +# 38| 0: [TypeAccess] S +# 38| 1: [Parameter] t +# 38| 0: [TypeAccess] T +# 38| 5: [BlockStmt] { ... } +# 42| 8: [Class,GenericType,ParameterizedType] Outer +#-----| -2: (Generic Parameters) +# 42| 0: [TypeVariable] T1 +# 42| 1: [TypeVariable] T2 +# 42| 3: [Constructor] Outer +# 42| 5: [BlockStmt] { ... } +# 42| 0: [SuperConstructorInvocationStmt] super(...) +# 42| 1: [BlockStmt] { ... } +# 43| 4: [Class,GenericType,ParameterizedType] Inner1 +#-----| -2: (Generic Parameters) +# 43| 0: [TypeVariable] T3 +# 43| 1: [TypeVariable] T4 +# 43| 1: [Constructor] Inner1 +# 43| 5: [BlockStmt] { ... } +# 43| 0: [SuperConstructorInvocationStmt] super(...) +# 43| 1: [BlockStmt] { ... } +# 44| 2: [Method] fn1 +# 44| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 44| 0: [Parameter] t1 +# 44| 0: [TypeAccess] T1 +# 44| 1: [Parameter] t2 +# 44| 0: [TypeAccess] T2 +# 44| 2: [Parameter] t3 +# 44| 0: [TypeAccess] T3 +# 44| 3: [Parameter] t4 +# 44| 0: [TypeAccess] T4 +# 44| 5: [BlockStmt] { ... } +# 45| 0: [LocalVariableDeclStmt] var ...; +# 45| 1: [LocalVariableDeclExpr] c +# 45| 0: [ClassInstanceExpr] new Inner1(...) +# 45| -3: [TypeAccess] Inner1 +# 45| 0: [TypeAccess] Integer +# 45| 1: [TypeAccess] String +# 45| -2: [ThisAccess] Outer.this +# 45| 0: [TypeAccess] Outer +# 49| 5: [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: [BlockStmt] { ... } +# 50| 2: [Method] fn2 +# 50| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 50| 0: [Parameter] t3 +# 50| 0: [TypeAccess] T3 +# 50| 1: [Parameter] t4 +# 50| 0: [TypeAccess] T4 +# 50| 5: [BlockStmt] { ... } +# 51| 0: [LocalVariableDeclStmt] var ...; +# 51| 1: [LocalVariableDeclExpr] c +# 51| 0: [ClassInstanceExpr] new Nested1(...) +# 51| -3: [TypeAccess] Nested1 +# 51| 0: [TypeAccess] Integer +# 51| 1: [TypeAccess] String +# 56| 9: [Class,GenericType,ParameterizedType] Class1 +#-----| -2: (Generic Parameters) +# 56| 0: [TypeVariable] T1 +# 56| 1: [Constructor] Class1 +# 56| 5: [BlockStmt] { ... } +# 56| 0: [SuperConstructorInvocationStmt] super(...) +# 56| 1: [BlockStmt] { ... } +# 57| 2: [Method] fn1 +#-----| 2: (Generic Parameters) +# 57| 0: [TypeVariable] T2 +# 57| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 57| 0: [Parameter] t +# 57| 0: [TypeAccess] T2 +# 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: [BlockStmt] { ... } +# 59| 2: [Method] fn2 +#-----| 2: (Generic Parameters) +# 59| 0: [TypeVariable] T4 +# 59| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 59| 0: [Parameter] t2 +# 59| 0: [TypeAccess] T2 +# 59| 1: [Parameter] t4 +# 59| 0: [TypeAccess] T4 +# 59| 5: [BlockStmt] { ... } +# 61| 1: [ExprStmt] ; +# 61| 0: [MethodCall] fn2(...) +# 61| -2: [TypeAccess] String +# 61| -1: [ClassInstanceExpr] new Local(...) +# 61| -3: [TypeAccess] Local +# 61| 0: [TypeAccess] Integer +# 61| 0: [VarAccess] t +# 61| 1: [StringLiteral] "" diff --git a/java/ql/test-kotlin2/library-tests/generics/PrintAst.qlref b/java/ql/test-kotlin2/library-tests/generics/PrintAst.qlref new file mode 100644 index 00000000000..c7fd5faf239 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/generics/PrintAst.qlref @@ -0,0 +1 @@ +semmle/code/java/PrintAst.ql \ No newline at end of file diff --git a/java/ql/test-kotlin2/library-tests/generics/generics.expected b/java/ql/test-kotlin2/library-tests/generics/generics.expected new file mode 100644 index 00000000000..83835bb7b99 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/generics/generics.expected @@ -0,0 +1,75 @@ +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 | +| 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:13:1:18:1 | C1 | generics.kt:13:1:18:1 | C1 | 0 | T | +| generics.kt:13:1:18:1 | C1 | generics.kt:13:1:18:1 | C1 | 1 | W | +| 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: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: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: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 | +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) | +| generics.kt:11:1:11:19 | C0 | C0() | +| generics.kt:13:15:13:24 | C1 | C1(java.lang.Object) | +| generics.kt:13:16:13:23 | getT | getT() | +| generics.kt:14:5:14:19 | f1 | f1(java.lang.Object) | +| generics.kt:15:5:17:5 | f2 | f2(java.lang.Object) | +| generics.kt:20:9:20:10 | C2 | C2() | +| generics.kt:21:5:21:23 | f4 | f4(java.lang.Object) | +| generics.kt:24:1:34:1 | m | m() | +| 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 | Outer | Outer() | +| generics.kt:43:5:47:5 | Inner1 | Inner1() | +| 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 | Nested1 | Nested1() | +| generics.kt:50:9:52:9 | fn2 | fn2(java.lang.Object,java.lang.Object) | +| 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 | Local | Local() | +| 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 | +| generics.kt:15:5:17:5 | f2 | generics.kt:13:1:18:1 | C1 | 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 | +genericCall +| generics.kt:27:14:27:22 | f2(...) | generics.kt:15:10:15:10 | U | String | +| generics.kt:30:14:30:21 | f2(...) | generics.kt:15:10:15:10 | U | Integer | +| generics.kt:32:5:32:12 | f4(...) | generics.kt:21:10:21:10 | P | Integer | +| generics.kt:61:9:61:31 | fn2(...) | generics.kt:59:18:59:19 | T4 | String | +genericCtor +| generics.kt:16:16:16:26 | new C1(...) | 0 | U | +| generics.kt:16:16:16:26 | new C1(...) | 1 | U | +| generics.kt:25:14:25:28 | new C1(...) | 0 | Integer | +| generics.kt:25:14:25:28 | new C1(...) | 1 | Integer | +| generics.kt:28:14:28:32 | new C1(...) | 0 | String | +| generics.kt:28:14:28:32 | new C1(...) | 1 | Integer | +| generics.kt:33:21:33:29 | new C0(...) | 0 | Integer | +| generics.kt:45:21:45:41 | new Inner1(...) | 0 | Integer | +| generics.kt:45:21:45:41 | new Inner1(...) | 1 | String | +| generics.kt:51:21:51:42 | new Nested1(...) | 0 | Integer | +| generics.kt:51:21:51:42 | new Nested1(...) | 1 | String | +| generics.kt:61:9:61:20 | new Local(...) | 0 | Integer | diff --git a/java/ql/test-kotlin2/library-tests/generics/generics.kt b/java/ql/test-kotlin2/library-tests/generics/generics.kt new file mode 100644 index 00000000000..6acab597b7a --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/generics/generics.kt @@ -0,0 +1,65 @@ +package foo.bar + +fun Int.f0(s: S): S { + return s +} + +fun Int.f1(s: S): C0? { + return null +} + +open class C0 {} + +class C1(val t: T) : C0() { + fun f1(t: T) {} + fun f2(u: U): C1 { + return C1(u) + } +} + +class C2() { + fun

f4(p: P) {} +} + +fun m() { + val c1 = C1(1) + c1.f1(2) + val x1 = c1.f2("") + val c2 = C1("") + c2.f1("a") + val x2 = c2.f2(3) + val c3 = C2() + c3.f4(5) + val c4: C0<*> = C0() +} + +class BoundedTest { + + fun m(s: S, t: T) { } + +} + +class Outer { + inner class Inner1 { + fun fn1(t1: T1, t2: T2, t3: T3, t4: T4) { + val c = Inner1() + } + } + + class Nested1 { + fun fn2(t3: T3, t4: T4) { + val c = Nested1() + } + } +} + +class Class1 { + fun fn1(t: T2) { + class Local { + fun fn2(t2: T2, t4: T4) {} + } + Local().fn2(t, "") + } +} + +// Diagnostic Matches: % Found more type arguments than parameters: foo.bar.Class1 ...while extracting a enclosing class (fn1) at %generics.kt:57:5:62:5% diff --git a/java/ql/test-kotlin2/library-tests/generics/generics.ql b/java/ql/test-kotlin2/library-tests/generics/generics.ql new file mode 100644 index 00000000000..8851d3c6441 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/generics/generics.ql @@ -0,0 +1,30 @@ +import java + +query predicate genericType(GenericType t, TypeVariable tv, int i) { + t.getTypeParameter(i) = tv and t.getFile().isKotlinSourceFile() +} + +query predicate parameterizedType(ParameterizedType t, GenericType gt, int i, string ta) { + t.getGenericType() = gt and + t.getTypeArgument(i).toString() = ta and + t.getFile().isKotlinSourceFile() +} + +query predicate function(Callable c, string signature) { + signature = c.getSignature() and + c.getFile().isKotlinSourceFile() +} + +query predicate genericFunction(GenericCallable c, RefType declType, TypeVariable tv, int i) { + c.getTypeParameter(i) = tv and + c.getFile().isKotlinSourceFile() and + c.getDeclaringType() = declType +} + +query predicate genericCall(GenericCall c, TypeVariable tv, string t) { + c.getATypeArgument(tv).toString() = t +} + +query predicate genericCtor(ClassInstanceExpr c, int i, string ta) { + c.getTypeArgument(i).getType().toString() = ta +} diff --git a/java/ql/test-kotlin2/library-tests/inherited-callee/Test.java b/java/ql/test-kotlin2/library-tests/inherited-callee/Test.java new file mode 100644 index 00000000000..6df2fa57f36 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/inherited-callee/Test.java @@ -0,0 +1,33 @@ +public class Test { + + void inheritMe() { } + +} + +interface ParentIf { + + void inheritedInterfaceMethodJ(); + +} + +interface ChildIf extends ParentIf { + + +} + +class Child extends Test { + + public static void user() { + + Child c = new Child(); + c.toString(); + c.equals(c); + c.hashCode(); + c.inheritMe(); + ChildIf c2 = null; + c2.inheritedInterfaceMethodJ(); + + } + +} + diff --git a/java/ql/test-kotlin2/library-tests/inherited-callee/Test.kt b/java/ql/test-kotlin2/library-tests/inherited-callee/Test.kt new file mode 100644 index 00000000000..af5150b161a --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/inherited-callee/Test.kt @@ -0,0 +1,33 @@ +open class TestKt { + + fun inheritMe() { } + +} + +interface ParentIfK { + + fun inheritedInterfaceMethodK() + +} + +interface ChildIfK : ParentIfK { + + +} + +class ChildKt : TestKt() { + + fun user() { + + val c = ChildKt() + c.toString() + c.equals(c) + c.hashCode() + c.inheritMe() + val c2: ParentIfK? = null + c2?.inheritedInterfaceMethodK() + + } + +} + diff --git a/java/ql/test-kotlin2/library-tests/inherited-callee/test.expected b/java/ql/test-kotlin2/library-tests/inherited-callee/test.expected new file mode 100644 index 00000000000..9ac95b4d8ab --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/inherited-callee/test.expected @@ -0,0 +1,10 @@ +| Test.java:23:5:23:16 | toString(...) | toString | Object | +| Test.java:24:5:24:15 | equals(...) | equals | Object | +| Test.java:25:5:25:16 | hashCode(...) | hashCode | Object | +| Test.java:26:5:26:17 | inheritMe(...) | inheritMe | Test | +| Test.java:28:5:28:34 | inheritedInterfaceMethodJ(...) | inheritedInterfaceMethodJ | ParentIf | +| Test.kt:23:5:23:16 | toString(...) | toString | Object | +| Test.kt:24:5:24:15 | equals(...) | equals | Object | +| Test.kt:25:5:25:16 | hashCode(...) | hashCode | Object | +| Test.kt:26:5:26:17 | inheritMe(...) | inheritMe | TestKt | +| Test.kt:28:5:28:35 | inheritedInterfaceMethodK(...) | inheritedInterfaceMethodK | ParentIfK | diff --git a/java/ql/test-kotlin2/library-tests/inherited-callee/test.ql b/java/ql/test-kotlin2/library-tests/inherited-callee/test.ql new file mode 100644 index 00000000000..d766c5173f7 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/inherited-callee/test.ql @@ -0,0 +1,5 @@ +import java + +from MethodCall ma, Callable callee, RefType declaringType +where ma.getCallee() = callee and callee.getDeclaringType() = declaringType +select ma, callee.toString(), declaringType.toString() diff --git a/java/ql/test-kotlin2/library-tests/inherited-collection-implementation/Test.java b/java/ql/test-kotlin2/library-tests/inherited-collection-implementation/Test.java new file mode 100644 index 00000000000..31ae93eace7 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/inherited-collection-implementation/Test.java @@ -0,0 +1,59 @@ +import java.util.*; + +public class Test { + + public boolean contains(Object o) { return false; } + +} + +class SetImpl extends Test implements Set { + + public int size() { + return 0; + } + + public boolean isEmpty() { + return false; + } + + public Iterator iterator() { + return null; + } + + public Object[] toArray() { + return new Object[0]; + } + + public T1[] toArray(T1[] a) { + return null; + } + + public boolean add(T t) { + return false; + } + + public boolean remove(Object o) { + return false; + } + + public boolean containsAll(Collection c) { + return false; + } + + public boolean addAll(Collection c) { + return false; + } + + public boolean retainAll(Collection c) { + return false; + } + + public boolean removeAll(Collection c) { + return false; + } + + public void clear() { + + } + +} diff --git a/java/ql/test-kotlin2/library-tests/inherited-collection-implementation/test.expected b/java/ql/test-kotlin2/library-tests/inherited-collection-implementation/test.expected new file mode 100644 index 00000000000..e70b47e5467 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/inherited-collection-implementation/test.expected @@ -0,0 +1,2 @@ +| user.kt:1:40:1:58 | contains(...) | +| user.kt:1:63:1:74 | contains(...) | diff --git a/java/ql/test-kotlin2/library-tests/inherited-collection-implementation/test.ql b/java/ql/test-kotlin2/library-tests/inherited-collection-implementation/test.ql new file mode 100644 index 00000000000..2bc06be3e20 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/inherited-collection-implementation/test.ql @@ -0,0 +1,5 @@ +import java + +from MethodCall ma +where ma.getEnclosingCallable().fromSource() +select ma diff --git a/java/ql/test-kotlin2/library-tests/inherited-collection-implementation/user.kt b/java/ql/test-kotlin2/library-tests/inherited-collection-implementation/user.kt new file mode 100644 index 00000000000..f462e68edfd --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/inherited-collection-implementation/user.kt @@ -0,0 +1 @@ +private fun user(s: SetImpl) = s.contains("Hello") && "world" in s diff --git a/java/ql/test-kotlin2/library-tests/inherited-default-value/test.expected b/java/ql/test-kotlin2/library-tests/inherited-default-value/test.expected new file mode 100644 index 00000000000..08da126b9b2 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/inherited-default-value/test.expected @@ -0,0 +1,2 @@ +| test.kt:3:3:3:28 | f(...) | test.kt:3:3:3:28 | f | test.kt:1:1:5:1 | A | +| test.kt:11:16:11:23 | f$default(...) | test.kt:3:3:3:28 | f$default | test.kt:1:1:5:1 | A | diff --git a/java/ql/test-kotlin2/library-tests/inherited-default-value/test.kt b/java/ql/test-kotlin2/library-tests/inherited-default-value/test.kt new file mode 100644 index 00000000000..b8b1e0e0788 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/inherited-default-value/test.kt @@ -0,0 +1,13 @@ +open class A { + + open fun f(x: Int = 0) = x + +} + +class B : A() { + + override fun f(x: Int) = x + 1 + + fun user() = this.f() + +} diff --git a/java/ql/test-kotlin2/library-tests/inherited-default-value/test.ql b/java/ql/test-kotlin2/library-tests/inherited-default-value/test.ql new file mode 100644 index 00000000000..026d9ae1fed --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/inherited-default-value/test.ql @@ -0,0 +1,4 @@ +import java + +from MethodCall ma +select ma, ma.getCallee(), ma.getCallee().getDeclaringType() diff --git a/java/ql/test-kotlin2/library-tests/inherited-single-abstract-method/test.expected b/java/ql/test-kotlin2/library-tests/inherited-single-abstract-method/test.expected new file mode 100644 index 00000000000..fbffff1e81b --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/inherited-single-abstract-method/test.expected @@ -0,0 +1,4 @@ +| test.kt:0:0:0:0 | TestKt | test.kt:3:1:3:35 | f | +| test.kt:0:0:0:0 | TestKt | test.kt:5:1:9:1 | test | +| test.kt:7:5:7:12 | new Function1(...) { ... } | test.kt:7:5:7:12 | invoke | +| test.kt:7:5:7:12 | new UnaryOperator(...) { ... } | test.kt:7:5:7:12 | apply | diff --git a/java/ql/test-kotlin2/library-tests/inherited-single-abstract-method/test.kt b/java/ql/test-kotlin2/library-tests/inherited-single-abstract-method/test.kt new file mode 100644 index 00000000000..2692849cc50 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/inherited-single-abstract-method/test.kt @@ -0,0 +1,9 @@ +import java.util.function.UnaryOperator + +fun f(x: UnaryOperator) { } + +fun test() { + + f({x -> x}) + +} diff --git a/java/ql/test-kotlin2/library-tests/inherited-single-abstract-method/test.ql b/java/ql/test-kotlin2/library-tests/inherited-single-abstract-method/test.ql new file mode 100644 index 00000000000..698a3f5f214 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/inherited-single-abstract-method/test.ql @@ -0,0 +1,5 @@ +import java + +from ClassOrInterface ci +where ci.fromSource() +select ci, ci.getAMethod() diff --git a/java/ql/test-kotlin2/library-tests/inheritence-substitution/test.expected b/java/ql/test-kotlin2/library-tests/inheritence-substitution/test.expected new file mode 100644 index 00000000000..95507fac8d6 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/inheritence-substitution/test.expected @@ -0,0 +1,40 @@ +| test.kt:14:3:14:29 | p1 | file:///!unknown-binary-location/main/SimpleInvariant.class:0:0:0:0 | SimpleInvariant | file://:0:0:0:0 | Kotlin nullable FakeKotlinClass | Object | +| test.kt:15:3:15:33 | p2 | file:///!unknown-binary-location/main/SimpleInvariant.class:0:0:0:0 | SimpleInvariant | file://:0:0:0:0 | Kotlin nullable FakeKotlinClass | Object | +| test.kt:16:3:16:32 | p3 | file:///!unknown-binary-location/main/SimpleInvariant.class:0:0:0:0 | SimpleInvariant | file://:0:0:0:0 | Kotlin nullable FakeKotlinClass | Object | +| test.kt:17:3:17:24 | p4 | file:///!unknown-binary-location/main/SimpleInvariant.class:0:0:0:0 | SimpleInvariant | file://:0:0:0:0 | Kotlin nullable FakeKotlinClass | Object | +| test.kt:18:3:18:29 | p5 | file:///!unknown-binary-location/main/NestedInvariant.class:0:0:0:0 | NestedInvariant | file://:0:0:0:0 | Kotlin nullable FakeKotlinClass | Object | +| test.kt:18:3:18:29 | p5 | file:///!unknown-binary-location/main/NestedInvariant.class:0:0:0:0 | NestedInvariant | file://:0:0:0:0 | Kotlin nullable FakeKotlinClass | SimpleInvariant> | +| test.kt:19:3:19:33 | p6 | file:///!unknown-binary-location/main/NestedInvariant.class:0:0:0:0 | NestedInvariant | file://:0:0:0:0 | Kotlin nullable FakeKotlinClass | Object | +| test.kt:19:3:19:33 | p6 | file:///!unknown-binary-location/main/NestedInvariant.class:0:0:0:0 | NestedInvariant | file://:0:0:0:0 | Kotlin nullable FakeKotlinClass | SimpleInvariant> | +| test.kt:20:3:20:32 | p7 | file:///!unknown-binary-location/main/NestedInvariant.class:0:0:0:0 | NestedInvariant | file://:0:0:0:0 | Kotlin nullable FakeKotlinClass | Object | +| test.kt:20:3:20:32 | p7 | file:///!unknown-binary-location/main/NestedInvariant.class:0:0:0:0 | NestedInvariant | file://:0:0:0:0 | Kotlin nullable FakeKotlinClass | SimpleInvariant> | +| test.kt:21:3:21:24 | p8 | file:///!unknown-binary-location/main/NestedInvariant.class:0:0:0:0 | NestedInvariant | file://:0:0:0:0 | Kotlin nullable FakeKotlinClass | Object | +| test.kt:21:3:21:24 | p8 | file:///!unknown-binary-location/main/NestedInvariant.class:0:0:0:0 | NestedInvariant | file://:0:0:0:0 | Kotlin nullable FakeKotlinClass | SimpleInvariant> | +| test.kt:22:3:22:29 | p9 | file:///!unknown-binary-location/main/NestedCovariant.class:0:0:0:0 | NestedCovariant | file://:0:0:0:0 | Kotlin nullable FakeKotlinClass | Object | +| test.kt:22:3:22:29 | p9 | file:///!unknown-binary-location/main/NestedCovariant.class:0:0:0:0 | NestedCovariant | file://:0:0:0:0 | Kotlin nullable FakeKotlinClass | SimpleInvariant> | +| test.kt:23:3:23:34 | p10 | file:///!unknown-binary-location/main/NestedCovariant.class:0:0:0:0 | NestedCovariant | file://:0:0:0:0 | Kotlin nullable FakeKotlinClass | Object | +| test.kt:23:3:23:34 | p10 | file:///!unknown-binary-location/main/NestedCovariant.class:0:0:0:0 | NestedCovariant | file://:0:0:0:0 | Kotlin nullable FakeKotlinClass | SimpleInvariant> | +| test.kt:24:3:24:33 | p11 | file:///!unknown-binary-location/main/NestedCovariant.class:0:0:0:0 | NestedCovariant | file://:0:0:0:0 | Kotlin nullable FakeKotlinClass | Object | +| test.kt:24:3:24:33 | p11 | file:///!unknown-binary-location/main/NestedCovariant.class:0:0:0:0 | NestedCovariant | file://:0:0:0:0 | Kotlin nullable FakeKotlinClass | SimpleInvariant> | +| test.kt:25:3:25:25 | p12 | file:///!unknown-binary-location/main/NestedCovariant.class:0:0:0:0 | NestedCovariant | file://:0:0:0:0 | Kotlin nullable FakeKotlinClass | Object | +| test.kt:25:3:25:25 | p12 | file:///!unknown-binary-location/main/NestedCovariant.class:0:0:0:0 | NestedCovariant | file://:0:0:0:0 | Kotlin nullable FakeKotlinClass | SimpleInvariant> | +| test.kt:26:3:26:34 | p13 | file:///!unknown-binary-location/main/NestedContravariant.class:0:0:0:0 | NestedContravariant | file://:0:0:0:0 | Kotlin nullable FakeKotlinClass | Object | +| test.kt:26:3:26:34 | p13 | file:///!unknown-binary-location/main/NestedContravariant.class:0:0:0:0 | NestedContravariant | file://:0:0:0:0 | Kotlin nullable FakeKotlinClass | SimpleInvariant> | +| test.kt:27:3:27:38 | p14 | file:///!unknown-binary-location/main/NestedContravariant.class:0:0:0:0 | NestedContravariant | file://:0:0:0:0 | Kotlin nullable FakeKotlinClass | Object | +| test.kt:27:3:27:38 | p14 | file:///!unknown-binary-location/main/NestedContravariant.class:0:0:0:0 | NestedContravariant | file://:0:0:0:0 | Kotlin nullable FakeKotlinClass | SimpleInvariant> | +| test.kt:28:3:28:37 | p15 | file:///!unknown-binary-location/main/NestedContravariant.class:0:0:0:0 | NestedContravariant | file://:0:0:0:0 | Kotlin nullable FakeKotlinClass | Object | +| test.kt:28:3:28:37 | p15 | file:///!unknown-binary-location/main/NestedContravariant.class:0:0:0:0 | NestedContravariant | file://:0:0:0:0 | Kotlin nullable FakeKotlinClass | SimpleInvariant> | +| test.kt:29:3:29:29 | p16 | file:///!unknown-binary-location/main/NestedContravariant.class:0:0:0:0 | NestedContravariant | file://:0:0:0:0 | Kotlin nullable FakeKotlinClass | Object | +| test.kt:29:3:29:29 | p16 | file:///!unknown-binary-location/main/NestedContravariant.class:0:0:0:0 | NestedContravariant | file://:0:0:0:0 | Kotlin nullable FakeKotlinClass | SimpleInvariant> | +| test.kt:30:3:30:28 | p17 | file:///!unknown-binary-location/main/DoubleInherit.class:0:0:0:0 | DoubleInherit | file://:0:0:0:0 | Kotlin nullable FakeKotlinClass | NestedInvariant | +| test.kt:30:3:30:28 | p17 | file:///!unknown-binary-location/main/DoubleInherit.class:0:0:0:0 | DoubleInherit | file://:0:0:0:0 | Kotlin nullable FakeKotlinClass | Object | +| test.kt:30:3:30:28 | p17 | file:///!unknown-binary-location/main/DoubleInherit.class:0:0:0:0 | DoubleInherit | file://:0:0:0:0 | Kotlin nullable FakeKotlinClass | SimpleInvariant> | +| test.kt:31:3:31:31 | p18 | file:///!unknown-binary-location/main/DoubleInherit.class:0:0:0:0 | DoubleInherit | file://:0:0:0:0 | Kotlin nullable FakeKotlinClass | NestedInvariant | +| test.kt:31:3:31:31 | p18 | file:///!unknown-binary-location/main/DoubleInherit.class:0:0:0:0 | DoubleInherit | file://:0:0:0:0 | Kotlin nullable FakeKotlinClass | Object | +| test.kt:31:3:31:31 | p18 | file:///!unknown-binary-location/main/DoubleInherit.class:0:0:0:0 | DoubleInherit | file://:0:0:0:0 | Kotlin nullable FakeKotlinClass | SimpleInvariant> | +| test.kt:32:3:32:32 | p19 | file:///!unknown-binary-location/main/DoubleInherit.class:0:0:0:0 | DoubleInherit | file://:0:0:0:0 | Kotlin nullable FakeKotlinClass | NestedInvariant | +| test.kt:32:3:32:32 | p19 | file:///!unknown-binary-location/main/DoubleInherit.class:0:0:0:0 | DoubleInherit | file://:0:0:0:0 | Kotlin nullable FakeKotlinClass | Object | +| test.kt:32:3:32:32 | p19 | file:///!unknown-binary-location/main/DoubleInherit.class:0:0:0:0 | DoubleInherit | file://:0:0:0:0 | Kotlin nullable FakeKotlinClass | SimpleInvariant> | +| test.kt:33:3:33:23 | p20 | file:///!unknown-binary-location/main/DoubleInherit.class:0:0:0:0 | DoubleInherit | file://:0:0:0:0 | Kotlin nullable FakeKotlinClass | NestedInvariant | +| test.kt:33:3:33:23 | p20 | file:///!unknown-binary-location/main/DoubleInherit.class:0:0:0:0 | DoubleInherit | file://:0:0:0:0 | Kotlin nullable FakeKotlinClass | Object | +| test.kt:33:3:33:23 | p20 | file:///!unknown-binary-location/main/DoubleInherit.class:0:0:0:0 | DoubleInherit | file://:0:0:0:0 | Kotlin nullable FakeKotlinClass | SimpleInvariant> | diff --git a/java/ql/test-kotlin2/library-tests/inheritence-substitution/test.kt b/java/ql/test-kotlin2/library-tests/inheritence-substitution/test.kt new file mode 100644 index 00000000000..c93c507ad2e --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/inheritence-substitution/test.kt @@ -0,0 +1,36 @@ +package main + +open class SimpleInvariant { } + +open class NestedInvariant : SimpleInvariant>() { } + +class NestedCovariant : SimpleInvariant>() { } + +class NestedContravariant : SimpleInvariant>() { } + +class DoubleInherit : NestedInvariant() { } + +fun user( + p1: SimpleInvariant, + p2: SimpleInvariant, + p3: SimpleInvariant, + p4: SimpleInvariant<*>, + p5: NestedInvariant, + p6: NestedInvariant, + p7: NestedInvariant, + p8: NestedInvariant<*>, + p9: NestedCovariant, + p10: NestedCovariant, + p11: NestedCovariant, + p12: NestedCovariant<*>, + p13: NestedContravariant, + p14: NestedContravariant, + p15: NestedContravariant, + p16: NestedContravariant<*>, + p17: DoubleInherit, + p18: DoubleInherit, + p19: DoubleInherit, + p20: DoubleInherit<*> +) { + +} \ No newline at end of file diff --git a/java/ql/test-kotlin2/library-tests/inheritence-substitution/test.ql b/java/ql/test-kotlin2/library-tests/inheritence-substitution/test.ql new file mode 100644 index 00000000000..f006237009b --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/inheritence-substitution/test.ql @@ -0,0 +1,17 @@ +import java + +RefType getADatabaseSubtype(RefType rt) { + extendsReftype(rt, result) + or + implInterface(rt, result) +} + +from Parameter p, RefType paramType, KotlinType paramKtType, string paramAncestorType +where + p.fromSource() and + p.getCallable().getName() = "user" and + p.getType() = paramType and + p.getKotlinType() = paramKtType and + // Stringified to avoid printing the source-location (i.e. stdlib path) of `Any?` + getADatabaseSubtype+(paramType).toString() = paramAncestorType +select p, paramType, paramKtType, paramAncestorType diff --git a/java/ql/test-kotlin2/library-tests/instances/TestClassA.kt b/java/ql/test-kotlin2/library-tests/instances/TestClassA.kt new file mode 100644 index 00000000000..591f9c3658e --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/instances/TestClassA.kt @@ -0,0 +1,4 @@ + +class TestClassA { +} + diff --git a/java/ql/test-kotlin2/library-tests/instances/TestClassAUser.kt b/java/ql/test-kotlin2/library-tests/instances/TestClassAUser.kt new file mode 100644 index 00000000000..6a9d8fecc2e --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/instances/TestClassAUser.kt @@ -0,0 +1,16 @@ + +/* +A fairly long comment. +A fairly long comment. +A fairly long comment. +A fairly long comment. +A fairly long comment. +A fairly long comment. +A fairly long comment. +*/ + +fun foo(x: TestClassA) { +} + +class TestClassAUser { } + diff --git a/java/ql/test-kotlin2/library-tests/instances/classes.expected b/java/ql/test-kotlin2/library-tests/instances/classes.expected new file mode 100644 index 00000000000..72fa8ccccf5 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/instances/classes.expected @@ -0,0 +1,5 @@ +| TestClassA.kt:2:1:3:1 | TestClassA | +| TestClassA.kt:2:1:3:1 | TestClassA<> | +| TestClassAUser.kt:0:0:0:0 | TestClassAUserKt | +| TestClassAUser.kt:15:1:15:24 | TestClassAUser | +| file:///!unknown-binary-location/TestClassA.class:0:0:0:0 | TestClassA | diff --git a/java/ql/test-kotlin2/library-tests/instances/classes.ql b/java/ql/test-kotlin2/library-tests/instances/classes.ql new file mode 100644 index 00000000000..2c0dd99626a --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/instances/classes.ql @@ -0,0 +1,5 @@ +import java + +from Class c +where c.getName().matches("TestClass%") +select c diff --git a/java/ql/test-kotlin2/library-tests/interface-delegate/intfDelegate.kt b/java/ql/test-kotlin2/library-tests/interface-delegate/intfDelegate.kt new file mode 100644 index 00000000000..aa8351e976f --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/interface-delegate/intfDelegate.kt @@ -0,0 +1,10 @@ +interface Intf { + + fun f(i: Int) + +} + +class Concrete : Intf by object : Intf { + override fun f(i: Int) { } +} { +} diff --git a/java/ql/test-kotlin2/library-tests/interface-delegate/test.expected b/java/ql/test-kotlin2/library-tests/interface-delegate/test.expected new file mode 100644 index 00000000000..a5576a6c083 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/interface-delegate/test.expected @@ -0,0 +1,8 @@ +fields +| intfDelegate.kt:7:18:9:1 | $$delegate_0 | intfDelegate.kt:7:26:9:1 | | +#select +| intfDelegate.kt:0:0:0:0 | f | intfDelegate.kt:7:1:10:1 | Concrete | +| intfDelegate.kt:3:3:3:15 | f | intfDelegate.kt:1:1:5:1 | Intf | +| intfDelegate.kt:7:1:10:1 | Concrete | intfDelegate.kt:7:1:10:1 | Concrete | +| intfDelegate.kt:7:26:9:1 | | intfDelegate.kt:7:26:9:1 | new Intf(...) { ... } | +| intfDelegate.kt:8:3:8:28 | f | intfDelegate.kt:7:26:9:1 | new Intf(...) { ... } | diff --git a/java/ql/test-kotlin2/library-tests/interface-delegate/test.ql b/java/ql/test-kotlin2/library-tests/interface-delegate/test.ql new file mode 100644 index 00000000000..8bd80cfc4ba --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/interface-delegate/test.ql @@ -0,0 +1,7 @@ +import java + +query predicate fields(Field f, Expr init) { f.getInitializer() = init } + +from Callable c +where c.fromSource() +select c, c.getDeclaringType() diff --git a/java/ql/test-kotlin2/library-tests/internal-constructor-called-from-java/User.java b/java/ql/test-kotlin2/library-tests/internal-constructor-called-from-java/User.java new file mode 100644 index 00000000000..e94894fa409 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/internal-constructor-called-from-java/User.java @@ -0,0 +1,5 @@ +public class User { + + public static void test() { new Test(1, 2); } + +} diff --git a/java/ql/test-kotlin2/library-tests/internal-constructor-called-from-java/test.expected b/java/ql/test-kotlin2/library-tests/internal-constructor-called-from-java/test.expected new file mode 100644 index 00000000000..44dbca7993e --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/internal-constructor-called-from-java/test.expected @@ -0,0 +1 @@ +| User.java:3:31:3:44 | new Test(...) | test.kt:3:3:3:51 | { ... } | diff --git a/java/ql/test-kotlin2/library-tests/internal-constructor-called-from-java/test.kt b/java/ql/test-kotlin2/library-tests/internal-constructor-called-from-java/test.kt new file mode 100644 index 00000000000..65c8b43c44c --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/internal-constructor-called-from-java/test.kt @@ -0,0 +1,5 @@ +public class Test() { + + internal constructor(x: Int, y: Int) : this() { } + +} diff --git a/java/ql/test-kotlin2/library-tests/internal-constructor-called-from-java/test.ql b/java/ql/test-kotlin2/library-tests/internal-constructor-called-from-java/test.ql new file mode 100644 index 00000000000..8ab8617ac77 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/internal-constructor-called-from-java/test.ql @@ -0,0 +1,4 @@ +import java + +from ClassInstanceExpr ce +select ce, ce.getConstructor().getBody() diff --git a/java/ql/test-kotlin2/library-tests/internal-public-alias/User.java b/java/ql/test-kotlin2/library-tests/internal-public-alias/User.java new file mode 100644 index 00000000000..d249e1d36f2 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/internal-public-alias/User.java @@ -0,0 +1,11 @@ +public class User { + + public static int test(Test t) { + + t.setInternalVar$main(t.getInternalVal$main()); + + return t.internalFun$main(); + + } + +} diff --git a/java/ql/test-kotlin2/library-tests/internal-public-alias/test.expected b/java/ql/test-kotlin2/library-tests/internal-public-alias/test.expected new file mode 100644 index 00000000000..a436af62303 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/internal-public-alias/test.expected @@ -0,0 +1,6 @@ +| User.java:3:21:3:24 | test | +| test.kt:3:3:3:30 | getInternalVal$main | +| test.kt:6:3:6:36 | getInternalVal | +| test.kt:8:3:8:30 | getInternalVar$main | +| test.kt:8:3:8:30 | setInternalVar$main | +| test.kt:10:3:10:32 | internalFun$main | diff --git a/java/ql/test-kotlin2/library-tests/internal-public-alias/test.kt b/java/ql/test-kotlin2/library-tests/internal-public-alias/test.kt new file mode 100644 index 00000000000..e79e6d2f907 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/internal-public-alias/test.kt @@ -0,0 +1,12 @@ +public class Test { + + internal val internalVal = 1 + + // Would clash with the internal val's getter without name mangling and provoke a database inconsistency: + fun getInternalVal() = internalVal + + internal var internalVar = 2 + + internal fun internalFun() = 3 + +} diff --git a/java/ql/test-kotlin2/library-tests/internal-public-alias/test.ql b/java/ql/test-kotlin2/library-tests/internal-public-alias/test.ql new file mode 100644 index 00000000000..f1355df2e88 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/internal-public-alias/test.ql @@ -0,0 +1,5 @@ +import java + +from Method m +where m.fromSource() +select m diff --git a/java/ql/test-kotlin2/library-tests/java-kotlin-collection-type-generic-methods/Test.java b/java/ql/test-kotlin2/library-tests/java-kotlin-collection-type-generic-methods/Test.java new file mode 100644 index 00000000000..12a77514c3d --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/java-kotlin-collection-type-generic-methods/Test.java @@ -0,0 +1,28 @@ +import java.util.Map; +import java.util.AbstractMap; +import java.util.Collection; +import java.util.AbstractCollection; +import java.util.List; +import java.util.AbstractList; + +public class Test { + + public static void test( + Map p1, + AbstractMap p2, + Collection p3, + AbstractCollection p4, + List p5, + AbstractList p6) { + + // Use a method of each to ensure method prototypes are extracted: + p1.remove("Hello"); + p2.remove("Hello"); + p3.remove("Hello"); + p4.remove("Hello"); + p5.remove("Hello"); + p6.remove("Hello"); + + } + +} diff --git a/java/ql/test-kotlin2/library-tests/java-kotlin-collection-type-generic-methods/test.expected b/java/ql/test-kotlin2/library-tests/java-kotlin-collection-type-generic-methods/test.expected new file mode 100644 index 00000000000..4ccb82a3d0d --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/java-kotlin-collection-type-generic-methods/test.expected @@ -0,0 +1,423 @@ +methodWithDuplicate +#select +| AbstractCollection | add | E | +| AbstractCollection | addAll | Collection | +| AbstractCollection | contains | Object | +| AbstractCollection | containsAll | Collection | +| AbstractCollection | remove | Object | +| AbstractCollection | removeAll | Collection | +| AbstractCollection | retainAll | Collection | +| AbstractCollection | toArray | T[] | +| AbstractCollection | add | E | +| AbstractCollection | addAll | Collection | +| AbstractCollection | contains | Object | +| AbstractCollection | containsAll | Collection | +| AbstractCollection | remove | Object | +| AbstractCollection | removeAll | Collection | +| AbstractCollection | retainAll | Collection | +| AbstractCollection | toArray | T[] | +| AbstractCollection | add | String | +| AbstractCollection | addAll | Collection | +| AbstractCollection | contains | Object | +| AbstractCollection | containsAll | Collection | +| AbstractCollection | remove | Object | +| AbstractCollection | removeAll | Collection | +| AbstractCollection | retainAll | Collection | +| AbstractCollection | toArray | T[] | +| AbstractList | add | E | +| AbstractList | add | int | +| AbstractList | addAll | Collection | +| AbstractList | addAll | int | +| AbstractList | equals | Object | +| AbstractList | get | int | +| AbstractList | indexOf | Object | +| AbstractList | lastIndexOf | Object | +| AbstractList | listIterator | int | +| AbstractList | remove | int | +| AbstractList | removeRange | int | +| AbstractList | set | E | +| AbstractList | set | int | +| AbstractList | subList | int | +| AbstractList | subListRangeCheck | int | +| AbstractList | add | E | +| AbstractList | add | int | +| AbstractList | addAll | Collection | +| AbstractList | addAll | int | +| AbstractList | equals | Object | +| AbstractList | get | int | +| AbstractList | indexOf | Object | +| AbstractList | lastIndexOf | Object | +| AbstractList | listIterator | int | +| AbstractList | remove | int | +| AbstractList | removeRange | int | +| AbstractList | set | E | +| AbstractList | set | int | +| AbstractList | subList | int | +| AbstractList | subListRangeCheck | int | +| AbstractMap | containsEntry$kotlin_stdlib | Entry | +| AbstractMap | containsKey | Object | +| AbstractMap | containsValue | Object | +| AbstractMap | equals | Object | +| AbstractMap | get | Object | +| AbstractMap | put | K | +| AbstractMap | put | V | +| AbstractMap | putAll | Map | +| AbstractMap | remove | Object | +| AbstractMap> | containsKey | Object | +| AbstractMap> | containsValue | Object | +| AbstractMap> | equals | Object | +| AbstractMap> | get | Object | +| AbstractMap> | put | Entry | +| AbstractMap> | put | Identity | +| AbstractMap> | putAll | Map> | +| AbstractMap> | remove | Object | +| AbstractMap | containsKey | Object | +| AbstractMap | containsValue | Object | +| AbstractMap | equals | Object | +| AbstractMap | get | Object | +| AbstractMap | put | K | +| AbstractMap | put | V | +| AbstractMap | putAll | Map | +| AbstractMap | remove | Object | +| AbstractMap | containsEntry$kotlin_stdlib | Entry | +| AbstractMap | containsKey | Object | +| AbstractMap | containsValue | Object | +| AbstractMap | equals | Object | +| AbstractMap | get | Object | +| AbstractMap | put | String | +| AbstractMap | putAll | Map | +| AbstractMap | remove | Object | +| AbstractMutableCollection | add | E | +| AbstractMutableList | add | E | +| AbstractMutableList | add | int | +| AbstractMutableList | remove | int | +| AbstractMutableList | set | E | +| AbstractMutableList | set | int | +| AbstractMutableMap | put | K | +| AbstractMutableMap | put | V | +| Collection | add | E | +| Collection | addAll | Collection | +| Collection | contains | Object | +| Collection | containsAll | Collection | +| Collection | equals | Object | +| Collection | remove | Object | +| Collection | removeAll | Collection | +| Collection | removeIf | Predicate | +| Collection | retainAll | Collection | +| Collection | toArray | IntFunction | +| Collection | toArray | T[] | +| Collection | add | E | +| Collection | addAll | Collection | +| Collection | contains | Object | +| Collection | containsAll | Collection | +| Collection | equals | Object | +| Collection | remove | Object | +| Collection | removeAll | Collection | +| Collection | removeIf | Predicate | +| Collection | retainAll | Collection | +| Collection | toArray | IntFunction | +| Collection | toArray | T[] | +| Collection> | add | Entry | +| Collection> | addAll | Collection> | +| Collection> | contains | Object | +| Collection> | containsAll | Collection | +| Collection> | equals | Object | +| Collection> | remove | Object | +| Collection> | removeAll | Collection | +| Collection> | removeIf | Predicate> | +| Collection> | retainAll | Collection | +| Collection> | toArray | IntFunction | +| Collection> | toArray | T[] | +| Collection | add | K | +| Collection | addAll | Collection | +| Collection | contains | Object | +| Collection | containsAll | Collection | +| Collection | equals | Object | +| Collection | remove | Object | +| Collection | removeAll | Collection | +| Collection | removeIf | Predicate | +| Collection | retainAll | Collection | +| Collection | toArray | IntFunction | +| Collection | toArray | T[] | +| Collection | add | String | +| Collection | addAll | Collection | +| Collection | contains | Object | +| Collection | containsAll | Collection | +| Collection | equals | Object | +| Collection | remove | Object | +| Collection | removeAll | Collection | +| Collection | removeIf | Predicate | +| Collection | retainAll | Collection | +| Collection | toArray | IntFunction | +| Collection | toArray | T[] | +| Collection | add | V | +| Collection | addAll | Collection | +| Collection | contains | Object | +| Collection | containsAll | Collection | +| Collection | equals | Object | +| Collection | remove | Object | +| Collection | removeAll | Collection | +| Collection | removeIf | Predicate | +| Collection | retainAll | Collection | +| Collection | toArray | IntFunction | +| Collection | toArray | T[] | +| List | add | E | +| List | add | int | +| List | addAll | Collection | +| List | addAll | int | +| List | addFirst | E | +| List | addLast | E | +| List | contains | Object | +| List | containsAll | Collection | +| List | copyOf | Collection | +| List | equals | Object | +| List | get | int | +| List | indexOf | Object | +| List | lastIndexOf | Object | +| List | listIterator | int | +| List | of | E | +| List | of | E[] | +| List | remove | Object | +| List | remove | int | +| List | removeAll | Collection | +| List | replaceAll | UnaryOperator | +| List | retainAll | Collection | +| List | set | E | +| List | set | int | +| List | sort | Comparator | +| List | subList | int | +| List | toArray | T[] | +| List | add | E | +| List | add | int | +| List | addAll | Collection | +| List | addAll | int | +| List | contains | Object | +| List | containsAll | Collection | +| List | copyOf | Collection | +| List | equals | Object | +| List | get | int | +| List | indexOf | Object | +| List | lastIndexOf | Object | +| List | listIterator | int | +| List | of | E | +| List | of | E[] | +| List | remove | Object | +| List | remove | int | +| List | removeAll | Collection | +| List | replaceAll | UnaryOperator | +| List | retainAll | Collection | +| List | set | E | +| List | set | int | +| List | sort | Comparator | +| List | subList | int | +| List | toArray | T[] | +| List | add | String | +| List | add | int | +| List | addAll | Collection | +| List | addAll | int | +| List | addFirst | String | +| List | addLast | String | +| List | contains | Object | +| List | containsAll | Collection | +| List | copyOf | Collection | +| List | equals | Object | +| List | get | int | +| List | indexOf | Object | +| List | lastIndexOf | Object | +| List | listIterator | int | +| List | of | E | +| List | of | E[] | +| List | remove | Object | +| List | remove | int | +| List | removeAll | Collection | +| List | replaceAll | UnaryOperator | +| List | retainAll | Collection | +| List | set | String | +| List | set | int | +| List | sort | Comparator | +| List | subList | int | +| List | toArray | T[] | +| Map | compute | BiFunction | +| Map | compute | K | +| Map | computeIfAbsent | Function | +| Map | computeIfAbsent | K | +| Map | computeIfPresent | BiFunction | +| Map | computeIfPresent | K | +| Map | containsKey | Object | +| Map | containsValue | Object | +| Map | copyOf | Map | +| Map | entry | K | +| Map | entry | V | +| Map | equals | Object | +| Map | forEach | BiConsumer | +| Map | get | Object | +| Map | getOrDefault | Object | +| Map | getOrDefault | V | +| Map | merge | BiFunction | +| Map | merge | K | +| Map | merge | V | +| Map | of | K | +| Map | of | V | +| Map | ofEntries | Entry[] | +| Map | put | K | +| Map | put | V | +| Map | putAll | Map | +| Map | putIfAbsent | K | +| Map | putIfAbsent | V | +| Map | remove | Object | +| Map | replace | K | +| Map | replace | V | +| Map | replaceAll | BiFunction | +| Map> | compute | BiFunction,? extends Entry> | +| Map> | compute | Identity | +| Map> | computeIfAbsent | Function> | +| Map> | computeIfAbsent | Identity | +| Map> | computeIfPresent | BiFunction,? extends Entry> | +| Map> | computeIfPresent | Identity | +| Map> | containsKey | Object | +| Map> | containsValue | Object | +| Map> | copyOf | Map | +| Map> | entry | K | +| Map> | entry | V | +| Map> | equals | Object | +| Map> | forEach | BiConsumer> | +| Map> | get | Object | +| Map> | getOrDefault | Entry | +| Map> | getOrDefault | Object | +| Map> | merge | BiFunction,? super Entry,? extends Entry> | +| Map> | merge | Entry | +| Map> | merge | Identity | +| Map> | of | K | +| Map> | of | V | +| Map> | ofEntries | Entry[] | +| Map> | put | Entry | +| Map> | put | Identity | +| Map> | putAll | Map> | +| Map> | putIfAbsent | Entry | +| Map> | putIfAbsent | Identity | +| Map> | remove | Object | +| Map> | replace | Entry | +| Map> | replace | Identity | +| Map> | replaceAll | BiFunction,? extends Entry> | +| Map | compute | BiFunction | +| Map | compute | K | +| Map | computeIfAbsent | Function | +| Map | computeIfAbsent | K | +| Map | computeIfPresent | BiFunction | +| Map | computeIfPresent | K | +| Map | containsKey | Object | +| Map | containsValue | Object | +| Map | copyOf | Map | +| Map | entry | K | +| Map | entry | V | +| Map | equals | Object | +| Map | forEach | BiConsumer | +| Map | get | Object | +| Map | getOrDefault | Object | +| Map | getOrDefault | V | +| Map | merge | BiFunction | +| Map | merge | K | +| Map | merge | V | +| Map | of | K | +| Map | of | V | +| Map | ofEntries | Entry[] | +| Map | put | K | +| Map | put | V | +| Map | putAll | Map | +| Map | putIfAbsent | K | +| Map | putIfAbsent | V | +| Map | remove | Object | +| Map | replace | K | +| Map | replace | V | +| Map | replaceAll | BiFunction | +| Map | compute | BiFunction | +| Map | compute | Object | +| Map | computeIfAbsent | Function | +| Map | computeIfAbsent | Object | +| Map | computeIfPresent | BiFunction | +| Map | computeIfPresent | Object | +| Map | containsKey | Object | +| Map | containsValue | Object | +| Map | copyOf | Map | +| Map | entry | K | +| Map | entry | V | +| Map | equals | Object | +| Map | forEach | BiConsumer | +| Map | get | Object | +| Map | getOrDefault | Object | +| Map | merge | BiFunction | +| Map | merge | Object | +| Map | of | K | +| Map | of | V | +| Map | ofEntries | Entry[] | +| Map | put | Object | +| Map | putAll | Map | +| Map | putIfAbsent | Object | +| Map | remove | Object | +| Map | replace | Object | +| Map | replaceAll | BiFunction | +| Map | compute | BiFunction | +| Map | compute | String | +| Map | computeIfAbsent | Function | +| Map | computeIfAbsent | String | +| Map | computeIfPresent | BiFunction | +| Map | computeIfPresent | String | +| Map | containsKey | Object | +| Map | containsValue | Object | +| Map | copyOf | Map | +| Map | entry | K | +| Map | entry | V | +| Map | equals | Object | +| Map | forEach | BiConsumer | +| Map | get | Object | +| Map | getOrDefault | Object | +| Map | getOrDefault | String | +| Map | merge | BiFunction | +| Map | merge | String | +| Map | of | K | +| Map | of | V | +| Map | ofEntries | Entry[] | +| Map | put | String | +| Map | putAll | Map | +| Map | putIfAbsent | String | +| Map | remove | Object | +| Map | replace | String | +| Map | replaceAll | BiFunction | +| MutableCollection | add | E | +| MutableCollection | addAll | Collection | +| MutableCollection | remove | Object | +| MutableCollection | removeAll | Collection | +| MutableCollection | removeIf | Predicate | +| MutableCollection | retainAll | Collection | +| MutableList | add | E | +| MutableList | add | int | +| MutableList | addAll | Collection | +| MutableList | addAll | int | +| MutableList | listIterator | int | +| MutableList | remove | Object | +| MutableList | remove | int | +| MutableList | removeAll | Collection | +| MutableList | replaceAll | UnaryOperator | +| MutableList | retainAll | Collection | +| MutableList | set | E | +| MutableList | set | int | +| MutableList | sort | Comparator | +| MutableList | subList | int | +| MutableMap | compute | BiFunction | +| MutableMap | compute | K | +| MutableMap | computeIfAbsent | Function | +| MutableMap | computeIfAbsent | K | +| MutableMap | computeIfPresent | BiFunction | +| MutableMap | computeIfPresent | K | +| MutableMap | merge | BiFunction | +| MutableMap | merge | K | +| MutableMap | merge | V | +| MutableMap | put | K | +| MutableMap | put | V | +| MutableMap | putAll | Map | +| MutableMap | putIfAbsent | K | +| MutableMap | putIfAbsent | V | +| MutableMap | remove | Object | +| MutableMap | replace | K | +| MutableMap | replace | V | +| MutableMap | replaceAll | BiFunction | diff --git a/java/ql/test-kotlin2/library-tests/java-kotlin-collection-type-generic-methods/test.kt b/java/ql/test-kotlin2/library-tests/java-kotlin-collection-type-generic-methods/test.kt new file mode 100644 index 00000000000..a597bbb8490 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/java-kotlin-collection-type-generic-methods/test.kt @@ -0,0 +1,29 @@ +fun test( + p1: Map, + p2: AbstractMap, + p3: Collection, + p4: AbstractCollection, + p5: List, + p6: AbstractList, + p7: MutableMap, + p8: AbstractMutableMap, + p9: MutableCollection, + p10: AbstractMutableCollection, + p11: MutableList, + p12: AbstractMutableList) { + + // Use a method of each to ensure method prototypes are extracted: + p1.get("Hello"); + p2.get("Hello"); + p3.contains("Hello"); + p4.contains("Hello"); + p5.contains("Hello"); + p6.contains("Hello"); + p7.remove("Hello"); + p8.remove("Hello"); + p9.remove("Hello"); + p10.remove("Hello"); + p11.remove("Hello"); + p12.remove("Hello"); + +} diff --git a/java/ql/test-kotlin2/library-tests/java-kotlin-collection-type-generic-methods/test.ql b/java/ql/test-kotlin2/library-tests/java-kotlin-collection-type-generic-methods/test.ql new file mode 100644 index 00000000000..22a78af1dea --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/java-kotlin-collection-type-generic-methods/test.ql @@ -0,0 +1,28 @@ +import java + +RefType getARelevantCollectionType() { + result + .hasQualifiedName(["java.util", "kotlin.collections"], + ["Abstract", ""] + ["Mutable", ""] + ["Collection", "List", "Map"]) +} + +class RelevantMethod extends Method { + RelevantMethod() { this.getDeclaringType().getSourceDeclaration() = getARelevantCollectionType() } +} + +// Check for methods with suspicious twins -- probably another extraction of the same method outline which was given a different trap key. +// It so happens the collections methods of interest to this test don't use overloads with the same parameter count. +query predicate methodWithDuplicate(string methodName, string typeName) { + exists(RelevantMethod m, RelevantMethod dup | + dup.getName() = m.getName() and + not dup.getName() = ["of", "remove", "toArray"] and // These really do have overloads with the same parameter count, so it isn't trivial to tell if they are intentional overloads or inappropriate duplicates. + dup.getNumberOfParameters() = m.getNumberOfParameters() and + dup.getDeclaringType() = m.getDeclaringType() and + dup != m and + methodName = m.getName() and + typeName = m.getDeclaringType().getName() + ) +} + +from RelevantMethod m +select m.getDeclaringType().getName(), m.getName(), m.getAParamType().getName() diff --git a/java/ql/test-kotlin2/library-tests/java-lang-number-conversions/Test.java b/java/ql/test-kotlin2/library-tests/java-lang-number-conversions/Test.java new file mode 100644 index 00000000000..fc4302abe7c --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/java-lang-number-conversions/Test.java @@ -0,0 +1,27 @@ +public class Test { + + byte b; + short s; + int i; + long l; + float f; + double d; + + public void test(Number n, Byte b2) { + + b = n.byteValue(); + s = n.shortValue(); + i = n.intValue(); + l = n.longValue(); + f = n.floatValue(); + d = n.doubleValue(); + b = b2.byteValue(); + s = b2.shortValue(); + i = b2.intValue(); + l = b2.longValue(); + f = b2.floatValue(); + d = b2.doubleValue(); + + } + +} diff --git a/java/ql/test-kotlin2/library-tests/java-lang-number-conversions/test.expected b/java/ql/test-kotlin2/library-tests/java-lang-number-conversions/test.expected new file mode 100644 index 00000000000..7182e30460c --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/java-lang-number-conversions/test.expected @@ -0,0 +1,52 @@ +| java.lang.Byte | byteValue | +| java.lang.Byte | compare | +| java.lang.Byte | compareTo | +| java.lang.Byte | compareUnsigned | +| java.lang.Byte | decode | +| java.lang.Byte | describeConstable | +| java.lang.Byte | doubleValue | +| java.lang.Byte | equals | +| java.lang.Byte | floatValue | +| java.lang.Byte | hashCode | +| java.lang.Byte | intValue | +| java.lang.Byte | longValue | +| java.lang.Byte | parseByte | +| java.lang.Byte | shortValue | +| java.lang.Byte | toString | +| java.lang.Byte | toUnsignedInt | +| java.lang.Byte | toUnsignedLong | +| java.lang.Byte | valueOf | +| java.lang.Number | byteValue | +| java.lang.Number | doubleValue | +| java.lang.Number | floatValue | +| java.lang.Number | intValue | +| java.lang.Number | longValue | +| java.lang.Number | shortValue | +| kotlin.Byte | byteValue | +| kotlin.Byte | compareTo | +| kotlin.Byte | dec | +| kotlin.Byte | div | +| kotlin.Byte | doubleValue | +| kotlin.Byte | equals | +| kotlin.Byte | floatValue | +| kotlin.Byte | inc | +| kotlin.Byte | intValue | +| kotlin.Byte | longValue | +| kotlin.Byte | minus | +| kotlin.Byte | plus | +| kotlin.Byte | rangeTo | +| kotlin.Byte | rangeUntil | +| kotlin.Byte | rem | +| kotlin.Byte | shortValue | +| kotlin.Byte | times | +| kotlin.Byte | toChar | +| kotlin.Byte | toString | +| kotlin.Byte | unaryMinus | +| kotlin.Byte | unaryPlus | +| kotlin.Number | byteValue | +| kotlin.Number | doubleValue | +| kotlin.Number | floatValue | +| kotlin.Number | intValue | +| kotlin.Number | longValue | +| kotlin.Number | shortValue | +| kotlin.Number | toChar | diff --git a/java/ql/test-kotlin2/library-tests/java-lang-number-conversions/test.kt b/java/ql/test-kotlin2/library-tests/java-lang-number-conversions/test.kt new file mode 100644 index 00000000000..31367f1d172 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/java-lang-number-conversions/test.kt @@ -0,0 +1,8 @@ +fun f(n: Number, b: Byte) = n.toByte() + n.toShort() + n.toInt() + n.toLong() + n.toFloat() + n.toDouble() + b.toByte() + b.toShort() + b.toInt() + b.toLong() + b.toFloat() + b.toDouble() + +// Diagnostic Matches: % Couldn't find a Java equivalent function to kotlin.Byte.toByte in java.lang.Byte ...while extracting a call () at %test.kt:1:112:1:119% +// Diagnostic Matches: % Couldn't find a Java equivalent function to kotlin.Byte.toDouble in java.lang.Byte ...while extracting a call () at %test.kt:1:178:1:187% +// Diagnostic Matches: % Couldn't find a Java equivalent function to kotlin.Byte.toFloat in java.lang.Byte ...while extracting a call () at %test.kt:1:164:1:172% +// Diagnostic Matches: % Couldn't find a Java equivalent function to kotlin.Byte.toInt in java.lang.Byte ...while extracting a call () at %test.kt:1:139:1:145% +// Diagnostic Matches: % Couldn't find a Java equivalent function to kotlin.Byte.toLong in java.lang.Byte ...while extracting a call () at %test.kt:1:151:1:158% +// Diagnostic Matches: % Couldn't find a Java equivalent function to kotlin.Byte.toShort in java.lang.Byte ...while extracting a call () at %test.kt:1:125:1:133% diff --git a/java/ql/test-kotlin2/library-tests/java-lang-number-conversions/test.ql b/java/ql/test-kotlin2/library-tests/java-lang-number-conversions/test.ql new file mode 100644 index 00000000000..c6d178df3fb --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/java-lang-number-conversions/test.ql @@ -0,0 +1,5 @@ +import java + +from Method m +where m.getDeclaringType().getName() = ["Number", "Byte"] +select m.getDeclaringType().getQualifiedName(), m.toString() diff --git a/java/ql/test-kotlin2/library-tests/java-list-kotlin-user/MyList.java b/java/ql/test-kotlin2/library-tests/java-list-kotlin-user/MyList.java new file mode 100644 index 00000000000..4e437bae542 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/java-list-kotlin-user/MyList.java @@ -0,0 +1,11 @@ +import java.util.AbstractList; + +public class MyList extends AbstractList { + + public T get(int idx) { return null; } + + public T remove(int idx) { return null; } + + public int size() { return 0; } + +} diff --git a/java/ql/test-kotlin2/library-tests/java-list-kotlin-user/test.expected b/java/ql/test-kotlin2/library-tests/java-list-kotlin-user/test.expected new file mode 100644 index 00000000000..5dae2e3f54b --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/java-list-kotlin-user/test.expected @@ -0,0 +1,3 @@ +| get | +| remove | +| size | diff --git a/java/ql/test-kotlin2/library-tests/java-list-kotlin-user/test.kt b/java/ql/test-kotlin2/library-tests/java-list-kotlin-user/test.kt new file mode 100644 index 00000000000..a4b651255be --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/java-list-kotlin-user/test.kt @@ -0,0 +1,2 @@ + +fun f(l: MyList) = l.get(0) diff --git a/java/ql/test-kotlin2/library-tests/java-list-kotlin-user/test.ql b/java/ql/test-kotlin2/library-tests/java-list-kotlin-user/test.ql new file mode 100644 index 00000000000..52d28097a4b --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/java-list-kotlin-user/test.ql @@ -0,0 +1,5 @@ +import java + +from Method m +where m.getDeclaringType().getName().matches("MyList%") +select m.toString() diff --git a/java/ql/test-kotlin2/library-tests/java-map-methods/PrintAst.expected b/java/ql/test-kotlin2/library-tests/java-map-methods/PrintAst.expected new file mode 100644 index 00000000000..d8b76bd775f --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/java-map-methods/PrintAst.expected @@ -0,0 +1,178 @@ +test.kt: +# 0| [CompilationUnit] test +# 0| 1: [Class] TestKt +# 1| 1: [Method] test +# 1| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 1| 0: [Parameter] m +# 1| 0: [TypeAccess] Map +# 1| 0: [TypeAccess] Integer +# 1| 1: [TypeAccess] Integer +# 1| 5: [BlockStmt] { ... } +# 1| 0: [ReturnStmt] return ... +# 1| 0: [MethodCall] getOrDefault(...) +# 1| -1: [VarAccess] m +# 1| 0: [IntegerLiteral] 1 +# 1| 1: [IntegerLiteral] 2 +# 3| 2: [Method] test2 +# 3| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 3| 0: [Parameter] s +# 3| 0: [TypeAccess] String +# 3| 5: [BlockStmt] { ... } +# 3| 0: [ReturnStmt] return ... +# 3| 0: [MethodCall] length(...) +# 3| -1: [VarAccess] s +# 5| 3: [Method] remove +# 5| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 5| 0: [Parameter] l +# 5| 0: [TypeAccess] List +# 5| 0: [TypeAccess] Integer +# 5| 5: [BlockStmt] { ... } +# 6| 0: [ExprStmt] ; +# 6| 0: [ImplicitCoercionToUnitExpr] +# 6| 0: [TypeAccess] Unit +# 6| 1: [MethodCall] remove(...) +# 6| -1: [VarAccess] l +# 6| 0: [IntegerLiteral] 5 +# 9| 4: [Method] fn1 +# 9| 3: [TypeAccess] String +#-----| 4: (Parameters) +# 9| 0: [Parameter] s +# 9| 0: [TypeAccess] String +# 9| 5: [BlockStmt] { ... } +# 9| 0: [ReturnStmt] return ... +# 9| 0: [AddExpr] ... + ... +# 9| 0: [VarAccess] s +# 9| 1: [StringLiteral] "" +# 10| 5: [Method] fn2 +# 10| 3: [TypeAccess] String +#-----| 4: (Parameters) +# 10| 0: [Parameter] s +# 10| 0: [TypeAccess] String +# 10| 5: [BlockStmt] { ... } +# 10| 0: [ReturnStmt] return ... +# 10| 0: [AddExpr] ... + ... +# 10| 0: [VarAccess] s +# 10| 1: [StringLiteral] "" +# 12| 6: [Method] fn1 +# 12| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 12| 0: [Parameter] i +# 12| 0: [TypeAccess] int +# 12| 5: [BlockStmt] { ... } +# 12| 0: [ReturnStmt] return ... +# 12| 0: [SubExpr] ... - ... +# 12| 0: [VarAccess] i +# 12| 1: [IntegerLiteral] 10 +# 13| 7: [Method] fn2 +# 13| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 13| 0: [Parameter] i +# 13| 0: [TypeAccess] int +# 13| 5: [BlockStmt] { ... } +# 13| 0: [ReturnStmt] return ... +# 13| 0: [SubExpr] ... - ... +# 13| 0: [VarAccess] i +# 13| 1: [IntegerLiteral] 10 +# 15| 8: [Method] special +# 15| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 15| 0: [Parameter] n +# 15| 0: [TypeAccess] Number +# 15| 1: [Parameter] m +# 15| 0: [TypeAccess] Map +# 15| 0: [TypeAccess] String +# 15| 1: [TypeAccess] String +# 15| 2: [Parameter] s +# 15| 0: [TypeAccess] String +# 15| 3: [Parameter] l +# 15| 0: [TypeAccess] List +# 15| 0: [TypeAccess] Integer +# 15| 5: [BlockStmt] { ... } +# 16| 0: [ExprStmt] ; +# 16| 0: [ImplicitCoercionToUnitExpr] +# 16| 0: [TypeAccess] Unit +# 16| 1: [MethodCall] charAt(...) +# 16| -1: [VarAccess] s +# 16| 0: [IntegerLiteral] 1 +# 17| 1: [ExprStmt] ; +# 17| 0: [ImplicitCoercionToUnitExpr] +# 17| 0: [TypeAccess] Unit +# 17| 1: [MethodCall] charAt(...) +# 17| -1: [VarAccess] s +# 17| 0: [IntegerLiteral] 1 +# 18| 2: [ExprStmt] ; +# 18| 0: [ImplicitCoercionToUnitExpr] +# 18| 0: [TypeAccess] Unit +# 18| 1: [MethodCall] doubleValue(...) +# 18| -1: [VarAccess] n +# 19| 3: [ExprStmt] ; +# 19| 0: [ImplicitCoercionToUnitExpr] +# 19| 0: [TypeAccess] Unit +# 19| 1: [MethodCall] byteValue(...) +# 19| -1: [VarAccess] n +# 20| 4: [ExprStmt] ; +# 20| 0: [ImplicitCoercionToUnitExpr] +# 20| 0: [TypeAccess] Unit +# 20| 1: [MethodCall] toChar(...) +# 20| -1: [VarAccess] n +# 21| 5: [ExprStmt] ; +# 21| 0: [ImplicitCoercionToUnitExpr] +# 21| 0: [TypeAccess] Unit +# 21| 1: [MethodCall] floatValue(...) +# 21| -1: [VarAccess] n +# 22| 6: [ExprStmt] ; +# 22| 0: [ImplicitCoercionToUnitExpr] +# 22| 0: [TypeAccess] Unit +# 22| 1: [MethodCall] intValue(...) +# 22| -1: [VarAccess] n +# 23| 7: [ExprStmt] ; +# 23| 0: [ImplicitCoercionToUnitExpr] +# 23| 0: [TypeAccess] Unit +# 23| 1: [MethodCall] shortValue(...) +# 23| -1: [VarAccess] n +# 24| 8: [ExprStmt] ; +# 24| 0: [ImplicitCoercionToUnitExpr] +# 24| 0: [TypeAccess] Unit +# 24| 1: [MethodCall] keySet(...) +# 24| -1: [VarAccess] m +# 25| 9: [ExprStmt] ; +# 25| 0: [ImplicitCoercionToUnitExpr] +# 25| 0: [TypeAccess] Unit +# 25| 1: [MethodCall] values(...) +# 25| -1: [VarAccess] m +# 26| 10: [ExprStmt] ; +# 26| 0: [ImplicitCoercionToUnitExpr] +# 26| 0: [TypeAccess] Unit +# 26| 1: [MethodCall] entrySet(...) +# 26| -1: [VarAccess] m +# 27| 11: [ExprStmt] ; +# 27| 0: [ImplicitCoercionToUnitExpr] +# 27| 0: [TypeAccess] Unit +# 27| 1: [MethodCall] remove(...) +# 27| -1: [VarAccess] l +# 27| 0: [IntegerLiteral] 1 +# 28| 12: [ExprStmt] ; +# 28| 0: [ImplicitCoercionToUnitExpr] +# 28| 0: [TypeAccess] Unit +# 28| 1: [MethodCall] getKey(...) +# 28| -1: [MethodCall] first(...) +# 28| -2: [TypeAccess] Entry +# 28| 0: [TypeAccess] String +# 28| 1: [TypeAccess] String +# 28| -1: [TypeAccess] CollectionsKt +# 28| 0: [MethodCall] entrySet(...) +# 28| -1: [VarAccess] m +# 29| 13: [ExprStmt] ; +# 29| 0: [ImplicitCoercionToUnitExpr] +# 29| 0: [TypeAccess] Unit +# 29| 1: [MethodCall] getValue(...) +# 29| -1: [MethodCall] first(...) +# 29| -2: [TypeAccess] Entry +# 29| 0: [TypeAccess] String +# 29| 1: [TypeAccess] String +# 29| -1: [TypeAccess] CollectionsKt +# 29| 0: [MethodCall] entrySet(...) +# 29| -1: [VarAccess] m diff --git a/java/ql/test-kotlin2/library-tests/java-map-methods/PrintAst.qlref b/java/ql/test-kotlin2/library-tests/java-map-methods/PrintAst.qlref new file mode 100644 index 00000000000..c7fd5faf239 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/java-map-methods/PrintAst.qlref @@ -0,0 +1 @@ +semmle/code/java/PrintAst.ql \ No newline at end of file diff --git a/java/ql/test-kotlin2/library-tests/java-map-methods/test.expected b/java/ql/test-kotlin2/library-tests/java-map-methods/test.expected new file mode 100644 index 00000000000..813df1c237a --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/java-map-methods/test.expected @@ -0,0 +1,7 @@ +#select +| Integer | +| Iterable | +| Object | +| int | +diagnostics +| file://:0:0:0:0 | Couldn't find a Java equivalent function to kotlin.Number.toChar in java.lang.Number | diff --git a/java/ql/test-kotlin2/library-tests/java-map-methods/test.kt b/java/ql/test-kotlin2/library-tests/java-map-methods/test.kt new file mode 100644 index 00000000000..26434612c7a --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/java-map-methods/test.kt @@ -0,0 +1,32 @@ +fun test(m: Map) = m.getOrDefault(1, 2) + +fun test2(s: String) = s.length + +fun remove(l: MutableList) { + l.remove(5) +} + +fun fn1(s: String) = s.plus(other = "") +fun fn2(s: String) = s + "" + +fun fn1(i: Int) = i.minus(10) +fun fn2(i: Int) = i - 10 + +fun special(n: Number, m: Map, s: String, l: MutableList) { + s[1] + s.get(1) + n.toDouble() + n.toByte() + n.toChar() + n.toFloat() + n.toInt() + n.toShort() + m.keys + m.values + m.entries + l.removeAt(1) + m.entries.first().key + m.entries.first().value +} + +// Diagnostic Matches: % Couldn't find a Java equivalent function to kotlin.Number.toChar in java.lang.Number % diff --git a/java/ql/test-kotlin2/library-tests/java-map-methods/test.ql b/java/ql/test-kotlin2/library-tests/java-map-methods/test.ql new file mode 100644 index 00000000000..12846e07dc9 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/java-map-methods/test.ql @@ -0,0 +1,7 @@ +import java +import semmle.code.java.Diagnostics + +from MethodCall ma +select ma.getCallee().getAParameter().getType().toString() + +query predicate diagnostics(Diagnostic d) { any() } diff --git a/java/ql/test-kotlin2/library-tests/java_and_kotlin/Continuation.java b/java/ql/test-kotlin2/library-tests/java_and_kotlin/Continuation.java new file mode 100644 index 00000000000..1e0bcda4135 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/java_and_kotlin/Continuation.java @@ -0,0 +1,4 @@ +package kotlin.coroutines; + +// This is a stub for the Kotlin Continuation interface. +public interface Continuation { } diff --git a/java/ql/test-kotlin2/library-tests/java_and_kotlin/Java.java b/java/ql/test-kotlin2/library-tests/java_and_kotlin/Java.java new file mode 100644 index 00000000000..8e9d4895605 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/java_and_kotlin/Java.java @@ -0,0 +1,23 @@ +import kotlin.coroutines.Continuation; + +public class Java { + void javaFun() { + new Kotlin().kotlinFun(); + } + + public class Djava extends Base { + @Override + public String fn0(int x) { + return super.fn0(x); + } + +/* +// Java interop disabled as it currently doesn't work (no symbol fn1(int, Completion<...>) gets created) +// TODO: re-enable this test once a correct function signature is extracted + @Override + public Object fn1(int x, Continuation $completion) { + return super.fn1(x, $completion); + } +*/ + } +} diff --git a/java/ql/test-kotlin2/library-tests/java_and_kotlin/Kotlin.kt b/java/ql/test-kotlin2/library-tests/java_and_kotlin/Kotlin.kt new file mode 100644 index 00000000000..63e5ca99455 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/java_and_kotlin/Kotlin.kt @@ -0,0 +1,15 @@ +public class Kotlin { + fun kotlinFun() { + // TODO: Java().javaFun(); + } +} + +open class Base { + open fun fn0(x: Int) : String = "" + open suspend fun fn1(x: Int) : String = "" +} + +class Dkotlin : Base() { + override fun fn0(x: Int): String = super.fn0(x) + override suspend fun fn1(x: Int): String = super.fn1(x) +} diff --git a/java/ql/test-kotlin2/library-tests/java_and_kotlin/test.expected b/java/ql/test-kotlin2/library-tests/java_and_kotlin/test.expected new file mode 100644 index 00000000000..845ee4ab788 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/java_and_kotlin/test.expected @@ -0,0 +1,19 @@ +#select +| Java.java:5:3:5:26 | kotlinFun(...) | Kotlin.kt:2:2:4:2 | kotlinFun | +| Java.java:11:11:11:22 | fn0(...) | Kotlin.kt:8:5:8:38 | fn0 | +| Kotlin.kt:13:46:13:51 | fn0(...) | Kotlin.kt:8:5:8:38 | fn0 | +| Kotlin.kt:14:54:14:59 | fn1(...) | Kotlin.kt:9:5:9:46 | fn1 | +methods +| Java.java:4:7:4:13 | javaFun | javaFun() | +| Java.java:10:17:10:19 | fn0 | fn0(int) | +| Kotlin.kt:2:2:4:2 | kotlinFun | kotlinFun() | +| Kotlin.kt:8:5:8:38 | fn0 | fn0(int) | +| Kotlin.kt:9:5:9:46 | fn1 | fn1(int) | +| Kotlin.kt:13:5:13:51 | fn0 | fn0(int) | +| Kotlin.kt:14:5:14:59 | fn1 | fn1(int) | +overrides +| Java.java:10:17:10:19 | fn0 | Kotlin.kt:8:5:8:38 | fn0 | +| Kotlin.kt:13:5:13:51 | fn0 | Kotlin.kt:8:5:8:38 | fn0 | +| Kotlin.kt:14:5:14:59 | fn1 | Kotlin.kt:9:5:9:46 | fn1 | +signature_mismatch +| Kotlin.kt:9:5:9:46 | fn1 | fn1(int) | diff --git a/java/ql/test-kotlin2/library-tests/java_and_kotlin/test.ql b/java/ql/test-kotlin2/library-tests/java_and_kotlin/test.ql new file mode 100644 index 00000000000..22605aad6a2 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/java_and_kotlin/test.ql @@ -0,0 +1,21 @@ +import java + +from MethodCall ma, Method m +where m = ma.getMethod() +select ma, m + +query predicate methods(Method m, string sig) { + m.fromSource() and + m.getSignature() = sig +} + +query predicate overrides(Method m1, Method m2) { + m1.fromSource() and + m1.overrides(m2) +} + +query predicate signature_mismatch(Method m, string sig) { + m.getDeclaringType().getQualifiedName() = "Base" and + m.getName() = "fn1" and + m.getSignature() = sig +} diff --git a/java/ql/test-kotlin2/library-tests/java_and_kotlin_generics/java/test.expected b/java/ql/test-kotlin2/library-tests/java_and_kotlin_generics/java/test.expected new file mode 100644 index 00000000000..43c7dd0274c --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/java_and_kotlin_generics/java/test.expected @@ -0,0 +1,4 @@ +test +| file:///modules/java.base/java/util/List.class:0:0:0:0 | iterator | file:///modules/java.base/java/util/Collection.class:0:0:0:0 | iterator | +test1 +| file:///modules/java.base/java/util/List.class:0:0:0:0 | iterator | diff --git a/java/ql/test-kotlin2/library-tests/java_and_kotlin_generics/java/test.ql b/java/ql/test-kotlin2/library-tests/java_and_kotlin_generics/java/test.ql new file mode 100644 index 00000000000..f9745028d6a --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/java_and_kotlin_generics/java/test.ql @@ -0,0 +1,12 @@ +import java + +query predicate test(Method m1, Method m2) { + m1.getName() = "iterator" and + m1.getDeclaringType().getQualifiedName() = "java.util.List" and + m1.overrides(m2) +} + +query predicate test1(Method m1) { + m1.getName() = "iterator" and + m1.getDeclaringType().getQualifiedName() = "java.util.List" +} diff --git a/java/ql/test-kotlin2/library-tests/java_and_kotlin_generics/java/x.java b/java/ql/test-kotlin2/library-tests/java_and_kotlin_generics/java/x.java new file mode 100644 index 00000000000..0080e71613c --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/java_and_kotlin_generics/java/x.java @@ -0,0 +1,8 @@ +import java.util.List; +import java.util.Arrays; + +public final class x { + public final void test() { + List ll = Arrays.asList("a", "b"); + } +} \ No newline at end of file diff --git a/java/ql/test-kotlin2/library-tests/java_and_kotlin_generics/kotlin/test.expected b/java/ql/test-kotlin2/library-tests/java_and_kotlin_generics/kotlin/test.expected new file mode 100644 index 00000000000..43c7dd0274c --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/java_and_kotlin_generics/kotlin/test.expected @@ -0,0 +1,4 @@ +test +| file:///modules/java.base/java/util/List.class:0:0:0:0 | iterator | file:///modules/java.base/java/util/Collection.class:0:0:0:0 | iterator | +test1 +| file:///modules/java.base/java/util/List.class:0:0:0:0 | iterator | diff --git a/java/ql/test-kotlin2/library-tests/java_and_kotlin_generics/kotlin/test.ql b/java/ql/test-kotlin2/library-tests/java_and_kotlin_generics/kotlin/test.ql new file mode 100644 index 00000000000..f9745028d6a --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/java_and_kotlin_generics/kotlin/test.ql @@ -0,0 +1,12 @@ +import java + +query predicate test(Method m1, Method m2) { + m1.getName() = "iterator" and + m1.getDeclaringType().getQualifiedName() = "java.util.List" and + m1.overrides(m2) +} + +query predicate test1(Method m1) { + m1.getName() = "iterator" and + m1.getDeclaringType().getQualifiedName() = "java.util.List" +} diff --git a/java/ql/test-kotlin2/library-tests/java_and_kotlin_generics/kotlin/x.kt b/java/ql/test-kotlin2/library-tests/java_and_kotlin_generics/kotlin/x.kt new file mode 100644 index 00000000000..7ae798f4ab6 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/java_and_kotlin_generics/kotlin/x.kt @@ -0,0 +1,7 @@ +import java.util.* + +class x { + fun test() { + val ll = Arrays.asList("a", "b") + } +} \ No newline at end of file diff --git a/java/ql/test-kotlin2/library-tests/java_and_kotlin_internal/Java.java b/java/ql/test-kotlin2/library-tests/java_and_kotlin_internal/Java.java new file mode 100644 index 00000000000..585161f21c0 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/java_and_kotlin_internal/Java.java @@ -0,0 +1,6 @@ +public class Java { + void javaFun() { + new Kotlin().kotlinFun$main(); + KotlinKt.topLevelKotlinFun(); + } +} diff --git a/java/ql/test-kotlin2/library-tests/java_and_kotlin_internal/Kotlin.kt b/java/ql/test-kotlin2/library-tests/java_and_kotlin_internal/Kotlin.kt new file mode 100644 index 00000000000..98235ec7ff8 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/java_and_kotlin_internal/Kotlin.kt @@ -0,0 +1,6 @@ +public class Kotlin { + internal fun kotlinFun() { + } +} + +internal fun topLevelKotlinFun() { } diff --git a/java/ql/test-kotlin2/library-tests/java_and_kotlin_internal/visibility.expected b/java/ql/test-kotlin2/library-tests/java_and_kotlin_internal/visibility.expected new file mode 100644 index 00000000000..222e90470fe --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/java_and_kotlin_internal/visibility.expected @@ -0,0 +1,16 @@ +#select +| Kotlin.kt:2:2:3:2 | kotlinFun$main | final | +| Kotlin.kt:2:2:3:2 | kotlinFun$main | internal | +| Kotlin.kt:6:1:6:36 | topLevelKotlinFun | final | +| Kotlin.kt:6:1:6:36 | topLevelKotlinFun | internal | +| Kotlin.kt:6:1:6:36 | topLevelKotlinFun | static | +isPublic +isInternal +| Kotlin.kt:2:2:3:2 | kotlinFun$main | +| Kotlin.kt:6:1:6:36 | topLevelKotlinFun | +modifiers_methods +| file://:0:0:0:0 | final | Kotlin.kt:2:2:3:2 | kotlinFun$main | +| file://:0:0:0:0 | final | Kotlin.kt:6:1:6:36 | topLevelKotlinFun | +| file://:0:0:0:0 | internal | Kotlin.kt:2:2:3:2 | kotlinFun$main | +| file://:0:0:0:0 | internal | Kotlin.kt:6:1:6:36 | topLevelKotlinFun | +| file://:0:0:0:0 | static | Kotlin.kt:6:1:6:36 | topLevelKotlinFun | diff --git a/java/ql/test-kotlin2/library-tests/java_and_kotlin_internal/visibility.ql b/java/ql/test-kotlin2/library-tests/java_and_kotlin_internal/visibility.ql new file mode 100644 index 00000000000..452cee9b3c6 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/java_and_kotlin_internal/visibility.ql @@ -0,0 +1,13 @@ +import java + +from Method m, string s +where m.fromSource() and m.hasModifier(s) +select m, s + +query predicate isPublic(Method m) { m.fromSource() and m.isPublic() } + +query predicate isInternal(Method m) { m.fromSource() and m.isInternal() } + +query predicate modifiers_methods(Modifier mo, Method me) { + mo.getElement() = me and me.fromSource() +} diff --git a/java/ql/test-kotlin2/library-tests/java_properties/PrintAst.expected b/java/ql/test-kotlin2/library-tests/java_properties/PrintAst.expected new file mode 100644 index 00000000000..64675f08dc0 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/java_properties/PrintAst.expected @@ -0,0 +1,22 @@ +Prop.java: +# 0| [CompilationUnit] Prop +# 2| 1: [Class] Prop +# 4| 2: [Method] getFoo +# 4| 3: [TypeAccess] String +# 4| 5: [BlockStmt] { ... } +# 5| 0: [ReturnStmt] return ... +# 5| 0: [StringLiteral] "foo" +Use.kt: +# 0| [CompilationUnit] Use +# 0| 1: [Class] UseKt +# 2| 1: [Method] use +# 2| 3: [TypeAccess] String +#-----| 4: (Parameters) +# 2| 0: [Parameter] prop +# 2| 0: [TypeAccess] Prop +# 2| 5: [BlockStmt] { ... } +# 3| 0: [ReturnStmt] return ... +# 3| 0: [ImplicitNotNullExpr] +# 3| 0: [TypeAccess] String +# 3| 1: [MethodCall] getFoo(...) +# 3| -1: [VarAccess] prop diff --git a/java/ql/test-kotlin2/library-tests/java_properties/PrintAst.qlref b/java/ql/test-kotlin2/library-tests/java_properties/PrintAst.qlref new file mode 100644 index 00000000000..c7fd5faf239 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/java_properties/PrintAst.qlref @@ -0,0 +1 @@ +semmle/code/java/PrintAst.ql \ No newline at end of file diff --git a/java/ql/test-kotlin2/library-tests/java_properties/Prop.java b/java/ql/test-kotlin2/library-tests/java_properties/Prop.java new file mode 100644 index 00000000000..fe18f8fccde --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/java_properties/Prop.java @@ -0,0 +1,7 @@ + +public class Prop { + // This will look like a property in Kotlin + String getFoo() { + return "foo"; + } +} diff --git a/java/ql/test-kotlin2/library-tests/java_properties/Use.kt b/java/ql/test-kotlin2/library-tests/java_properties/Use.kt new file mode 100644 index 00000000000..5c7a489de7c --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/java_properties/Use.kt @@ -0,0 +1,4 @@ + +fun use(prop: Prop): String { + return prop.foo +} diff --git a/java/ql/test-kotlin2/library-tests/jvmoverloads-annotation/PrintAst.expected b/java/ql/test-kotlin2/library-tests/jvmoverloads-annotation/PrintAst.expected new file mode 100644 index 00000000000..6355cc86a7a --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/jvmoverloads-annotation/PrintAst.expected @@ -0,0 +1,1082 @@ +test.kt: +# 0| [CompilationUnit] test +# 0| 1: [Class] TestKt +# 1| 1: [Method] getString +# 1| 3: [TypeAccess] String +# 1| 5: [BlockStmt] { ... } +# 1| 0: [ReturnStmt] return ... +# 1| 0: [StringLiteral] "Hello world" +# 44| 2: [ExtensionMethod] testExtensionFunction +# 44| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 45| 0: [Parameter] +# 45| 0: [TypeAccess] Test +# 45| 1: [Parameter] a +# 45| 0: [TypeAccess] int +# 45| 2: [Parameter] b +# 45| 0: [TypeAccess] String +# 45| 3: [Parameter] c +# 45| 0: [TypeAccess] double +# 45| 4: [Parameter] e +# 45| 0: [TypeAccess] boolean +# 44| 5: [BlockStmt] { ... } +# 44| 0: [ReturnStmt] return ... +# 44| 0: [MethodCall] testExtensionFunction$default(...) +# 44| -1: [TypeAccess] TestKt +# 0| 0: [ExtensionReceiverAccess] this +# 0| 1: [VarAccess] a +# 0| 2: [VarAccess] b +# 0| 3: [VarAccess] c +# 1| 4: [FloatLiteral] 0.0 +# 0| 5: [VarAccess] e +# 1| 6: [IntegerLiteral] 23 +# 1| 7: [NullLiteral] null +# 44| 3: [ExtensionMethod] testExtensionFunction +#-----| 1: (Annotations) +# 44| 1: [Annotation] JvmOverloads +# 44| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 45| 0: [Parameter] +# 45| 0: [TypeAccess] Test +# 45| 1: [Parameter] a +# 45| 0: [TypeAccess] int +# 45| 2: [Parameter] b +# 45| 0: [TypeAccess] String +# 45| 3: [Parameter] c +# 45| 0: [TypeAccess] double +# 45| 4: [Parameter] d +# 45| 0: [TypeAccess] float +# 45| 5: [Parameter] e +# 45| 0: [TypeAccess] boolean +# 45| 5: [BlockStmt] { ... } +# 45| 0: [ReturnStmt] return ... +# 45| 0: [VarAccess] a +# 44| 4: [ExtensionMethod] testExtensionFunction +# 44| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 45| 0: [Parameter] +# 45| 0: [TypeAccess] Test +# 45| 1: [Parameter] a +# 45| 0: [TypeAccess] int +# 45| 2: [Parameter] c +# 45| 0: [TypeAccess] double +# 45| 3: [Parameter] e +# 45| 0: [TypeAccess] boolean +# 44| 5: [BlockStmt] { ... } +# 44| 0: [ReturnStmt] return ... +# 44| 0: [MethodCall] testExtensionFunction$default(...) +# 44| -1: [TypeAccess] TestKt +# 0| 0: [ExtensionReceiverAccess] this +# 0| 1: [VarAccess] a +# 1| 2: [NullLiteral] null +# 0| 3: [VarAccess] c +# 1| 4: [FloatLiteral] 0.0 +# 0| 5: [VarAccess] e +# 1| 6: [IntegerLiteral] 21 +# 1| 7: [NullLiteral] null +# 44| 5: [ExtensionMethod] testExtensionFunction$default +# 44| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 44| 0: [Parameter] p0 +# 44| 0: [TypeAccess] Test +# 44| 1: [Parameter] p1 +# 44| 0: [TypeAccess] int +# 44| 2: [Parameter] p2 +# 44| 0: [TypeAccess] String +# 44| 3: [Parameter] p3 +# 44| 0: [TypeAccess] double +# 44| 4: [Parameter] p4 +# 44| 0: [TypeAccess] float +# 44| 5: [Parameter] p5 +# 44| 0: [TypeAccess] boolean +# 44| 6: [Parameter] p6 +# 44| 0: [TypeAccess] int +# 44| 7: [Parameter] p7 +# 44| 0: [TypeAccess] Object +# 44| 5: [BlockStmt] { ... } +# 44| 0: [IfStmt] if (...) +# 44| 0: [EQExpr] ... == ... +# 44| 0: [AndBitwiseExpr] ... & ... +# 44| 0: [IntegerLiteral] 2 +# 44| 1: [VarAccess] p6 +# 44| 1: [IntegerLiteral] 0 +# 44| 1: [ExprStmt] ; +# 44| 0: [AssignExpr] ...=... +# 44| 0: [VarAccess] p2 +# 45| 1: [MethodCall] getString(...) +# 45| -1: [TypeAccess] TestKt +# 44| 1: [IfStmt] if (...) +# 44| 0: [EQExpr] ... == ... +# 44| 0: [AndBitwiseExpr] ... & ... +# 44| 0: [IntegerLiteral] 8 +# 44| 1: [VarAccess] p6 +# 44| 1: [IntegerLiteral] 0 +# 44| 1: [ExprStmt] ; +# 44| 0: [AssignExpr] ...=... +# 44| 0: [VarAccess] p4 +# 45| 1: [FloatLiteral] 1.0 +# 44| 2: [ReturnStmt] return ... +# 44| 0: [MethodCall] testExtensionFunction(...) +# 44| -1: [TypeAccess] TestKt +# 44| 0: [ExtensionReceiverAccess] this +# 44| 1: [VarAccess] p1 +# 44| 2: [VarAccess] p2 +# 44| 3: [VarAccess] p3 +# 44| 4: [VarAccess] p4 +# 44| 5: [VarAccess] p5 +# 3| 2: [Class] Test +# 3| 1: [Constructor] Test +# 3| 5: [BlockStmt] { ... } +# 3| 0: [SuperConstructorInvocationStmt] super(...) +# 3| 1: [BlockStmt] { ... } +# 5| 2: [Method] testStaticFunction +# 5| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 6| 0: [Parameter] a +# 6| 0: [TypeAccess] int +# 6| 1: [Parameter] b +# 6| 0: [TypeAccess] String +# 6| 2: [Parameter] c +# 6| 0: [TypeAccess] double +# 6| 3: [Parameter] e +# 6| 0: [TypeAccess] boolean +# 5| 5: [BlockStmt] { ... } +# 5| 0: [ReturnStmt] return ... +# 5| 0: [MethodCall] testStaticFunction$default(...) +# 5| -1: [TypeAccess] Test +# 0| 0: [VarAccess] a +# 0| 1: [VarAccess] b +# 0| 2: [VarAccess] c +# 1| 3: [FloatLiteral] 0.0 +# 0| 4: [VarAccess] e +# 1| 5: [IntegerLiteral] 23 +# 1| 6: [NullLiteral] null +# 5| 3: [Method] testStaticFunction +#-----| 1: (Annotations) +# 5| 1: [Annotation] JvmOverloads +# 5| 2: [Annotation] JvmStatic +# 5| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 6| 0: [Parameter] a +# 6| 0: [TypeAccess] int +# 6| 1: [Parameter] b +# 6| 0: [TypeAccess] String +# 6| 2: [Parameter] c +# 6| 0: [TypeAccess] double +# 6| 3: [Parameter] d +# 6| 0: [TypeAccess] float +# 6| 4: [Parameter] e +# 6| 0: [TypeAccess] boolean +# 6| 5: [BlockStmt] { ... } +# 6| 0: [ReturnStmt] return ... +# 6| 0: [VarAccess] a +# 5| 4: [Method] testStaticFunction +# 5| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 6| 0: [Parameter] a +# 6| 0: [TypeAccess] int +# 6| 1: [Parameter] c +# 6| 0: [TypeAccess] double +# 6| 2: [Parameter] e +# 6| 0: [TypeAccess] boolean +# 5| 5: [BlockStmt] { ... } +# 5| 0: [ReturnStmt] return ... +# 5| 0: [MethodCall] testStaticFunction$default(...) +# 5| -1: [TypeAccess] Test +# 0| 0: [VarAccess] a +# 1| 1: [NullLiteral] null +# 0| 2: [VarAccess] c +# 1| 3: [FloatLiteral] 0.0 +# 0| 4: [VarAccess] e +# 1| 5: [IntegerLiteral] 21 +# 1| 6: [NullLiteral] null +# 5| 5: [Method] testStaticFunction$default +# 5| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 5| 0: [Parameter] p0 +# 5| 0: [TypeAccess] int +# 5| 1: [Parameter] p1 +# 5| 0: [TypeAccess] String +# 5| 2: [Parameter] p2 +# 5| 0: [TypeAccess] double +# 5| 3: [Parameter] p3 +# 5| 0: [TypeAccess] float +# 5| 4: [Parameter] p4 +# 5| 0: [TypeAccess] boolean +# 5| 5: [Parameter] p5 +# 5| 0: [TypeAccess] int +# 5| 6: [Parameter] p6 +# 5| 0: [TypeAccess] Object +# 5| 5: [BlockStmt] { ... } +# 5| 0: [IfStmt] if (...) +# 5| 0: [EQExpr] ... == ... +# 5| 0: [AndBitwiseExpr] ... & ... +# 5| 0: [IntegerLiteral] 2 +# 5| 1: [VarAccess] p5 +# 5| 1: [IntegerLiteral] 0 +# 5| 1: [ExprStmt] ; +# 5| 0: [AssignExpr] ...=... +# 5| 0: [VarAccess] p1 +# 6| 1: [MethodCall] getString(...) +# 6| -1: [TypeAccess] TestKt +# 5| 1: [IfStmt] if (...) +# 5| 0: [EQExpr] ... == ... +# 5| 0: [AndBitwiseExpr] ... & ... +# 5| 0: [IntegerLiteral] 8 +# 5| 1: [VarAccess] p5 +# 5| 1: [IntegerLiteral] 0 +# 5| 1: [ExprStmt] ; +# 5| 0: [AssignExpr] ...=... +# 5| 0: [VarAccess] p3 +# 6| 1: [FloatLiteral] 1.0 +# 5| 2: [ReturnStmt] return ... +# 5| 0: [MethodCall] testStaticFunction(...) +# 5| -1: [TypeAccess] Test +# 5| 0: [VarAccess] p0 +# 5| 1: [VarAccess] p1 +# 5| 2: [VarAccess] p2 +# 5| 3: [VarAccess] p3 +# 5| 4: [VarAccess] p4 +# 8| 6: [Method] testMemberFunction +# 8| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 9| 0: [Parameter] a +# 9| 0: [TypeAccess] int +# 9| 1: [Parameter] b +# 9| 0: [TypeAccess] String +# 9| 2: [Parameter] c +# 9| 0: [TypeAccess] double +# 9| 3: [Parameter] e +# 9| 0: [TypeAccess] boolean +# 8| 5: [BlockStmt] { ... } +# 8| 0: [ReturnStmt] return ... +# 8| 0: [MethodCall] testMemberFunction$default(...) +# 8| -1: [TypeAccess] Test +# 0| 0: [ThisAccess] this +# 0| 1: [VarAccess] a +# 0| 2: [VarAccess] b +# 0| 3: [VarAccess] c +# 1| 4: [FloatLiteral] 0.0 +# 0| 5: [VarAccess] e +# 1| 6: [IntegerLiteral] 23 +# 1| 7: [NullLiteral] null +# 8| 7: [Method] testMemberFunction +#-----| 1: (Annotations) +# 8| 1: [Annotation] JvmOverloads +# 8| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 9| 0: [Parameter] a +# 9| 0: [TypeAccess] int +# 9| 1: [Parameter] b +# 9| 0: [TypeAccess] String +# 9| 2: [Parameter] c +# 9| 0: [TypeAccess] double +# 9| 3: [Parameter] d +# 9| 0: [TypeAccess] float +# 9| 4: [Parameter] e +# 9| 0: [TypeAccess] boolean +# 9| 5: [BlockStmt] { ... } +# 9| 0: [ReturnStmt] return ... +# 9| 0: [VarAccess] a +# 8| 8: [Method] testMemberFunction +# 8| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 9| 0: [Parameter] a +# 9| 0: [TypeAccess] int +# 9| 1: [Parameter] c +# 9| 0: [TypeAccess] double +# 9| 2: [Parameter] e +# 9| 0: [TypeAccess] boolean +# 8| 5: [BlockStmt] { ... } +# 8| 0: [ReturnStmt] return ... +# 8| 0: [MethodCall] testMemberFunction$default(...) +# 8| -1: [TypeAccess] Test +# 0| 0: [ThisAccess] this +# 0| 1: [VarAccess] a +# 1| 2: [NullLiteral] null +# 0| 3: [VarAccess] c +# 1| 4: [FloatLiteral] 0.0 +# 0| 5: [VarAccess] e +# 1| 6: [IntegerLiteral] 21 +# 1| 7: [NullLiteral] null +# 8| 9: [Method] testMemberFunction$default +# 8| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 8| 0: [Parameter] p0 +# 8| 0: [TypeAccess] Test +# 8| 1: [Parameter] p1 +# 8| 0: [TypeAccess] int +# 8| 2: [Parameter] p2 +# 8| 0: [TypeAccess] String +# 8| 3: [Parameter] p3 +# 8| 0: [TypeAccess] double +# 8| 4: [Parameter] p4 +# 8| 0: [TypeAccess] float +# 8| 5: [Parameter] p5 +# 8| 0: [TypeAccess] boolean +# 8| 6: [Parameter] p6 +# 8| 0: [TypeAccess] int +# 8| 7: [Parameter] p7 +# 8| 0: [TypeAccess] Object +# 8| 5: [BlockStmt] { ... } +# 8| 0: [IfStmt] if (...) +# 8| 0: [EQExpr] ... == ... +# 8| 0: [AndBitwiseExpr] ... & ... +# 8| 0: [IntegerLiteral] 2 +# 8| 1: [VarAccess] p6 +# 8| 1: [IntegerLiteral] 0 +# 8| 1: [ExprStmt] ; +# 8| 0: [AssignExpr] ...=... +# 8| 0: [VarAccess] p2 +# 9| 1: [MethodCall] getString(...) +# 9| -1: [TypeAccess] TestKt +# 8| 1: [IfStmt] if (...) +# 8| 0: [EQExpr] ... == ... +# 8| 0: [AndBitwiseExpr] ... & ... +# 8| 0: [IntegerLiteral] 8 +# 8| 1: [VarAccess] p6 +# 8| 1: [IntegerLiteral] 0 +# 8| 1: [ExprStmt] ; +# 8| 0: [AssignExpr] ...=... +# 8| 0: [VarAccess] p4 +# 9| 1: [FloatLiteral] 1.0 +# 8| 2: [ReturnStmt] return ... +# 8| 0: [MethodCall] testMemberFunction(...) +# 8| -1: [VarAccess] p0 +# 8| 0: [VarAccess] p1 +# 8| 1: [VarAccess] p2 +# 8| 2: [VarAccess] p3 +# 8| 3: [VarAccess] p4 +# 8| 4: [VarAccess] p5 +# 11| 10: [ExtensionMethod] testMemberExtensionFunction +# 11| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 12| 0: [Parameter] +# 12| 0: [TypeAccess] Test2 +# 12| 1: [Parameter] a +# 12| 0: [TypeAccess] int +# 12| 2: [Parameter] b +# 12| 0: [TypeAccess] String +# 12| 3: [Parameter] c +# 12| 0: [TypeAccess] double +# 12| 4: [Parameter] e +# 12| 0: [TypeAccess] boolean +# 11| 5: [BlockStmt] { ... } +# 11| 0: [ReturnStmt] return ... +# 11| 0: [MethodCall] testMemberExtensionFunction$default(...) +# 11| -1: [TypeAccess] Test +# 0| 0: [ThisAccess] Test.this +# 0| 0: [TypeAccess] Test +# 0| 1: [ExtensionReceiverAccess] this +# 0| 2: [VarAccess] a +# 0| 3: [VarAccess] b +# 0| 4: [VarAccess] c +# 1| 5: [FloatLiteral] 0.0 +# 0| 6: [VarAccess] e +# 1| 7: [IntegerLiteral] 23 +# 1| 8: [NullLiteral] null +# 11| 11: [ExtensionMethod] testMemberExtensionFunction +#-----| 1: (Annotations) +# 11| 1: [Annotation] JvmOverloads +# 11| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 12| 0: [Parameter] +# 12| 0: [TypeAccess] Test2 +# 12| 1: [Parameter] a +# 12| 0: [TypeAccess] int +# 12| 2: [Parameter] b +# 12| 0: [TypeAccess] String +# 12| 3: [Parameter] c +# 12| 0: [TypeAccess] double +# 12| 4: [Parameter] d +# 12| 0: [TypeAccess] float +# 12| 5: [Parameter] e +# 12| 0: [TypeAccess] boolean +# 12| 5: [BlockStmt] { ... } +# 12| 0: [ReturnStmt] return ... +# 12| 0: [VarAccess] a +# 11| 12: [ExtensionMethod] testMemberExtensionFunction +# 11| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 12| 0: [Parameter] +# 12| 0: [TypeAccess] Test2 +# 12| 1: [Parameter] a +# 12| 0: [TypeAccess] int +# 12| 2: [Parameter] c +# 12| 0: [TypeAccess] double +# 12| 3: [Parameter] e +# 12| 0: [TypeAccess] boolean +# 11| 5: [BlockStmt] { ... } +# 11| 0: [ReturnStmt] return ... +# 11| 0: [MethodCall] testMemberExtensionFunction$default(...) +# 11| -1: [TypeAccess] Test +# 0| 0: [ThisAccess] Test.this +# 0| 0: [TypeAccess] Test +# 0| 1: [ExtensionReceiverAccess] this +# 0| 2: [VarAccess] a +# 1| 3: [NullLiteral] null +# 0| 4: [VarAccess] c +# 1| 5: [FloatLiteral] 0.0 +# 0| 6: [VarAccess] e +# 1| 7: [IntegerLiteral] 21 +# 1| 8: [NullLiteral] null +# 11| 13: [ExtensionMethod] testMemberExtensionFunction$default +# 11| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 11| 0: [Parameter] p0 +# 11| 0: [TypeAccess] Test +# 11| 1: [Parameter] p1 +# 11| 0: [TypeAccess] Test2 +# 11| 2: [Parameter] p2 +# 11| 0: [TypeAccess] int +# 11| 3: [Parameter] p3 +# 11| 0: [TypeAccess] String +# 11| 4: [Parameter] p4 +# 11| 0: [TypeAccess] double +# 11| 5: [Parameter] p5 +# 11| 0: [TypeAccess] float +# 11| 6: [Parameter] p6 +# 11| 0: [TypeAccess] boolean +# 11| 7: [Parameter] p7 +# 11| 0: [TypeAccess] int +# 11| 8: [Parameter] p8 +# 11| 0: [TypeAccess] Object +# 11| 5: [BlockStmt] { ... } +# 11| 0: [IfStmt] if (...) +# 11| 0: [EQExpr] ... == ... +# 11| 0: [AndBitwiseExpr] ... & ... +# 11| 0: [IntegerLiteral] 2 +# 11| 1: [VarAccess] p7 +# 11| 1: [IntegerLiteral] 0 +# 11| 1: [ExprStmt] ; +# 11| 0: [AssignExpr] ...=... +# 11| 0: [VarAccess] p3 +# 12| 1: [MethodCall] getString(...) +# 12| -1: [TypeAccess] TestKt +# 11| 1: [IfStmt] if (...) +# 11| 0: [EQExpr] ... == ... +# 11| 0: [AndBitwiseExpr] ... & ... +# 11| 0: [IntegerLiteral] 8 +# 11| 1: [VarAccess] p7 +# 11| 1: [IntegerLiteral] 0 +# 11| 1: [ExprStmt] ; +# 11| 0: [AssignExpr] ...=... +# 11| 0: [VarAccess] p5 +# 12| 1: [FloatLiteral] 1.0 +# 11| 2: [ReturnStmt] return ... +# 11| 0: [MethodCall] testMemberExtensionFunction(...) +# 11| -1: [VarAccess] p0 +# 11| 0: [ExtensionReceiverAccess] this +# 11| 1: [VarAccess] p2 +# 11| 2: [VarAccess] p3 +# 11| 3: [VarAccess] p4 +# 11| 4: [VarAccess] p5 +# 11| 5: [VarAccess] p6 +# 16| 3: [Class] Test2 +# 16| 1: [Constructor] Test2 +#-----| 4: (Parameters) +# 16| 0: [Parameter] a +# 16| 0: [TypeAccess] int +# 16| 1: [Parameter] b +# 16| 0: [TypeAccess] String +# 16| 2: [Parameter] c +# 16| 0: [TypeAccess] double +# 16| 3: [Parameter] e +# 16| 0: [TypeAccess] boolean +# 16| 5: [BlockStmt] { ... } +# 16| 0: [ThisConstructorInvocationStmt] this(...) +# 0| 0: [VarAccess] a +# 0| 1: [VarAccess] b +# 0| 2: [VarAccess] c +# 1| 3: [FloatLiteral] 0.0 +# 0| 4: [VarAccess] e +# 1| 5: [IntegerLiteral] 23 +# 1| 6: [NullLiteral] null +# 16| 2: [Constructor] Test2 +#-----| 1: (Annotations) +# 16| 1: [Annotation] JvmOverloads +#-----| 4: (Parameters) +# 16| 0: [Parameter] a +# 16| 0: [TypeAccess] int +# 16| 1: [Parameter] b +# 16| 0: [TypeAccess] String +# 16| 2: [Parameter] c +# 16| 0: [TypeAccess] double +# 16| 3: [Parameter] d +# 16| 0: [TypeAccess] float +# 16| 4: [Parameter] e +# 16| 0: [TypeAccess] boolean +# 16| 5: [BlockStmt] { ... } +# 16| 0: [SuperConstructorInvocationStmt] super(...) +# 16| 1: [BlockStmt] { ... } +# 16| 3: [Constructor] Test2 +#-----| 4: (Parameters) +# 16| 0: [Parameter] p0 +# 16| 0: [TypeAccess] int +# 16| 1: [Parameter] p1 +# 16| 0: [TypeAccess] String +# 16| 2: [Parameter] p2 +# 16| 0: [TypeAccess] double +# 16| 3: [Parameter] p3 +# 16| 0: [TypeAccess] float +# 16| 4: [Parameter] p4 +# 16| 0: [TypeAccess] boolean +# 16| 5: [Parameter] p5 +# 16| 0: [TypeAccess] int +# 16| 6: [Parameter] p6 +# 16| 0: [TypeAccess] DefaultConstructorMarker +# 16| 5: [BlockStmt] { ... } +# 16| 0: [IfStmt] if (...) +# 16| 0: [EQExpr] ... == ... +# 16| 0: [AndBitwiseExpr] ... & ... +# 16| 0: [IntegerLiteral] 2 +# 16| 1: [VarAccess] p5 +# 16| 1: [IntegerLiteral] 0 +# 16| 1: [ExprStmt] ; +# 16| 0: [AssignExpr] ...=... +# 16| 0: [VarAccess] p1 +# 16| 1: [MethodCall] getString(...) +# 16| -1: [TypeAccess] TestKt +# 16| 1: [IfStmt] if (...) +# 16| 0: [EQExpr] ... == ... +# 16| 0: [AndBitwiseExpr] ... & ... +# 16| 0: [IntegerLiteral] 8 +# 16| 1: [VarAccess] p5 +# 16| 1: [IntegerLiteral] 0 +# 16| 1: [ExprStmt] ; +# 16| 0: [AssignExpr] ...=... +# 16| 0: [VarAccess] p3 +# 16| 1: [FloatLiteral] 1.0 +# 16| 2: [ThisConstructorInvocationStmt] this(...) +# 16| 0: [VarAccess] p0 +# 16| 1: [VarAccess] p1 +# 16| 2: [VarAccess] p2 +# 16| 3: [VarAccess] p3 +# 16| 4: [VarAccess] p4 +# 16| 4: [Constructor] Test2 +#-----| 4: (Parameters) +# 16| 0: [Parameter] a +# 16| 0: [TypeAccess] int +# 16| 1: [Parameter] c +# 16| 0: [TypeAccess] double +# 16| 2: [Parameter] e +# 16| 0: [TypeAccess] boolean +# 16| 5: [BlockStmt] { ... } +# 16| 0: [ThisConstructorInvocationStmt] this(...) +# 0| 0: [VarAccess] a +# 1| 1: [NullLiteral] null +# 0| 2: [VarAccess] c +# 1| 3: [FloatLiteral] 0.0 +# 0| 4: [VarAccess] e +# 1| 5: [IntegerLiteral] 21 +# 1| 6: [NullLiteral] null +# 18| 5: [Class] Companion +# 18| 1: [Constructor] Companion +# 18| 5: [BlockStmt] { ... } +# 18| 0: [SuperConstructorInvocationStmt] super(...) +# 18| 1: [BlockStmt] { ... } +# 20| 2: [Method] testCompanionFunction +# 20| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 21| 0: [Parameter] a +# 21| 0: [TypeAccess] int +# 21| 1: [Parameter] b +# 21| 0: [TypeAccess] String +# 21| 2: [Parameter] c +# 21| 0: [TypeAccess] double +# 21| 3: [Parameter] e +# 21| 0: [TypeAccess] boolean +# 20| 5: [BlockStmt] { ... } +# 20| 0: [ReturnStmt] return ... +# 20| 0: [MethodCall] testCompanionFunction$default(...) +# 20| -1: [TypeAccess] Companion +# 0| 0: [ThisAccess] this +# 0| 1: [VarAccess] a +# 0| 2: [VarAccess] b +# 0| 3: [VarAccess] c +# 1| 4: [FloatLiteral] 0.0 +# 0| 5: [VarAccess] e +# 1| 6: [IntegerLiteral] 23 +# 1| 7: [NullLiteral] null +# 20| 3: [Method] testCompanionFunction +#-----| 1: (Annotations) +# 20| 1: [Annotation] JvmOverloads +# 20| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 21| 0: [Parameter] a +# 21| 0: [TypeAccess] int +# 21| 1: [Parameter] b +# 21| 0: [TypeAccess] String +# 21| 2: [Parameter] c +# 21| 0: [TypeAccess] double +# 21| 3: [Parameter] d +# 21| 0: [TypeAccess] float +# 21| 4: [Parameter] e +# 21| 0: [TypeAccess] boolean +# 21| 5: [BlockStmt] { ... } +# 21| 0: [ReturnStmt] return ... +# 21| 0: [VarAccess] a +# 20| 4: [Method] testCompanionFunction +# 20| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 21| 0: [Parameter] a +# 21| 0: [TypeAccess] int +# 21| 1: [Parameter] c +# 21| 0: [TypeAccess] double +# 21| 2: [Parameter] e +# 21| 0: [TypeAccess] boolean +# 20| 5: [BlockStmt] { ... } +# 20| 0: [ReturnStmt] return ... +# 20| 0: [MethodCall] testCompanionFunction$default(...) +# 20| -1: [TypeAccess] Companion +# 0| 0: [ThisAccess] this +# 0| 1: [VarAccess] a +# 1| 2: [NullLiteral] null +# 0| 3: [VarAccess] c +# 1| 4: [FloatLiteral] 0.0 +# 0| 5: [VarAccess] e +# 1| 6: [IntegerLiteral] 21 +# 1| 7: [NullLiteral] null +# 20| 5: [Method] testCompanionFunction$default +# 20| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 20| 0: [Parameter] p0 +# 20| 0: [TypeAccess] Companion +# 20| 1: [Parameter] p1 +# 20| 0: [TypeAccess] int +# 20| 2: [Parameter] p2 +# 20| 0: [TypeAccess] String +# 20| 3: [Parameter] p3 +# 20| 0: [TypeAccess] double +# 20| 4: [Parameter] p4 +# 20| 0: [TypeAccess] float +# 20| 5: [Parameter] p5 +# 20| 0: [TypeAccess] boolean +# 20| 6: [Parameter] p6 +# 20| 0: [TypeAccess] int +# 20| 7: [Parameter] p7 +# 20| 0: [TypeAccess] Object +# 20| 5: [BlockStmt] { ... } +# 20| 0: [IfStmt] if (...) +# 20| 0: [EQExpr] ... == ... +# 20| 0: [AndBitwiseExpr] ... & ... +# 20| 0: [IntegerLiteral] 2 +# 20| 1: [VarAccess] p6 +# 20| 1: [IntegerLiteral] 0 +# 20| 1: [ExprStmt] ; +# 20| 0: [AssignExpr] ...=... +# 20| 0: [VarAccess] p2 +# 21| 1: [MethodCall] getString(...) +# 21| -1: [TypeAccess] TestKt +# 20| 1: [IfStmt] if (...) +# 20| 0: [EQExpr] ... == ... +# 20| 0: [AndBitwiseExpr] ... & ... +# 20| 0: [IntegerLiteral] 8 +# 20| 1: [VarAccess] p6 +# 20| 1: [IntegerLiteral] 0 +# 20| 1: [ExprStmt] ; +# 20| 0: [AssignExpr] ...=... +# 20| 0: [VarAccess] p4 +# 21| 1: [FloatLiteral] 1.0 +# 20| 2: [ReturnStmt] return ... +# 20| 0: [MethodCall] testCompanionFunction(...) +# 20| -1: [VarAccess] p0 +# 20| 0: [VarAccess] p1 +# 20| 1: [VarAccess] p2 +# 20| 2: [VarAccess] p3 +# 20| 3: [VarAccess] p4 +# 20| 4: [VarAccess] p5 +# 23| 6: [Method] testStaticCompanionFunction +# 23| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 24| 0: [Parameter] a +# 24| 0: [TypeAccess] int +# 24| 1: [Parameter] b +# 24| 0: [TypeAccess] String +# 24| 2: [Parameter] c +# 24| 0: [TypeAccess] double +# 24| 3: [Parameter] e +# 24| 0: [TypeAccess] boolean +# 23| 5: [BlockStmt] { ... } +# 23| 0: [ReturnStmt] return ... +# 23| 0: [MethodCall] testStaticCompanionFunction$default(...) +# 23| -1: [TypeAccess] Companion +# 0| 0: [ThisAccess] this +# 0| 1: [VarAccess] a +# 0| 2: [VarAccess] b +# 0| 3: [VarAccess] c +# 1| 4: [FloatLiteral] 0.0 +# 0| 5: [VarAccess] e +# 1| 6: [IntegerLiteral] 23 +# 1| 7: [NullLiteral] null +# 23| 7: [Method] testStaticCompanionFunction +#-----| 1: (Annotations) +# 23| 1: [Annotation] JvmOverloads +# 23| 2: [Annotation] JvmStatic +# 23| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 24| 0: [Parameter] a +# 24| 0: [TypeAccess] int +# 24| 1: [Parameter] b +# 24| 0: [TypeAccess] String +# 24| 2: [Parameter] c +# 24| 0: [TypeAccess] double +# 24| 3: [Parameter] d +# 24| 0: [TypeAccess] float +# 24| 4: [Parameter] e +# 24| 0: [TypeAccess] boolean +# 24| 5: [BlockStmt] { ... } +# 24| 0: [ReturnStmt] return ... +# 24| 0: [VarAccess] a +# 23| 8: [Method] testStaticCompanionFunction +# 23| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 24| 0: [Parameter] a +# 24| 0: [TypeAccess] int +# 24| 1: [Parameter] c +# 24| 0: [TypeAccess] double +# 24| 2: [Parameter] e +# 24| 0: [TypeAccess] boolean +# 23| 5: [BlockStmt] { ... } +# 23| 0: [ReturnStmt] return ... +# 23| 0: [MethodCall] testStaticCompanionFunction$default(...) +# 23| -1: [TypeAccess] Companion +# 0| 0: [ThisAccess] this +# 0| 1: [VarAccess] a +# 1| 2: [NullLiteral] null +# 0| 3: [VarAccess] c +# 1| 4: [FloatLiteral] 0.0 +# 0| 5: [VarAccess] e +# 1| 6: [IntegerLiteral] 21 +# 1| 7: [NullLiteral] null +# 23| 9: [Method] testStaticCompanionFunction$default +# 23| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 23| 0: [Parameter] p0 +# 23| 0: [TypeAccess] Companion +# 23| 1: [Parameter] p1 +# 23| 0: [TypeAccess] int +# 23| 2: [Parameter] p2 +# 23| 0: [TypeAccess] String +# 23| 3: [Parameter] p3 +# 23| 0: [TypeAccess] double +# 23| 4: [Parameter] p4 +# 23| 0: [TypeAccess] float +# 23| 5: [Parameter] p5 +# 23| 0: [TypeAccess] boolean +# 23| 6: [Parameter] p6 +# 23| 0: [TypeAccess] int +# 23| 7: [Parameter] p7 +# 23| 0: [TypeAccess] Object +# 23| 5: [BlockStmt] { ... } +# 23| 0: [IfStmt] if (...) +# 23| 0: [EQExpr] ... == ... +# 23| 0: [AndBitwiseExpr] ... & ... +# 23| 0: [IntegerLiteral] 2 +# 23| 1: [VarAccess] p6 +# 23| 1: [IntegerLiteral] 0 +# 23| 1: [ExprStmt] ; +# 23| 0: [AssignExpr] ...=... +# 23| 0: [VarAccess] p2 +# 24| 1: [MethodCall] getString(...) +# 24| -1: [TypeAccess] TestKt +# 23| 1: [IfStmt] if (...) +# 23| 0: [EQExpr] ... == ... +# 23| 0: [AndBitwiseExpr] ... & ... +# 23| 0: [IntegerLiteral] 8 +# 23| 1: [VarAccess] p6 +# 23| 1: [IntegerLiteral] 0 +# 23| 1: [ExprStmt] ; +# 23| 0: [AssignExpr] ...=... +# 23| 0: [VarAccess] p4 +# 24| 1: [FloatLiteral] 1.0 +# 23| 2: [ReturnStmt] return ... +# 23| 0: [MethodCall] testStaticCompanionFunction(...) +# 23| -1: [VarAccess] p0 +# 23| 0: [VarAccess] p1 +# 23| 1: [VarAccess] p2 +# 23| 2: [VarAccess] p3 +# 23| 3: [VarAccess] p4 +# 23| 4: [VarAccess] p5 +# 23| 6: [Method] testStaticCompanionFunction +# 23| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 24| 0: [Parameter] a +# 24| 0: [TypeAccess] int +# 24| 1: [Parameter] b +# 24| 0: [TypeAccess] String +# 24| 2: [Parameter] c +# 24| 0: [TypeAccess] double +# 24| 3: [Parameter] e +# 24| 0: [TypeAccess] boolean +# 23| 5: [BlockStmt] { ... } +# 23| 0: [ReturnStmt] return ... +# 23| 0: [MethodCall] testStaticCompanionFunction$default(...) +# 23| -1: [TypeAccess] Companion +# 0| 0: [ThisAccess] this +# 0| 1: [VarAccess] a +# 0| 2: [VarAccess] b +# 0| 3: [VarAccess] c +# 1| 4: [FloatLiteral] 0.0 +# 0| 5: [VarAccess] e +# 1| 6: [IntegerLiteral] 23 +# 1| 7: [NullLiteral] null +# 23| 7: [Method] testStaticCompanionFunction +# 23| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 24| 0: [Parameter] a +# 24| 0: [TypeAccess] int +# 24| 1: [Parameter] b +# 24| 0: [TypeAccess] String +# 24| 2: [Parameter] c +# 24| 0: [TypeAccess] double +# 24| 3: [Parameter] d +# 24| 0: [TypeAccess] float +# 24| 4: [Parameter] e +# 24| 0: [TypeAccess] boolean +# 23| 5: [BlockStmt] { ... } +# 23| 0: [ReturnStmt] return ... +# 23| 0: [MethodCall] testStaticCompanionFunction(...) +# 23| -1: [VarAccess] Test2.Companion +# 23| -1: [TypeAccess] Test2 +# 23| 0: [VarAccess] a +# 23| 1: [VarAccess] b +# 23| 2: [VarAccess] c +# 23| 3: [VarAccess] d +# 23| 4: [VarAccess] e +# 23| 8: [Method] testStaticCompanionFunction +# 23| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 24| 0: [Parameter] a +# 24| 0: [TypeAccess] int +# 24| 1: [Parameter] c +# 24| 0: [TypeAccess] double +# 24| 2: [Parameter] e +# 24| 0: [TypeAccess] boolean +# 23| 5: [BlockStmt] { ... } +# 23| 0: [ReturnStmt] return ... +# 23| 0: [MethodCall] testStaticCompanionFunction$default(...) +# 23| -1: [TypeAccess] Companion +# 0| 0: [ThisAccess] this +# 0| 1: [VarAccess] a +# 1| 2: [NullLiteral] null +# 0| 3: [VarAccess] c +# 1| 4: [FloatLiteral] 0.0 +# 0| 5: [VarAccess] e +# 1| 6: [IntegerLiteral] 21 +# 1| 7: [NullLiteral] null +# 30| 4: [Class,GenericType,ParameterizedType] GenericTest +#-----| -2: (Generic Parameters) +# 30| 0: [TypeVariable] T +# 30| 1: [Constructor] GenericTest +#-----| 4: (Parameters) +# 30| 0: [Parameter] b +# 30| 0: [TypeAccess] T +# 30| 1: [Parameter] d +# 30| 0: [TypeAccess] T +# 30| 5: [BlockStmt] { ... } +# 30| 0: [ThisConstructorInvocationStmt] this(...) +# 1| 0: [IntegerLiteral] 0 +# 0| 1: [VarAccess] b +# 1| 2: [NullLiteral] null +# 0| 3: [VarAccess] d +# 1| 4: [IntegerLiteral] 10 +# 1| 5: [NullLiteral] null +# 30| 2: [Constructor] GenericTest +#-----| 4: (Parameters) +# 30| 0: [Parameter] p0 +# 30| 0: [TypeAccess] int +# 30| 1: [Parameter] p1 +# 30| 0: [TypeAccess] Object +# 30| 2: [Parameter] p2 +# 30| 0: [TypeAccess] String +# 30| 3: [Parameter] p3 +# 30| 0: [TypeAccess] Object +# 30| 4: [Parameter] p4 +# 30| 0: [TypeAccess] int +# 30| 5: [Parameter] p5 +# 30| 0: [TypeAccess] DefaultConstructorMarker +# 30| 5: [BlockStmt] { ... } +# 30| 0: [IfStmt] if (...) +# 30| 0: [EQExpr] ... == ... +# 30| 0: [AndBitwiseExpr] ... & ... +# 30| 0: [IntegerLiteral] 1 +# 30| 1: [VarAccess] p4 +# 30| 1: [IntegerLiteral] 0 +# 30| 1: [ExprStmt] ; +# 30| 0: [AssignExpr] ...=... +# 30| 0: [VarAccess] p0 +# 30| 1: [IntegerLiteral] 1 +# 30| 1: [IfStmt] if (...) +# 30| 0: [EQExpr] ... == ... +# 30| 0: [AndBitwiseExpr] ... & ... +# 30| 0: [IntegerLiteral] 4 +# 30| 1: [VarAccess] p4 +# 30| 1: [IntegerLiteral] 0 +# 30| 1: [ExprStmt] ; +# 30| 0: [AssignExpr] ...=... +# 30| 0: [VarAccess] p2 +# 30| 1: [StringLiteral] "Hello world" +# 30| 2: [ThisConstructorInvocationStmt] this(...) +# 30| 0: [VarAccess] p0 +# 30| 1: [VarAccess] p1 +# 30| 2: [VarAccess] p2 +# 30| 3: [VarAccess] p3 +# 30| 3: [Constructor] GenericTest +#-----| 1: (Annotations) +# 30| 1: [Annotation] JvmOverloads +#-----| 4: (Parameters) +# 30| 0: [Parameter] a +# 30| 0: [TypeAccess] int +# 30| 1: [Parameter] b +# 30| 0: [TypeAccess] T +# 30| 2: [Parameter] c +# 30| 0: [TypeAccess] String +# 30| 3: [Parameter] d +# 30| 0: [TypeAccess] T +# 30| 5: [BlockStmt] { ... } +# 30| 0: [SuperConstructorInvocationStmt] super(...) +# 30| 1: [BlockStmt] { ... } +# 30| 4: [Constructor] GenericTest +#-----| 4: (Parameters) +# 30| 0: [Parameter] a +# 30| 0: [TypeAccess] int +# 30| 1: [Parameter] b +# 30| 0: [TypeAccess] T +# 30| 2: [Parameter] d +# 30| 0: [TypeAccess] T +# 30| 5: [BlockStmt] { ... } +# 30| 0: [ThisConstructorInvocationStmt] this(...) +# 0| 0: [VarAccess] a +# 0| 1: [VarAccess] b +# 1| 2: [NullLiteral] null +# 0| 3: [VarAccess] d +# 1| 4: [IntegerLiteral] 11 +# 1| 5: [NullLiteral] null +# 32| 5: [Method] testMemberFunction +# 32| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 33| 0: [Parameter] b +# 33| 0: [TypeAccess] T +# 33| 1: [Parameter] d +# 33| 0: [TypeAccess] T +# 32| 5: [BlockStmt] { ... } +# 32| 0: [ReturnStmt] return ... +# 32| 0: [MethodCall] testMemberFunction$default(...) +# 32| -1: [TypeAccess] GenericTest<> +# 0| 0: [ThisAccess] this +# 1| 1: [IntegerLiteral] 0 +# 0| 2: [VarAccess] b +# 1| 3: [NullLiteral] null +# 0| 4: [VarAccess] d +# 1| 5: [IntegerLiteral] 10 +# 1| 6: [NullLiteral] null +# 32| 6: [Method] testMemberFunction +#-----| 1: (Annotations) +# 32| 1: [Annotation] JvmOverloads +# 32| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 33| 0: [Parameter] a +# 33| 0: [TypeAccess] int +# 33| 1: [Parameter] b +# 33| 0: [TypeAccess] T +# 33| 2: [Parameter] c +# 33| 0: [TypeAccess] String +# 33| 3: [Parameter] d +# 33| 0: [TypeAccess] T +# 33| 5: [BlockStmt] { ... } +# 33| 0: [ReturnStmt] return ... +# 33| 0: [VarAccess] a +# 32| 7: [Method] testMemberFunction +# 32| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 33| 0: [Parameter] a +# 33| 0: [TypeAccess] int +# 33| 1: [Parameter] b +# 33| 0: [TypeAccess] T +# 33| 2: [Parameter] d +# 33| 0: [TypeAccess] T +# 32| 5: [BlockStmt] { ... } +# 32| 0: [ReturnStmt] return ... +# 32| 0: [MethodCall] testMemberFunction$default(...) +# 32| -1: [TypeAccess] GenericTest<> +# 0| 0: [ThisAccess] this +# 0| 1: [VarAccess] a +# 0| 2: [VarAccess] b +# 1| 3: [NullLiteral] null +# 0| 4: [VarAccess] d +# 1| 5: [IntegerLiteral] 11 +# 1| 6: [NullLiteral] null +# 32| 8: [Method] testMemberFunction$default +# 32| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 32| 0: [Parameter] p0 +# 32| 0: [TypeAccess] GenericTest<> +# 32| 1: [Parameter] p1 +# 32| 0: [TypeAccess] int +# 32| 2: [Parameter] p2 +# 32| 0: [TypeAccess] Object +# 32| 3: [Parameter] p3 +# 32| 0: [TypeAccess] String +# 32| 4: [Parameter] p4 +# 32| 0: [TypeAccess] Object +# 32| 5: [Parameter] p5 +# 32| 0: [TypeAccess] int +# 32| 6: [Parameter] p6 +# 32| 0: [TypeAccess] Object +# 32| 5: [BlockStmt] { ... } +# 32| 0: [IfStmt] if (...) +# 32| 0: [EQExpr] ... == ... +# 32| 0: [AndBitwiseExpr] ... & ... +# 32| 0: [IntegerLiteral] 1 +# 32| 1: [VarAccess] p5 +# 32| 1: [IntegerLiteral] 0 +# 32| 1: [ExprStmt] ; +# 32| 0: [AssignExpr] ...=... +# 32| 0: [VarAccess] p1 +# 33| 1: [IntegerLiteral] 1 +# 32| 1: [IfStmt] if (...) +# 32| 0: [EQExpr] ... == ... +# 32| 0: [AndBitwiseExpr] ... & ... +# 32| 0: [IntegerLiteral] 4 +# 32| 1: [VarAccess] p5 +# 32| 1: [IntegerLiteral] 0 +# 32| 1: [ExprStmt] ; +# 32| 0: [AssignExpr] ...=... +# 32| 0: [VarAccess] p3 +# 33| 1: [StringLiteral] "Hello world" +# 32| 2: [ReturnStmt] return ... +# 32| 0: [MethodCall] testMemberFunction(...) +# 32| -1: [VarAccess] p0 +# 32| 0: [VarAccess] p1 +# 32| 1: [VarAccess] p2 +# 32| 2: [VarAccess] p3 +# 32| 3: [VarAccess] p4 +# 35| 9: [Method] useSpecialised +# 35| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 35| 0: [Parameter] spec1 +# 35| 0: [TypeAccess] GenericTest +# 35| 0: [TypeAccess] Float +# 35| 1: [Parameter] spec2 +# 35| 0: [TypeAccess] GenericTest +# 35| 0: [TypeAccess] Double +# 35| 5: [BlockStmt] { ... } +# 37| 0: [ExprStmt] ; +# 37| 0: [ImplicitCoercionToUnitExpr] +# 37| 0: [TypeAccess] Unit +# 37| 1: [MethodCall] testMemberFunction(...) +# 37| -1: [VarAccess] spec1 +# 37| 0: [IntegerLiteral] 1 +# 37| 1: [FloatLiteral] 1.0 +# 37| 2: [StringLiteral] "Hello world" +# 37| 3: [FloatLiteral] 2.0 +# 38| 1: [ExprStmt] ; +# 38| 0: [ImplicitCoercionToUnitExpr] +# 38| 0: [TypeAccess] Unit +# 38| 1: [MethodCall] testMemberFunction(...) +# 38| -1: [VarAccess] spec2 +# 38| 0: [IntegerLiteral] 1 +# 38| 1: [DoubleLiteral] 1.0 +# 38| 2: [StringLiteral] "Hello world" +# 38| 3: [DoubleLiteral] 2.0 diff --git a/java/ql/test-kotlin2/library-tests/jvmoverloads-annotation/PrintAst.qlref b/java/ql/test-kotlin2/library-tests/jvmoverloads-annotation/PrintAst.qlref new file mode 100644 index 00000000000..c7fd5faf239 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/jvmoverloads-annotation/PrintAst.qlref @@ -0,0 +1 @@ +semmle/code/java/PrintAst.ql \ No newline at end of file diff --git a/java/ql/test-kotlin2/library-tests/jvmoverloads-annotation/test.expected b/java/ql/test-kotlin2/library-tests/jvmoverloads-annotation/test.expected new file mode 100644 index 00000000000..a8d3f281f8c --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/jvmoverloads-annotation/test.expected @@ -0,0 +1,57 @@ +| file:///!unknown-binary-location/GenericTest.class:0:0:0:0 | GenericTest | file:///!unknown-binary-location/GenericTest.class:0:0:0:0 | GenericTest | GenericTest(int,java.lang.Double,java.lang.Double) | +| file:///!unknown-binary-location/GenericTest.class:0:0:0:0 | GenericTest | file:///!unknown-binary-location/GenericTest.class:0:0:0:0 | GenericTest | GenericTest(int,java.lang.Double,java.lang.String,java.lang.Double) | +| file:///!unknown-binary-location/GenericTest.class:0:0:0:0 | GenericTest | file:///!unknown-binary-location/GenericTest.class:0:0:0:0 | GenericTest | GenericTest(java.lang.Double,java.lang.Double) | +| file:///!unknown-binary-location/GenericTest.class:0:0:0:0 | GenericTest | file:///!unknown-binary-location/GenericTest.class:0:0:0:0 | testMemberFunction | testMemberFunction(int,java.lang.Double,java.lang.Double) | +| file:///!unknown-binary-location/GenericTest.class:0:0:0:0 | GenericTest | file:///!unknown-binary-location/GenericTest.class:0:0:0:0 | testMemberFunction | testMemberFunction(int,java.lang.Double,java.lang.String,java.lang.Double) | +| file:///!unknown-binary-location/GenericTest.class:0:0:0:0 | GenericTest | file:///!unknown-binary-location/GenericTest.class:0:0:0:0 | testMemberFunction | testMemberFunction(java.lang.Double,java.lang.Double) | +| file:///!unknown-binary-location/GenericTest.class:0:0:0:0 | GenericTest | file:///!unknown-binary-location/GenericTest.class:0:0:0:0 | useSpecialised | useSpecialised(GenericTest,GenericTest) | +| file:///!unknown-binary-location/GenericTest.class:0:0:0:0 | GenericTest | file:///!unknown-binary-location/GenericTest.class:0:0:0:0 | GenericTest | GenericTest(int,java.lang.Float,java.lang.Float) | +| file:///!unknown-binary-location/GenericTest.class:0:0:0:0 | GenericTest | file:///!unknown-binary-location/GenericTest.class:0:0:0:0 | GenericTest | GenericTest(int,java.lang.Float,java.lang.String,java.lang.Float) | +| file:///!unknown-binary-location/GenericTest.class:0:0:0:0 | GenericTest | file:///!unknown-binary-location/GenericTest.class:0:0:0:0 | GenericTest | GenericTest(java.lang.Float,java.lang.Float) | +| file:///!unknown-binary-location/GenericTest.class:0:0:0:0 | GenericTest | file:///!unknown-binary-location/GenericTest.class:0:0:0:0 | testMemberFunction | testMemberFunction(int,java.lang.Float,java.lang.Float) | +| file:///!unknown-binary-location/GenericTest.class:0:0:0:0 | GenericTest | file:///!unknown-binary-location/GenericTest.class:0:0:0:0 | testMemberFunction | testMemberFunction(int,java.lang.Float,java.lang.String,java.lang.Float) | +| file:///!unknown-binary-location/GenericTest.class:0:0:0:0 | GenericTest | file:///!unknown-binary-location/GenericTest.class:0:0:0:0 | testMemberFunction | testMemberFunction(java.lang.Float,java.lang.Float) | +| file:///!unknown-binary-location/GenericTest.class:0:0:0:0 | GenericTest | file:///!unknown-binary-location/GenericTest.class:0:0:0:0 | useSpecialised | useSpecialised(GenericTest,GenericTest) | +| test.kt:0:0:0:0 | TestKt | test.kt:1:1:1:31 | getString | getString() | +| test.kt:0:0:0:0 | TestKt | test.kt:44:1:45:112 | testExtensionFunction | testExtensionFunction(Test,int,double,boolean) | +| test.kt:0:0:0:0 | TestKt | test.kt:44:1:45:112 | testExtensionFunction | testExtensionFunction(Test,int,java.lang.String,double,boolean) | +| test.kt:0:0:0:0 | TestKt | test.kt:44:1:45:112 | testExtensionFunction | testExtensionFunction(Test,int,java.lang.String,double,float,boolean) | +| test.kt:0:0:0:0 | TestKt | test.kt:44:1:45:112 | testExtensionFunction$default | testExtensionFunction$default(Test,int,java.lang.String,double,float,boolean,int,java.lang.Object) | +| test.kt:3:1:14:1 | Test | test.kt:3:1:14:1 | Test | Test() | +| test.kt:3:1:14:1 | Test | test.kt:5:3:6:106 | testStaticFunction | testStaticFunction(int,double,boolean) | +| test.kt:3:1:14:1 | Test | test.kt:5:3:6:106 | testStaticFunction | testStaticFunction(int,java.lang.String,double,boolean) | +| test.kt:3:1:14:1 | Test | test.kt:5:3:6:106 | testStaticFunction | testStaticFunction(int,java.lang.String,double,float,boolean) | +| test.kt:3:1:14:1 | Test | test.kt:5:3:6:106 | testStaticFunction$default | testStaticFunction$default(int,java.lang.String,double,float,boolean,int,java.lang.Object) | +| test.kt:3:1:14:1 | Test | test.kt:8:3:9:106 | testMemberFunction | testMemberFunction(int,double,boolean) | +| test.kt:3:1:14:1 | Test | test.kt:8:3:9:106 | testMemberFunction | testMemberFunction(int,java.lang.String,double,boolean) | +| test.kt:3:1:14:1 | Test | test.kt:8:3:9:106 | testMemberFunction | testMemberFunction(int,java.lang.String,double,float,boolean) | +| test.kt:3:1:14:1 | Test | test.kt:8:3:9:106 | testMemberFunction$default | testMemberFunction$default(Test,int,java.lang.String,double,float,boolean,int,java.lang.Object) | +| test.kt:3:1:14:1 | Test | test.kt:11:3:12:121 | testMemberExtensionFunction | testMemberExtensionFunction(Test2,int,double,boolean) | +| test.kt:3:1:14:1 | Test | test.kt:11:3:12:121 | testMemberExtensionFunction | testMemberExtensionFunction(Test2,int,java.lang.String,double,boolean) | +| test.kt:3:1:14:1 | Test | test.kt:11:3:12:121 | testMemberExtensionFunction | testMemberExtensionFunction(Test2,int,java.lang.String,double,float,boolean) | +| test.kt:3:1:14:1 | Test | test.kt:11:3:12:121 | testMemberExtensionFunction$default | testMemberExtensionFunction$default(Test,Test2,int,java.lang.String,double,float,boolean,int,java.lang.Object) | +| test.kt:16:1:28:1 | Test2 | test.kt:16:20:16:117 | Test2 | Test2(int,double,boolean) | +| test.kt:16:1:28:1 | Test2 | test.kt:16:20:16:117 | Test2 | Test2(int,java.lang.String,double,boolean) | +| test.kt:16:1:28:1 | Test2 | test.kt:16:20:16:117 | Test2 | Test2(int,java.lang.String,double,float,boolean) | +| test.kt:16:1:28:1 | Test2 | test.kt:16:20:16:117 | Test2 | Test2(int,java.lang.String,double,float,boolean,int,kotlin.jvm.internal.DefaultConstructorMarker) | +| test.kt:16:1:28:1 | Test2 | test.kt:23:5:24:117 | testStaticCompanionFunction | testStaticCompanionFunction(int,double,boolean) | +| test.kt:16:1:28:1 | Test2 | test.kt:23:5:24:117 | testStaticCompanionFunction | testStaticCompanionFunction(int,java.lang.String,double,boolean) | +| test.kt:16:1:28:1 | Test2 | test.kt:23:5:24:117 | testStaticCompanionFunction | testStaticCompanionFunction(int,java.lang.String,double,float,boolean) | +| test.kt:18:3:26:3 | Companion | test.kt:18:3:26:3 | Companion | Companion() | +| test.kt:18:3:26:3 | Companion | test.kt:20:5:21:111 | testCompanionFunction | testCompanionFunction(int,double,boolean) | +| test.kt:18:3:26:3 | Companion | test.kt:20:5:21:111 | testCompanionFunction | testCompanionFunction(int,java.lang.String,double,boolean) | +| test.kt:18:3:26:3 | Companion | test.kt:20:5:21:111 | testCompanionFunction | testCompanionFunction(int,java.lang.String,double,float,boolean) | +| test.kt:18:3:26:3 | Companion | test.kt:20:5:21:111 | testCompanionFunction$default | testCompanionFunction$default(Test2.Companion,int,java.lang.String,double,float,boolean,int,java.lang.Object) | +| test.kt:18:3:26:3 | Companion | test.kt:23:5:24:117 | testStaticCompanionFunction | testStaticCompanionFunction(int,double,boolean) | +| test.kt:18:3:26:3 | Companion | test.kt:23:5:24:117 | testStaticCompanionFunction | testStaticCompanionFunction(int,java.lang.String,double,boolean) | +| test.kt:18:3:26:3 | Companion | test.kt:23:5:24:117 | testStaticCompanionFunction | testStaticCompanionFunction(int,java.lang.String,double,float,boolean) | +| test.kt:18:3:26:3 | Companion | test.kt:23:5:24:117 | testStaticCompanionFunction$default | testStaticCompanionFunction$default(Test2.Companion,int,java.lang.String,double,float,boolean,int,java.lang.Object) | +| test.kt:30:1:42:1 | GenericTest | test.kt:30:29:30:104 | GenericTest | GenericTest(int,java.lang.Object,java.lang.Object) | +| test.kt:30:1:42:1 | GenericTest | test.kt:30:29:30:104 | GenericTest | GenericTest(int,java.lang.Object,java.lang.String,java.lang.Object) | +| test.kt:30:1:42:1 | GenericTest | test.kt:30:29:30:104 | GenericTest | GenericTest(int,java.lang.Object,java.lang.String,java.lang.Object,int,kotlin.jvm.internal.DefaultConstructorMarker) | +| test.kt:30:1:42:1 | GenericTest | test.kt:30:29:30:104 | GenericTest | GenericTest(java.lang.Object,java.lang.Object) | +| test.kt:30:1:42:1 | GenericTest | test.kt:32:3:33:84 | testMemberFunction | testMemberFunction(int,java.lang.Object,java.lang.Object) | +| test.kt:30:1:42:1 | GenericTest | test.kt:32:3:33:84 | testMemberFunction | testMemberFunction(int,java.lang.Object,java.lang.String,java.lang.Object) | +| test.kt:30:1:42:1 | GenericTest | test.kt:32:3:33:84 | testMemberFunction | testMemberFunction(java.lang.Object,java.lang.Object) | +| test.kt:30:1:42:1 | GenericTest | test.kt:32:3:33:84 | testMemberFunction$default | testMemberFunction$default(GenericTest,int,java.lang.Object,java.lang.String,java.lang.Object,int,java.lang.Object) | +| test.kt:30:1:42:1 | GenericTest | test.kt:35:3:40:3 | useSpecialised | useSpecialised(GenericTest,GenericTest) | diff --git a/java/ql/test-kotlin2/library-tests/jvmoverloads-annotation/test.kt b/java/ql/test-kotlin2/library-tests/jvmoverloads-annotation/test.kt new file mode 100644 index 00000000000..131fc6b8b68 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/jvmoverloads-annotation/test.kt @@ -0,0 +1,45 @@ +fun getString() = "Hello world" + +object Test { + + @JvmOverloads @JvmStatic + fun testStaticFunction(a: Int, b: String = getString(), c: Double, d: Float = 1.0f, e: Boolean): Int = a + + @JvmOverloads + fun testMemberFunction(a: Int, b: String = getString(), c: Double, d: Float = 1.0f, e: Boolean): Int = a + + @JvmOverloads + fun Test2.testMemberExtensionFunction(a: Int, b: String = getString(), c: Double, d: Float = 1.0f, e: Boolean): Int = a + +} + +public class Test2 @JvmOverloads constructor(a: Int, b: String = getString(), c: Double, d: Float = 1.0f, e: Boolean) { + + companion object { + + @JvmOverloads + fun testCompanionFunction(a: Int, b: String = getString(), c: Double, d: Float = 1.0f, e: Boolean): Int = a + + @JvmOverloads @JvmStatic + fun testStaticCompanionFunction(a: Int, b: String = getString(), c: Double, d: Float = 1.0f, e: Boolean): Int = a + + } + +} + +public class GenericTest @JvmOverloads constructor(a: Int = 1, b: T, c: String = "Hello world", d: T) { + + @JvmOverloads + fun testMemberFunction(a: Int = 1, b: T, c: String = "Hello world", d: T): Int = a + + fun useSpecialised(spec1: GenericTest, spec2: GenericTest) { + + spec1.testMemberFunction(1, 1.0f, "Hello world", 2.0f) + spec2.testMemberFunction(1, 1.0, "Hello world", 2.0) + + } + +} + +@JvmOverloads +fun Test.testExtensionFunction(a: Int, b: String = getString(), c: Double, d: Float = 1.0f, e: Boolean): Int = a diff --git a/java/ql/test-kotlin2/library-tests/jvmoverloads-annotation/test.ql b/java/ql/test-kotlin2/library-tests/jvmoverloads-annotation/test.ql new file mode 100644 index 00000000000..1ad74fa2a99 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/jvmoverloads-annotation/test.ql @@ -0,0 +1,5 @@ +import java + +from Callable c +where c.getSourceDeclaration().fromSource() +select c.getDeclaringType(), c, c.getSignature() diff --git a/java/ql/test-kotlin2/library-tests/jvmoverloads_flow/User.java b/java/ql/test-kotlin2/library-tests/jvmoverloads_flow/User.java new file mode 100644 index 00000000000..aa739ed1b84 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/jvmoverloads_flow/User.java @@ -0,0 +1,43 @@ +public class User { + + public static String source() { return "taint"; } + + public static void test(Test2 t2, GenericTest gt, TestDefaultParameterReference paramRefTest) { + + Test.taintSuppliedAsDefault(1, "no taint", 2); + Test.taintSuppliedAsDefault(1, 2); + Test.noTaintByDefault(1, source(), 2, 3); + Test.noTaintByDefault(1, source(), 2); + + Test2.taintSuppliedAsDefaultStatic(1, "no taint", 2); + Test2.taintSuppliedAsDefaultStatic(1, 2); + Test2.noTaintByDefaultStatic(1, source(), 2, 3); + Test2.noTaintByDefaultStatic(1, source(), 2); + + t2.taintSuppliedAsDefault(1, "no taint", 2); + t2.taintSuppliedAsDefault(1, 2); + t2.noTaintByDefault(1, source(), 2, 3); + t2.noTaintByDefault(1, source(), 2); + + gt.taintSuppliedAsDefault(1, "no taint", 2); + gt.taintSuppliedAsDefault(1, 2); + gt.noTaintByDefault(1, source(), 2, 3); + gt.noTaintByDefault(1, source(), 2); + + new ConstructorTaintsByDefault(1, "no taint", 2); + new ConstructorTaintsByDefault(1, 2); + new ConstructorDoesNotTaintByDefault(1, source(), 2, 3); + new ConstructorDoesNotTaintByDefault(1, source(), 2); + + new GenericConstructorTaintsByDefault(1, "no taint", 2); + new GenericConstructorTaintsByDefault(1, 2); + new GenericConstructorDoesNotTaintByDefault(1, source(), 2, 3); + new GenericConstructorDoesNotTaintByDefault(1, source(), 2); + + paramRefTest.f(source(), "no flow"); + paramRefTest.f("flow", source()); + paramRefTest.f(source()); // Should also have flow due to the default for the second parameter being the value of the first + + } + +} diff --git a/java/ql/test-kotlin2/library-tests/jvmoverloads_flow/test.expected b/java/ql/test-kotlin2/library-tests/jvmoverloads_flow/test.expected new file mode 100644 index 00000000000..feac5a14c95 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/jvmoverloads_flow/test.expected @@ -0,0 +1,20 @@ +| User.java:9:30:9:37 | source(...) | test.kt:13:97:13:97 | s | User.java:5:22:5:25 | test | +| User.java:10:30:10:37 | source(...) | test.kt:13:97:13:97 | s | User.java:5:22:5:25 | test | +| User.java:14:37:14:44 | source(...) | test.kt:25:105:25:105 | s | User.java:5:22:5:25 | test | +| User.java:15:37:15:44 | source(...) | test.kt:25:105:25:105 | s | User.java:5:22:5:25 | test | +| User.java:19:28:19:35 | source(...) | test.kt:33:97:33:97 | s | User.java:5:22:5:25 | test | +| User.java:20:28:20:35 | source(...) | test.kt:33:97:33:97 | s | User.java:5:22:5:25 | test | +| User.java:24:28:24:35 | source(...) | test.kt:43:93:43:93 | s | User.java:5:22:5:25 | test | +| User.java:25:28:25:35 | source(...) | test.kt:43:93:43:93 | s | User.java:5:22:5:25 | test | +| User.java:29:45:29:52 | source(...) | test.kt:58:10:58:10 | s | User.java:5:22:5:25 | test | +| User.java:30:45:30:52 | source(...) | test.kt:58:10:58:10 | s | User.java:5:22:5:25 | test | +| User.java:34:61:34:68 | source(...) | test.kt:74:10:74:10 | s | User.java:5:22:5:25 | test | +| User.java:35:61:35:68 | source(...) | test.kt:74:10:74:10 | s | User.java:5:22:5:25 | test | +| User.java:38:28:38:35 | source(...) | test.kt:84:10:84:10 | y | User.java:5:22:5:25 | test | +| User.java:39:20:39:27 | source(...) | test.kt:84:10:84:10 | y | User.java:5:22:5:25 | test | +| test.kt:10:55:10:62 | source(...) | test.kt:10:84:10:84 | s | test.kt:9:3:10:87 | taintSuppliedAsDefault$default | +| test.kt:22:63:22:70 | source(...) | test.kt:22:92:22:92 | s | test.kt:21:5:22:95 | taintSuppliedAsDefaultStatic$default | +| test.kt:30:55:30:62 | source(...) | test.kt:30:84:30:84 | s | test.kt:29:3:30:87 | taintSuppliedAsDefault$default | +| test.kt:40:53:40:60 | source(...) | test.kt:40:80:40:80 | s | test.kt:39:3:40:83 | taintSuppliedAsDefault$default | +| test.kt:47:92:47:99 | source(...) | test.kt:50:10:50:10 | s | test.kt:47:41:47:112 | ConstructorTaintsByDefault | +| test.kt:63:100:63:107 | source(...) | test.kt:66:10:66:10 | s | test.kt:63:51:63:118 | GenericConstructorTaintsByDefault | diff --git a/java/ql/test-kotlin2/library-tests/jvmoverloads_flow/test.kt b/java/ql/test-kotlin2/library-tests/jvmoverloads_flow/test.kt new file mode 100644 index 00000000000..ff5879ebb93 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/jvmoverloads_flow/test.kt @@ -0,0 +1,87 @@ +fun getString() = "Hello world" + +fun source() = "tainted" + +fun sink(s: String) { } + +object Test { + + @JvmOverloads @JvmStatic + fun taintSuppliedAsDefault(before: Int, s: String = source(), after: Int) { sink(s) } + + @JvmOverloads @JvmStatic + fun noTaintByDefault(before: Int, s: String = "no taint", after: Int, after2: Int = 1) { sink(s) } + +} + +public class Test2 { + + companion object { + + @JvmOverloads @JvmStatic + fun taintSuppliedAsDefaultStatic(before: Int, s: String = source(), after: Int) { sink(s) } + + @JvmOverloads @JvmStatic + fun noTaintByDefaultStatic(before: Int, s: String = "no taint", after: Int, after2: Int = 1) { sink(s) } + + } + + @JvmOverloads + fun taintSuppliedAsDefault(before: Int, s: String = source(), after: Int) { sink(s) } + + @JvmOverloads + fun noTaintByDefault(before: Int, s: String = "no taint", after: Int, after2: Int = 1) { sink(s) } + +} + +public class GenericTest { + + @JvmOverloads + fun taintSuppliedAsDefault(before: T, s: String = source(), after: T) { sink(s) } + + @JvmOverloads + fun noTaintByDefault(before: T, s: String = "no taint", after: T, after2: Int = 1) { sink(s) } + +} + +public class ConstructorTaintsByDefault @JvmOverloads constructor(before: Int, s: String = source(), after: Int) { + + init { + sink(s) + } + +} + +public class ConstructorDoesNotTaintByDefault @JvmOverloads constructor(before: Int, s: String = "no taint", after: Int, after2: Int = 1) { + + init { + sink(s) + } + +} + +public class GenericConstructorTaintsByDefault @JvmOverloads constructor(before: T, s: String = source(), after: T) { + + init { + sink(s) + } + +} + +public class GenericConstructorDoesNotTaintByDefault @JvmOverloads constructor(before: T, s: String = "no taint", after: T, after2: T? = null) { + + init { + sink(s) + } + +} + +fun ident(s: String) = s + +public class TestDefaultParameterReference { + + @JvmOverloads fun f(x: String, y: String = ident(x)) { + sink(y) + } + +} diff --git a/java/ql/test-kotlin2/library-tests/jvmoverloads_flow/test.ql b/java/ql/test-kotlin2/library-tests/jvmoverloads_flow/test.ql new file mode 100644 index 00000000000..7fc4b4c000c --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/jvmoverloads_flow/test.ql @@ -0,0 +1,16 @@ +import java +import semmle.code.java.dataflow.DataFlow + +module Config implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node n) { n.asExpr().(MethodCall).getCallee().getName() = "source" } + + predicate isSink(DataFlow::Node n) { + n.asExpr().(Argument).getCall().getCallee().getName() = "sink" + } +} + +module Flow = DataFlow::Global; + +from DataFlow::Node source, DataFlow::Node sink +where Flow::flow(source, sink) +select source, sink, source.getEnclosingCallable() diff --git a/java/ql/test-kotlin2/library-tests/jvmoverloads_generics/User.java b/java/ql/test-kotlin2/library-tests/jvmoverloads_generics/User.java new file mode 100644 index 00000000000..04ae091ab7f --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/jvmoverloads_generics/User.java @@ -0,0 +1,9 @@ +public class User { + + public static void test(A a) { + + a.genericFunctionWithOverloads(null, null); + + } + +} diff --git a/java/ql/test-kotlin2/library-tests/jvmoverloads_generics/test.expected b/java/ql/test-kotlin2/library-tests/jvmoverloads_generics/test.expected new file mode 100644 index 00000000000..964935c841f --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/jvmoverloads_generics/test.expected @@ -0,0 +1,9 @@ +| test.kt:3:3:4:94 | genericFunctionWithOverloads | genericFunctionWithOverloads() | return | T | genericFunctionWithOverloads() | +| test.kt:3:3:4:94 | genericFunctionWithOverloads | genericFunctionWithOverloads(java.lang.Object) | param | T | genericFunctionWithOverloads(java.lang.Object) | +| test.kt:3:3:4:94 | genericFunctionWithOverloads | genericFunctionWithOverloads(java.lang.Object) | return | T | genericFunctionWithOverloads(java.lang.Object) | +| test.kt:3:3:4:94 | genericFunctionWithOverloads | genericFunctionWithOverloads(java.lang.Object,java.util.List) | param | List | genericFunctionWithOverloads(java.lang.Object,java.util.List) | +| test.kt:3:3:4:94 | genericFunctionWithOverloads | genericFunctionWithOverloads(java.lang.Object,java.util.List) | param | T | genericFunctionWithOverloads(java.lang.Object,java.util.List) | +| test.kt:3:3:4:94 | genericFunctionWithOverloads | genericFunctionWithOverloads(java.lang.Object,java.util.List) | return | T | genericFunctionWithOverloads(java.lang.Object,java.util.List) | +| test.kt:3:3:4:94 | genericFunctionWithOverloads | genericFunctionWithOverloads(java.lang.Object,java.util.List,java.lang.Object) | param | List | genericFunctionWithOverloads(java.lang.Object,java.util.List,java.lang.Object) | +| test.kt:3:3:4:94 | genericFunctionWithOverloads | genericFunctionWithOverloads(java.lang.Object,java.util.List,java.lang.Object) | param | T | genericFunctionWithOverloads(java.lang.Object,java.util.List,java.lang.Object) | +| test.kt:3:3:4:94 | genericFunctionWithOverloads | genericFunctionWithOverloads(java.lang.Object,java.util.List,java.lang.Object) | return | T | genericFunctionWithOverloads(java.lang.Object,java.util.List,java.lang.Object) | diff --git a/java/ql/test-kotlin2/library-tests/jvmoverloads_generics/test.kt b/java/ql/test-kotlin2/library-tests/jvmoverloads_generics/test.kt new file mode 100644 index 00000000000..3e5ced39c3f --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/jvmoverloads_generics/test.kt @@ -0,0 +1,6 @@ +public class A { + + @JvmOverloads + fun genericFunctionWithOverloads(x: T? = null, y: List? = null, z: T? = null): T? = z + +} diff --git a/java/ql/test-kotlin2/library-tests/jvmoverloads_generics/test.ql b/java/ql/test-kotlin2/library-tests/jvmoverloads_generics/test.ql new file mode 100644 index 00000000000..d61705a10f8 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/jvmoverloads_generics/test.ql @@ -0,0 +1,16 @@ +import java + +from Method m, string kind, Type t +where + m.fromSource() and + ( + kind = "param" and t = m.getAParamType() + or + kind = "return" and t = m.getReturnType() + ) +// 't.(ParameterizedType).getATypeArgument().(Wildcard).getUpperBound().getType()' is pulling the 'T' out of 'List' +select m, m.getSignature(), kind, t.toString(), + [t, t.(ParameterizedType).getATypeArgument().(Wildcard).getUpperBound().getType()] + .(TypeVariable) + .getGenericCallable() + .getSignature() diff --git a/java/ql/test-kotlin2/library-tests/jvmstatic-annotation/JavaUser.java b/java/ql/test-kotlin2/library-tests/jvmstatic-annotation/JavaUser.java new file mode 100644 index 00000000000..fc079df1ba8 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/jvmstatic-annotation/JavaUser.java @@ -0,0 +1,22 @@ +public class JavaUser { + + public static void test() { + + HasCompanion.staticMethod("1"); + HasCompanion.Companion.nonStaticMethod("2"); + HasCompanion.setStaticProp(HasCompanion.Companion.getNonStaticProp()); + HasCompanion.Companion.setNonStaticProp(HasCompanion.getStaticProp()); + HasCompanion.Companion.setPropWithStaticGetter(HasCompanion.Companion.getPropWithStaticSetter()); + HasCompanion.setPropWithStaticSetter(HasCompanion.getPropWithStaticGetter()); + + // These extract as static methods, since there is no proxy method in the non-companion object case. + NonCompanion.staticMethod("1"); + NonCompanion.INSTANCE.nonStaticMethod("2"); + NonCompanion.setStaticProp(NonCompanion.INSTANCE.getNonStaticProp()); + NonCompanion.INSTANCE.setNonStaticProp(NonCompanion.getStaticProp()); + NonCompanion.INSTANCE.setPropWithStaticGetter(NonCompanion.INSTANCE.getPropWithStaticSetter()); + NonCompanion.setPropWithStaticSetter(NonCompanion.getPropWithStaticGetter()); + + } + +} diff --git a/java/ql/test-kotlin2/library-tests/jvmstatic-annotation/PrintAst.expected b/java/ql/test-kotlin2/library-tests/jvmstatic-annotation/PrintAst.expected new file mode 100644 index 00000000000..871d9a31a0d --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/jvmstatic-annotation/PrintAst.expected @@ -0,0 +1,417 @@ +JavaUser.java: +# 0| [CompilationUnit] JavaUser +# 1| 1: [Class] JavaUser +# 3| 2: [Method] test +# 3| 3: [TypeAccess] void +# 3| 5: [BlockStmt] { ... } +# 5| 0: [ExprStmt] ; +# 5| 0: [MethodCall] staticMethod(...) +# 5| -1: [TypeAccess] HasCompanion +# 5| 0: [StringLiteral] "1" +# 6| 1: [ExprStmt] ; +# 6| 0: [MethodCall] nonStaticMethod(...) +# 6| -1: [VarAccess] HasCompanion.Companion +# 6| -1: [TypeAccess] HasCompanion +# 6| 0: [StringLiteral] "2" +# 7| 2: [ExprStmt] ; +# 7| 0: [MethodCall] setStaticProp(...) +# 7| -1: [TypeAccess] HasCompanion +# 7| 0: [MethodCall] getNonStaticProp(...) +# 7| -1: [VarAccess] HasCompanion.Companion +# 7| -1: [TypeAccess] HasCompanion +# 8| 3: [ExprStmt] ; +# 8| 0: [MethodCall] setNonStaticProp(...) +# 8| -1: [VarAccess] HasCompanion.Companion +# 8| -1: [TypeAccess] HasCompanion +# 8| 0: [MethodCall] getStaticProp(...) +# 8| -1: [TypeAccess] HasCompanion +# 9| 4: [ExprStmt] ; +# 9| 0: [MethodCall] setPropWithStaticGetter(...) +# 9| -1: [VarAccess] HasCompanion.Companion +# 9| -1: [TypeAccess] HasCompanion +# 9| 0: [MethodCall] getPropWithStaticSetter(...) +# 9| -1: [VarAccess] HasCompanion.Companion +# 9| -1: [TypeAccess] HasCompanion +# 10| 5: [ExprStmt] ; +# 10| 0: [MethodCall] setPropWithStaticSetter(...) +# 10| -1: [TypeAccess] HasCompanion +# 10| 0: [MethodCall] getPropWithStaticGetter(...) +# 10| -1: [TypeAccess] HasCompanion +# 13| 6: [ExprStmt] ; +# 13| 0: [MethodCall] staticMethod(...) +# 13| -1: [TypeAccess] NonCompanion +# 13| 0: [StringLiteral] "1" +# 14| 7: [ExprStmt] ; +# 14| 0: [MethodCall] nonStaticMethod(...) +# 14| -1: [VarAccess] NonCompanion.INSTANCE +# 14| -1: [TypeAccess] NonCompanion +# 14| 0: [StringLiteral] "2" +# 15| 8: [ExprStmt] ; +# 15| 0: [MethodCall] setStaticProp(...) +# 15| -1: [TypeAccess] NonCompanion +# 15| 0: [MethodCall] getNonStaticProp(...) +# 15| -1: [VarAccess] NonCompanion.INSTANCE +# 15| -1: [TypeAccess] NonCompanion +# 16| 9: [ExprStmt] ; +# 16| 0: [MethodCall] setNonStaticProp(...) +# 16| -1: [VarAccess] NonCompanion.INSTANCE +# 16| -1: [TypeAccess] NonCompanion +# 16| 0: [MethodCall] getStaticProp(...) +# 16| -1: [TypeAccess] NonCompanion +# 17| 10: [ExprStmt] ; +# 17| 0: [MethodCall] setPropWithStaticGetter(...) +# 17| -1: [VarAccess] NonCompanion.INSTANCE +# 17| -1: [TypeAccess] NonCompanion +# 17| 0: [MethodCall] getPropWithStaticSetter(...) +# 17| -1: [VarAccess] NonCompanion.INSTANCE +# 17| -1: [TypeAccess] NonCompanion +# 18| 11: [ExprStmt] ; +# 18| 0: [MethodCall] setPropWithStaticSetter(...) +# 18| -1: [TypeAccess] NonCompanion +# 18| 0: [MethodCall] getPropWithStaticGetter(...) +# 18| -1: [TypeAccess] NonCompanion +test.kt: +# 0| [CompilationUnit] test +# 0| 1: [Class] TestKt +# 49| 1: [Method] externalUser +# 49| 3: [TypeAccess] Unit +# 49| 5: [BlockStmt] { ... } +# 52| 0: [ExprStmt] ; +# 52| 0: [ImplicitCoercionToUnitExpr] +# 52| 0: [TypeAccess] Unit +# 52| 1: [MethodCall] staticMethod(...) +# 52| -1: [VarAccess] Companion +# 52| 0: [StringLiteral] "1" +# 53| 1: [ExprStmt] ; +# 53| 0: [ImplicitCoercionToUnitExpr] +# 53| 0: [TypeAccess] Unit +# 53| 1: [MethodCall] nonStaticMethod(...) +# 53| -1: [VarAccess] Companion +# 53| 0: [StringLiteral] "2" +# 54| 2: [ExprStmt] ; +# 54| 0: [MethodCall] setStaticProp(...) +# 54| -1: [VarAccess] Companion +# 54| 0: [MethodCall] getNonStaticProp(...) +# 54| -1: [VarAccess] Companion +# 55| 3: [ExprStmt] ; +# 55| 0: [MethodCall] setNonStaticProp(...) +# 55| -1: [VarAccess] Companion +# 55| 0: [MethodCall] getStaticProp(...) +# 55| -1: [VarAccess] Companion +# 56| 4: [ExprStmt] ; +# 56| 0: [MethodCall] setPropWithStaticGetter(...) +# 56| -1: [VarAccess] Companion +# 56| 0: [MethodCall] getPropWithStaticSetter(...) +# 56| -1: [VarAccess] Companion +# 57| 5: [ExprStmt] ; +# 57| 0: [MethodCall] setPropWithStaticSetter(...) +# 57| -1: [VarAccess] Companion +# 57| 0: [MethodCall] getPropWithStaticGetter(...) +# 57| -1: [VarAccess] Companion +# 60| 6: [ExprStmt] ; +# 60| 0: [ImplicitCoercionToUnitExpr] +# 60| 0: [TypeAccess] Unit +# 60| 1: [MethodCall] staticMethod(...) +# 60| -1: [TypeAccess] NonCompanion +# 60| 0: [StringLiteral] "1" +# 61| 7: [ExprStmt] ; +# 61| 0: [ImplicitCoercionToUnitExpr] +# 61| 0: [TypeAccess] Unit +# 61| 1: [MethodCall] nonStaticMethod(...) +# 61| -1: [VarAccess] INSTANCE +# 61| 0: [StringLiteral] "2" +# 62| 8: [ExprStmt] ; +# 62| 0: [MethodCall] setStaticProp(...) +# 62| -1: [TypeAccess] NonCompanion +# 62| 0: [MethodCall] getNonStaticProp(...) +# 62| -1: [VarAccess] INSTANCE +# 63| 9: [ExprStmt] ; +# 63| 0: [MethodCall] setNonStaticProp(...) +# 63| -1: [VarAccess] INSTANCE +# 63| 0: [MethodCall] getStaticProp(...) +# 63| -1: [TypeAccess] NonCompanion +# 64| 10: [ExprStmt] ; +# 64| 0: [MethodCall] setPropWithStaticGetter(...) +# 64| -1: [VarAccess] INSTANCE +# 64| 0: [MethodCall] getPropWithStaticSetter(...) +# 64| -1: [VarAccess] INSTANCE +# 65| 11: [ExprStmt] ; +# 65| 0: [MethodCall] setPropWithStaticSetter(...) +# 65| -1: [TypeAccess] NonCompanion +# 65| 0: [MethodCall] getPropWithStaticGetter(...) +# 65| -1: [TypeAccess] NonCompanion +# 9| 2: [Class] HasCompanion +# 9| 1: [Constructor] HasCompanion +# 9| 5: [BlockStmt] { ... } +# 9| 0: [SuperConstructorInvocationStmt] super(...) +# 9| 1: [BlockStmt] { ... } +# 11| 2: [Class] Companion +# 11| 1: [Constructor] Companion +# 11| 5: [BlockStmt] { ... } +# 11| 0: [SuperConstructorInvocationStmt] super(...) +# 11| 1: [BlockStmt] { ... } +# 16| 0: [ExprStmt] ; +# 16| 0: [KtInitializerAssignExpr] ...=... +# 16| 0: [VarAccess] staticProp +# 17| 1: [ExprStmt] ; +# 17| 0: [KtInitializerAssignExpr] ...=... +# 17| 0: [VarAccess] nonStaticProp +# 13| 2: [Method] staticMethod +#-----| 1: (Annotations) +# 13| 1: [Annotation] JvmStatic +# 13| 3: [TypeAccess] String +#-----| 4: (Parameters) +# 13| 0: [Parameter] s +# 13| 0: [TypeAccess] String +# 13| 5: [BlockStmt] { ... } +# 13| 0: [ReturnStmt] return ... +# 13| 0: [MethodCall] nonStaticMethod(...) +# 13| -1: [ThisAccess] this +# 13| 0: [VarAccess] s +# 14| 3: [Method] nonStaticMethod +# 14| 3: [TypeAccess] String +#-----| 4: (Parameters) +# 14| 0: [Parameter] s +# 14| 0: [TypeAccess] String +# 14| 5: [BlockStmt] { ... } +# 14| 0: [ReturnStmt] return ... +# 14| 0: [MethodCall] staticMethod(...) +# 14| -1: [ThisAccess] this +# 14| 0: [VarAccess] s +# 16| 4: [FieldDeclaration] String staticProp; +# 16| -1: [TypeAccess] String +# 16| 0: [StringLiteral] "a" +# 16| 5: [Method] getStaticProp +# 16| 3: [TypeAccess] String +# 16| 5: [BlockStmt] { ... } +# 16| 0: [ReturnStmt] return ... +# 16| 0: [VarAccess] this.staticProp +# 16| -1: [ThisAccess] this +# 16| 6: [Method] setStaticProp +# 16| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 16| 0: [Parameter] +# 16| 0: [TypeAccess] String +# 16| 5: [BlockStmt] { ... } +# 16| 0: [ExprStmt] ; +# 16| 0: [AssignExpr] ...=... +# 16| 0: [VarAccess] this.staticProp +# 16| -1: [ThisAccess] this +# 16| 1: [VarAccess] +# 17| 7: [FieldDeclaration] String nonStaticProp; +# 17| -1: [TypeAccess] String +# 17| 0: [StringLiteral] "b" +# 17| 8: [Method] getNonStaticProp +# 17| 3: [TypeAccess] String +# 17| 5: [BlockStmt] { ... } +# 17| 0: [ReturnStmt] return ... +# 17| 0: [VarAccess] this.nonStaticProp +# 17| -1: [ThisAccess] this +# 17| 9: [Method] setNonStaticProp +# 17| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 17| 0: [Parameter] +# 17| 0: [TypeAccess] String +# 17| 5: [BlockStmt] { ... } +# 17| 0: [ExprStmt] ; +# 17| 0: [AssignExpr] ...=... +# 17| 0: [VarAccess] this.nonStaticProp +# 17| -1: [ThisAccess] this +# 17| 1: [VarAccess] +# 20| 10: [Method] getPropWithStaticGetter +#-----| 1: (Annotations) +# 20| 1: [Annotation] JvmStatic +# 20| 3: [TypeAccess] String +# 20| 5: [BlockStmt] { ... } +# 20| 0: [ReturnStmt] return ... +# 20| 0: [MethodCall] getPropWithStaticSetter(...) +# 20| -1: [ThisAccess] this +# 21| 11: [Method] setPropWithStaticGetter +# 21| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 21| 0: [Parameter] s +# 21| 0: [TypeAccess] String +# 21| 5: [BlockStmt] { ... } +# 21| 0: [ExprStmt] ; +# 21| 0: [MethodCall] setPropWithStaticSetter(...) +# 21| -1: [ThisAccess] this +# 21| 0: [VarAccess] s +# 24| 12: [Method] getPropWithStaticSetter +# 24| 3: [TypeAccess] String +# 24| 5: [BlockStmt] { ... } +# 24| 0: [ReturnStmt] return ... +# 24| 0: [MethodCall] getPropWithStaticGetter(...) +# 24| -1: [ThisAccess] this +# 25| 13: [Method] setPropWithStaticSetter +#-----| 1: (Annotations) +# 25| 1: [Annotation] JvmStatic +# 25| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 25| 0: [Parameter] s +# 25| 0: [TypeAccess] String +# 25| 5: [BlockStmt] { ... } +# 25| 0: [ExprStmt] ; +# 25| 0: [MethodCall] setPropWithStaticGetter(...) +# 25| -1: [ThisAccess] this +# 25| 0: [VarAccess] s +# 13| 3: [Method] staticMethod +# 13| 3: [TypeAccess] String +#-----| 4: (Parameters) +# 13| 0: [Parameter] s +# 13| 0: [TypeAccess] String +# 13| 5: [BlockStmt] { ... } +# 13| 0: [ReturnStmt] return ... +# 13| 0: [MethodCall] staticMethod(...) +# 13| -1: [VarAccess] HasCompanion.Companion +# 13| -1: [TypeAccess] HasCompanion +# 13| 0: [VarAccess] s +# 16| 4: [Method] getStaticProp +# 16| 3: [TypeAccess] String +# 16| 5: [BlockStmt] { ... } +# 16| 0: [ReturnStmt] return ... +# 16| 0: [MethodCall] getStaticProp(...) +# 16| -1: [VarAccess] HasCompanion.Companion +# 16| -1: [TypeAccess] HasCompanion +# 16| 5: [Method] setStaticProp +# 16| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 16| 0: [Parameter] +# 16| 0: [TypeAccess] String +# 16| 5: [BlockStmt] { ... } +# 16| 0: [ReturnStmt] return ... +# 16| 0: [MethodCall] setStaticProp(...) +# 16| -1: [VarAccess] HasCompanion.Companion +# 16| -1: [TypeAccess] HasCompanion +# 16| 0: [VarAccess] +# 20| 6: [Method] getPropWithStaticGetter +# 20| 3: [TypeAccess] String +# 20| 5: [BlockStmt] { ... } +# 20| 0: [ReturnStmt] return ... +# 20| 0: [MethodCall] getPropWithStaticGetter(...) +# 20| -1: [VarAccess] HasCompanion.Companion +# 20| -1: [TypeAccess] HasCompanion +# 25| 7: [Method] setPropWithStaticSetter +# 25| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 25| 0: [Parameter] s +# 25| 0: [TypeAccess] String +# 25| 5: [BlockStmt] { ... } +# 25| 0: [ReturnStmt] return ... +# 25| 0: [MethodCall] setPropWithStaticSetter(...) +# 25| -1: [VarAccess] HasCompanion.Companion +# 25| -1: [TypeAccess] HasCompanion +# 25| 0: [VarAccess] s +# 31| 3: [Class] NonCompanion +# 31| 1: [Constructor] NonCompanion +# 31| 5: [BlockStmt] { ... } +# 31| 0: [SuperConstructorInvocationStmt] super(...) +# 31| 1: [BlockStmt] { ... } +# 36| 0: [ExprStmt] ; +# 36| 0: [KtInitializerAssignExpr] ...=... +# 36| 0: [VarAccess] staticProp +# 37| 1: [ExprStmt] ; +# 37| 0: [KtInitializerAssignExpr] ...=... +# 37| 0: [VarAccess] nonStaticProp +# 33| 2: [Method] staticMethod +#-----| 1: (Annotations) +# 33| 1: [Annotation] JvmStatic +# 33| 3: [TypeAccess] String +#-----| 4: (Parameters) +# 33| 0: [Parameter] s +# 33| 0: [TypeAccess] String +# 33| 5: [BlockStmt] { ... } +# 33| 0: [ReturnStmt] return ... +# 33| 0: [MethodCall] nonStaticMethod(...) +# 33| -1: [VarAccess] NonCompanion.INSTANCE +# 33| -1: [TypeAccess] NonCompanion +# 33| 0: [VarAccess] s +# 34| 3: [Method] nonStaticMethod +# 34| 3: [TypeAccess] String +#-----| 4: (Parameters) +# 34| 0: [Parameter] s +# 34| 0: [TypeAccess] String +# 34| 5: [BlockStmt] { ... } +# 34| 0: [ReturnStmt] return ... +# 34| 0: [MethodCall] staticMethod(...) +# 34| -1: [TypeAccess] NonCompanion +# 34| 0: [VarAccess] s +# 36| 4: [FieldDeclaration] String staticProp; +# 36| -1: [TypeAccess] String +# 36| 0: [StringLiteral] "a" +# 36| 5: [Method] getStaticProp +# 36| 3: [TypeAccess] String +# 36| 5: [BlockStmt] { ... } +# 36| 0: [ReturnStmt] return ... +# 36| 0: [VarAccess] NonCompanion.INSTANCE.staticProp +# 36| -1: [VarAccess] NonCompanion.INSTANCE +# 36| -1: [TypeAccess] NonCompanion +# 36| 6: [Method] setStaticProp +# 36| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 36| 0: [Parameter] +# 36| 0: [TypeAccess] String +# 36| 5: [BlockStmt] { ... } +# 36| 0: [ExprStmt] ; +# 36| 0: [AssignExpr] ...=... +# 36| 0: [VarAccess] NonCompanion.INSTANCE.staticProp +# 36| -1: [VarAccess] NonCompanion.INSTANCE +# 36| -1: [TypeAccess] NonCompanion +# 36| 1: [VarAccess] +# 37| 7: [FieldDeclaration] String nonStaticProp; +# 37| -1: [TypeAccess] String +# 37| 0: [StringLiteral] "b" +# 37| 8: [Method] getNonStaticProp +# 37| 3: [TypeAccess] String +# 37| 5: [BlockStmt] { ... } +# 37| 0: [ReturnStmt] return ... +# 37| 0: [VarAccess] this.nonStaticProp +# 37| -1: [ThisAccess] this +# 37| 9: [Method] setNonStaticProp +# 37| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 37| 0: [Parameter] +# 37| 0: [TypeAccess] String +# 37| 5: [BlockStmt] { ... } +# 37| 0: [ExprStmt] ; +# 37| 0: [AssignExpr] ...=... +# 37| 0: [VarAccess] this.nonStaticProp +# 37| -1: [ThisAccess] this +# 37| 1: [VarAccess] +# 40| 10: [Method] getPropWithStaticGetter +#-----| 1: (Annotations) +# 40| 1: [Annotation] JvmStatic +# 40| 3: [TypeAccess] String +# 40| 5: [BlockStmt] { ... } +# 40| 0: [ReturnStmt] return ... +# 40| 0: [MethodCall] getPropWithStaticSetter(...) +# 40| -1: [VarAccess] NonCompanion.INSTANCE +# 40| -1: [TypeAccess] NonCompanion +# 41| 11: [Method] setPropWithStaticGetter +# 41| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 41| 0: [Parameter] s +# 41| 0: [TypeAccess] String +# 41| 5: [BlockStmt] { ... } +# 41| 0: [ExprStmt] ; +# 41| 0: [MethodCall] setPropWithStaticSetter(...) +# 41| -1: [TypeAccess] NonCompanion +# 41| 0: [VarAccess] s +# 44| 12: [Method] getPropWithStaticSetter +# 44| 3: [TypeAccess] String +# 44| 5: [BlockStmt] { ... } +# 44| 0: [ReturnStmt] return ... +# 44| 0: [MethodCall] getPropWithStaticGetter(...) +# 44| -1: [TypeAccess] NonCompanion +# 45| 13: [Method] setPropWithStaticSetter +#-----| 1: (Annotations) +# 45| 1: [Annotation] JvmStatic +# 45| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 45| 0: [Parameter] s +# 45| 0: [TypeAccess] String +# 45| 5: [BlockStmt] { ... } +# 45| 0: [ExprStmt] ; +# 45| 0: [MethodCall] setPropWithStaticGetter(...) +# 45| -1: [VarAccess] NonCompanion.INSTANCE +# 45| -1: [TypeAccess] NonCompanion +# 45| 0: [VarAccess] s diff --git a/java/ql/test-kotlin2/library-tests/jvmstatic-annotation/PrintAst.qlref b/java/ql/test-kotlin2/library-tests/jvmstatic-annotation/PrintAst.qlref new file mode 100644 index 00000000000..c7fd5faf239 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/jvmstatic-annotation/PrintAst.qlref @@ -0,0 +1 @@ +semmle/code/java/PrintAst.ql \ No newline at end of file diff --git a/java/ql/test-kotlin2/library-tests/jvmstatic-annotation/test.expected b/java/ql/test-kotlin2/library-tests/jvmstatic-annotation/test.expected new file mode 100644 index 00000000000..6ce063785ea --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/jvmstatic-annotation/test.expected @@ -0,0 +1,74 @@ +staticMembers +| JavaUser.java:1:14:1:21 | JavaUser | JavaUser.java:3:22:3:25 | test | Method | +| test.kt:0:0:0:0 | TestKt | test.kt:49:1:67:1 | externalUser | Method | +| test.kt:9:1:29:1 | HasCompanion | test.kt:11:3:27:3 | Companion | Class | +| test.kt:9:1:29:1 | HasCompanion | test.kt:11:3:27:3 | Companion | Field | +| test.kt:9:1:29:1 | HasCompanion | test.kt:13:5:13:71 | staticMethod | Method | +| test.kt:9:1:29:1 | HasCompanion | test.kt:16:5:16:43 | getStaticProp | Method | +| test.kt:9:1:29:1 | HasCompanion | test.kt:16:5:16:43 | setStaticProp | Method | +| test.kt:9:1:29:1 | HasCompanion | test.kt:20:7:20:45 | getPropWithStaticGetter | Method | +| test.kt:9:1:29:1 | HasCompanion | test.kt:25:7:25:60 | setPropWithStaticSetter | Method | +| test.kt:31:1:47:1 | NonCompanion | test.kt:31:1:47:1 | INSTANCE | Field | +| test.kt:31:1:47:1 | NonCompanion | test.kt:33:3:33:69 | staticMethod | Method | +| test.kt:31:1:47:1 | NonCompanion | test.kt:36:3:36:41 | getStaticProp | Method | +| test.kt:31:1:47:1 | NonCompanion | test.kt:36:3:36:41 | setStaticProp | Method | +| test.kt:31:1:47:1 | NonCompanion | test.kt:40:5:40:43 | getPropWithStaticGetter | Method | +| test.kt:31:1:47:1 | NonCompanion | test.kt:45:5:45:58 | setPropWithStaticSetter | Method | +#select +| test.kt:9:1:29:1 | HasCompanion | JavaUser.java:5:5:5:34 | staticMethod(...) | JavaUser.java:5:5:5:16 | HasCompanion | static | +| test.kt:9:1:29:1 | HasCompanion | JavaUser.java:7:5:7:73 | setStaticProp(...) | JavaUser.java:7:5:7:16 | HasCompanion | static | +| test.kt:9:1:29:1 | HasCompanion | JavaUser.java:8:45:8:72 | getStaticProp(...) | JavaUser.java:8:45:8:56 | HasCompanion | static | +| test.kt:9:1:29:1 | HasCompanion | JavaUser.java:10:5:10:80 | setPropWithStaticSetter(...) | JavaUser.java:10:5:10:16 | HasCompanion | static | +| test.kt:9:1:29:1 | HasCompanion | JavaUser.java:10:42:10:79 | getPropWithStaticGetter(...) | JavaUser.java:10:42:10:53 | HasCompanion | static | +| test.kt:11:3:27:3 | Companion | JavaUser.java:6:5:6:47 | nonStaticMethod(...) | JavaUser.java:6:5:6:26 | HasCompanion.Companion | instance | +| test.kt:11:3:27:3 | Companion | JavaUser.java:7:32:7:72 | getNonStaticProp(...) | JavaUser.java:7:32:7:53 | HasCompanion.Companion | instance | +| test.kt:11:3:27:3 | Companion | JavaUser.java:8:5:8:73 | setNonStaticProp(...) | JavaUser.java:8:5:8:26 | HasCompanion.Companion | instance | +| test.kt:11:3:27:3 | Companion | JavaUser.java:9:5:9:100 | setPropWithStaticGetter(...) | JavaUser.java:9:5:9:26 | HasCompanion.Companion | instance | +| test.kt:11:3:27:3 | Companion | JavaUser.java:9:52:9:99 | getPropWithStaticSetter(...) | JavaUser.java:9:52:9:73 | HasCompanion.Companion | instance | +| test.kt:11:3:27:3 | Companion | test.kt:13:5:13:71 | staticMethod(...) | test.kt:13:5:13:71 | HasCompanion.Companion | instance | +| test.kt:11:3:27:3 | Companion | test.kt:13:54:13:71 | nonStaticMethod(...) | test.kt:13:54:13:71 | this | instance | +| test.kt:11:3:27:3 | Companion | test.kt:14:46:14:60 | staticMethod(...) | test.kt:14:46:14:60 | this | instance | +| test.kt:11:3:27:3 | Companion | test.kt:16:5:16:43 | getStaticProp(...) | test.kt:16:5:16:43 | HasCompanion.Companion | instance | +| test.kt:11:3:27:3 | Companion | test.kt:16:5:16:43 | setStaticProp(...) | test.kt:16:5:16:43 | HasCompanion.Companion | instance | +| test.kt:11:3:27:3 | Companion | test.kt:20:7:20:45 | getPropWithStaticGetter(...) | test.kt:20:7:20:45 | HasCompanion.Companion | instance | +| test.kt:11:3:27:3 | Companion | test.kt:20:26:20:45 | getPropWithStaticSetter(...) | test.kt:20:26:20:45 | this | instance | +| test.kt:11:3:27:3 | Companion | test.kt:21:24:21:47 | setPropWithStaticSetter(...) | test.kt:21:24:21:47 | this | instance | +| test.kt:11:3:27:3 | Companion | test.kt:24:15:24:34 | getPropWithStaticGetter(...) | test.kt:24:15:24:34 | this | instance | +| test.kt:11:3:27:3 | Companion | test.kt:25:7:25:60 | setPropWithStaticSetter(...) | test.kt:25:7:25:60 | HasCompanion.Companion | instance | +| test.kt:11:3:27:3 | Companion | test.kt:25:35:25:58 | setPropWithStaticGetter(...) | test.kt:25:35:25:58 | this | instance | +| test.kt:11:3:27:3 | Companion | test.kt:52:3:52:32 | staticMethod(...) | test.kt:52:3:52:14 | Companion | instance | +| test.kt:11:3:27:3 | Companion | test.kt:53:3:53:35 | nonStaticMethod(...) | test.kt:53:3:53:14 | Companion | instance | +| test.kt:11:3:27:3 | Companion | test.kt:54:3:54:54 | setStaticProp(...) | test.kt:54:3:54:14 | Companion | instance | +| test.kt:11:3:27:3 | Companion | test.kt:54:29:54:54 | getNonStaticProp(...) | test.kt:54:29:54:40 | Companion | instance | +| test.kt:11:3:27:3 | Companion | test.kt:55:3:55:54 | setNonStaticProp(...) | test.kt:55:3:55:14 | Companion | instance | +| test.kt:11:3:27:3 | Companion | test.kt:55:32:55:54 | getStaticProp(...) | test.kt:55:32:55:43 | Companion | instance | +| test.kt:11:3:27:3 | Companion | test.kt:56:3:56:71 | setPropWithStaticGetter(...) | test.kt:56:3:56:14 | Companion | instance | +| test.kt:11:3:27:3 | Companion | test.kt:56:39:56:71 | getPropWithStaticSetter(...) | test.kt:56:39:56:50 | Companion | instance | +| test.kt:11:3:27:3 | Companion | test.kt:57:3:57:71 | setPropWithStaticSetter(...) | test.kt:57:3:57:14 | Companion | instance | +| test.kt:11:3:27:3 | Companion | test.kt:57:39:57:71 | getPropWithStaticGetter(...) | test.kt:57:39:57:50 | Companion | instance | +| test.kt:31:1:47:1 | NonCompanion | JavaUser.java:13:5:13:34 | staticMethod(...) | JavaUser.java:13:5:13:16 | NonCompanion | static | +| test.kt:31:1:47:1 | NonCompanion | JavaUser.java:14:5:14:46 | nonStaticMethod(...) | JavaUser.java:14:5:14:25 | NonCompanion.INSTANCE | instance | +| test.kt:31:1:47:1 | NonCompanion | JavaUser.java:15:5:15:72 | setStaticProp(...) | JavaUser.java:15:5:15:16 | NonCompanion | static | +| test.kt:31:1:47:1 | NonCompanion | JavaUser.java:15:32:15:71 | getNonStaticProp(...) | JavaUser.java:15:32:15:52 | NonCompanion.INSTANCE | instance | +| test.kt:31:1:47:1 | NonCompanion | JavaUser.java:16:5:16:72 | setNonStaticProp(...) | JavaUser.java:16:5:16:25 | NonCompanion.INSTANCE | instance | +| test.kt:31:1:47:1 | NonCompanion | JavaUser.java:16:44:16:71 | getStaticProp(...) | JavaUser.java:16:44:16:55 | NonCompanion | static | +| test.kt:31:1:47:1 | NonCompanion | JavaUser.java:17:5:17:98 | setPropWithStaticGetter(...) | JavaUser.java:17:5:17:25 | NonCompanion.INSTANCE | instance | +| test.kt:31:1:47:1 | NonCompanion | JavaUser.java:17:51:17:97 | getPropWithStaticSetter(...) | JavaUser.java:17:51:17:71 | NonCompanion.INSTANCE | instance | +| test.kt:31:1:47:1 | NonCompanion | JavaUser.java:18:5:18:80 | setPropWithStaticSetter(...) | JavaUser.java:18:5:18:16 | NonCompanion | static | +| test.kt:31:1:47:1 | NonCompanion | JavaUser.java:18:42:18:79 | getPropWithStaticGetter(...) | JavaUser.java:18:42:18:53 | NonCompanion | static | +| test.kt:31:1:47:1 | NonCompanion | test.kt:33:52:33:69 | nonStaticMethod(...) | test.kt:33:52:33:69 | NonCompanion.INSTANCE | instance | +| test.kt:31:1:47:1 | NonCompanion | test.kt:34:44:34:58 | staticMethod(...) | test.kt:34:44:34:58 | NonCompanion | static | +| test.kt:31:1:47:1 | NonCompanion | test.kt:40:24:40:43 | getPropWithStaticSetter(...) | test.kt:40:24:40:43 | NonCompanion.INSTANCE | instance | +| test.kt:31:1:47:1 | NonCompanion | test.kt:41:22:41:45 | setPropWithStaticSetter(...) | test.kt:41:22:41:45 | NonCompanion | static | +| test.kt:31:1:47:1 | NonCompanion | test.kt:44:13:44:32 | getPropWithStaticGetter(...) | test.kt:44:13:44:32 | NonCompanion | static | +| test.kt:31:1:47:1 | NonCompanion | test.kt:45:33:45:56 | setPropWithStaticGetter(...) | test.kt:45:33:45:56 | NonCompanion.INSTANCE | instance | +| test.kt:31:1:47:1 | NonCompanion | test.kt:60:3:60:32 | staticMethod(...) | test.kt:60:3:60:32 | NonCompanion | static | +| test.kt:31:1:47:1 | NonCompanion | test.kt:61:3:61:35 | nonStaticMethod(...) | test.kt:61:3:61:14 | INSTANCE | instance | +| test.kt:31:1:47:1 | NonCompanion | test.kt:62:3:62:54 | setStaticProp(...) | test.kt:62:3:62:54 | NonCompanion | static | +| test.kt:31:1:47:1 | NonCompanion | test.kt:62:29:62:54 | getNonStaticProp(...) | test.kt:62:29:62:40 | INSTANCE | instance | +| test.kt:31:1:47:1 | NonCompanion | test.kt:63:3:63:54 | setNonStaticProp(...) | test.kt:63:3:63:14 | INSTANCE | instance | +| test.kt:31:1:47:1 | NonCompanion | test.kt:63:32:63:54 | getStaticProp(...) | test.kt:63:32:63:54 | NonCompanion | static | +| test.kt:31:1:47:1 | NonCompanion | test.kt:64:3:64:71 | setPropWithStaticGetter(...) | test.kt:64:3:64:14 | INSTANCE | instance | +| test.kt:31:1:47:1 | NonCompanion | test.kt:64:39:64:71 | getPropWithStaticSetter(...) | test.kt:64:39:64:50 | INSTANCE | instance | +| test.kt:31:1:47:1 | NonCompanion | test.kt:65:3:65:71 | setPropWithStaticSetter(...) | test.kt:65:3:65:71 | NonCompanion | static | +| test.kt:31:1:47:1 | NonCompanion | test.kt:65:39:65:71 | getPropWithStaticGetter(...) | test.kt:65:39:65:71 | NonCompanion | static | diff --git a/java/ql/test-kotlin2/library-tests/jvmstatic-annotation/test.kt b/java/ql/test-kotlin2/library-tests/jvmstatic-annotation/test.kt new file mode 100644 index 00000000000..cbf553725b4 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/jvmstatic-annotation/test.kt @@ -0,0 +1,67 @@ +// Test both definining static members, and referring to an object's other static members, in companion object and non-companion object contexts. +// For the companion object all the references to other properties and methods should extract as ordinary instance calls and field read and writes, +// but those methods / getters / setters that are annotated static should get an additional static proxy method defined on the surrounding class-- +// for example, we should see (using Java notation) public static String HasCompanion.staticMethod(String s) { return Companion.staticMethod(s); }. +// For the non-companion object, the static-annotated methods should themselves be extracted as static members, and calls / gets / sets that use them +// should extract as static calls. Static members using non-static ones should extract like staticMethod(...) { INSTANCE.nonStaticMethod(...) }, +// where the reference to INSTANCE replaces what would normally be a `this` reference. + +public class HasCompanion { + + companion object { + + @JvmStatic fun staticMethod(s: String): String = nonStaticMethod(s) + fun nonStaticMethod(s: String): String = staticMethod(s) + + @JvmStatic var staticProp: String = "a" + var nonStaticProp: String = "b" + + var propWithStaticGetter: String + @JvmStatic get() = propWithStaticSetter + set(s: String) { propWithStaticSetter = s } + + var propWithStaticSetter: String + get() = propWithStaticGetter + @JvmStatic set(s: String) { propWithStaticGetter = s } + + } + +} + +object NonCompanion { + + @JvmStatic fun staticMethod(s: String): String = nonStaticMethod(s) + fun nonStaticMethod(s: String): String = staticMethod(s) + + @JvmStatic var staticProp: String = "a" + var nonStaticProp: String = "b" + + var propWithStaticGetter: String + @JvmStatic get() = propWithStaticSetter + set(s: String) { propWithStaticSetter = s } + + var propWithStaticSetter: String + get() = propWithStaticGetter + @JvmStatic set(s: String) { propWithStaticGetter = s } + +} + +fun externalUser() { + + // These all extract as instance calls (to HasCompanion.Companion), since a Kotlin caller won't use the static proxy methods generated by the @JvmStatic annotation. + HasCompanion.staticMethod("1") + HasCompanion.nonStaticMethod("2") + HasCompanion.staticProp = HasCompanion.nonStaticProp + HasCompanion.nonStaticProp = HasCompanion.staticProp + HasCompanion.propWithStaticGetter = HasCompanion.propWithStaticSetter + HasCompanion.propWithStaticSetter = HasCompanion.propWithStaticGetter + + // These extract as static methods, since there is no proxy method in the non-companion object case. + NonCompanion.staticMethod("1") + NonCompanion.nonStaticMethod("2") + NonCompanion.staticProp = NonCompanion.nonStaticProp + NonCompanion.nonStaticProp = NonCompanion.staticProp + NonCompanion.propWithStaticGetter = NonCompanion.propWithStaticSetter + NonCompanion.propWithStaticSetter = NonCompanion.propWithStaticGetter + +} diff --git a/java/ql/test-kotlin2/library-tests/jvmstatic-annotation/test.ql b/java/ql/test-kotlin2/library-tests/jvmstatic-annotation/test.ql new file mode 100644 index 00000000000..725ba05a106 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/jvmstatic-annotation/test.ql @@ -0,0 +1,16 @@ +import java + +query predicate staticMembers(RefType declType, Member m, string kind) { + m.fromSource() and + m.isStatic() and + m.getDeclaringType() = declType and + kind = m.getAPrimaryQlClass() +} + +from Call call, Callable callable, RefType declType, Expr qualifier, string callType +where + call.getCallee() = callable and + declType = callable.getDeclaringType() and + qualifier = call.getQualifier() and + if callable.isStatic() then callType = "static" else callType = "instance" +select declType, call, qualifier, callType diff --git a/java/ql/test-kotlin2/library-tests/kotlin-java-map-entries/C.java b/java/ql/test-kotlin2/library-tests/kotlin-java-map-entries/C.java new file mode 100644 index 00000000000..c2f5e29be50 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/kotlin-java-map-entries/C.java @@ -0,0 +1,3 @@ +import java.util.Map; + +public abstract class C implements Map.Entry { } diff --git a/java/ql/test-kotlin2/library-tests/kotlin-java-map-entries/b.kt b/java/ql/test-kotlin2/library-tests/kotlin-java-map-entries/b.kt new file mode 100644 index 00000000000..6e52e8c38c4 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/kotlin-java-map-entries/b.kt @@ -0,0 +1 @@ +public abstract class B : Map.Entry { } diff --git a/java/ql/test-kotlin2/library-tests/kotlin-java-map-entries/test.expected b/java/ql/test-kotlin2/library-tests/kotlin-java-map-entries/test.expected new file mode 100644 index 00000000000..0f01d1aaf5d --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/kotlin-java-map-entries/test.expected @@ -0,0 +1,2 @@ +| comparingByKey | K | Comparable | +| comparingByValue | V | Comparable | diff --git a/java/ql/test-kotlin2/library-tests/kotlin-java-map-entries/test.ql b/java/ql/test-kotlin2/library-tests/kotlin-java-map-entries/test.ql new file mode 100644 index 00000000000..2981f115d2a --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/kotlin-java-map-entries/test.ql @@ -0,0 +1,7 @@ +import java + +from Method m, TypeVariable param +where + m.getDeclaringType().getQualifiedName() = "java.util.Map$Entry" and + param = m.(GenericCallable).getATypeParameter() +select m.toString(), param.toString(), param.getATypeBound().toString() diff --git a/java/ql/test-kotlin2/library-tests/lateinit/PrintAst.expected b/java/ql/test-kotlin2/library-tests/lateinit/PrintAst.expected new file mode 100644 index 00000000000..b01d9f781fc --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/lateinit/PrintAst.expected @@ -0,0 +1,94 @@ +test.kt: +# 0| [CompilationUnit] test +# 1| 1: [Class] LateInit +# 1| 1: [Constructor] LateInit +# 1| 5: [BlockStmt] { ... } +# 1| 0: [SuperConstructorInvocationStmt] super(...) +# 1| 1: [BlockStmt] { ... } +# 2| 2: [FieldDeclaration] LateInit test0; +# 2| -1: [TypeAccess] LateInit +# 2| 3: [Method] getTest0$private +# 2| 3: [TypeAccess] LateInit +# 2| 5: [BlockStmt] { ... } +# 2| 0: [ReturnStmt] return ... +# 2| 0: [VarAccess] this.test0 +# 2| -1: [ThisAccess] this +# 2| 4: [Method] setTest0$private +# 2| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 2| 0: [Parameter] +# 2| 0: [TypeAccess] LateInit +# 2| 5: [BlockStmt] { ... } +# 2| 0: [ExprStmt] ; +# 2| 0: [AssignExpr] ...=... +# 2| 0: [VarAccess] this.test0 +# 2| -1: [ThisAccess] this +# 2| 1: [VarAccess] +# 4| 5: [Method] f +# 4| 3: [TypeAccess] Unit +# 4| 5: [BlockStmt] { ... } +# 4| 0: [ReturnStmt] return ... +# 4| 0: [MethodCall] println(...) +# 4| -1: [TypeAccess] ConsoleKt +# 4| 0: [StringLiteral] "a" +# 6| 6: [Method] init +# 6| 3: [TypeAccess] LateInit +# 6| 5: [BlockStmt] { ... } +# 6| 0: [ReturnStmt] return ... +# 6| 0: [ClassInstanceExpr] new LateInit(...) +# 6| -3: [TypeAccess] LateInit +# 8| 7: [Method] fn +# 8| 3: [TypeAccess] Unit +# 8| 5: [BlockStmt] { ... } +# 9| 0: [ExprStmt] ; +# 9| 0: [MethodCall] f(...) +# 9| -1: [MethodCall] getTest0$private(...) +# 9| -1: [ThisAccess] this +# 10| 1: [ExprStmt] ; +# 10| 0: [WhenExpr] when ... +# 10| 0: [WhenBranch] ... -> ... +# 10| 0: [MethodCall] isInitialized(...) +# 10| -1: [TypeAccess] LateinitKt +# 10| 0: [PropertyRefExpr] ...::... +# 10| -4: [AnonymousClass] new KMutableProperty0(...) { ... } +# 10| 1: [Constructor] +#-----| 4: (Parameters) +# 10| 0: [Parameter] +# 10| 5: [BlockStmt] { ... } +# 10| 0: [SuperConstructorInvocationStmt] super(...) +# 10| 1: [ExprStmt] ; +# 10| 0: [AssignExpr] ...=... +# 10| 0: [VarAccess] this. +# 10| -1: [ThisAccess] this +# 10| 1: [VarAccess] +# 10| 2: [FieldDeclaration] LateInit ; +# 10| -1: [TypeAccess] LateInit +# 10| 3: [Method] get +# 10| 5: [BlockStmt] { ... } +# 10| 0: [ReturnStmt] return ... +# 10| 0: [MethodCall] getTest0$private(...) +# 10| -1: [VarAccess] this. +# 10| -1: [ThisAccess] this +# 10| 4: [Method] invoke +# 10| 5: [BlockStmt] { ... } +# 10| 0: [ReturnStmt] return ... +# 10| 0: [MethodCall] get(...) +# 10| -1: [ThisAccess] this +# 10| 5: [Method] set +#-----| 4: (Parameters) +# 10| 0: [Parameter] a0 +# 10| 5: [BlockStmt] { ... } +# 10| 0: [ReturnStmt] return ... +# 10| 0: [MethodCall] setTest0$private(...) +# 10| -1: [VarAccess] this. +# 10| -1: [ThisAccess] this +# 10| 0: [VarAccess] a0 +# 10| -3: [TypeAccess] KMutableProperty0 +# 10| 0: [TypeAccess] LateInit +# 10| 0: [ThisAccess] this +# 10| 1: [BlockStmt] { ... } +# 13| 2: [LocalVariableDeclStmt] var ...; +# 13| 1: [LocalVariableDeclExpr] test1 +# 14| 3: [ExprStmt] ; +# 14| 0: [MethodCall] f(...) +# 14| -1: [VarAccess] test1 diff --git a/java/ql/test-kotlin2/library-tests/lateinit/PrintAst.qlref b/java/ql/test-kotlin2/library-tests/lateinit/PrintAst.qlref new file mode 100644 index 00000000000..c7fd5faf239 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/lateinit/PrintAst.qlref @@ -0,0 +1 @@ +semmle/code/java/PrintAst.ql \ No newline at end of file diff --git a/java/ql/test-kotlin2/library-tests/lateinit/test.expected b/java/ql/test-kotlin2/library-tests/lateinit/test.expected new file mode 100644 index 00000000000..3e8b48d298b --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/lateinit/test.expected @@ -0,0 +1,8 @@ +| test.kt:4:15:4:26 | println(...) | file:///ConsoleKt.class:0:0:0:0 | println | +| test.kt:9:9:9:13 | getTest0$private(...) | test.kt:2:5:2:40 | getTest0$private | +| test.kt:9:9:9:17 | f(...) | test.kt:4:5:4:26 | f | +| test.kt:10:13:10:23 | get(...) | test.kt:10:13:10:23 | get | +| test.kt:10:13:10:23 | getTest0$private(...) | test.kt:2:5:2:40 | getTest0$private | +| test.kt:10:13:10:23 | setTest0$private(...) | test.kt:2:5:2:40 | setTest0$private | +| test.kt:10:13:10:37 | isInitialized(...) | file:///LateinitKt.class:0:0:0:0 | isInitialized | +| test.kt:14:9:14:17 | f(...) | test.kt:4:5:4:26 | f | diff --git a/java/ql/test-kotlin2/library-tests/lateinit/test.kt b/java/ql/test-kotlin2/library-tests/lateinit/test.kt new file mode 100644 index 00000000000..3312f67511c --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/lateinit/test.kt @@ -0,0 +1,16 @@ +public class LateInit { + private lateinit var test0: LateInit + + fun f() = println("a") + + fun init() = LateInit() + + fun fn() { + test0.f() // This is preceded by a null-check and a throw in bytecode, in IR it's a simple call + if (this::test0.isInitialized) { // This is converted to a null-check in bytecode, in IR it's a call to `LateinitKt.isInitialized` + } + + lateinit var test1: LateInit + test1.f() // This is replaced by `Intrinsics.throwUninitializedPropertyAccessException` in bytecode, in IR it's a simple call + } +} diff --git a/java/ql/test-kotlin2/library-tests/lateinit/test.ql b/java/ql/test-kotlin2/library-tests/lateinit/test.ql new file mode 100644 index 00000000000..9b95c387607 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/lateinit/test.ql @@ -0,0 +1,13 @@ +import java + +class MethodLocation extends Method { + override predicate hasLocationInfo(string path, int sl, int sc, int el, int ec) { + exists(string fullPath | super.hasLocationInfo(fullPath, sl, sc, el, ec) | + if exists(this.getFile().getRelativePath()) + then path = fullPath + else path = fullPath.regexpReplaceAll(".*/", "/") + ) + } +} + +query predicate calls(MethodCall ma, Method m) { ma.getMethod() = m } diff --git a/java/ql/test-kotlin2/library-tests/lazy-val-multiple-constructors/test.expected b/java/ql/test-kotlin2/library-tests/lazy-val-multiple-constructors/test.expected new file mode 100644 index 00000000000..cf3eb1ac9f3 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/lazy-val-multiple-constructors/test.expected @@ -0,0 +1,2 @@ +| test.kt:3:23:3:32 | new KProperty1(...) { ... } | test.kt:3:23:3:32 | ...::... | +| test.kt:3:28:3:32 | new Function0(...) { ... } | test.kt:3:28:3:32 | ...->... | diff --git a/java/ql/test-kotlin2/library-tests/lazy-val-multiple-constructors/test.kt b/java/ql/test-kotlin2/library-tests/lazy-val-multiple-constructors/test.kt new file mode 100644 index 00000000000..2797b2f0fef --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/lazy-val-multiple-constructors/test.kt @@ -0,0 +1,12 @@ +public class Test { + + val lazyVal: Int by lazy { 5 } + + // Both of these constructors will need to extract the implicit classes created by `lazyVal` and initialize it-- + // This test checks we don't introduce any inconsistency this way. + + constructor(x: Int) { } + + constructor(y: String) { } + +} diff --git a/java/ql/test-kotlin2/library-tests/lazy-val-multiple-constructors/test.ql b/java/ql/test-kotlin2/library-tests/lazy-val-multiple-constructors/test.ql new file mode 100644 index 00000000000..4e3af808af7 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/lazy-val-multiple-constructors/test.ql @@ -0,0 +1,4 @@ +import java + +from AnonymousClass ac +select ac, ac.getClassInstanceExpr() diff --git a/java/ql/test-kotlin2/library-tests/literals/literals.expected b/java/ql/test-kotlin2/library-tests/literals/literals.expected new file mode 100644 index 00000000000..bb6f6fd4739 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/literals/literals.expected @@ -0,0 +1,29 @@ +| literals.kt:3:36:3:39 | true | BooleanLiteral | +| literals.kt:4:36:4:40 | false | BooleanLiteral | +| literals.kt:5:28:5:28 | 0 | IntegerLiteral | +| literals.kt:6:28:6:30 | 123 | IntegerLiteral | +| literals.kt:7:28:7:31 | -123 | IntegerLiteral | +| literals.kt:8:28:8:31 | 15 | IntegerLiteral | +| literals.kt:9:28:9:37 | 11 | IntegerLiteral | +| literals.kt:10:28:10:36 | 1234567 | IntegerLiteral | +| literals.kt:11:30:11:30 | 0 | LongLiteral | +| literals.kt:12:30:12:32 | 123 | LongLiteral | +| literals.kt:13:30:13:33 | -123 | LongLiteral | +| literals.kt:14:30:14:31 | 0 | LongLiteral | +| literals.kt:15:30:15:33 | 123 | LongLiteral | +| literals.kt:16:31:16:34 | 123 | LongLiteral | +| literals.kt:17:30:17:33 | 15 | LongLiteral | +| literals.kt:18:30:18:39 | 11 | LongLiteral | +| literals.kt:19:30:19:38 | 1234567 | LongLiteral | +| literals.kt:20:32:20:35 | 0.0 | FloatLiteral | +| literals.kt:21:32:21:37 | 123.4 | FloatLiteral | +| literals.kt:22:33:22:38 | 123.4 | FloatLiteral | +| literals.kt:23:34:23:36 | 0.0 | DoubleLiteral | +| literals.kt:24:34:24:38 | 123.4 | DoubleLiteral | +| literals.kt:25:35:25:39 | 123.4 | DoubleLiteral | +| literals.kt:26:30:26:32 | c | CharacterLiteral | +| literals.kt:27:30:27:33 | \n | CharacterLiteral | +| literals.kt:28:34:28:35 | "" | StringLiteral | +| literals.kt:29:34:29:46 | "Some string" | StringLiteral | +| literals.kt:30:34:30:47 | "Some\\nstring" | StringLiteral | +| literals.kt:31:30:31:33 | null | NullLiteral | diff --git a/java/ql/test-kotlin2/library-tests/literals/literals.kt b/java/ql/test-kotlin2/library-tests/literals/literals.kt new file mode 100644 index 00000000000..27af90aa928 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/literals/literals.kt @@ -0,0 +1,33 @@ + +fun literalFun() { + val booleanLiteral1: Boolean = true + val booleanLiteral2: Boolean = false + val intLiteral1: Int = 0 + val intLiteral2: Int = 123 + val intLiteral3: Int = -123 + val intLiteral4: Int = 0x0F + val intLiteral5: Int = 0b00001011 + val intLiteral6: Int = 1_234_567 + val longLiteral1: Long = 0 + val longLiteral2: Long = 123 + val longLiteral3: Long = -123 + val longLiteral4: Long = 0L + val longLiteral5: Long = 123L + val longLiteral6: Long = -123L + val longLiteral7: Long = 0x0F + val longLiteral8: Long = 0b00001011 + val longLiteral9: Long = 1_234_567 + val floatLiteral1: Float = 0.0f + val floatLiteral2: Float = 123.4f + val floatLiteral3: Float = -123.4f + val doubleLiteral1: Double = 0.0 + val doubleLiteral2: Double = 123.4 + val doubleLiteral3: Double = -123.4 + val charLiteral1: Char = 'c' + val charLiteral2: Char = '\n' + val stringLiteral1: String = "" + val stringLiteral2: String = "Some string" + val stringLiteral3: String = "Some\nstring" + val nullLiteral1: Int? = null +} + diff --git a/java/ql/test-kotlin2/library-tests/literals/literals.ql b/java/ql/test-kotlin2/library-tests/literals/literals.ql new file mode 100644 index 00000000000..587a71f3dc7 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/literals/literals.ql @@ -0,0 +1,5 @@ +import java + +from Literal l +where l.getFile().isSourceFile() +select l, l.getPrimaryQlClasses() diff --git a/java/ql/test-kotlin2/library-tests/maps-iterator-overloads/test.expected b/java/ql/test-kotlin2/library-tests/maps-iterator-overloads/test.expected new file mode 100644 index 00000000000..2456c6145c5 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/maps-iterator-overloads/test.expected @@ -0,0 +1,2 @@ +| test.kt:1:98:1:109 | mutableIterator(...) | mutableIterator | +| test.kt:3:71:3:82 | iterator(...) | iterator | diff --git a/java/ql/test-kotlin2/library-tests/maps-iterator-overloads/test.kt b/java/ql/test-kotlin2/library-tests/maps-iterator-overloads/test.kt new file mode 100644 index 00000000000..93b035e24ee --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/maps-iterator-overloads/test.kt @@ -0,0 +1,3 @@ +fun getIter(m: MutableMap): MutableIterator> = m.iterator() + +fun getIter2(m: Map): Iterator> = m.iterator() diff --git a/java/ql/test-kotlin2/library-tests/maps-iterator-overloads/test.ql b/java/ql/test-kotlin2/library-tests/maps-iterator-overloads/test.ql new file mode 100644 index 00000000000..4c9c5a8177a --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/maps-iterator-overloads/test.ql @@ -0,0 +1,4 @@ +import java + +from MethodCall ma +select ma, ma.getCallee().toString() diff --git a/java/ql/test-kotlin2/library-tests/methods-mixed-java-and-kotlin/A.java b/java/ql/test-kotlin2/library-tests/methods-mixed-java-and-kotlin/A.java new file mode 100644 index 00000000000..b8df49db85c --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/methods-mixed-java-and-kotlin/A.java @@ -0,0 +1,5 @@ +package j; + +interface A { + void foo(T t); +} diff --git a/java/ql/test-kotlin2/library-tests/methods-mixed-java-and-kotlin/B.java b/java/ql/test-kotlin2/library-tests/methods-mixed-java-and-kotlin/B.java new file mode 100644 index 00000000000..4958d94bb38 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/methods-mixed-java-and-kotlin/B.java @@ -0,0 +1,5 @@ +package j; + +class B implements A { + public void foo(String t) {} +} diff --git a/java/ql/test-kotlin2/library-tests/methods-mixed-java-and-kotlin/W.kt b/java/ql/test-kotlin2/library-tests/methods-mixed-java-and-kotlin/W.kt new file mode 100644 index 00000000000..e4e089da5fa --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/methods-mixed-java-and-kotlin/W.kt @@ -0,0 +1,9 @@ +package k + +interface A { + fun foo(t: T) +} + +class B : A { + override fun foo(t: String) {} +} \ No newline at end of file diff --git a/java/ql/test-kotlin2/library-tests/methods-mixed-java-and-kotlin/test.expected b/java/ql/test-kotlin2/library-tests/methods-mixed-java-and-kotlin/test.expected new file mode 100644 index 00000000000..43281e98beb --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/methods-mixed-java-and-kotlin/test.expected @@ -0,0 +1,6 @@ +| A.class:0:0:0:0 | foo | j.A.foo | foo(java.lang.String) | A.java:4:10:4:12 | foo | j.A.foo | +| A.java:4:10:4:12 | foo | j.A.foo | foo(java.lang.Object) | A.java:4:10:4:12 | foo | j.A.foo | +| B.java:4:17:4:19 | foo | j.B.foo | foo(java.lang.String) | B.java:4:17:4:19 | foo | j.B.foo | +| W.kt:4:5:4:17 | foo | k.A.foo | foo(java.lang.Object) | W.kt:4:5:4:17 | foo | k.A.foo | +| W.kt:8:5:8:34 | foo | k.B.foo | foo(java.lang.String) | W.kt:8:5:8:34 | foo | k.B.foo | +| file:///!unknown-binary-location/k/A.class:0:0:0:0 | foo | k.A.foo | foo(java.lang.String) | W.kt:4:5:4:17 | foo | k.A.foo | diff --git a/java/ql/test-kotlin2/library-tests/methods-mixed-java-and-kotlin/test.ql b/java/ql/test-kotlin2/library-tests/methods-mixed-java-and-kotlin/test.ql new file mode 100644 index 00000000000..ec2159d35de --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/methods-mixed-java-and-kotlin/test.ql @@ -0,0 +1,6 @@ +import java + +from Method m +where m.getName() = "foo" +select m, m.getQualifiedName(), m.getSignature(), m.getSourceDeclaration(), + m.getSourceDeclaration().getQualifiedName() diff --git a/java/ql/test-kotlin2/library-tests/methods/clinit.expected b/java/ql/test-kotlin2/library-tests/methods/clinit.expected new file mode 100644 index 00000000000..3bf5f170f08 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/methods/clinit.expected @@ -0,0 +1,3 @@ +| clinit.kt:0:0:0:0 | | file://:0:0:0:0 | void | +| enumClass.kt:0:0:0:0 | | file://:0:0:0:0 | void | +| enumClass.kt:0:0:0:0 | | file://:0:0:0:0 | void | diff --git a/java/ql/test-kotlin2/library-tests/methods/clinit.kt b/java/ql/test-kotlin2/library-tests/methods/clinit.kt new file mode 100644 index 00000000000..291dc7cad4b --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/methods/clinit.kt @@ -0,0 +1,3 @@ +package foo.bar + +var topLevelInt: Int = 0 \ No newline at end of file diff --git a/java/ql/test-kotlin2/library-tests/methods/clinit.ql b/java/ql/test-kotlin2/library-tests/methods/clinit.ql new file mode 100644 index 00000000000..11ea8515abb --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/methods/clinit.ql @@ -0,0 +1,5 @@ +import java + +from Method m +where m.getName() = "" +select m, m.getReturnType() diff --git a/java/ql/test-kotlin2/library-tests/methods/dataClass.kt b/java/ql/test-kotlin2/library-tests/methods/dataClass.kt new file mode 100644 index 00000000000..c960238ca3a --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/methods/dataClass.kt @@ -0,0 +1 @@ +data class DataClass(val x: Int, var y: String) diff --git a/java/ql/test-kotlin2/library-tests/methods/delegates.kt b/java/ql/test-kotlin2/library-tests/methods/delegates.kt new file mode 100644 index 00000000000..cd475a51cec --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/methods/delegates.kt @@ -0,0 +1,12 @@ +import kotlin.properties.Delegates + +class MyClass { + val lazyProp by lazy { + 5 + } + + var observableProp: String by Delegates.observable("") { + prop, old, new -> + println("Was $old, now $new") + } +} diff --git a/java/ql/test-kotlin2/library-tests/methods/diagnostics.expected b/java/ql/test-kotlin2/library-tests/methods/diagnostics.expected new file mode 100644 index 00000000000..e69de29bb2d diff --git a/java/ql/test-kotlin2/library-tests/methods/diagnostics.ql b/java/ql/test-kotlin2/library-tests/methods/diagnostics.ql new file mode 100644 index 00000000000..1774650beff --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/methods/diagnostics.ql @@ -0,0 +1,4 @@ +import java +import semmle.code.java.Diagnostics + +select any(Diagnostic d | not d.toString().matches("Not rewriting trap file for%")) diff --git a/java/ql/test-kotlin2/library-tests/methods/enumClass.kt b/java/ql/test-kotlin2/library-tests/methods/enumClass.kt new file mode 100644 index 00000000000..9f3acad608a --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/methods/enumClass.kt @@ -0,0 +1,16 @@ +enum class EnumClass(val v: Int) { + enum1(1), + enum2(1) +} + +enum class EnumWithFunctions { + + VAL { + override fun f(i: Int) = i + override fun g(i: Int) = this.f(i) + i + }; + + abstract fun f(i: Int): Int + abstract fun g(i: Int): Int + +} diff --git a/java/ql/test-kotlin2/library-tests/methods/exprs.expected b/java/ql/test-kotlin2/library-tests/methods/exprs.expected new file mode 100644 index 00000000000..7c494f6e392 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/methods/exprs.expected @@ -0,0 +1,402 @@ +| clinit.kt:3:1:3:24 | ...=... | AssignExpr | +| clinit.kt:3:1:3:24 | ...=... | KtInitializerAssignExpr | +| clinit.kt:3:1:3:24 | | VarAccess | +| clinit.kt:3:1:3:24 | ClinitKt | TypeAccess | +| clinit.kt:3:1:3:24 | ClinitKt | TypeAccess | +| clinit.kt:3:1:3:24 | ClinitKt | TypeAccess | +| clinit.kt:3:1:3:24 | ClinitKt.topLevelInt | VarAccess | +| clinit.kt:3:1:3:24 | ClinitKt.topLevelInt | VarAccess | +| clinit.kt:3:1:3:24 | ClinitKt.topLevelInt | VarAccess | +| clinit.kt:3:1:3:24 | Unit | TypeAccess | +| clinit.kt:3:1:3:24 | int | TypeAccess | +| clinit.kt:3:1:3:24 | int | TypeAccess | +| clinit.kt:3:1:3:24 | int | TypeAccess | +| clinit.kt:3:24:3:24 | 0 | IntegerLiteral | +| dataClass.kt:0:0:0:0 | 0 | IntegerLiteral | +| dataClass.kt:0:0:0:0 | 0 | IntegerLiteral | +| dataClass.kt:0:0:0:0 | 1 | IntegerLiteral | +| dataClass.kt:0:0:0:0 | 2 | IntegerLiteral | +| dataClass.kt:0:0:0:0 | 31 | IntegerLiteral | +| dataClass.kt:0:0:0:0 | ")" | StringLiteral | +| dataClass.kt:0:0:0:0 | ", " | StringLiteral | +| dataClass.kt:0:0:0:0 | "..." | StringTemplateExpr | +| dataClass.kt:0:0:0:0 | "DataClass(" | StringLiteral | +| dataClass.kt:0:0:0:0 | "x=" | StringLiteral | +| dataClass.kt:0:0:0:0 | "y=" | StringLiteral | +| dataClass.kt:0:0:0:0 | (...)... | CastExpr | +| dataClass.kt:0:0:0:0 | ... !is ... | NotInstanceOfExpr | +| dataClass.kt:0:0:0:0 | ... & ... | AndBitwiseExpr | +| dataClass.kt:0:0:0:0 | ... & ... | AndBitwiseExpr | +| dataClass.kt:0:0:0:0 | ... (value not-equals) ... | ValueNEExpr | +| dataClass.kt:0:0:0:0 | ... (value not-equals) ... | ValueNEExpr | +| dataClass.kt:0:0:0:0 | ... * ... | MulExpr | +| dataClass.kt:0:0:0:0 | ... + ... | AddExpr | +| dataClass.kt:0:0:0:0 | ... == ... | EQExpr | +| dataClass.kt:0:0:0:0 | ... == ... | EQExpr | +| dataClass.kt:0:0:0:0 | ... == ... | EQExpr | +| dataClass.kt:0:0:0:0 | ...=... | AssignExpr | +| dataClass.kt:0:0:0:0 | ...=... | AssignExpr | +| dataClass.kt:0:0:0:0 | ...=... | AssignExpr | +| dataClass.kt:0:0:0:0 | DataClass | TypeAccess | +| dataClass.kt:0:0:0:0 | DataClass | TypeAccess | +| dataClass.kt:0:0:0:0 | DataClass | TypeAccess | +| dataClass.kt:0:0:0:0 | DataClass | TypeAccess | +| dataClass.kt:0:0:0:0 | DataClass | TypeAccess | +| dataClass.kt:0:0:0:0 | DataClass | TypeAccess | +| dataClass.kt:0:0:0:0 | Object | TypeAccess | +| dataClass.kt:0:0:0:0 | Object | TypeAccess | +| dataClass.kt:0:0:0:0 | String | TypeAccess | +| dataClass.kt:0:0:0:0 | String | TypeAccess | +| dataClass.kt:0:0:0:0 | String | TypeAccess | +| dataClass.kt:0:0:0:0 | boolean | TypeAccess | +| dataClass.kt:0:0:0:0 | copy(...) | MethodCall | +| dataClass.kt:0:0:0:0 | false | BooleanLiteral | +| dataClass.kt:0:0:0:0 | false | BooleanLiteral | +| dataClass.kt:0:0:0:0 | false | BooleanLiteral | +| dataClass.kt:0:0:0:0 | hashCode(...) | MethodCall | +| dataClass.kt:0:0:0:0 | hashCode(...) | MethodCall | +| dataClass.kt:0:0:0:0 | int | TypeAccess | +| dataClass.kt:0:0:0:0 | int | TypeAccess | +| dataClass.kt:0:0:0:0 | int | TypeAccess | +| dataClass.kt:0:0:0:0 | int | TypeAccess | +| dataClass.kt:0:0:0:0 | new DataClass(...) | ClassInstanceExpr | +| dataClass.kt:0:0:0:0 | other | VarAccess | +| dataClass.kt:0:0:0:0 | other | VarAccess | +| dataClass.kt:0:0:0:0 | other | VarAccess | +| dataClass.kt:0:0:0:0 | p0 | VarAccess | +| dataClass.kt:0:0:0:0 | p0 | VarAccess | +| dataClass.kt:0:0:0:0 | p0 | VarAccess | +| dataClass.kt:0:0:0:0 | p0.x | VarAccess | +| dataClass.kt:0:0:0:0 | p0.y | VarAccess | +| dataClass.kt:0:0:0:0 | p1 | VarAccess | +| dataClass.kt:0:0:0:0 | p1 | VarAccess | +| dataClass.kt:0:0:0:0 | p2 | VarAccess | +| dataClass.kt:0:0:0:0 | p2 | VarAccess | +| dataClass.kt:0:0:0:0 | p3 | VarAccess | +| dataClass.kt:0:0:0:0 | p3 | VarAccess | +| dataClass.kt:0:0:0:0 | result | LocalVariableDeclExpr | +| dataClass.kt:0:0:0:0 | result | VarAccess | +| dataClass.kt:0:0:0:0 | result | VarAccess | +| dataClass.kt:0:0:0:0 | result | VarAccess | +| dataClass.kt:0:0:0:0 | this | ThisAccess | +| dataClass.kt:0:0:0:0 | this | ThisAccess | +| dataClass.kt:0:0:0:0 | this | ThisAccess | +| dataClass.kt:0:0:0:0 | this | ThisAccess | +| dataClass.kt:0:0:0:0 | this | ThisAccess | +| dataClass.kt:0:0:0:0 | this | ThisAccess | +| dataClass.kt:0:0:0:0 | this | ThisAccess | +| dataClass.kt:0:0:0:0 | this | ThisAccess | +| dataClass.kt:0:0:0:0 | this | ThisAccess | +| dataClass.kt:0:0:0:0 | this.x | VarAccess | +| dataClass.kt:0:0:0:0 | this.x | VarAccess | +| dataClass.kt:0:0:0:0 | this.x | VarAccess | +| dataClass.kt:0:0:0:0 | this.x | VarAccess | +| dataClass.kt:0:0:0:0 | this.y | VarAccess | +| dataClass.kt:0:0:0:0 | this.y | VarAccess | +| dataClass.kt:0:0:0:0 | this.y | VarAccess | +| dataClass.kt:0:0:0:0 | this.y | VarAccess | +| dataClass.kt:0:0:0:0 | tmp0_other_with_cast | LocalVariableDeclExpr | +| dataClass.kt:0:0:0:0 | tmp0_other_with_cast | VarAccess | +| dataClass.kt:0:0:0:0 | tmp0_other_with_cast | VarAccess | +| dataClass.kt:0:0:0:0 | tmp0_other_with_cast.x | VarAccess | +| dataClass.kt:0:0:0:0 | tmp0_other_with_cast.y | VarAccess | +| dataClass.kt:0:0:0:0 | true | BooleanLiteral | +| dataClass.kt:0:0:0:0 | true | BooleanLiteral | +| dataClass.kt:0:0:0:0 | when ... | WhenExpr | +| dataClass.kt:0:0:0:0 | when ... | WhenExpr | +| dataClass.kt:0:0:0:0 | when ... | WhenExpr | +| dataClass.kt:0:0:0:0 | when ... | WhenExpr | +| dataClass.kt:0:0:0:0 | x | VarAccess | +| dataClass.kt:0:0:0:0 | y | VarAccess | +| dataClass.kt:1:22:1:31 | ...=... | KtInitializerAssignExpr | +| dataClass.kt:1:22:1:31 | int | TypeAccess | +| dataClass.kt:1:22:1:31 | int | TypeAccess | +| dataClass.kt:1:22:1:31 | int | TypeAccess | +| dataClass.kt:1:22:1:31 | int | TypeAccess | +| dataClass.kt:1:22:1:31 | this | ThisAccess | +| dataClass.kt:1:22:1:31 | this.x | VarAccess | +| dataClass.kt:1:22:1:31 | x | VarAccess | +| dataClass.kt:1:22:1:31 | x | VarAccess | +| dataClass.kt:1:34:1:46 | ...=... | AssignExpr | +| dataClass.kt:1:34:1:46 | ...=... | KtInitializerAssignExpr | +| dataClass.kt:1:34:1:46 | | VarAccess | +| dataClass.kt:1:34:1:46 | String | TypeAccess | +| dataClass.kt:1:34:1:46 | String | TypeAccess | +| dataClass.kt:1:34:1:46 | String | TypeAccess | +| dataClass.kt:1:34:1:46 | String | TypeAccess | +| dataClass.kt:1:34:1:46 | String | TypeAccess | +| dataClass.kt:1:34:1:46 | Unit | TypeAccess | +| dataClass.kt:1:34:1:46 | this | ThisAccess | +| dataClass.kt:1:34:1:46 | this | ThisAccess | +| dataClass.kt:1:34:1:46 | this.y | VarAccess | +| dataClass.kt:1:34:1:46 | this.y | VarAccess | +| dataClass.kt:1:34:1:46 | y | VarAccess | +| dataClass.kt:1:34:1:46 | y | VarAccess | +| delegates.kt:1:9:1:12 | this | ThisAccess | +| delegates.kt:1:9:1:12 | this | ThisAccess | +| delegates.kt:1:9:1:12 | this | ThisAccess | +| delegates.kt:4:18:6:5 | ...::... | PropertyRefExpr | +| delegates.kt:4:18:6:5 | ...=... | KtInitializerAssignExpr | +| delegates.kt:4:18:6:5 | Integer | TypeAccess | +| delegates.kt:4:18:6:5 | Integer | TypeAccess | +| delegates.kt:4:18:6:5 | Integer | TypeAccess | +| delegates.kt:4:18:6:5 | KProperty1 | TypeAccess | +| delegates.kt:4:18:6:5 | Lazy | TypeAccess | +| delegates.kt:4:18:6:5 | LazyKt | TypeAccess | +| delegates.kt:4:18:6:5 | MyClass | TypeAccess | +| delegates.kt:4:18:6:5 | a0 | VarAccess | +| delegates.kt:4:18:6:5 | a0 | VarAccess | +| delegates.kt:4:18:6:5 | get(...) | MethodCall | +| delegates.kt:4:18:6:5 | getLazyProp(...) | MethodCall | +| delegates.kt:4:18:6:5 | getValue(...) | MethodCall | +| delegates.kt:4:18:6:5 | int | TypeAccess | +| delegates.kt:4:18:6:5 | lazyProp$delegate | VarAccess | +| delegates.kt:4:18:6:5 | this | ThisAccess | +| delegates.kt:4:18:6:5 | this | ThisAccess | +| delegates.kt:4:18:6:5 | this.lazyProp$delegate | VarAccess | +| delegates.kt:4:21:6:5 | Integer | TypeAccess | +| delegates.kt:4:21:6:5 | LazyKt | TypeAccess | +| delegates.kt:4:21:6:5 | lazy(...) | MethodCall | +| delegates.kt:4:26:6:5 | ...->... | LambdaExpr | +| delegates.kt:4:26:6:5 | Function0 | TypeAccess | +| delegates.kt:4:26:6:5 | Integer | TypeAccess | +| delegates.kt:4:26:6:5 | int | TypeAccess | +| delegates.kt:5:9:5:9 | 5 | IntegerLiteral | +| delegates.kt:8:32:11:5 | ...::... | PropertyRefExpr | +| delegates.kt:8:32:11:5 | ...::... | PropertyRefExpr | +| delegates.kt:8:32:11:5 | ...=... | KtInitializerAssignExpr | +| delegates.kt:8:32:11:5 | KMutableProperty1 | TypeAccess | +| delegates.kt:8:32:11:5 | KMutableProperty1 | TypeAccess | +| delegates.kt:8:32:11:5 | MyClass | TypeAccess | +| delegates.kt:8:32:11:5 | MyClass | TypeAccess | +| delegates.kt:8:32:11:5 | Object | TypeAccess | +| delegates.kt:8:32:11:5 | ReadWriteProperty | TypeAccess | +| delegates.kt:8:32:11:5 | String | TypeAccess | +| delegates.kt:8:32:11:5 | String | TypeAccess | +| delegates.kt:8:32:11:5 | String | TypeAccess | +| delegates.kt:8:32:11:5 | String | TypeAccess | +| delegates.kt:8:32:11:5 | String | TypeAccess | +| delegates.kt:8:32:11:5 | Unit | TypeAccess | +| delegates.kt:8:32:11:5 | a0 | VarAccess | +| delegates.kt:8:32:11:5 | a0 | VarAccess | +| delegates.kt:8:32:11:5 | a0 | VarAccess | +| delegates.kt:8:32:11:5 | a0 | VarAccess | +| delegates.kt:8:32:11:5 | a0 | VarAccess | +| delegates.kt:8:32:11:5 | a0 | VarAccess | +| delegates.kt:8:32:11:5 | a1 | VarAccess | +| delegates.kt:8:32:11:5 | a1 | VarAccess | +| delegates.kt:8:32:11:5 | get(...) | MethodCall | +| delegates.kt:8:32:11:5 | get(...) | MethodCall | +| delegates.kt:8:32:11:5 | getObservableProp(...) | MethodCall | +| delegates.kt:8:32:11:5 | getObservableProp(...) | MethodCall | +| delegates.kt:8:32:11:5 | getValue(...) | MethodCall | +| delegates.kt:8:32:11:5 | observableProp$delegate | VarAccess | +| delegates.kt:8:32:11:5 | setObservableProp(...) | MethodCall | +| delegates.kt:8:32:11:5 | setObservableProp(...) | MethodCall | +| delegates.kt:8:32:11:5 | setValue(...) | MethodCall | +| delegates.kt:8:32:11:5 | this | ThisAccess | +| delegates.kt:8:32:11:5 | this | ThisAccess | +| delegates.kt:8:32:11:5 | this | ThisAccess | +| delegates.kt:8:32:11:5 | this | ThisAccess | +| delegates.kt:8:32:11:5 | this.observableProp$delegate | VarAccess | +| delegates.kt:8:32:11:5 | this.observableProp$delegate | VarAccess | +| delegates.kt:8:35:8:43 | INSTANCE | VarAccess | +| delegates.kt:8:35:11:5 | | VarAccess | +| delegates.kt:8:35:11:5 | String | TypeAccess | +| delegates.kt:8:35:11:5 | observable(...) | MethodCall | +| delegates.kt:8:57:8:62 | "" | StringLiteral | +| delegates.kt:8:66:11:5 | ...->... | LambdaExpr | +| delegates.kt:8:66:11:5 | Function3,String,String,Unit> | TypeAccess | +| delegates.kt:8:66:11:5 | KProperty | TypeAccess | +| delegates.kt:8:66:11:5 | String | TypeAccess | +| delegates.kt:8:66:11:5 | String | TypeAccess | +| delegates.kt:8:66:11:5 | Unit | TypeAccess | +| delegates.kt:8:66:11:5 | Unit | TypeAccess | +| delegates.kt:9:9:9:12 | ? ... | WildcardTypeAccess | +| delegates.kt:9:9:9:12 | KProperty | TypeAccess | +| delegates.kt:9:15:9:17 | String | TypeAccess | +| delegates.kt:9:20:9:22 | String | TypeAccess | +| delegates.kt:10:9:10:37 | ConsoleKt | TypeAccess | +| delegates.kt:10:9:10:37 | println(...) | MethodCall | +| delegates.kt:10:17:10:36 | "..." | StringTemplateExpr | +| delegates.kt:10:18:10:21 | "Was " | StringLiteral | +| delegates.kt:10:23:10:25 | old | VarAccess | +| delegates.kt:10:26:10:31 | ", now " | StringLiteral | +| delegates.kt:10:33:10:35 | new | VarAccess | +| enumClass.kt:0:0:0:0 | EnumClass | TypeAccess | +| enumClass.kt:0:0:0:0 | EnumClass | TypeAccess | +| enumClass.kt:0:0:0:0 | EnumClass | TypeAccess | +| enumClass.kt:0:0:0:0 | EnumClass[] | TypeAccess | +| enumClass.kt:0:0:0:0 | EnumEntries | TypeAccess | +| enumClass.kt:0:0:0:0 | EnumEntries | TypeAccess | +| enumClass.kt:0:0:0:0 | EnumWithFunctions | TypeAccess | +| enumClass.kt:0:0:0:0 | EnumWithFunctions | TypeAccess | +| enumClass.kt:0:0:0:0 | EnumWithFunctions | TypeAccess | +| enumClass.kt:0:0:0:0 | EnumWithFunctions[] | TypeAccess | +| enumClass.kt:0:0:0:0 | String | TypeAccess | +| enumClass.kt:0:0:0:0 | String | TypeAccess | +| enumClass.kt:1:1:4:1 | 0 | IntegerLiteral | +| enumClass.kt:1:1:4:1 | Enum | TypeAccess | +| enumClass.kt:1:1:4:1 | EnumClass | TypeAccess | +| enumClass.kt:1:1:4:1 | new Enum(...) | ClassInstanceExpr | +| enumClass.kt:1:1:4:1 | null | NullLiteral | +| enumClass.kt:1:22:1:31 | ...=... | KtInitializerAssignExpr | +| enumClass.kt:1:22:1:31 | int | TypeAccess | +| enumClass.kt:1:22:1:31 | int | TypeAccess | +| enumClass.kt:1:22:1:31 | int | TypeAccess | +| enumClass.kt:1:22:1:31 | this | ThisAccess | +| enumClass.kt:1:22:1:31 | this.v | VarAccess | +| enumClass.kt:1:22:1:31 | v | VarAccess | +| enumClass.kt:1:22:1:31 | v | VarAccess | +| enumClass.kt:2:5:2:13 | ...=... | KtInitializerAssignExpr | +| enumClass.kt:2:5:2:13 | EnumClass | TypeAccess | +| enumClass.kt:2:5:2:13 | EnumClass | TypeAccess | +| enumClass.kt:2:5:2:13 | EnumClass | TypeAccess | +| enumClass.kt:2:5:2:13 | EnumClass.enum1 | VarAccess | +| enumClass.kt:2:5:2:13 | new EnumClass(...) | ClassInstanceExpr | +| enumClass.kt:2:11:2:11 | 1 | IntegerLiteral | +| enumClass.kt:3:5:3:12 | ...=... | KtInitializerAssignExpr | +| enumClass.kt:3:5:3:12 | EnumClass | TypeAccess | +| enumClass.kt:3:5:3:12 | EnumClass | TypeAccess | +| enumClass.kt:3:5:3:12 | EnumClass | TypeAccess | +| enumClass.kt:3:5:3:12 | EnumClass.enum2 | VarAccess | +| enumClass.kt:3:5:3:12 | new EnumClass(...) | ClassInstanceExpr | +| enumClass.kt:3:11:3:11 | 1 | IntegerLiteral | +| enumClass.kt:6:1:16:1 | 0 | IntegerLiteral | +| enumClass.kt:6:1:16:1 | Enum | TypeAccess | +| enumClass.kt:6:1:16:1 | EnumWithFunctions | TypeAccess | +| enumClass.kt:6:1:16:1 | new Enum(...) | ClassInstanceExpr | +| enumClass.kt:6:1:16:1 | null | NullLiteral | +| enumClass.kt:8:3:11:4 | ...=... | KtInitializerAssignExpr | +| enumClass.kt:8:3:11:4 | | ImplicitCoercionToUnitExpr | +| enumClass.kt:8:3:11:4 | EnumWithFunctions | TypeAccess | +| enumClass.kt:8:3:11:4 | EnumWithFunctions | TypeAccess | +| enumClass.kt:8:3:11:4 | EnumWithFunctions | TypeAccess | +| enumClass.kt:8:3:11:4 | EnumWithFunctions.VAL | VarAccess | +| enumClass.kt:8:3:11:4 | Unit | TypeAccess | +| enumClass.kt:8:3:11:4 | VAL | TypeAccess | +| enumClass.kt:8:3:11:4 | new EnumWithFunctions(...) | ClassInstanceExpr | +| enumClass.kt:8:3:11:4 | new VAL(...) | ClassInstanceExpr | +| enumClass.kt:9:14:9:30 | int | TypeAccess | +| enumClass.kt:9:20:9:25 | int | TypeAccess | +| enumClass.kt:9:30:9:30 | i | VarAccess | +| enumClass.kt:10:14:10:42 | int | TypeAccess | +| enumClass.kt:10:20:10:25 | int | TypeAccess | +| enumClass.kt:10:30:10:33 | this | ThisAccess | +| enumClass.kt:10:30:10:38 | f(...) | MethodCall | +| enumClass.kt:10:30:10:42 | ... + ... | AddExpr | +| enumClass.kt:10:37:10:37 | i | VarAccess | +| enumClass.kt:10:42:10:42 | i | VarAccess | +| enumClass.kt:13:12:13:29 | int | TypeAccess | +| enumClass.kt:13:18:13:23 | int | TypeAccess | +| enumClass.kt:14:12:14:29 | int | TypeAccess | +| enumClass.kt:14:18:14:23 | int | TypeAccess | +| methods2.kt:4:1:5:1 | Unit | TypeAccess | +| methods2.kt:4:26:4:31 | int | TypeAccess | +| methods2.kt:4:34:4:39 | int | TypeAccess | +| methods2.kt:8:5:9:5 | Unit | TypeAccess | +| methods2.kt:8:27:8:32 | int | TypeAccess | +| methods2.kt:8:35:8:40 | int | TypeAccess | +| methods3.kt:3:1:3:49 | 0 | IntegerLiteral | +| methods3.kt:3:1:3:49 | 1 | IntegerLiteral | +| methods3.kt:3:1:3:49 | ... & ... | AndBitwiseExpr | +| methods3.kt:3:1:3:49 | ... == ... | EQExpr | +| methods3.kt:3:1:3:49 | ...=... | AssignExpr | +| methods3.kt:3:1:3:49 | Methods3Kt | TypeAccess | +| methods3.kt:3:1:3:49 | Object | TypeAccess | +| methods3.kt:3:1:3:49 | String | TypeAccess | +| methods3.kt:3:1:3:49 | Unit | TypeAccess | +| methods3.kt:3:1:3:49 | Unit | TypeAccess | +| methods3.kt:3:1:3:49 | fooBarTopLevelMethodExt(...) | MethodCall | +| methods3.kt:3:1:3:49 | int | TypeAccess | +| methods3.kt:3:1:3:49 | int | TypeAccess | +| methods3.kt:3:1:3:49 | p1 | VarAccess | +| methods3.kt:3:1:3:49 | p1 | VarAccess | +| methods3.kt:3:1:3:49 | p2 | VarAccess | +| methods3.kt:3:1:3:49 | this | ExtensionReceiverAccess | +| methods3.kt:3:5:3:10 | String | TypeAccess | +| methods3.kt:3:36:3:45 | int | TypeAccess | +| methods3.kt:3:45:3:45 | 1 | IntegerLiteral | +| methods3.kt:6:5:6:45 | 0 | IntegerLiteral | +| methods3.kt:6:5:6:45 | 1 | IntegerLiteral | +| methods3.kt:6:5:6:45 | ... & ... | AndBitwiseExpr | +| methods3.kt:6:5:6:45 | ... == ... | EQExpr | +| methods3.kt:6:5:6:45 | ...=... | AssignExpr | +| methods3.kt:6:5:6:45 | Class3 | TypeAccess | +| methods3.kt:6:5:6:45 | Object | TypeAccess | +| methods3.kt:6:5:6:45 | String | TypeAccess | +| methods3.kt:6:5:6:45 | Unit | TypeAccess | +| methods3.kt:6:5:6:45 | Unit | TypeAccess | +| methods3.kt:6:5:6:45 | fooBarMethodExt(...) | MethodCall | +| methods3.kt:6:5:6:45 | int | TypeAccess | +| methods3.kt:6:5:6:45 | int | TypeAccess | +| methods3.kt:6:5:6:45 | p0 | VarAccess | +| methods3.kt:6:5:6:45 | p2 | VarAccess | +| methods3.kt:6:5:6:45 | p2 | VarAccess | +| methods3.kt:6:5:6:45 | p3 | VarAccess | +| methods3.kt:6:5:6:45 | this | ExtensionReceiverAccess | +| methods3.kt:6:9:6:14 | String | TypeAccess | +| methods3.kt:6:32:6:41 | int | TypeAccess | +| methods3.kt:6:41:6:41 | 1 | IntegerLiteral | +| methods4.kt:7:5:7:34 | Unit | TypeAccess | +| methods4.kt:7:11:7:29 | InsideNestedTest | TypeAccess | +| methods5.kt:3:1:11:1 | Unit | TypeAccess | +| methods5.kt:4:7:4:7 | x | LocalVariableDeclExpr | +| methods5.kt:4:11:4:11 | 5 | IntegerLiteral | +| methods5.kt:5:3:5:27 | int | TypeAccess | +| methods5.kt:5:13:5:18 | int | TypeAccess | +| methods5.kt:5:23:5:23 | i | VarAccess | +| methods5.kt:5:23:5:27 | ... + ... | AddExpr | +| methods5.kt:5:27:5:27 | x | VarAccess | +| methods5.kt:6:3:6:3 | x | VarAccess | +| methods5.kt:6:3:6:7 | ...=... | AssignExpr | +| methods5.kt:6:7:6:7 | 6 | IntegerLiteral | +| methods5.kt:7:3:7:15 | | ImplicitCoercionToUnitExpr | +| methods5.kt:7:3:7:15 | Object | TypeAccess | +| methods5.kt:7:3:7:15 | String | TypeAccess | +| methods5.kt:7:3:7:15 | Unit | TypeAccess | +| methods5.kt:7:3:7:15 | a(...) | MethodCall | +| methods5.kt:7:3:7:15 | new (...) | ClassInstanceExpr | +| methods5.kt:7:13:7:14 | 42 | IntegerLiteral | +| methods5.kt:8:3:8:3 | x | VarAccess | +| methods5.kt:8:3:8:7 | ...=... | AssignExpr | +| methods5.kt:8:7:8:7 | 7 | IntegerLiteral | +| methods5.kt:9:3:9:32 | int | TypeAccess | +| methods5.kt:9:12:9:17 | C1 | TypeAccess | +| methods5.kt:9:12:9:17 | T1 | TypeAccess | +| methods5.kt:9:22:9:27 | int | TypeAccess | +| methods5.kt:9:32:9:32 | 5 | IntegerLiteral | +| methods5.kt:10:3:10:11 | C1 | TypeAccess | +| methods5.kt:10:3:10:11 | Integer | TypeAccess | +| methods5.kt:10:3:10:11 | new C1(...) | ClassInstanceExpr | +| methods5.kt:10:3:10:18 | Integer | TypeAccess | +| methods5.kt:10:3:10:18 | Object | TypeAccess | +| methods5.kt:10:3:10:18 | f1(...) | MethodCall | +| methods5.kt:10:3:10:18 | new (...) | ClassInstanceExpr | +| methods5.kt:10:13:10:18 | | ImplicitCoercionToUnitExpr | +| methods5.kt:10:13:10:18 | Unit | TypeAccess | +| methods5.kt:10:16:10:17 | 42 | IntegerLiteral | +| methods6.kt:3:9:4:1 | Unit | TypeAccess | +| methods.kt:2:1:3:1 | Unit | TypeAccess | +| methods.kt:2:20:2:25 | int | TypeAccess | +| methods.kt:2:28:2:33 | int | TypeAccess | +| methods.kt:6:5:7:5 | Unit | TypeAccess | +| methods.kt:6:21:6:26 | int | TypeAccess | +| methods.kt:6:29:6:34 | int | TypeAccess | +| methods.kt:9:5:12:5 | Unit | TypeAccess | +| methods.kt:9:28:9:33 | int | TypeAccess | +| methods.kt:9:36:9:41 | int | TypeAccess | +| methods.kt:10:9:10:25 | classMethod(...) | MethodCall | +| methods.kt:10:9:10:25 | this | ThisAccess | +| methods.kt:10:21:10:21 | a | VarAccess | +| methods.kt:10:24:10:24 | 3 | IntegerLiteral | +| methods.kt:11:9:11:28 | MethodsKt | TypeAccess | +| methods.kt:11:9:11:28 | topLevelMethod(...) | MethodCall | +| methods.kt:11:24:11:24 | b | VarAccess | +| methods.kt:11:27:11:27 | 4 | IntegerLiteral | +| methods.kt:14:12:14:29 | Unit | TypeAccess | +| methods.kt:15:15:15:35 | Unit | TypeAccess | +| methods.kt:16:13:16:31 | Unit | TypeAccess | +| methods.kt:17:14:17:33 | Unit | TypeAccess | +| methods.kt:18:5:18:36 | Unit | TypeAccess | +| methods.kt:19:12:19:29 | Unit | TypeAccess | diff --git a/java/ql/test-kotlin2/library-tests/methods/exprs.ql b/java/ql/test-kotlin2/library-tests/methods/exprs.ql new file mode 100644 index 00000000000..c2ae4f55ac7 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/methods/exprs.ql @@ -0,0 +1,5 @@ +import java + +from Expr e +where e.getFile().isSourceFile() +select e, e.getPrimaryQlClasses() diff --git a/java/ql/test-kotlin2/library-tests/methods/methods.expected b/java/ql/test-kotlin2/library-tests/methods/methods.expected new file mode 100644 index 00000000000..b1550468e0a --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/methods/methods.expected @@ -0,0 +1,92 @@ +methods +| clinit.kt:0:0:0:0 | ClinitKt | clinit.kt:0:0:0:0 | | () | static | Compiler generated | +| clinit.kt:0:0:0:0 | ClinitKt | clinit.kt:3:1:3:24 | getTopLevelInt | getTopLevelInt() | final, public, static | Compiler generated | +| clinit.kt:0:0:0:0 | ClinitKt | clinit.kt:3:1:3:24 | setTopLevelInt | setTopLevelInt(int) | final, public, static | Compiler generated | +| dataClass.kt:1:1:1:47 | DataClass | dataClass.kt:0:0:0:0 | equals | equals(java.lang.Object) | override, public | Compiler generated | +| dataClass.kt:1:1:1:47 | DataClass | dataClass.kt:0:0:0:0 | hashCode | hashCode() | override, public | Compiler generated | +| dataClass.kt:1:1:1:47 | DataClass | dataClass.kt:0:0:0:0 | toString | toString() | override, public | Compiler generated | +| dataClass.kt:1:1:1:47 | DataClass | dataClass.kt:1:1:1:47 | copy | copy(int,java.lang.String) | final, public | Compiler generated | +| dataClass.kt:1:1:1:47 | DataClass | dataClass.kt:1:1:1:47 | copy$default | copy$default(DataClass,int,java.lang.String,int,java.lang.Object) | public, static | Compiler generated | +| dataClass.kt:1:1:1:47 | DataClass | dataClass.kt:1:22:1:31 | component1 | component1() | final, public | Compiler generated | +| dataClass.kt:1:1:1:47 | DataClass | dataClass.kt:1:22:1:31 | getX | getX() | final, public | Compiler generated | +| dataClass.kt:1:1:1:47 | DataClass | dataClass.kt:1:34:1:46 | component2 | component2() | final, public | Compiler generated | +| dataClass.kt:1:1:1:47 | DataClass | dataClass.kt:1:34:1:46 | getY | getY() | final, public | Compiler generated | +| dataClass.kt:1:1:1:47 | DataClass | dataClass.kt:1:34:1:46 | setY | setY(java.lang.String) | final, public | Compiler generated | +| delegates.kt:3:1:12:1 | MyClass | delegates.kt:4:5:6:5 | getLazyProp | getLazyProp() | final, public | Compiler generated | +| delegates.kt:3:1:12:1 | MyClass | delegates.kt:8:5:11:5 | getObservableProp | getObservableProp() | final, public | Compiler generated | +| delegates.kt:3:1:12:1 | MyClass | delegates.kt:8:5:11:5 | setObservableProp | setObservableProp(java.lang.String) | final, public | Compiler generated | +| delegates.kt:4:21:6:5 | new KProperty1(...) { ... } | delegates.kt:4:21:6:5 | get | get(MyClass) | override, public | | +| delegates.kt:4:21:6:5 | new KProperty1(...) { ... } | delegates.kt:4:21:6:5 | invoke | invoke(MyClass) | override, public | | +| delegates.kt:4:26:6:5 | new Function0(...) { ... } | delegates.kt:4:26:6:5 | invoke | invoke() | final, override, public | | +| delegates.kt:8:35:11:5 | new KMutableProperty1(...) { ... } | delegates.kt:8:35:11:5 | get | get(MyClass) | override, public | | +| delegates.kt:8:35:11:5 | new KMutableProperty1(...) { ... } | delegates.kt:8:35:11:5 | get | get(MyClass) | override, public | | +| delegates.kt:8:35:11:5 | new KMutableProperty1(...) { ... } | delegates.kt:8:35:11:5 | invoke | invoke(MyClass) | override, public | | +| delegates.kt:8:35:11:5 | new KMutableProperty1(...) { ... } | delegates.kt:8:35:11:5 | invoke | invoke(MyClass) | override, public | | +| delegates.kt:8:35:11:5 | new KMutableProperty1(...) { ... } | delegates.kt:8:35:11:5 | set | set(MyClass,java.lang.String) | override, public | | +| delegates.kt:8:35:11:5 | new KMutableProperty1(...) { ... } | delegates.kt:8:35:11:5 | set | set(MyClass,java.lang.String) | override, public | | +| delegates.kt:8:66:11:5 | new Function3,String,String,Unit>(...) { ... } | delegates.kt:8:66:11:5 | invoke | invoke(kotlin.reflect.KProperty,java.lang.String,java.lang.String) | final, override, public | | +| enumClass.kt:1:1:4:1 | EnumClass | enumClass.kt:0:0:0:0 | | () | static | Compiler generated | +| enumClass.kt:1:1:4:1 | EnumClass | enumClass.kt:1:1:4:1 | getEntries | getEntries() | final, public, static | Compiler generated | +| enumClass.kt:1:1:4:1 | EnumClass | enumClass.kt:1:1:4:1 | valueOf | valueOf(java.lang.String) | final, public, static | Compiler generated | +| enumClass.kt:1:1:4:1 | EnumClass | enumClass.kt:1:1:4:1 | values | values() | final, public, static | Compiler generated | +| enumClass.kt:1:1:4:1 | EnumClass | enumClass.kt:1:22:1:31 | getV | getV() | final, public | Compiler generated | +| enumClass.kt:6:1:16:1 | EnumWithFunctions | enumClass.kt:0:0:0:0 | | () | static | Compiler generated | +| enumClass.kt:6:1:16:1 | EnumWithFunctions | enumClass.kt:6:1:16:1 | getEntries | getEntries() | final, public, static | Compiler generated | +| enumClass.kt:6:1:16:1 | EnumWithFunctions | enumClass.kt:6:1:16:1 | valueOf | valueOf(java.lang.String) | final, public, static | Compiler generated | +| enumClass.kt:6:1:16:1 | EnumWithFunctions | enumClass.kt:6:1:16:1 | values | values() | final, public, static | Compiler generated | +| enumClass.kt:6:1:16:1 | EnumWithFunctions | enumClass.kt:13:3:13:29 | f | f(int) | abstract, public | | +| enumClass.kt:6:1:16:1 | EnumWithFunctions | enumClass.kt:14:3:14:29 | g | g(int) | abstract, public | | +| enumClass.kt:8:3:11:4 | VAL | enumClass.kt:9:5:9:30 | f | f(int) | override, public | | +| enumClass.kt:8:3:11:4 | VAL | enumClass.kt:10:5:10:42 | g | g(int) | override, public | | +| methods2.kt:0:0:0:0 | Methods2Kt | methods2.kt:4:1:5:1 | fooBarTopLevelMethod | fooBarTopLevelMethod(int,int) | final, public, static | | +| methods2.kt:7:1:10:1 | Class2 | methods2.kt:8:5:9:5 | fooBarClassMethod | fooBarClassMethod(int,int) | final, public | | +| methods3.kt:0:0:0:0 | Methods3Kt | methods3.kt:3:1:3:49 | fooBarTopLevelMethodExt | fooBarTopLevelMethodExt(java.lang.String,int) | final, public, static | | +| methods3.kt:0:0:0:0 | Methods3Kt | methods3.kt:3:1:3:49 | fooBarTopLevelMethodExt$default | fooBarTopLevelMethodExt$default(java.lang.String,int,int,java.lang.Object) | public, static | Compiler generated | +| methods3.kt:5:1:7:1 | Class3 | methods3.kt:6:5:6:45 | fooBarMethodExt | fooBarMethodExt(java.lang.String,int) | final, public | | +| methods3.kt:5:1:7:1 | Class3 | methods3.kt:6:5:6:45 | fooBarMethodExt$default | fooBarMethodExt$default(foo.bar.Class3,java.lang.String,int,int,java.lang.Object) | public, static | Compiler generated | +| methods4.kt:5:3:9:3 | InsideNestedTest | methods4.kt:7:5:7:34 | m | m(foo.bar.NestedTest.InsideNestedTest) | final, public | | +| methods5.kt:0:0:0:0 | Methods5Kt | methods5.kt:3:1:11:1 | x | x() | final, public, static | | +| methods5.kt:5:3:5:27 | | methods5.kt:5:3:5:27 | a | a(int) | final, public | | +| methods5.kt:9:3:9:32 | | methods5.kt:9:3:9:32 | f1 | f1(foo.bar.C1,int) | final, public | | +| methods6.kt:0:0:0:0 | Methods6Kt | methods6.kt:3:1:4:1 | s | s() | final, public, static, suspend | | +| methods.kt:0:0:0:0 | MethodsKt | methods.kt:2:1:3:1 | topLevelMethod | topLevelMethod(int,int) | final, public, static | | +| methods.kt:5:1:20:1 | Class | methods.kt:6:5:7:5 | classMethod | classMethod(int,int) | final, public | | +| methods.kt:5:1:20:1 | Class | methods.kt:9:5:12:5 | anotherClassMethod | anotherClassMethod(int,int) | final, public | | +| methods.kt:5:1:20:1 | Class | methods.kt:14:5:14:29 | publicFun | publicFun() | final, public | | +| methods.kt:5:1:20:1 | Class | methods.kt:15:5:15:35 | protectedFun | protectedFun() | final, protected | | +| methods.kt:5:1:20:1 | Class | methods.kt:16:5:16:31 | privateFun | privateFun() | final, private | | +| methods.kt:5:1:20:1 | Class | methods.kt:17:5:17:33 | internalFun$main | internalFun$main() | final, internal | | +| methods.kt:5:1:20:1 | Class | methods.kt:18:5:18:36 | noExplicitVisibilityFun | noExplicitVisibilityFun() | final, public | | +| methods.kt:5:1:20:1 | Class | methods.kt:19:5:19:29 | inlineFun | inlineFun() | final, inline, public | | +constructors +| dataClass.kt:1:1:1:47 | DataClass | dataClass.kt:1:21:1:47 | DataClass | DataClass(int,java.lang.String) | +| delegates.kt:3:1:12:1 | MyClass | delegates.kt:3:1:12:1 | MyClass | MyClass() | +| delegates.kt:4:21:6:5 | new KProperty1(...) { ... } | delegates.kt:4:21:6:5 | | | +| delegates.kt:4:26:6:5 | new Function0(...) { ... } | delegates.kt:4:26:6:5 | | | +| delegates.kt:8:35:11:5 | new KMutableProperty1(...) { ... } | delegates.kt:8:35:11:5 | | | +| delegates.kt:8:35:11:5 | new KMutableProperty1(...) { ... } | delegates.kt:8:35:11:5 | | | +| delegates.kt:8:66:11:5 | new Function3,String,String,Unit>(...) { ... } | delegates.kt:8:66:11:5 | | | +| enumClass.kt:1:1:4:1 | EnumClass | enumClass.kt:1:21:1:32 | EnumClass | EnumClass(int) | +| enumClass.kt:6:1:16:1 | EnumWithFunctions | enumClass.kt:6:1:16:1 | EnumWithFunctions | EnumWithFunctions() | +| enumClass.kt:8:3:11:4 | VAL | enumClass.kt:8:3:11:4 | VAL | VAL() | +| methods2.kt:7:1:10:1 | Class2 | methods2.kt:7:1:10:1 | Class2 | Class2() | +| methods3.kt:5:1:7:1 | Class3 | methods3.kt:5:1:7:1 | Class3 | Class3() | +| methods4.kt:3:1:11:1 | NestedTest | methods4.kt:3:1:11:1 | NestedTest | NestedTest() | +| methods4.kt:5:3:9:3 | InsideNestedTest | methods4.kt:5:3:9:3 | InsideNestedTest | InsideNestedTest() | +| methods5.kt:5:3:5:27 | | methods5.kt:5:3:5:27 | | | +| methods5.kt:9:3:9:32 | | methods5.kt:9:3:9:32 | | | +| methods5.kt:13:1:13:14 | C1 | methods5.kt:13:1:13:14 | C1 | C1() | +| methods.kt:5:1:20:1 | Class | methods.kt:5:1:20:1 | Class | Class() | +extensions +| methods3.kt:3:1:3:49 | fooBarTopLevelMethodExt | file:///modules/java.base/java/lang/String.class:0:0:0:0 | String | +| methods3.kt:3:1:3:49 | fooBarTopLevelMethodExt$default | file:///modules/java.base/java/lang/String.class:0:0:0:0 | String | +| methods3.kt:6:5:6:45 | fooBarMethodExt | file:///modules/java.base/java/lang/String.class:0:0:0:0 | String | +| methods3.kt:6:5:6:45 | fooBarMethodExt$default | file:///modules/java.base/java/lang/String.class:0:0:0:0 | String | +| methods5.kt:9:3:9:32 | f1 | file:///!unknown-binary-location/foo/bar/C1.class:0:0:0:0 | C1 | +extensionsMismatch +extensionIndex +| methods3.kt:3:1:3:49 | fooBarTopLevelMethodExt | 0 | file:///modules/java.base/java/lang/String.class:0:0:0:0 | String | +| methods3.kt:3:1:3:49 | fooBarTopLevelMethodExt$default | 0 | file:///modules/java.base/java/lang/String.class:0:0:0:0 | String | +| methods3.kt:6:5:6:45 | fooBarMethodExt | 0 | file:///modules/java.base/java/lang/String.class:0:0:0:0 | String | +| methods3.kt:6:5:6:45 | fooBarMethodExt$default | 1 | file:///modules/java.base/java/lang/String.class:0:0:0:0 | String | +| methods5.kt:9:3:9:32 | f1 | 0 | file:///!unknown-binary-location/foo/bar/C1.class:0:0:0:0 | C1 | diff --git a/java/ql/test-kotlin2/library-tests/methods/methods.kt b/java/ql/test-kotlin2/library-tests/methods/methods.kt new file mode 100644 index 00000000000..48f480f8748 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/methods/methods.kt @@ -0,0 +1,21 @@ + +fun topLevelMethod(x: Int, y: Int) { +} + +class Class { + fun classMethod(x: Int, y: Int) { + } + + fun anotherClassMethod(a: Int, b: Int) { + classMethod(a, 3) + topLevelMethod(b, 4) + } + + public fun publicFun() {} + protected fun protectedFun() {} + private fun privateFun() {} + internal fun internalFun() {} + fun noExplicitVisibilityFun() {} + inline fun inlineFun() {} +} + diff --git a/java/ql/test-kotlin2/library-tests/methods/methods.ql b/java/ql/test-kotlin2/library-tests/methods/methods.ql new file mode 100644 index 00000000000..0f0b43f4e4b --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/methods/methods.ql @@ -0,0 +1,35 @@ +import java + +query predicate methods( + RefType declType, Method m, string signature, string modifiers, string compilerGenerated +) { + m.fromSource() and + declType = m.getDeclaringType() and + signature = m.getSignature() and + modifiers = concat(string s | m.hasModifier(s) | s, ", ") and + if m.isCompilerGenerated() + then compilerGenerated = "Compiler generated" + else compilerGenerated = "" +} + +query predicate constructors(RefType declType, Constructor c, string signature) { + c.fromSource() and declType = c.getDeclaringType() and signature = c.getSignature() +} + +query predicate extensions(ExtensionMethod m, Type t) { m.getExtendedType() = t and m.fromSource() } + +query predicate extensionsMismatch(Method src, Method def) { + src.getKotlinParameterDefaultsProxy() = def and + ( + src instanceof ExtensionMethod and not def instanceof ExtensionMethod + or + def instanceof ExtensionMethod and not src instanceof ExtensionMethod + ) +} + +query predicate extensionIndex(ExtensionMethod m, int i, Type t) { + m.fromSource() and + m.getExtensionReceiverParameterIndex() = i and + m.getExtendedType() = t and + m.getParameter(i).getType() = t +} diff --git a/java/ql/test-kotlin2/library-tests/methods/methods2.kt b/java/ql/test-kotlin2/library-tests/methods/methods2.kt new file mode 100644 index 00000000000..4c642e2d189 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/methods/methods2.kt @@ -0,0 +1,11 @@ + +package foo.bar + +fun fooBarTopLevelMethod(x: Int, y: Int) { +} + +class Class2 { + fun fooBarClassMethod(x: Int, y: Int) { + } +} + diff --git a/java/ql/test-kotlin2/library-tests/methods/methods3.kt b/java/ql/test-kotlin2/library-tests/methods/methods3.kt new file mode 100644 index 00000000000..120a5339a5a --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/methods/methods3.kt @@ -0,0 +1,7 @@ +package foo.bar + +fun String.fooBarTopLevelMethodExt(x: Int = 1) {} + +class Class3 { + fun String.fooBarMethodExt(x: Int = 1) {} +} diff --git a/java/ql/test-kotlin2/library-tests/methods/methods4.kt b/java/ql/test-kotlin2/library-tests/methods/methods4.kt new file mode 100644 index 00000000000..87e409eb02e --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/methods/methods4.kt @@ -0,0 +1,12 @@ +package foo.bar + +class NestedTest { + + class InsideNestedTest { + + fun m(x: InsideNestedTest) { } + + } + +} + diff --git a/java/ql/test-kotlin2/library-tests/methods/methods5.kt b/java/ql/test-kotlin2/library-tests/methods/methods5.kt new file mode 100644 index 00000000000..c1f49e2fa8e --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/methods/methods5.kt @@ -0,0 +1,13 @@ +package foo.bar + +fun x() { + var x = 5 + fun a(i: Int) = i + x + x = 6 + a(42) + x = 7 + fun C1.f1(i: Int) = 5 + C1().f1(42) +} + +class C1 {} diff --git a/java/ql/test-kotlin2/library-tests/methods/methods6.kt b/java/ql/test-kotlin2/library-tests/methods/methods6.kt new file mode 100644 index 00000000000..6ae5c37d70b --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/methods/methods6.kt @@ -0,0 +1,4 @@ +package foo.bar + +suspend fun s() { +} diff --git a/java/ql/test-kotlin2/library-tests/methods/parameters.expected b/java/ql/test-kotlin2/library-tests/methods/parameters.expected new file mode 100644 index 00000000000..f4c60ab6ac4 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/methods/parameters.expected @@ -0,0 +1,57 @@ +| clinit.kt:3:1:3:24 | setTopLevelInt | clinit.kt:3:1:3:24 | | 0 | +| dataClass.kt:0:0:0:0 | equals | dataClass.kt:0:0:0:0 | other | 0 | +| dataClass.kt:1:1:1:47 | copy | dataClass.kt:1:22:1:31 | x | 0 | +| dataClass.kt:1:1:1:47 | copy | dataClass.kt:1:34:1:46 | y | 1 | +| dataClass.kt:1:1:1:47 | copy$default | dataClass.kt:1:1:1:47 | p0 | 0 | +| dataClass.kt:1:1:1:47 | copy$default | dataClass.kt:1:1:1:47 | p1 | 1 | +| dataClass.kt:1:1:1:47 | copy$default | dataClass.kt:1:1:1:47 | p2 | 2 | +| dataClass.kt:1:1:1:47 | copy$default | dataClass.kt:1:1:1:47 | p3 | 3 | +| dataClass.kt:1:1:1:47 | copy$default | dataClass.kt:1:1:1:47 | p4 | 4 | +| dataClass.kt:1:34:1:46 | setY | dataClass.kt:1:34:1:46 | | 0 | +| delegates.kt:4:21:6:5 | get | delegates.kt:4:21:6:5 | a0 | 0 | +| delegates.kt:4:21:6:5 | invoke | delegates.kt:4:21:6:5 | a0 | 0 | +| delegates.kt:8:5:11:5 | setObservableProp | delegates.kt:8:35:11:5 | | 0 | +| delegates.kt:8:35:11:5 | get | delegates.kt:8:35:11:5 | a0 | 0 | +| delegates.kt:8:35:11:5 | get | delegates.kt:8:35:11:5 | a0 | 0 | +| delegates.kt:8:35:11:5 | invoke | delegates.kt:8:35:11:5 | a0 | 0 | +| delegates.kt:8:35:11:5 | invoke | delegates.kt:8:35:11:5 | a0 | 0 | +| delegates.kt:8:35:11:5 | set | delegates.kt:8:35:11:5 | a0 | 0 | +| delegates.kt:8:35:11:5 | set | delegates.kt:8:35:11:5 | a0 | 0 | +| delegates.kt:8:35:11:5 | set | delegates.kt:8:35:11:5 | a1 | 1 | +| delegates.kt:8:35:11:5 | set | delegates.kt:8:35:11:5 | a1 | 1 | +| delegates.kt:8:66:11:5 | invoke | delegates.kt:9:9:9:12 | prop | 0 | +| delegates.kt:8:66:11:5 | invoke | delegates.kt:9:15:9:17 | old | 1 | +| delegates.kt:8:66:11:5 | invoke | delegates.kt:9:20:9:22 | new | 2 | +| enumClass.kt:1:1:4:1 | valueOf | enumClass.kt:1:1:4:1 | value | 0 | +| enumClass.kt:6:1:16:1 | valueOf | enumClass.kt:6:1:16:1 | value | 0 | +| enumClass.kt:9:5:9:30 | f | enumClass.kt:9:20:9:25 | i | 0 | +| enumClass.kt:10:5:10:42 | g | enumClass.kt:10:20:10:25 | i | 0 | +| enumClass.kt:13:3:13:29 | f | enumClass.kt:13:18:13:23 | i | 0 | +| enumClass.kt:14:3:14:29 | g | enumClass.kt:14:18:14:23 | i | 0 | +| methods2.kt:4:1:5:1 | fooBarTopLevelMethod | methods2.kt:4:26:4:31 | x | 0 | +| methods2.kt:4:1:5:1 | fooBarTopLevelMethod | methods2.kt:4:34:4:39 | y | 1 | +| methods2.kt:8:5:9:5 | fooBarClassMethod | methods2.kt:8:27:8:32 | x | 0 | +| methods2.kt:8:5:9:5 | fooBarClassMethod | methods2.kt:8:35:8:40 | y | 1 | +| methods3.kt:3:1:3:49 | fooBarTopLevelMethodExt | methods3.kt:3:5:3:10 | | 0 | +| methods3.kt:3:1:3:49 | fooBarTopLevelMethodExt | methods3.kt:3:36:3:45 | x | 1 | +| methods3.kt:3:1:3:49 | fooBarTopLevelMethodExt$default | methods3.kt:3:1:3:49 | p0 | 0 | +| methods3.kt:3:1:3:49 | fooBarTopLevelMethodExt$default | methods3.kt:3:1:3:49 | p1 | 1 | +| methods3.kt:3:1:3:49 | fooBarTopLevelMethodExt$default | methods3.kt:3:1:3:49 | p2 | 2 | +| methods3.kt:3:1:3:49 | fooBarTopLevelMethodExt$default | methods3.kt:3:1:3:49 | p3 | 3 | +| methods3.kt:6:5:6:45 | fooBarMethodExt | methods3.kt:6:9:6:14 | | 0 | +| methods3.kt:6:5:6:45 | fooBarMethodExt | methods3.kt:6:32:6:41 | x | 1 | +| methods3.kt:6:5:6:45 | fooBarMethodExt$default | methods3.kt:6:5:6:45 | p0 | 0 | +| methods3.kt:6:5:6:45 | fooBarMethodExt$default | methods3.kt:6:5:6:45 | p1 | 1 | +| methods3.kt:6:5:6:45 | fooBarMethodExt$default | methods3.kt:6:5:6:45 | p2 | 2 | +| methods3.kt:6:5:6:45 | fooBarMethodExt$default | methods3.kt:6:5:6:45 | p3 | 3 | +| methods3.kt:6:5:6:45 | fooBarMethodExt$default | methods3.kt:6:5:6:45 | p4 | 4 | +| methods4.kt:7:5:7:34 | m | methods4.kt:7:11:7:29 | x | 0 | +| methods5.kt:5:3:5:27 | a | methods5.kt:5:13:5:18 | i | 0 | +| methods5.kt:9:3:9:32 | f1 | methods5.kt:9:12:9:17 | | 0 | +| methods5.kt:9:3:9:32 | f1 | methods5.kt:9:22:9:27 | i | 1 | +| methods.kt:2:1:3:1 | topLevelMethod | methods.kt:2:20:2:25 | x | 0 | +| methods.kt:2:1:3:1 | topLevelMethod | methods.kt:2:28:2:33 | y | 1 | +| methods.kt:6:5:7:5 | classMethod | methods.kt:6:21:6:26 | x | 0 | +| methods.kt:6:5:7:5 | classMethod | methods.kt:6:29:6:34 | y | 1 | +| methods.kt:9:5:12:5 | anotherClassMethod | methods.kt:9:28:9:33 | a | 0 | +| methods.kt:9:5:12:5 | anotherClassMethod | methods.kt:9:36:9:41 | b | 1 | diff --git a/java/ql/test-kotlin2/library-tests/methods/parameters.ql b/java/ql/test-kotlin2/library-tests/methods/parameters.ql new file mode 100644 index 00000000000..6863e863b57 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/methods/parameters.ql @@ -0,0 +1,7 @@ +import java + +from Method m, Parameter p, int i +where + m.getParameter(i) = p and + m.fromSource() +select m, p, i diff --git a/java/ql/test-kotlin2/library-tests/ministdlib/MiniStdLib.kt b/java/ql/test-kotlin2/library-tests/ministdlib/MiniStdLib.kt new file mode 100644 index 00000000000..ba48bc63234 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/ministdlib/MiniStdLib.kt @@ -0,0 +1,46 @@ +package kotlin + +/* +This is a mini standard library replacement, to make it easy to write +very small tests that create very small databases. + +If you define a class, then you will need to also define any members that +compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/descriptors/IrBuiltInsOverDescriptors.kt +expects (e.g. with findFunctions(...).first) to exist. +*/ + +public open class Any { + fun toString(): String { return this.toString() } + open operator fun equals(other: Any?): Boolean { return this.equals(other) } +} + +public class String { + operator fun plus(other: Any?): String { return this.plus(other) } +} + +public class Boolean { + operator fun not(): Boolean { return this.not() } +} + +public class Int { + operator fun plus(other: Int): Int { return this.plus(other) } + operator fun times(other: Int): Int { return this.times(other) } + infix fun xor(other: Int): Int { return this.xor(other) } +} + +public object Unit { +} + +// Diagnostic Matches: % Can't find java.lang.Boolean +// Diagnostic Matches: % Can't find java.lang.Byte +// Diagnostic Matches: % Can't find java.lang.Character +// Diagnostic Matches: % Can't find java.lang.Double +// Diagnostic Matches: % Can't find java.lang.Float +// Diagnostic Matches: % Can't find java.lang.Integer +// Diagnostic Matches: % Can't find java.lang.Long +// Diagnostic Matches: % Can't find java.lang.Short +// Diagnostic Matches: % Can't find java.lang.Void +// Diagnostic Matches: % Can't find kotlin.UByte +// Diagnostic Matches: % Can't find kotlin.UInt +// Diagnostic Matches: % Can't find kotlin.ULong +// Diagnostic Matches: % Can't find kotlin.UShort diff --git a/java/ql/test-kotlin2/library-tests/ministdlib/MyClass.kt b/java/ql/test-kotlin2/library-tests/ministdlib/MyClass.kt new file mode 100644 index 00000000000..eaa7e450bbb --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/ministdlib/MyClass.kt @@ -0,0 +1 @@ +class MyClass {} diff --git a/java/ql/test-kotlin2/library-tests/ministdlib/classes.expected b/java/ql/test-kotlin2/library-tests/ministdlib/classes.expected new file mode 100644 index 00000000000..8d1bc538129 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/ministdlib/classes.expected @@ -0,0 +1,7 @@ +| MiniStdLib.kt:12:1:15:1 | Any | +| MiniStdLib.kt:17:1:19:1 | String | +| MiniStdLib.kt:21:1:23:1 | Boolean | +| MiniStdLib.kt:25:1:29:1 | Int | +| MiniStdLib.kt:31:1:32:1 | Unit | +| MyClass.kt:1:1:1:16 | MyClass | +| file://:0:0:0:0 | FakeKotlinClass | diff --git a/java/ql/test-kotlin2/library-tests/ministdlib/classes.ql b/java/ql/test-kotlin2/library-tests/ministdlib/classes.ql new file mode 100644 index 00000000000..86c654ea986 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/ministdlib/classes.ql @@ -0,0 +1,4 @@ +import java + +from Class c +select c diff --git a/java/ql/test-kotlin2/library-tests/ministdlib/options b/java/ql/test-kotlin2/library-tests/ministdlib/options new file mode 100644 index 00000000000..052bfdb9a30 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/ministdlib/options @@ -0,0 +1 @@ +codeql-extractor-kotlin-options: -no-jdk -no-reflect -no-stdlib -Xallow-kotlin-package diff --git a/java/ql/test-kotlin2/library-tests/mixed-java-and-kotlin/Q.java b/java/ql/test-kotlin2/library-tests/mixed-java-and-kotlin/Q.java new file mode 100644 index 00000000000..9c9a6482201 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/mixed-java-and-kotlin/Q.java @@ -0,0 +1,3 @@ +package main; + +public class Q {} diff --git a/java/ql/test-kotlin2/library-tests/mixed-java-and-kotlin/W.kt b/java/ql/test-kotlin2/library-tests/mixed-java-and-kotlin/W.kt new file mode 100644 index 00000000000..b89b2098c3e --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/mixed-java-and-kotlin/W.kt @@ -0,0 +1,3 @@ +package main + +class W {} diff --git a/java/ql/test-kotlin2/library-tests/mixed-java-and-kotlin/test.expected b/java/ql/test-kotlin2/library-tests/mixed-java-and-kotlin/test.expected new file mode 100644 index 00000000000..95060ae561c --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/mixed-java-and-kotlin/test.expected @@ -0,0 +1,2 @@ +| Q.java:0:0:0:0 | Q | +| W.kt:0:0:0:0 | W | diff --git a/java/ql/test-kotlin2/library-tests/mixed-java-and-kotlin/test.ql b/java/ql/test-kotlin2/library-tests/mixed-java-and-kotlin/test.ql new file mode 100644 index 00000000000..bf53215390c --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/mixed-java-and-kotlin/test.ql @@ -0,0 +1,6 @@ +import java + +from File f +where f.isSourceFile() +select f +// This test is mainly a consistency test; just checking that both the Java and Kotlin source were extracted here diff --git a/java/ql/test-kotlin2/library-tests/modifiers/modifiers.expected b/java/ql/test-kotlin2/library-tests/modifiers/modifiers.expected new file mode 100644 index 00000000000..329e9e10399 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/modifiers/modifiers.expected @@ -0,0 +1,87 @@ +| modifiers.kt:1:1:29:1 | X | Class | public | +| modifiers.kt:1:1: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 | +| modifiers.kt:2:5:2:21 | getA$private | Method | final | +| modifiers.kt:2:5:2:21 | getA$private | Method | private | +| modifiers.kt:3:5:3:23 | b | Field | final | +| modifiers.kt:3:5:3:23 | b | Field | private | +| modifiers.kt:3:5:3:23 | b | Property | protected | +| modifiers.kt:3:5:3:23 | getB | Method | final | +| modifiers.kt:3:5:3:23 | getB | Method | protected | +| modifiers.kt:4:5:4:22 | c | Field | final | +| modifiers.kt:4:5:4:22 | c | Field | private | +| modifiers.kt:4:5:4:22 | c | Property | internal | +| modifiers.kt:4:5:4:22 | getC$main | Method | final | +| modifiers.kt:4:5:4:22 | getC$main | Method | internal | +| modifiers.kt:5:5:5:34 | d | Field | final | +| modifiers.kt:5:5:5:34 | d | Field | private | +| modifiers.kt:5:5:5:34 | d | Property | public | +| modifiers.kt:5:5:5:34 | getD | Method | final | +| modifiers.kt:5:5:5:34 | getD | Method | public | +| modifiers.kt:7:5:9:5 | Nested | Class | final | +| modifiers.kt:7:5:9:5 | Nested | Class | protected | +| modifiers.kt:7:5:9:5 | Nested | Constructor | public | +| modifiers.kt:8:9:8:29 | e | Field | final | +| modifiers.kt:8:9:8:29 | e | Field | private | +| modifiers.kt:8:9:8:29 | e | Property | public | +| modifiers.kt:8:9:8:29 | getE | Method | final | +| modifiers.kt:8:9:8:29 | getE | Method | public | +| modifiers.kt:11:5:15:5 | fn1 | Method | final | +| modifiers.kt:11:5:15:5 | fn1 | Method | public | +| modifiers.kt:12:16:14:9 | | Constructor | public | +| modifiers.kt:12:16:14:9 | new Object(...) { ... } | AnonymousClass | final | +| modifiers.kt:12:16:14:9 | new Object(...) { ... } | AnonymousClass | private | +| modifiers.kt:12:16:14:9 | new Object(...) { ... } | LocalClass | final | +| modifiers.kt:12:16:14:9 | new Object(...) { ... } | LocalClass | private | +| modifiers.kt:13:13:13:23 | fn | Method | final | +| modifiers.kt:13:13:13:23 | fn | Method | public | +| modifiers.kt:17:5:20:5 | fn2 | Method | final | +| modifiers.kt:17:5:20:5 | fn2 | Method | public | +| modifiers.kt:18:9:18:24 | | Constructor | public | +| modifiers.kt:18:9:18:24 | | LocalClass | final | +| modifiers.kt:18:9:18:24 | | LocalClass | private | +| modifiers.kt:18:9:18:24 | fnLocal | Method | final | +| modifiers.kt:18:9:18:24 | fnLocal | Method | public | +| modifiers.kt:22:5:24:5 | fn3 | Method | final | +| modifiers.kt:22:5:24:5 | fn3 | Method | public | +| modifiers.kt:23:9:23:27 | localClass | Constructor | public | +| modifiers.kt:23:9:23:27 | localClass | LocalClass | final | +| modifiers.kt:23:9:23:27 | localClass | LocalClass | private | +| modifiers.kt:26:5:26:46 | fn4 | Method | final | +| modifiers.kt:26:5:26:46 | fn4 | Method | inline | +| modifiers.kt:26:5:26:46 | fn4 | Method | public | +| modifiers.kt:26:20:26:41 | f | Parameter | noinline | +| modifiers.kt:27:5:27:49 | fn5 | Method | final | +| modifiers.kt:27:5:27:49 | fn5 | Method | inline | +| modifiers.kt:27:5:27:49 | fn5 | Method | public | +| modifiers.kt:27:20:27:44 | f | Parameter | crossinline | +| modifiers.kt:28:5:28:39 | fn6 | Method | final | +| modifiers.kt:28:5:28:39 | fn6 | Method | inline | +| modifiers.kt:28:5: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 | final | +| 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:1:41:1 | LateInit | Constructor | public | +| modifiers.kt:36:5:36:40 | getTest0$private | Method | final | +| modifiers.kt:36:5:36:40 | getTest0$private | Method | private | +| modifiers.kt:36:5:36:40 | setTest0$private | Method | final | +| modifiers.kt:36:5:36:40 | setTest0$private | Method | private | +| 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:38:5:40:5 | fn | Method | final | +| modifiers.kt:38:5:40:5 | fn | Method | public | +| modifiers.kt:39:9:39:36 | LateInit test1 | LocalVariableDecl | lateinit | diff --git a/java/ql/test-kotlin2/library-tests/modifiers/modifiers.kt b/java/ql/test-kotlin2/library-tests/modifiers/modifiers.kt new file mode 100644 index 00000000000..62de34aadb2 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/modifiers/modifiers.kt @@ -0,0 +1,41 @@ +open class X { + private val a = 1 + protected val b = 2 + internal val c = 3 + val d = 4 // public by default + + protected class Nested { + public val e: Int = 5 + } + + fun fn1(): Any { + return object { + fun fn() {} + } + } + + fun fn2() { + fun fnLocal() {} + fnLocal() + } + + fun fn3() { + class localClass {} + } + + inline fun fn4(noinline f: () -> Unit) { } + inline fun fn5(crossinline f: () -> Unit) { } + inline fun fn6(x: T) {} +} + +class Y { + fun foo(t: T1) : T2 = null!! +} + +public class LateInit { + private lateinit var test0: LateInit + + fun fn() { + lateinit var test1: LateInit + } +} \ No newline at end of file diff --git a/java/ql/test-kotlin2/library-tests/modifiers/modifiers.ql b/java/ql/test-kotlin2/library-tests/modifiers/modifiers.ql new file mode 100644 index 00000000000..48a33db0591 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/modifiers/modifiers.ql @@ -0,0 +1,5 @@ +import java + +from Modifiable m, string mod +where m.fromSource() and m.hasModifier(mod) +select m, m.getAPrimaryQlClass(), mod diff --git a/java/ql/test-kotlin2/library-tests/multiple_extensions/calls.expected b/java/ql/test-kotlin2/library-tests/multiple_extensions/calls.expected new file mode 100644 index 00000000000..cb0e0eaf085 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/multiple_extensions/calls.expected @@ -0,0 +1,4 @@ +| PropertyReferenceDelegatesKt | getValue(KProperty0, Object, KProperty) | +| PropertyReferenceDelegatesKt | getValue(KProperty1, T, KProperty) | +| StringsKt | removePrefix(String, CharSequence) | +| StringsKt | startsWith$default(String, String, boolean, int, Object) | diff --git a/java/ql/test-kotlin2/library-tests/multiple_extensions/calls.ql b/java/ql/test-kotlin2/library-tests/multiple_extensions/calls.ql new file mode 100644 index 00000000000..1fe30bd6b27 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/multiple_extensions/calls.ql @@ -0,0 +1,4 @@ +import java + +from MethodCall ma +select ma.getMethod().getDeclaringType().getName(), ma.getMethod().getStringSignature() diff --git a/java/ql/test-kotlin2/library-tests/multiple_extensions/test.kt b/java/ql/test-kotlin2/library-tests/multiple_extensions/test.kt new file mode 100644 index 00000000000..129bc8e4919 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/multiple_extensions/test.kt @@ -0,0 +1,7 @@ +fun test(url: String) { + val s = url.startsWith("1") + val r = url.removePrefix("2") + + (null!! as kotlin.reflect.KProperty0).getValue(null, null!!) + (null!! as kotlin.reflect.KProperty1).getValue(1, null!!) +} diff --git a/java/ql/test-kotlin2/library-tests/multiple_files/classes.expected b/java/ql/test-kotlin2/library-tests/multiple_files/classes.expected new file mode 100644 index 00000000000..51e9b016e32 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/multiple_files/classes.expected @@ -0,0 +1,6 @@ +| file1.kt:2:1:13:1 | Class1 | Class1 | +| file2.kt:2:1:4:1 | Class2 | Class2 | +| file3.kt:0:0:0:0 | MyJvmName | MyJvmName | +| file3.kt:3:1:3:16 | Class3 | Class3 | +| file4.kt:0:0:0:0 | File4Kt | File4Kt | +| file4.kt:2:1:2:16 | Class4 | Class4 | diff --git a/java/ql/test-kotlin2/library-tests/multiple_files/classes.ql b/java/ql/test-kotlin2/library-tests/multiple_files/classes.ql new file mode 100644 index 00000000000..e4ad877448e --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/multiple_files/classes.ql @@ -0,0 +1,5 @@ +import java + +from Class c +where c.fromSource() +select c, c.getQualifiedName() diff --git a/java/ql/test-kotlin2/library-tests/multiple_files/file1.kt b/java/ql/test-kotlin2/library-tests/multiple_files/file1.kt new file mode 100644 index 00000000000..bd914174387 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/multiple_files/file1.kt @@ -0,0 +1,13 @@ + +class Class1 { + fun fun1() { + Class2().fun2() + fun3() + fun4() + + // libraries/stdlib/jvm/runtime/kotlin/jvm/internal/CollectionToArray.kt + // has a @file:JvmName("CollectionToArray") annotation, and contains + // a function collectionToArray with a @JvmName("toArray") annotation. + kotlin.jvm.internal.collectionToArray(listOf(1)) + } +} diff --git a/java/ql/test-kotlin2/library-tests/multiple_files/file2.kt b/java/ql/test-kotlin2/library-tests/multiple_files/file2.kt new file mode 100644 index 00000000000..d785a2fa739 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/multiple_files/file2.kt @@ -0,0 +1,5 @@ + +class Class2 { + fun fun2() { } +} + diff --git a/java/ql/test-kotlin2/library-tests/multiple_files/file3.kt b/java/ql/test-kotlin2/library-tests/multiple_files/file3.kt new file mode 100644 index 00000000000..489b18113f3 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/multiple_files/file3.kt @@ -0,0 +1,7 @@ +@file:JvmName("MyJvmName") + +class Class3 { } + +fun fun3() { +} + diff --git a/java/ql/test-kotlin2/library-tests/multiple_files/file4.kt b/java/ql/test-kotlin2/library-tests/multiple_files/file4.kt new file mode 100644 index 00000000000..2cae1e4ca98 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/multiple_files/file4.kt @@ -0,0 +1,6 @@ + +class Class4 { } + +fun fun4() { +} + diff --git a/java/ql/test-kotlin2/library-tests/multiple_files/method_accesses.expected b/java/ql/test-kotlin2/library-tests/multiple_files/method_accesses.expected new file mode 100644 index 00000000000..b5bba6fae86 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/multiple_files/method_accesses.expected @@ -0,0 +1,5 @@ +| file1.kt:4:9:4:23 | fun2(...) | file2.kt:3:5:3:18 | fun2 | Class2.fun2 | file2.kt:2:1:4:1 | Class2 | +| file1.kt:5:9:5:14 | fun3(...) | file3.kt:5:1:6:1 | fun3 | MyJvmName.fun3 | file3.kt:0:0:0:0 | MyJvmName | +| file1.kt:6:9:6:14 | fun4(...) | file4.kt:4:1:5:1 | fun4 | File4Kt.fun4 | file4.kt:0:0:0:0 | File4Kt | +| file1.kt:11:29:11:56 | toArray(...) | file:///CollectionToArray.class:0:0:0:0 | toArray | kotlin.jvm.internal.CollectionToArray.toArray | file:///CollectionToArray.class:0:0:0:0 | CollectionToArray | +| file1.kt:11:47:11:55 | listOf(...) | file:///CollectionsKt.class:0:0:0:0 | listOf | kotlin.collections.CollectionsKt.listOf | file:///CollectionsKt.class:0:0:0:0 | CollectionsKt | diff --git a/java/ql/test-kotlin2/library-tests/multiple_files/method_accesses.ql b/java/ql/test-kotlin2/library-tests/multiple_files/method_accesses.ql new file mode 100644 index 00000000000..f511e8211be --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/multiple_files/method_accesses.ql @@ -0,0 +1,28 @@ +import java + +// Stop external filepaths from appearing in the results +class ClassOrInterfaceLocation extends ClassOrInterface { + override predicate hasLocationInfo(string path, int sl, int sc, int el, int ec) { + exists(string fullPath | super.hasLocationInfo(fullPath, sl, sc, el, ec) | + if exists(this.getFile().getRelativePath()) + then path = fullPath + else path = fullPath.regexpReplaceAll(".*/", "/") + ) + } +} + +class MethodLocation extends Method { + override predicate hasLocationInfo(string path, int sl, int sc, int el, int ec) { + exists(string fullPath | super.hasLocationInfo(fullPath, sl, sc, el, ec) | + if exists(this.getFile().getRelativePath()) + then path = fullPath + else path = fullPath.regexpReplaceAll(".*/", "/") + ) + } +} + +from MethodCall ma, Method m +where + ma.getFile().(CompilationUnit).fromSource() and + m = ma.getMethod() +select ma, m, m.getQualifiedName(), m.getDeclaringType() diff --git a/java/ql/test-kotlin2/library-tests/multiple_files/methods.expected b/java/ql/test-kotlin2/library-tests/multiple_files/methods.expected new file mode 100644 index 00000000000..a5026657856 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/multiple_files/methods.expected @@ -0,0 +1,4 @@ +| file1.kt:3:5:12:5 | fun1 | Class1.fun1 | file1.kt:2:1:13:1 | Class1 | +| file2.kt:3:5:3:18 | fun2 | Class2.fun2 | file2.kt:2:1:4:1 | Class2 | +| file3.kt:5:1:6:1 | fun3 | MyJvmName.fun3 | file3.kt:0:0:0:0 | MyJvmName | +| file4.kt:4:1:5:1 | fun4 | File4Kt.fun4 | file4.kt:0:0:0:0 | File4Kt | diff --git a/java/ql/test-kotlin2/library-tests/multiple_files/methods.ql b/java/ql/test-kotlin2/library-tests/multiple_files/methods.ql new file mode 100644 index 00000000000..9060f05e302 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/multiple_files/methods.ql @@ -0,0 +1,5 @@ +import java + +from Method m +where m.fromSource() +select m, m.getQualifiedName(), m.getDeclaringType() diff --git a/java/ql/test-kotlin2/library-tests/no-when-branch-found/test.expected b/java/ql/test-kotlin2/library-tests/no-when-branch-found/test.expected new file mode 100644 index 00000000000..a4fcaba215a --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/no-when-branch-found/test.expected @@ -0,0 +1 @@ +| test.kt:6:3:9:3 | throw ... | test.kt:6:3:9:3 | new NoWhenBranchMatchedException(...) | diff --git a/java/ql/test-kotlin2/library-tests/no-when-branch-found/test.kt b/java/ql/test-kotlin2/library-tests/no-when-branch-found/test.kt new file mode 100644 index 00000000000..17b2b58703c --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/no-when-branch-found/test.kt @@ -0,0 +1,10 @@ +enum class A { + A1, A2 +} + +fun test(a: A): Int = + when(a) { + A.A1 -> 1 + A.A2 -> 2 + } + diff --git a/java/ql/test-kotlin2/library-tests/no-when-branch-found/test.ql b/java/ql/test-kotlin2/library-tests/no-when-branch-found/test.ql new file mode 100644 index 00000000000..511bb32bb0a --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/no-when-branch-found/test.ql @@ -0,0 +1,4 @@ +import java + +from ThrowStmt ts +select ts, ts.getExpr() diff --git a/java/ql/test-kotlin2/library-tests/numlines/callable.expected b/java/ql/test-kotlin2/library-tests/numlines/callable.expected new file mode 100644 index 00000000000..52f3a4f2cbe --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/numlines/callable.expected @@ -0,0 +1,6 @@ +| test.kt:2:1:4:1 | foo | 3 | 3 | 0 | +| test.kt:8:1:8:9 | getX | 1 | 1 | 0 | +| test.kt:18:1:18:17 | getY | 5 | 1 | 4 | +| test.kt:20:1:26:1 | Foo | 7 | 6 | 1 | +| test.kt:21:5:24:5 | bar | 4 | 3 | 1 | +| test.kt:25:5:25:21 | getSomeField | 1 | 1 | 0 | diff --git a/java/ql/test-kotlin2/library-tests/numlines/callable.ql b/java/ql/test-kotlin2/library-tests/numlines/callable.ql new file mode 100644 index 00000000000..c9775a24c5d --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/numlines/callable.ql @@ -0,0 +1,4 @@ +import java + +from Callable c +select c, c.getTotalNumberOfLines(), c.getNumberOfLinesOfCode(), c.getNumberOfCommentLines() diff --git a/java/ql/test-kotlin2/library-tests/numlines/classes.expected b/java/ql/test-kotlin2/library-tests/numlines/classes.expected new file mode 100644 index 00000000000..35000a02464 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/numlines/classes.expected @@ -0,0 +1 @@ +| test.kt:20:1:26:1 | Foo | 7 | 6 | 1 | diff --git a/java/ql/test-kotlin2/library-tests/numlines/classes.ql b/java/ql/test-kotlin2/library-tests/numlines/classes.ql new file mode 100644 index 00000000000..4c987784146 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/numlines/classes.ql @@ -0,0 +1,4 @@ +import java + +from Class c +select c, c.getTotalNumberOfLines(), c.getNumberOfLinesOfCode(), c.getNumberOfCommentLines() diff --git a/java/ql/test-kotlin2/library-tests/numlines/files.expected b/java/ql/test-kotlin2/library-tests/numlines/files.expected new file mode 100644 index 00000000000..1cc9c337bac --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/numlines/files.expected @@ -0,0 +1 @@ +| test.kt:0:0:0:0 | test | 28 | 11 | 9 | diff --git a/java/ql/test-kotlin2/library-tests/numlines/files.ql b/java/ql/test-kotlin2/library-tests/numlines/files.ql new file mode 100644 index 00000000000..ca56da73369 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/numlines/files.ql @@ -0,0 +1,4 @@ +import java + +from File f +select f, f.getTotalNumberOfLines(), f.getNumberOfLinesOfCode(), f.getNumberOfCommentLines() diff --git a/java/ql/test-kotlin2/library-tests/numlines/test.kt b/java/ql/test-kotlin2/library-tests/numlines/test.kt new file mode 100644 index 00000000000..1ede04c7952 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/numlines/test.kt @@ -0,0 +1,27 @@ + +fun foo ( x : Int ) { + val y = ( x + 1 ) +} + +// test + +val x = 4 + +/* +test +*/ + +/** +test +*/ + +val y = 5 // test + +class Foo { + fun bar() { + // comment + return + } + val someField = 3 +} + diff --git a/java/ql/test-kotlin2/library-tests/object/accesses.expected b/java/ql/test-kotlin2/library-tests/object/accesses.expected new file mode 100644 index 00000000000..146576a7969 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/object/accesses.expected @@ -0,0 +1 @@ +| objects.kt:2:1:4:1 | MyObject | objects.kt:7:17:7:24 | INSTANCE | diff --git a/java/ql/test-kotlin2/library-tests/object/accesses.ql b/java/ql/test-kotlin2/library-tests/object/accesses.ql new file mode 100644 index 00000000000..38de5d06eb3 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/object/accesses.ql @@ -0,0 +1,5 @@ +import java + +from VarAccess va, ClassObject co +where va.getVariable() = co.getInstance() +select co, va diff --git a/java/ql/test-kotlin2/library-tests/object/objects.expected b/java/ql/test-kotlin2/library-tests/object/objects.expected new file mode 100644 index 00000000000..1d3ddd817c0 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/object/objects.expected @@ -0,0 +1 @@ +| objects.kt:2:1:4:1 | MyObject | objects.kt:2:1:4:1 | INSTANCE | final,public,static | diff --git a/java/ql/test-kotlin2/library-tests/object/objects.kt b/java/ql/test-kotlin2/library-tests/object/objects.kt new file mode 100644 index 00000000000..d666838b123 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/object/objects.kt @@ -0,0 +1,9 @@ + +object MyObject { + fun MyObjectFunction() {} +} + +fun useMyObject() { + val myObj = MyObject +} + diff --git a/java/ql/test-kotlin2/library-tests/object/objects.ql b/java/ql/test-kotlin2/library-tests/object/objects.ql new file mode 100644 index 00000000000..90228cc73e1 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/object/objects.ql @@ -0,0 +1,7 @@ +import java + +from ClassObject co, Field f +where + co.fromSource() and + f = co.getInstance() +select co, f, concat(f.getAModifier().toString(), ",") diff --git a/java/ql/test-kotlin2/library-tests/operator-overloads/PrintAst.expected b/java/ql/test-kotlin2/library-tests/operator-overloads/PrintAst.expected new file mode 100644 index 00000000000..b43d88b4531 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/operator-overloads/PrintAst.expected @@ -0,0 +1,103 @@ +test.kt: +# 0| [CompilationUnit] test +# 0| 1: [Class] TestKt +# 1| 1: [Method] fn +# 1| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 1| 0: [Parameter] arr +# 1| 0: [TypeAccess] byte[] +# 1| 1: [Parameter] mt +# 1| 0: [TypeAccess] C +# 1| 5: [BlockStmt] { ... } +# 2| 0: [ExprStmt] ; +# 2| 0: [ImplicitCoercionToUnitExpr] +# 2| 0: [TypeAccess] Unit +# 2| 1: [MethodCall] get(...) +# 2| -1: [VarAccess] arr +# 2| 0: [IntegerLiteral] 1 +# 3| 1: [ExprStmt] ; +# 3| 0: [ImplicitCoercionToUnitExpr] +# 3| 0: [TypeAccess] Unit +# 3| 1: [MethodCall] get(...) +# 3| -1: [TypeAccess] TestKt +# 3| 0: [VarAccess] arr +# 3| 1: [IntegerLiteral] 1 +# 3| 2: [IntegerLiteral] 2 +# 4| 2: [ExprStmt] ; +# 4| 0: [ImplicitCoercionToUnitExpr] +# 4| 0: [TypeAccess] Unit +# 4| 1: [MethodCall] get(...) +# 4| -1: [VarAccess] mt +# 4| 0: [IntegerLiteral] 1 +# 4| 1: [IntegerLiteral] 2 +# 6| 3: [ExprStmt] ; +# 6| 0: [ImplicitCoercionToUnitExpr] +# 6| 0: [TypeAccess] Unit +# 6| 1: [MethodCall] set(...) +# 6| -1: [TypeAccess] TestKt +# 6| 0: [VarAccess] arr +# 6| 1: [IntegerLiteral] 1 +# 6| 2: [IntegerLiteral] 2 +# 6| 3: [IntegerLiteral] 3 +# 7| 4: [ExprStmt] ; +# 7| 0: [ImplicitCoercionToUnitExpr] +# 7| 0: [TypeAccess] Unit +# 7| 1: [MethodCall] set(...) +# 7| -1: [TypeAccess] TestKt +# 7| 0: [VarAccess] arr +# 7| 1: [IntegerLiteral] 1 +# 7| 2: [ClassInstanceExpr] new C(...) +# 7| -3: [TypeAccess] C +# 10| 2: [ExtensionMethod] get +# 10| 3: [TypeAccess] String +#-----| 4: (Parameters) +# 10| 0: [Parameter] +# 10| 0: [TypeAccess] byte[] +# 10| 1: [Parameter] i +# 10| 0: [TypeAccess] int +# 10| 2: [Parameter] j +# 10| 0: [TypeAccess] int +# 10| 5: [BlockStmt] { ... } +# 10| 0: [ReturnStmt] return ... +# 10| 0: [StringLiteral] "" +# 11| 3: [ExtensionMethod] set +# 11| 3: [TypeAccess] String +#-----| 4: (Parameters) +# 11| 0: [Parameter] +# 11| 0: [TypeAccess] byte[] +# 11| 1: [Parameter] i +# 11| 0: [TypeAccess] int +# 11| 2: [Parameter] j +# 11| 0: [TypeAccess] int +# 11| 3: [Parameter] k +# 11| 0: [TypeAccess] int +# 11| 5: [BlockStmt] { ... } +# 11| 0: [ReturnStmt] return ... +# 11| 0: [StringLiteral] "" +# 12| 4: [ExtensionMethod] set +# 12| 3: [TypeAccess] String +#-----| 4: (Parameters) +# 12| 0: [Parameter] +# 12| 0: [TypeAccess] byte[] +# 12| 1: [Parameter] i +# 12| 0: [TypeAccess] int +# 12| 2: [Parameter] c +# 12| 0: [TypeAccess] C +# 12| 5: [BlockStmt] { ... } +# 12| 0: [ReturnStmt] return ... +# 12| 0: [StringLiteral] "" +# 15| 2: [Class] C +# 15| 1: [Constructor] C +# 15| 5: [BlockStmt] { ... } +# 15| 0: [SuperConstructorInvocationStmt] super(...) +# 15| 1: [BlockStmt] { ... } +# 16| 2: [Method] get +# 16| 3: [TypeAccess] String +#-----| 4: (Parameters) +# 16| 0: [Parameter] i +# 16| 0: [TypeAccess] int +# 16| 1: [Parameter] j +# 16| 0: [TypeAccess] int +# 16| 5: [BlockStmt] { ... } +# 16| 0: [ReturnStmt] return ... +# 16| 0: [StringLiteral] "" diff --git a/java/ql/test-kotlin2/library-tests/operator-overloads/PrintAst.qlref b/java/ql/test-kotlin2/library-tests/operator-overloads/PrintAst.qlref new file mode 100644 index 00000000000..c7fd5faf239 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/operator-overloads/PrintAst.qlref @@ -0,0 +1 @@ +semmle/code/java/PrintAst.ql \ No newline at end of file diff --git a/java/ql/test-kotlin2/library-tests/operator-overloads/test.expected b/java/ql/test-kotlin2/library-tests/operator-overloads/test.expected new file mode 100644 index 00000000000..e69de29bb2d diff --git a/java/ql/test-kotlin2/library-tests/operator-overloads/test.kt b/java/ql/test-kotlin2/library-tests/operator-overloads/test.kt new file mode 100644 index 00000000000..d332c995148 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/operator-overloads/test.kt @@ -0,0 +1,17 @@ +fun fn(arr: ByteArray, mt: C) { + arr[1] + arr[1, 2] + mt[1, 2] + + arr[1, 2] = 3 + arr[1] = C() +} + +public operator fun ByteArray.get(i: Int, j: Int) = "" +public operator fun ByteArray.set(i: Int, j: Int, k: Int) = "" +public operator fun ByteArray.set(i: Int, c: C) = "" + + +public class C { + public operator fun get(i: Int, j: Int) = "" +} diff --git a/java/ql/test-kotlin2/library-tests/operator-overloads/test.ql b/java/ql/test-kotlin2/library-tests/operator-overloads/test.ql new file mode 100644 index 00000000000..16d62d79b3c --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/operator-overloads/test.ql @@ -0,0 +1,6 @@ +import java +import java +import semmle.code.java.Diagnostics + +from Diagnostic d +select d diff --git a/java/ql/test-kotlin2/library-tests/parameter-defaults/PrintAst.expected b/java/ql/test-kotlin2/library-tests/parameter-defaults/PrintAst.expected new file mode 100644 index 00000000000..c1787f19440 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/parameter-defaults/PrintAst.expected @@ -0,0 +1,1725 @@ +test.kt: +# 0| [CompilationUnit] test +# 0| 1: [Class] TestKt +# 1| 1: [Method] sink +# 1| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 1| 0: [Parameter] a +# 1| 0: [TypeAccess] Object +# 1| 5: [BlockStmt] { ... } +# 184| 2: [Method] varargsTest +# 184| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 184| 0: [Parameter] x +# 184| 0: [TypeAccess] String +# 184| 1: [Parameter] y +# 184| 0: [TypeAccess] String[] +# 184| 0: [WildcardTypeAccess] ? ... +# 184| 0: [TypeAccess] String +# 184| 2: [Parameter] z +# 184| 0: [TypeAccess] String +# 184| 5: [BlockStmt] { ... } +# 185| 0: [ExprStmt] ; +# 185| 0: [MethodCall] sink(...) +# 185| -1: [TypeAccess] TestKt +# 185| 0: [VarAccess] x +# 186| 1: [ExprStmt] ; +# 186| 0: [MethodCall] sink(...) +# 186| -1: [TypeAccess] TestKt +# 186| 0: [ArrayAccess] ...[...] +# 186| 0: [VarAccess] y +# 186| 1: [IntegerLiteral] 0 +# 187| 2: [ExprStmt] ; +# 187| 0: [MethodCall] sink(...) +# 187| -1: [TypeAccess] TestKt +# 187| 0: [VarAccess] z +# 184| 3: [Method] varargsTest$default +# 184| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 184| 0: [Parameter] p0 +# 184| 0: [TypeAccess] String +# 184| 1: [Parameter] p1 +# 184| 0: [TypeAccess] String[] +# 184| 2: [Parameter] p2 +# 184| 0: [TypeAccess] String +# 184| 3: [Parameter] p3 +# 184| 0: [TypeAccess] int +# 184| 4: [Parameter] p4 +# 184| 0: [TypeAccess] Object +# 184| 5: [BlockStmt] { ... } +# 184| 0: [IfStmt] if (...) +# 184| 0: [EQExpr] ... == ... +# 184| 0: [AndBitwiseExpr] ... & ... +# 184| 0: [IntegerLiteral] 1 +# 184| 1: [VarAccess] p3 +# 184| 1: [IntegerLiteral] 0 +# 184| 1: [ExprStmt] ; +# 184| 0: [AssignExpr] ...=... +# 184| 0: [VarAccess] p0 +# 184| 1: [StringLiteral] "before-vararg-default sunk" +# 184| 1: [IfStmt] if (...) +# 184| 0: [EQExpr] ... == ... +# 184| 0: [AndBitwiseExpr] ... & ... +# 184| 0: [IntegerLiteral] 2 +# 184| 1: [VarAccess] p3 +# 184| 1: [IntegerLiteral] 0 +# 184| 1: [ExprStmt] ; +# 184| 0: [AssignExpr] ...=... +# 184| 0: [VarAccess] p1 +# 184| 1: [ArrayCreationExpr] new String[] +# 184| -2: [ArrayInit] {...} +# 184| 0: [StringLiteral] "first-vararg-default sunk" +# 184| 1: [StringLiteral] "second-vararg-default sunk" +# 184| -1: [TypeAccess] String +# 184| 0: [IntegerLiteral] 2 +# 184| 2: [IfStmt] if (...) +# 184| 0: [EQExpr] ... == ... +# 184| 0: [AndBitwiseExpr] ... & ... +# 184| 0: [IntegerLiteral] 4 +# 184| 1: [VarAccess] p3 +# 184| 1: [IntegerLiteral] 0 +# 184| 1: [ExprStmt] ; +# 184| 0: [AssignExpr] ...=... +# 184| 0: [VarAccess] p2 +# 184| 1: [StringLiteral] "after-vararg-default sunk" +# 184| 3: [ReturnStmt] return ... +# 184| 0: [MethodCall] varargsTest(...) +# 184| -1: [TypeAccess] TestKt +# 184| 0: [VarAccess] p0 +# 184| 1: [VarAccess] p1 +# 184| 2: [VarAccess] p2 +# 190| 4: [Method] varargsUser +# 190| 3: [TypeAccess] Unit +# 190| 5: [BlockStmt] { ... } +# 191| 0: [ExprStmt] ; +# 191| 0: [MethodCall] varargsTest$default(...) +# 191| -1: [TypeAccess] TestKt +# 1| 0: [NullLiteral] null +# 1| 1: [NullLiteral] null +# 1| 2: [NullLiteral] null +# 1| 3: [IntegerLiteral] 0 +# 1| 4: [NullLiteral] null +# 192| 1: [ExprStmt] ; +# 192| 0: [MethodCall] varargsTest$default(...) +# 192| -1: [TypeAccess] TestKt +# 192| 0: [StringLiteral] "no-varargs-before, no-z-parameter sunk" +# 1| 1: [NullLiteral] null +# 1| 2: [NullLiteral] null +# 1| 3: [IntegerLiteral] 1 +# 1| 4: [NullLiteral] null +# 193| 2: [ExprStmt] ; +# 193| 0: [MethodCall] varargsTest$default(...) +# 193| -1: [TypeAccess] TestKt +# 193| 0: [StringLiteral] "no-varargs-before sunk" +# 1| 1: [NullLiteral] null +# 193| 2: [StringLiteral] "no-varargs-after sunk" +# 1| 3: [IntegerLiteral] 5 +# 1| 4: [NullLiteral] null +# 194| 3: [ExprStmt] ; +# 194| 0: [MethodCall] varargsTest(...) +# 194| -1: [TypeAccess] TestKt +# 194| 0: [StringLiteral] "one-vararg-before sunk" +# 194| 1: [StringLiteral] "one-vararg sunk" +# 194| 2: [StringLiteral] "one-vararg-after sunk" +# 195| 4: [ExprStmt] ; +# 195| 0: [MethodCall] varargsTest(...) +# 195| -1: [TypeAccess] TestKt +# 195| 0: [StringLiteral] "two-varargs-before sunk" +# 195| 1: [StringLiteral] "two-vararg-first sunk" +# 195| 2: [StringLiteral] "two-vararg-second sunk" +# 195| 3: [StringLiteral] "two-varargs-after sunk" +# 196| 5: [ExprStmt] ; +# 196| 0: [MethodCall] varargsTest$default(...) +# 196| -1: [TypeAccess] TestKt +# 196| 0: [StringLiteral] "no-z-parmeter sunk" +# 196| 1: [ArrayCreationExpr] new String[] +# 196| -2: [ArrayInit] {...} +# 196| 0: [StringLiteral] "no-z-parameter first vararg sunk" +# 196| 1: [StringLiteral] "no-z-parameter second vararg sunk" +# 196| -1: [TypeAccess] String +# 196| 0: [IntegerLiteral] 2 +# 1| 2: [NullLiteral] null +# 1| 3: [IntegerLiteral] 3 +# 1| 4: [NullLiteral] null +# 199| 5: [Method] varargsTestOnlySinkVarargs +# 199| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 199| 0: [Parameter] x +# 199| 0: [TypeAccess] String +# 199| 1: [Parameter] y +# 199| 0: [TypeAccess] String[] +# 199| 0: [WildcardTypeAccess] ? ... +# 199| 0: [TypeAccess] String +# 199| 2: [Parameter] z +# 199| 0: [TypeAccess] String +# 199| 5: [BlockStmt] { ... } +# 200| 0: [ExprStmt] ; +# 200| 0: [MethodCall] sink(...) +# 200| -1: [TypeAccess] TestKt +# 200| 0: [ArrayAccess] ...[...] +# 200| 0: [VarAccess] y +# 200| 1: [IntegerLiteral] 0 +# 199| 6: [Method] varargsTestOnlySinkVarargs$default +# 199| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 199| 0: [Parameter] p0 +# 199| 0: [TypeAccess] String +# 199| 1: [Parameter] p1 +# 199| 0: [TypeAccess] String[] +# 199| 2: [Parameter] p2 +# 199| 0: [TypeAccess] String +# 199| 3: [Parameter] p3 +# 199| 0: [TypeAccess] int +# 199| 4: [Parameter] p4 +# 199| 0: [TypeAccess] Object +# 199| 5: [BlockStmt] { ... } +# 199| 0: [IfStmt] if (...) +# 199| 0: [EQExpr] ... == ... +# 199| 0: [AndBitwiseExpr] ... & ... +# 199| 0: [IntegerLiteral] 1 +# 199| 1: [VarAccess] p3 +# 199| 1: [IntegerLiteral] 0 +# 199| 1: [ExprStmt] ; +# 199| 0: [AssignExpr] ...=... +# 199| 0: [VarAccess] p0 +# 199| 1: [StringLiteral] "before-vararg-default not sunk 2" +# 199| 1: [IfStmt] if (...) +# 199| 0: [EQExpr] ... == ... +# 199| 0: [AndBitwiseExpr] ... & ... +# 199| 0: [IntegerLiteral] 2 +# 199| 1: [VarAccess] p3 +# 199| 1: [IntegerLiteral] 0 +# 199| 1: [ExprStmt] ; +# 199| 0: [AssignExpr] ...=... +# 199| 0: [VarAccess] p1 +# 199| 1: [ArrayCreationExpr] new String[] +# 199| -2: [ArrayInit] {...} +# 199| 0: [StringLiteral] "first-vararg-default sunk 2" +# 199| 1: [StringLiteral] "second-vararg-default sunk 2" +# 199| -1: [TypeAccess] String +# 199| 0: [IntegerLiteral] 2 +# 199| 2: [IfStmt] if (...) +# 199| 0: [EQExpr] ... == ... +# 199| 0: [AndBitwiseExpr] ... & ... +# 199| 0: [IntegerLiteral] 4 +# 199| 1: [VarAccess] p3 +# 199| 1: [IntegerLiteral] 0 +# 199| 1: [ExprStmt] ; +# 199| 0: [AssignExpr] ...=... +# 199| 0: [VarAccess] p2 +# 199| 1: [StringLiteral] "after-vararg-default not sunk 2" +# 199| 3: [ReturnStmt] return ... +# 199| 0: [MethodCall] varargsTestOnlySinkVarargs(...) +# 199| -1: [TypeAccess] TestKt +# 199| 0: [VarAccess] p0 +# 199| 1: [VarAccess] p1 +# 199| 2: [VarAccess] p2 +# 203| 7: [Method] varargsUserOnlySinkVarargs +# 203| 3: [TypeAccess] Unit +# 203| 5: [BlockStmt] { ... } +# 204| 0: [ExprStmt] ; +# 204| 0: [MethodCall] varargsTestOnlySinkVarargs$default(...) +# 204| -1: [TypeAccess] TestKt +# 1| 0: [NullLiteral] null +# 1| 1: [NullLiteral] null +# 1| 2: [NullLiteral] null +# 1| 3: [IntegerLiteral] 0 +# 1| 4: [NullLiteral] null +# 205| 1: [ExprStmt] ; +# 205| 0: [MethodCall] varargsTestOnlySinkVarargs$default(...) +# 205| -1: [TypeAccess] TestKt +# 205| 0: [StringLiteral] "no-varargs-before, no-z-parameter not sunk 2" +# 1| 1: [NullLiteral] null +# 1| 2: [NullLiteral] null +# 1| 3: [IntegerLiteral] 1 +# 1| 4: [NullLiteral] null +# 206| 2: [ExprStmt] ; +# 206| 0: [MethodCall] varargsTestOnlySinkVarargs$default(...) +# 206| -1: [TypeAccess] TestKt +# 206| 0: [StringLiteral] "no-varargs-before not sunk 2" +# 1| 1: [NullLiteral] null +# 206| 2: [StringLiteral] "no-varargs-after not sunk 2" +# 1| 3: [IntegerLiteral] 5 +# 1| 4: [NullLiteral] null +# 207| 3: [ExprStmt] ; +# 207| 0: [MethodCall] varargsTestOnlySinkVarargs(...) +# 207| -1: [TypeAccess] TestKt +# 207| 0: [StringLiteral] "one-vararg-before not sunk 2" +# 207| 1: [StringLiteral] "one-vararg sunk 2" +# 207| 2: [StringLiteral] "one-vararg-after not sunk 2" +# 208| 4: [ExprStmt] ; +# 208| 0: [MethodCall] varargsTestOnlySinkVarargs(...) +# 208| -1: [TypeAccess] TestKt +# 208| 0: [StringLiteral] "two-varargs-before not sunk 2" +# 208| 1: [StringLiteral] "two-vararg-first sunk 2" +# 208| 2: [StringLiteral] "two-vararg-second sunk 2" +# 208| 3: [StringLiteral] "two-varargs-after not sunk 2" +# 209| 5: [ExprStmt] ; +# 209| 0: [MethodCall] varargsTestOnlySinkVarargs$default(...) +# 209| -1: [TypeAccess] TestKt +# 209| 0: [StringLiteral] "no-z-parmeter not sunk 2" +# 209| 1: [ArrayCreationExpr] new String[] +# 209| -2: [ArrayInit] {...} +# 209| 0: [StringLiteral] "no-z-parameter first vararg sunk 2" +# 209| 1: [StringLiteral] "no-z-parameter second vararg sunk 2" +# 209| -1: [TypeAccess] String +# 209| 0: [IntegerLiteral] 2 +# 1| 2: [NullLiteral] null +# 1| 3: [IntegerLiteral] 3 +# 1| 4: [NullLiteral] null +# 212| 8: [Method] varargsTestOnlySinkRegularArgs +# 212| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 212| 0: [Parameter] x +# 212| 0: [TypeAccess] String +# 212| 1: [Parameter] y +# 212| 0: [TypeAccess] String[] +# 212| 0: [WildcardTypeAccess] ? ... +# 212| 0: [TypeAccess] String +# 212| 2: [Parameter] z +# 212| 0: [TypeAccess] String +# 212| 5: [BlockStmt] { ... } +# 213| 0: [ExprStmt] ; +# 213| 0: [MethodCall] sink(...) +# 213| -1: [TypeAccess] TestKt +# 213| 0: [VarAccess] x +# 214| 1: [ExprStmt] ; +# 214| 0: [MethodCall] sink(...) +# 214| -1: [TypeAccess] TestKt +# 214| 0: [VarAccess] z +# 212| 9: [Method] varargsTestOnlySinkRegularArgs$default +# 212| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 212| 0: [Parameter] p0 +# 212| 0: [TypeAccess] String +# 212| 1: [Parameter] p1 +# 212| 0: [TypeAccess] String[] +# 212| 2: [Parameter] p2 +# 212| 0: [TypeAccess] String +# 212| 3: [Parameter] p3 +# 212| 0: [TypeAccess] int +# 212| 4: [Parameter] p4 +# 212| 0: [TypeAccess] Object +# 212| 5: [BlockStmt] { ... } +# 212| 0: [IfStmt] if (...) +# 212| 0: [EQExpr] ... == ... +# 212| 0: [AndBitwiseExpr] ... & ... +# 212| 0: [IntegerLiteral] 1 +# 212| 1: [VarAccess] p3 +# 212| 1: [IntegerLiteral] 0 +# 212| 1: [ExprStmt] ; +# 212| 0: [AssignExpr] ...=... +# 212| 0: [VarAccess] p0 +# 212| 1: [StringLiteral] "before-vararg-default sunk 3" +# 212| 1: [IfStmt] if (...) +# 212| 0: [EQExpr] ... == ... +# 212| 0: [AndBitwiseExpr] ... & ... +# 212| 0: [IntegerLiteral] 2 +# 212| 1: [VarAccess] p3 +# 212| 1: [IntegerLiteral] 0 +# 212| 1: [ExprStmt] ; +# 212| 0: [AssignExpr] ...=... +# 212| 0: [VarAccess] p1 +# 212| 1: [ArrayCreationExpr] new String[] +# 212| -2: [ArrayInit] {...} +# 212| 0: [StringLiteral] "first-vararg-default not sunk 3" +# 212| 1: [StringLiteral] "second-vararg-default not sunk 3" +# 212| -1: [TypeAccess] String +# 212| 0: [IntegerLiteral] 2 +# 212| 2: [IfStmt] if (...) +# 212| 0: [EQExpr] ... == ... +# 212| 0: [AndBitwiseExpr] ... & ... +# 212| 0: [IntegerLiteral] 4 +# 212| 1: [VarAccess] p3 +# 212| 1: [IntegerLiteral] 0 +# 212| 1: [ExprStmt] ; +# 212| 0: [AssignExpr] ...=... +# 212| 0: [VarAccess] p2 +# 212| 1: [StringLiteral] "after-vararg-default sunk 3" +# 212| 3: [ReturnStmt] return ... +# 212| 0: [MethodCall] varargsTestOnlySinkRegularArgs(...) +# 212| -1: [TypeAccess] TestKt +# 212| 0: [VarAccess] p0 +# 212| 1: [VarAccess] p1 +# 212| 2: [VarAccess] p2 +# 217| 10: [Method] varargsUserOnlySinkRegularArgs +# 217| 3: [TypeAccess] Unit +# 217| 5: [BlockStmt] { ... } +# 218| 0: [ExprStmt] ; +# 218| 0: [MethodCall] varargsTestOnlySinkRegularArgs$default(...) +# 218| -1: [TypeAccess] TestKt +# 1| 0: [NullLiteral] null +# 1| 1: [NullLiteral] null +# 1| 2: [NullLiteral] null +# 1| 3: [IntegerLiteral] 0 +# 1| 4: [NullLiteral] null +# 219| 1: [ExprStmt] ; +# 219| 0: [MethodCall] varargsTestOnlySinkRegularArgs$default(...) +# 219| -1: [TypeAccess] TestKt +# 219| 0: [StringLiteral] "no-varargs-before, no-z-parameter sunk 3" +# 1| 1: [NullLiteral] null +# 1| 2: [NullLiteral] null +# 1| 3: [IntegerLiteral] 1 +# 1| 4: [NullLiteral] null +# 220| 2: [ExprStmt] ; +# 220| 0: [MethodCall] varargsTestOnlySinkRegularArgs$default(...) +# 220| -1: [TypeAccess] TestKt +# 220| 0: [StringLiteral] "no-varargs-before sunk 3" +# 1| 1: [NullLiteral] null +# 220| 2: [StringLiteral] "no-varargs-after sunk 3" +# 1| 3: [IntegerLiteral] 5 +# 1| 4: [NullLiteral] null +# 221| 3: [ExprStmt] ; +# 221| 0: [MethodCall] varargsTestOnlySinkRegularArgs(...) +# 221| -1: [TypeAccess] TestKt +# 221| 0: [StringLiteral] "one-vararg-before sunk 3" +# 221| 1: [StringLiteral] "one-vararg not sunk 3" +# 221| 2: [StringLiteral] "one-vararg-after sunk 3" +# 222| 4: [ExprStmt] ; +# 222| 0: [MethodCall] varargsTestOnlySinkRegularArgs(...) +# 222| -1: [TypeAccess] TestKt +# 222| 0: [StringLiteral] "two-varargs-before sunk 3" +# 222| 1: [StringLiteral] "two-vararg-first not sunk 3" +# 222| 2: [StringLiteral] "two-vararg-second not sunk 3" +# 222| 3: [StringLiteral] "two-varargs-after sunk 3" +# 223| 5: [ExprStmt] ; +# 223| 0: [MethodCall] varargsTestOnlySinkRegularArgs$default(...) +# 223| -1: [TypeAccess] TestKt +# 223| 0: [StringLiteral] "no-z-parmeter sunk 3" +# 223| 1: [ArrayCreationExpr] new String[] +# 223| -2: [ArrayInit] {...} +# 223| 0: [StringLiteral] "no-z-parameter first vararg not sunk 3" +# 223| 1: [StringLiteral] "no-z-parameter second vararg not sunk 3" +# 223| -1: [TypeAccess] String +# 223| 0: [IntegerLiteral] 2 +# 1| 2: [NullLiteral] null +# 1| 3: [IntegerLiteral] 3 +# 1| 4: [NullLiteral] null +# 232| 11: [Method] varargsConstructorUser +# 232| 3: [TypeAccess] Unit +# 232| 5: [BlockStmt] { ... } +# 233| 0: [ExprStmt] ; +# 233| 0: [ImplicitCoercionToUnitExpr] +# 233| 0: [TypeAccess] Unit +# 233| 1: [ClassInstanceExpr] new VarargsConstructorTest(...) +# 233| -3: [TypeAccess] VarargsConstructorTest +# 233| 0: [StringLiteral] "varargs constructor test sunk" +# 234| 1: [ExprStmt] ; +# 234| 0: [ImplicitCoercionToUnitExpr] +# 234| 0: [TypeAccess] Unit +# 234| 1: [ClassInstanceExpr] new VarargsConstructorTest(...) +# 234| -3: [TypeAccess] VarargsConstructorTest +# 234| 0: [StringLiteral] "varargs constructor test sunk 2" +# 234| 1: [StringLiteral] "varargs constructor test not sunk 1" +# 234| 2: [StringLiteral] "varargs constructor test not sunk 2" +# 3| 2: [Class] TestMember +# 3| 1: [Constructor] TestMember +# 3| 5: [BlockStmt] { ... } +# 3| 0: [SuperConstructorInvocationStmt] super(...) +# 3| 1: [BlockStmt] { ... } +# 5| 2: [Method] f +# 5| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 5| 0: [Parameter] x +# 5| 0: [TypeAccess] String +# 5| 1: [Parameter] y +# 5| 0: [TypeAccess] String +# 5| 2: [Parameter] z +# 5| 0: [TypeAccess] String +# 5| 5: [BlockStmt] { ... } +# 6| 0: [ExprStmt] ; +# 6| 0: [MethodCall] sink(...) +# 6| -1: [TypeAccess] TestKt +# 6| 0: [VarAccess] y +# 5| 3: [Method] f$default +# 5| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 5| 0: [Parameter] p0 +# 5| 0: [TypeAccess] TestMember +# 5| 1: [Parameter] p1 +# 5| 0: [TypeAccess] String +# 5| 2: [Parameter] p2 +# 5| 0: [TypeAccess] String +# 5| 3: [Parameter] p3 +# 5| 0: [TypeAccess] String +# 5| 4: [Parameter] p4 +# 5| 0: [TypeAccess] int +# 5| 5: [Parameter] p5 +# 5| 0: [TypeAccess] Object +# 5| 5: [BlockStmt] { ... } +# 5| 0: [IfStmt] if (...) +# 5| 0: [EQExpr] ... == ... +# 5| 0: [AndBitwiseExpr] ... & ... +# 5| 0: [IntegerLiteral] 2 +# 5| 1: [VarAccess] p4 +# 5| 1: [IntegerLiteral] 0 +# 5| 1: [ExprStmt] ; +# 5| 0: [AssignExpr] ...=... +# 5| 0: [VarAccess] p2 +# 5| 1: [VarAccess] p1 +# 5| 1: [IfStmt] if (...) +# 5| 0: [EQExpr] ... == ... +# 5| 0: [AndBitwiseExpr] ... & ... +# 5| 0: [IntegerLiteral] 4 +# 5| 1: [VarAccess] p4 +# 5| 1: [IntegerLiteral] 0 +# 5| 1: [ExprStmt] ; +# 5| 0: [AssignExpr] ...=... +# 5| 0: [VarAccess] p3 +# 5| 1: [StringLiteral] "hello world" +# 5| 2: [ReturnStmt] return ... +# 5| 0: [MethodCall] f(...) +# 5| -1: [VarAccess] p0 +# 5| 0: [VarAccess] p1 +# 5| 1: [VarAccess] p2 +# 5| 2: [VarAccess] p3 +# 9| 4: [Method] user +# 9| 3: [TypeAccess] Unit +# 9| 5: [BlockStmt] { ... } +# 10| 0: [ExprStmt] ; +# 10| 0: [MethodCall] f$default(...) +# 10| -1: [TypeAccess] TestMember +# 10| 0: [ThisAccess] this +# 10| 1: [StringLiteral] "member sunk" +# 1| 2: [NullLiteral] null +# 1| 3: [NullLiteral] null +# 1| 4: [IntegerLiteral] 1 +# 1| 5: [NullLiteral] null +# 11| 1: [ExprStmt] ; +# 11| 0: [MethodCall] f$default(...) +# 11| -1: [TypeAccess] TestMember +# 11| 0: [ThisAccess] this +# 11| 1: [StringLiteral] "member sunk fp" +# 11| 2: [StringLiteral] "member sunk 2" +# 1| 3: [NullLiteral] null +# 1| 4: [IntegerLiteral] 3 +# 1| 5: [NullLiteral] null +# 12| 2: [ExprStmt] ; +# 12| 0: [MethodCall] f(...) +# 12| -1: [ThisAccess] this +# 12| 0: [StringLiteral] "not sunk" +# 12| 1: [StringLiteral] "member sunk 3" +# 12| 2: [StringLiteral] "not sunk" +# 17| 3: [Class] TestExtensionMember +# 17| 1: [Constructor] TestExtensionMember +# 17| 5: [BlockStmt] { ... } +# 17| 0: [SuperConstructorInvocationStmt] super(...) +# 17| 1: [BlockStmt] { ... } +# 19| 2: [ExtensionMethod] f +# 19| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 19| 0: [Parameter] +# 19| 0: [TypeAccess] String +# 19| 1: [Parameter] x +# 19| 0: [TypeAccess] String +# 19| 2: [Parameter] y +# 19| 0: [TypeAccess] String +# 19| 3: [Parameter] z +# 19| 0: [TypeAccess] String +# 19| 5: [BlockStmt] { ... } +# 20| 0: [ExprStmt] ; +# 20| 0: [MethodCall] sink(...) +# 20| -1: [TypeAccess] TestKt +# 20| 0: [ExtensionReceiverAccess] this +# 21| 1: [ExprStmt] ; +# 21| 0: [MethodCall] sink(...) +# 21| -1: [TypeAccess] TestKt +# 21| 0: [VarAccess] y +# 19| 3: [ExtensionMethod] f$default +# 19| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 19| 0: [Parameter] p0 +# 19| 0: [TypeAccess] TestExtensionMember +# 19| 1: [Parameter] p1 +# 19| 0: [TypeAccess] String +# 19| 2: [Parameter] p2 +# 19| 0: [TypeAccess] String +# 19| 3: [Parameter] p3 +# 19| 0: [TypeAccess] String +# 19| 4: [Parameter] p4 +# 19| 0: [TypeAccess] String +# 19| 5: [Parameter] p5 +# 19| 0: [TypeAccess] int +# 19| 6: [Parameter] p6 +# 19| 0: [TypeAccess] Object +# 19| 5: [BlockStmt] { ... } +# 19| 0: [IfStmt] if (...) +# 19| 0: [EQExpr] ... == ... +# 19| 0: [AndBitwiseExpr] ... & ... +# 19| 0: [IntegerLiteral] 2 +# 19| 1: [VarAccess] p5 +# 19| 1: [IntegerLiteral] 0 +# 19| 1: [ExprStmt] ; +# 19| 0: [AssignExpr] ...=... +# 19| 0: [VarAccess] p3 +# 19| 1: [VarAccess] p2 +# 19| 1: [IfStmt] if (...) +# 19| 0: [EQExpr] ... == ... +# 19| 0: [AndBitwiseExpr] ... & ... +# 19| 0: [IntegerLiteral] 4 +# 19| 1: [VarAccess] p5 +# 19| 1: [IntegerLiteral] 0 +# 19| 1: [ExprStmt] ; +# 19| 0: [AssignExpr] ...=... +# 19| 0: [VarAccess] p4 +# 19| 1: [StringLiteral] "hello world" +# 19| 2: [ReturnStmt] return ... +# 19| 0: [MethodCall] f(...) +# 19| -1: [VarAccess] p0 +# 19| 0: [ExtensionReceiverAccess] this +# 19| 1: [VarAccess] p2 +# 19| 2: [VarAccess] p3 +# 19| 3: [VarAccess] p4 +# 24| 4: [Method] user +# 24| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 24| 0: [Parameter] sunk +# 24| 0: [TypeAccess] String +# 24| 5: [BlockStmt] { ... } +# 25| 0: [ExprStmt] ; +# 25| 0: [MethodCall] f$default(...) +# 25| -1: [TypeAccess] TestExtensionMember +# 25| 0: [ThisAccess] this +# 25| 1: [VarAccess] sunk +# 25| 2: [StringLiteral] "extension sunk" +# 1| 3: [NullLiteral] null +# 1| 4: [NullLiteral] null +# 1| 5: [IntegerLiteral] 1 +# 1| 6: [NullLiteral] null +# 26| 1: [ExprStmt] ; +# 26| 0: [MethodCall] f$default(...) +# 26| -1: [TypeAccess] TestExtensionMember +# 26| 0: [ThisAccess] this +# 26| 1: [VarAccess] sunk +# 26| 2: [StringLiteral] "extension sunk fp" +# 26| 3: [StringLiteral] "extension sunk 2" +# 1| 4: [NullLiteral] null +# 1| 5: [IntegerLiteral] 3 +# 1| 6: [NullLiteral] null +# 27| 2: [ExprStmt] ; +# 27| 0: [MethodCall] f(...) +# 27| -1: [ThisAccess] this +# 27| 0: [VarAccess] sunk +# 27| 1: [StringLiteral] "not sunk" +# 27| 2: [StringLiteral] "extension sunk 3" +# 27| 3: [StringLiteral] "not sunk" +# 32| 4: [Class] TestStaticMember +# 32| 1: [Constructor] TestStaticMember +# 32| 5: [BlockStmt] { ... } +# 32| 0: [SuperConstructorInvocationStmt] super(...) +# 32| 1: [BlockStmt] { ... } +# 34| 2: [Method] f +#-----| 1: (Annotations) +# 34| 1: [Annotation] JvmStatic +# 34| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 34| 0: [Parameter] x +# 34| 0: [TypeAccess] String +# 34| 1: [Parameter] y +# 34| 0: [TypeAccess] String +# 34| 2: [Parameter] z +# 34| 0: [TypeAccess] String +# 34| 5: [BlockStmt] { ... } +# 35| 0: [ExprStmt] ; +# 35| 0: [MethodCall] sink(...) +# 35| -1: [TypeAccess] TestKt +# 35| 0: [VarAccess] y +# 34| 3: [Method] f$default +# 34| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 34| 0: [Parameter] p0 +# 34| 0: [TypeAccess] String +# 34| 1: [Parameter] p1 +# 34| 0: [TypeAccess] String +# 34| 2: [Parameter] p2 +# 34| 0: [TypeAccess] String +# 34| 3: [Parameter] p3 +# 34| 0: [TypeAccess] int +# 34| 4: [Parameter] p4 +# 34| 0: [TypeAccess] Object +# 34| 5: [BlockStmt] { ... } +# 34| 0: [IfStmt] if (...) +# 34| 0: [EQExpr] ... == ... +# 34| 0: [AndBitwiseExpr] ... & ... +# 34| 0: [IntegerLiteral] 2 +# 34| 1: [VarAccess] p3 +# 34| 1: [IntegerLiteral] 0 +# 34| 1: [ExprStmt] ; +# 34| 0: [AssignExpr] ...=... +# 34| 0: [VarAccess] p1 +# 34| 1: [VarAccess] p0 +# 34| 1: [IfStmt] if (...) +# 34| 0: [EQExpr] ... == ... +# 34| 0: [AndBitwiseExpr] ... & ... +# 34| 0: [IntegerLiteral] 4 +# 34| 1: [VarAccess] p3 +# 34| 1: [IntegerLiteral] 0 +# 34| 1: [ExprStmt] ; +# 34| 0: [AssignExpr] ...=... +# 34| 0: [VarAccess] p2 +# 34| 1: [StringLiteral] "hello world" +# 34| 2: [ReturnStmt] return ... +# 34| 0: [MethodCall] f(...) +# 34| -1: [TypeAccess] TestStaticMember +# 34| 0: [VarAccess] p0 +# 34| 1: [VarAccess] p1 +# 34| 2: [VarAccess] p2 +# 38| 4: [Method] user +# 38| 3: [TypeAccess] Unit +# 38| 5: [BlockStmt] { ... } +# 39| 0: [ExprStmt] ; +# 39| 0: [MethodCall] f$default(...) +# 39| -1: [TypeAccess] TestStaticMember +# 39| 0: [StringLiteral] "static sunk" +# 1| 1: [NullLiteral] null +# 1| 2: [NullLiteral] null +# 1| 3: [IntegerLiteral] 1 +# 1| 4: [NullLiteral] null +# 40| 1: [ExprStmt] ; +# 40| 0: [MethodCall] f$default(...) +# 40| -1: [TypeAccess] TestStaticMember +# 40| 0: [StringLiteral] "static sunk fp" +# 40| 1: [StringLiteral] "static sunk 2" +# 1| 2: [NullLiteral] null +# 1| 3: [IntegerLiteral] 3 +# 1| 4: [NullLiteral] null +# 41| 2: [ExprStmt] ; +# 41| 0: [MethodCall] f(...) +# 41| -1: [TypeAccess] TestStaticMember +# 41| 0: [StringLiteral] "not sunk" +# 41| 1: [StringLiteral] "static sunk 3" +# 41| 2: [StringLiteral] "not sunk" +# 46| 5: [Class] ExtendMe +# 46| 1: [Constructor] ExtendMe +# 46| 5: [BlockStmt] { ... } +# 46| 0: [SuperConstructorInvocationStmt] super(...) +# 46| 1: [BlockStmt] { ... } +# 48| 2: [Method] f +# 48| 3: [TypeAccess] String +#-----| 4: (Parameters) +# 48| 0: [Parameter] x +# 48| 0: [TypeAccess] String +# 48| 5: [BlockStmt] { ... } +# 48| 0: [ReturnStmt] return ... +# 48| 0: [VarAccess] x +# 52| 6: [Class] TestReceiverReferences +# 52| 1: [Constructor] TestReceiverReferences +# 52| 5: [BlockStmt] { ... } +# 52| 0: [SuperConstructorInvocationStmt] super(...) +# 52| 1: [BlockStmt] { ... } +# 54| 2: [Method] g +# 54| 3: [TypeAccess] String +#-----| 4: (Parameters) +# 54| 0: [Parameter] x +# 54| 0: [TypeAccess] String +# 54| 5: [BlockStmt] { ... } +# 54| 0: [ReturnStmt] return ... +# 54| 0: [VarAccess] x +# 56| 3: [ExtensionMethod] test +# 56| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 56| 0: [Parameter] +# 56| 0: [TypeAccess] ExtendMe +# 56| 1: [Parameter] x +# 56| 0: [TypeAccess] String +# 56| 2: [Parameter] y +# 56| 0: [TypeAccess] String +# 56| 3: [Parameter] z +# 56| 0: [TypeAccess] String +# 56| 5: [BlockStmt] { ... } +# 57| 0: [ExprStmt] ; +# 57| 0: [MethodCall] sink(...) +# 57| -1: [TypeAccess] TestKt +# 57| 0: [VarAccess] y +# 56| 4: [ExtensionMethod] test$default +# 56| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 56| 0: [Parameter] p0 +# 56| 0: [TypeAccess] TestReceiverReferences +# 56| 1: [Parameter] p1 +# 56| 0: [TypeAccess] ExtendMe +# 56| 2: [Parameter] p2 +# 56| 0: [TypeAccess] String +# 56| 3: [Parameter] p3 +# 56| 0: [TypeAccess] String +# 56| 4: [Parameter] p4 +# 56| 0: [TypeAccess] String +# 56| 5: [Parameter] p5 +# 56| 0: [TypeAccess] int +# 56| 6: [Parameter] p6 +# 56| 0: [TypeAccess] Object +# 56| 5: [BlockStmt] { ... } +# 56| 0: [IfStmt] if (...) +# 56| 0: [EQExpr] ... == ... +# 56| 0: [AndBitwiseExpr] ... & ... +# 56| 0: [IntegerLiteral] 2 +# 56| 1: [VarAccess] p5 +# 56| 1: [IntegerLiteral] 0 +# 56| 1: [ExprStmt] ; +# 56| 0: [AssignExpr] ...=... +# 56| 0: [VarAccess] p3 +# 56| 1: [MethodCall] f(...) +# 56| -1: [VarAccess] p0 +# 56| 0: [MethodCall] g(...) +# 56| -1: [VarAccess] p0 +# 56| 0: [VarAccess] p2 +# 56| 1: [IfStmt] if (...) +# 56| 0: [EQExpr] ... == ... +# 56| 0: [AndBitwiseExpr] ... & ... +# 56| 0: [IntegerLiteral] 4 +# 56| 1: [VarAccess] p5 +# 56| 1: [IntegerLiteral] 0 +# 56| 1: [ExprStmt] ; +# 56| 0: [AssignExpr] ...=... +# 56| 0: [VarAccess] p4 +# 56| 1: [StringLiteral] "hello world" +# 56| 2: [ReturnStmt] return ... +# 56| 0: [MethodCall] test(...) +# 56| -1: [VarAccess] p0 +# 56| 0: [ExtensionReceiverAccess] this +# 56| 1: [VarAccess] p2 +# 56| 2: [VarAccess] p3 +# 56| 3: [VarAccess] p4 +# 60| 5: [Method] user +# 60| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 60| 0: [Parameter] t +# 60| 0: [TypeAccess] ExtendMe +# 60| 5: [BlockStmt] { ... } +# 61| 0: [ExprStmt] ; +# 61| 0: [MethodCall] test$default(...) +# 61| -1: [TypeAccess] TestReceiverReferences +# 61| 0: [ThisAccess] this +# 61| 1: [VarAccess] t +# 61| 2: [StringLiteral] "receiver refs sunk" +# 1| 3: [NullLiteral] null +# 1| 4: [NullLiteral] null +# 1| 5: [IntegerLiteral] 1 +# 1| 6: [NullLiteral] null +# 62| 1: [ExprStmt] ; +# 62| 0: [MethodCall] test$default(...) +# 62| -1: [TypeAccess] TestReceiverReferences +# 62| 0: [ThisAccess] this +# 62| 1: [VarAccess] t +# 62| 2: [StringLiteral] "receiver refs sunk fp" +# 62| 3: [StringLiteral] "receiver refs sunk 2" +# 1| 4: [NullLiteral] null +# 1| 5: [IntegerLiteral] 3 +# 1| 6: [NullLiteral] null +# 63| 2: [ExprStmt] ; +# 63| 0: [MethodCall] test(...) +# 63| -1: [ThisAccess] this +# 63| 0: [VarAccess] t +# 63| 1: [StringLiteral] "not sunk" +# 63| 2: [StringLiteral] "receiver refs sunk 3" +# 63| 3: [StringLiteral] "not sunk" +# 68| 7: [Class] TestConstructor +# 68| 1: [Constructor] TestConstructor +#-----| 4: (Parameters) +# 68| 0: [Parameter] x +# 68| 0: [TypeAccess] String +# 68| 1: [Parameter] y +# 68| 0: [TypeAccess] String +# 68| 2: [Parameter] z +# 68| 0: [TypeAccess] String +# 68| 5: [BlockStmt] { ... } +# 68| 0: [SuperConstructorInvocationStmt] super(...) +# 68| 1: [BlockStmt] { ... } +# 71| 0: [ExprStmt] ; +# 71| 0: [MethodCall] sink(...) +# 71| -1: [TypeAccess] TestKt +# 71| 0: [VarAccess] y +# 68| 2: [Constructor] TestConstructor +#-----| 4: (Parameters) +# 68| 0: [Parameter] p0 +# 68| 0: [TypeAccess] String +# 68| 1: [Parameter] p1 +# 68| 0: [TypeAccess] String +# 68| 2: [Parameter] p2 +# 68| 0: [TypeAccess] String +# 68| 3: [Parameter] p3 +# 68| 0: [TypeAccess] int +# 68| 4: [Parameter] p4 +# 68| 0: [TypeAccess] DefaultConstructorMarker +# 68| 5: [BlockStmt] { ... } +# 68| 0: [IfStmt] if (...) +# 68| 0: [EQExpr] ... == ... +# 68| 0: [AndBitwiseExpr] ... & ... +# 68| 0: [IntegerLiteral] 2 +# 68| 1: [VarAccess] p3 +# 68| 1: [IntegerLiteral] 0 +# 68| 1: [ExprStmt] ; +# 68| 0: [AssignExpr] ...=... +# 68| 0: [VarAccess] p1 +# 68| 1: [VarAccess] p0 +# 68| 1: [IfStmt] if (...) +# 68| 0: [EQExpr] ... == ... +# 68| 0: [AndBitwiseExpr] ... & ... +# 68| 0: [IntegerLiteral] 4 +# 68| 1: [VarAccess] p3 +# 68| 1: [IntegerLiteral] 0 +# 68| 1: [ExprStmt] ; +# 68| 0: [AssignExpr] ...=... +# 68| 0: [VarAccess] p2 +# 68| 1: [StringLiteral] "hello world" +# 68| 2: [ThisConstructorInvocationStmt] this(...) +# 68| 0: [VarAccess] p0 +# 68| 1: [VarAccess] p1 +# 68| 2: [VarAccess] p2 +# 74| 3: [Method] user +# 74| 3: [TypeAccess] Unit +# 74| 5: [BlockStmt] { ... } +# 75| 0: [ExprStmt] ; +# 75| 0: [ImplicitCoercionToUnitExpr] +# 75| 0: [TypeAccess] Unit +# 75| 1: [ClassInstanceExpr] new TestConstructor(...) +# 75| -3: [TypeAccess] TestConstructor +# 75| 0: [StringLiteral] "constructor sunk" +# 1| 1: [NullLiteral] null +# 1| 2: [NullLiteral] null +# 1| 3: [IntegerLiteral] 1 +# 1| 4: [NullLiteral] null +# 76| 1: [ExprStmt] ; +# 76| 0: [ImplicitCoercionToUnitExpr] +# 76| 0: [TypeAccess] Unit +# 76| 1: [ClassInstanceExpr] new TestConstructor(...) +# 76| -3: [TypeAccess] TestConstructor +# 76| 0: [StringLiteral] "constructor sunk fp" +# 76| 1: [StringLiteral] "constructor sunk 2" +# 1| 2: [NullLiteral] null +# 1| 3: [IntegerLiteral] 3 +# 1| 4: [NullLiteral] null +# 77| 2: [ExprStmt] ; +# 77| 0: [ImplicitCoercionToUnitExpr] +# 77| 0: [TypeAccess] Unit +# 77| 1: [ClassInstanceExpr] new TestConstructor(...) +# 77| -3: [TypeAccess] TestConstructor +# 77| 0: [StringLiteral] "not sunk" +# 77| 1: [StringLiteral] "constructor sunk 3" +# 77| 2: [StringLiteral] "not sunk" +# 82| 8: [Class] TestLocal +# 82| 1: [Constructor] TestLocal +# 82| 5: [BlockStmt] { ... } +# 82| 0: [SuperConstructorInvocationStmt] super(...) +# 82| 1: [BlockStmt] { ... } +# 84| 2: [Method] enclosing +# 84| 3: [TypeAccess] Unit +# 84| 5: [BlockStmt] { ... } +# 86| 0: [LocalTypeDeclStmt] class ... +# 86| 0: [LocalClass] +# 86| 1: [Constructor] +# 86| 5: [BlockStmt] { ... } +# 86| 0: [SuperConstructorInvocationStmt] super(...) +# 86| 2: [Method] f +# 86| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 86| 0: [Parameter] x +# 86| 0: [TypeAccess] String +# 86| 1: [Parameter] y +# 86| 0: [TypeAccess] String +# 86| 2: [Parameter] z +# 86| 0: [TypeAccess] String +# 86| 5: [BlockStmt] { ... } +# 87| 0: [ExprStmt] ; +# 87| 0: [MethodCall] sink(...) +# 87| -1: [TypeAccess] TestKt +# 87| 0: [VarAccess] y +# 86| 3: [Method] f$default +# 86| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 86| 0: [Parameter] p0 +# 86| 0: [TypeAccess] String +# 86| 1: [Parameter] p1 +# 86| 0: [TypeAccess] String +# 86| 2: [Parameter] p2 +# 86| 0: [TypeAccess] String +# 86| 3: [Parameter] p3 +# 86| 0: [TypeAccess] int +# 86| 4: [Parameter] p4 +# 86| 0: [TypeAccess] Object +# 86| 5: [BlockStmt] { ... } +# 86| 0: [IfStmt] if (...) +# 86| 0: [EQExpr] ... == ... +# 86| 0: [AndBitwiseExpr] ... & ... +# 86| 0: [IntegerLiteral] 2 +# 86| 1: [VarAccess] p3 +# 86| 1: [IntegerLiteral] 0 +# 86| 1: [ExprStmt] ; +# 86| 0: [AssignExpr] ...=... +# 86| 0: [VarAccess] p1 +# 86| 1: [VarAccess] p0 +# 86| 1: [IfStmt] if (...) +# 86| 0: [EQExpr] ... == ... +# 86| 0: [AndBitwiseExpr] ... & ... +# 86| 0: [IntegerLiteral] 4 +# 86| 1: [VarAccess] p3 +# 86| 1: [IntegerLiteral] 0 +# 86| 1: [ExprStmt] ; +# 86| 0: [AssignExpr] ...=... +# 86| 0: [VarAccess] p2 +# 86| 1: [StringLiteral] "hello world" +# 86| 2: [ReturnStmt] return ... +# 86| 0: [MethodCall] f(...) +# 86| -1: [ClassInstanceExpr] new (...) +# 86| -3: [TypeAccess] Object +# 86| 0: [VarAccess] p0 +# 86| 1: [VarAccess] p1 +# 86| 2: [VarAccess] p2 +# 90| 1: [LocalTypeDeclStmt] class ... +# 90| 0: [LocalClass] +# 90| 1: [Constructor] +# 90| 5: [BlockStmt] { ... } +# 90| 0: [SuperConstructorInvocationStmt] super(...) +# 90| 2: [Method] user +# 90| 3: [TypeAccess] Unit +# 90| 5: [BlockStmt] { ... } +# 91| 0: [ExprStmt] ; +# 91| 0: [MethodCall] f$default(...) +# 91| -1: [TypeAccess] +# 91| 0: [StringLiteral] "local sunk" +# 1| 1: [NullLiteral] null +# 1| 2: [NullLiteral] null +# 1| 3: [IntegerLiteral] 1 +# 1| 4: [NullLiteral] null +# 92| 1: [ExprStmt] ; +# 92| 0: [MethodCall] f$default(...) +# 92| -1: [TypeAccess] +# 92| 0: [StringLiteral] "local sunk fp" +# 92| 1: [StringLiteral] "local sunk 2" +# 1| 2: [NullLiteral] null +# 1| 3: [IntegerLiteral] 3 +# 1| 4: [NullLiteral] null +# 93| 2: [ExprStmt] ; +# 93| 0: [MethodCall] f(...) +# 93| -1: [ClassInstanceExpr] new (...) +# 93| -3: [TypeAccess] Object +# 93| 0: [StringLiteral] "not sunk" +# 93| 1: [StringLiteral] "local sunk 3" +# 93| 2: [StringLiteral] "not sunk" +# 100| 9: [Class] TestLocalClass +# 100| 1: [Constructor] TestLocalClass +# 100| 5: [BlockStmt] { ... } +# 100| 0: [SuperConstructorInvocationStmt] super(...) +# 100| 1: [BlockStmt] { ... } +# 102| 2: [Method] enclosingFunction +# 102| 3: [TypeAccess] Unit +# 102| 5: [BlockStmt] { ... } +# 104| 0: [LocalTypeDeclStmt] class ... +# 104| 0: [LocalClass] EnclosingLocalClass +# 104| 1: [Constructor] EnclosingLocalClass +# 104| 5: [BlockStmt] { ... } +# 104| 0: [SuperConstructorInvocationStmt] super(...) +# 104| 1: [BlockStmt] { ... } +# 106| 2: [Method] f +# 106| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 106| 0: [Parameter] x +# 106| 0: [TypeAccess] String +# 106| 1: [Parameter] y +# 106| 0: [TypeAccess] String +# 106| 2: [Parameter] z +# 106| 0: [TypeAccess] String +# 106| 5: [BlockStmt] { ... } +# 107| 0: [ExprStmt] ; +# 107| 0: [MethodCall] sink(...) +# 107| -1: [TypeAccess] TestKt +# 107| 0: [VarAccess] y +# 106| 3: [Method] f$default +# 106| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 106| 0: [Parameter] p0 +# 106| 0: [TypeAccess] EnclosingLocalClass +# 106| 1: [Parameter] p1 +# 106| 0: [TypeAccess] String +# 106| 2: [Parameter] p2 +# 106| 0: [TypeAccess] String +# 106| 3: [Parameter] p3 +# 106| 0: [TypeAccess] String +# 106| 4: [Parameter] p4 +# 106| 0: [TypeAccess] int +# 106| 5: [Parameter] p5 +# 106| 0: [TypeAccess] Object +# 106| 5: [BlockStmt] { ... } +# 106| 0: [IfStmt] if (...) +# 106| 0: [EQExpr] ... == ... +# 106| 0: [AndBitwiseExpr] ... & ... +# 106| 0: [IntegerLiteral] 2 +# 106| 1: [VarAccess] p4 +# 106| 1: [IntegerLiteral] 0 +# 106| 1: [ExprStmt] ; +# 106| 0: [AssignExpr] ...=... +# 106| 0: [VarAccess] p2 +# 106| 1: [VarAccess] p1 +# 106| 1: [IfStmt] if (...) +# 106| 0: [EQExpr] ... == ... +# 106| 0: [AndBitwiseExpr] ... & ... +# 106| 0: [IntegerLiteral] 4 +# 106| 1: [VarAccess] p4 +# 106| 1: [IntegerLiteral] 0 +# 106| 1: [ExprStmt] ; +# 106| 0: [AssignExpr] ...=... +# 106| 0: [VarAccess] p3 +# 106| 1: [StringLiteral] "hello world" +# 106| 2: [ReturnStmt] return ... +# 106| 0: [MethodCall] f(...) +# 106| -1: [VarAccess] p0 +# 106| 0: [VarAccess] p1 +# 106| 1: [VarAccess] p2 +# 106| 2: [VarAccess] p3 +# 110| 4: [Method] user +# 110| 3: [TypeAccess] Unit +# 110| 5: [BlockStmt] { ... } +# 111| 0: [ExprStmt] ; +# 111| 0: [MethodCall] f$default(...) +# 111| -1: [TypeAccess] EnclosingLocalClass +# 111| 0: [ThisAccess] this +# 111| 1: [StringLiteral] "local sunk" +# 1| 2: [NullLiteral] null +# 1| 3: [NullLiteral] null +# 1| 4: [IntegerLiteral] 1 +# 1| 5: [NullLiteral] null +# 112| 1: [ExprStmt] ; +# 112| 0: [MethodCall] f$default(...) +# 112| -1: [TypeAccess] EnclosingLocalClass +# 112| 0: [ThisAccess] this +# 112| 1: [StringLiteral] "local sunk fp" +# 112| 2: [StringLiteral] "local sunk 2" +# 1| 3: [NullLiteral] null +# 1| 4: [IntegerLiteral] 3 +# 1| 5: [NullLiteral] null +# 113| 2: [ExprStmt] ; +# 113| 0: [MethodCall] f(...) +# 113| -1: [ThisAccess] this +# 113| 0: [StringLiteral] "not sunk" +# 113| 1: [StringLiteral] "local sunk 3" +# 113| 2: [StringLiteral] "not sunk" +# 122| 10: [Class,GenericType,ParameterizedType] TestGeneric +#-----| -2: (Generic Parameters) +# 122| 0: [TypeVariable] T +# 122| 1: [Constructor] TestGeneric +# 122| 5: [BlockStmt] { ... } +# 122| 0: [SuperConstructorInvocationStmt] super(...) +# 122| 1: [BlockStmt] { ... } +# 124| 2: [Method] f +# 124| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 124| 0: [Parameter] x +# 124| 0: [TypeAccess] T +# 124| 1: [Parameter] y +# 124| 0: [TypeAccess] T +# 124| 2: [Parameter] z +# 124| 0: [TypeAccess] T +# 124| 5: [BlockStmt] { ... } +# 125| 0: [ExprStmt] ; +# 125| 0: [MethodCall] sink(...) +# 125| -1: [TypeAccess] TestKt +# 125| 0: [VarAccess] y +# 124| 3: [Method] f$default +# 124| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 124| 0: [Parameter] p0 +# 124| 0: [TypeAccess] TestGeneric<> +# 124| 1: [Parameter] p1 +# 124| 0: [TypeAccess] Object +# 124| 2: [Parameter] p2 +# 124| 0: [TypeAccess] Object +# 124| 3: [Parameter] p3 +# 124| 0: [TypeAccess] Object +# 124| 4: [Parameter] p4 +# 124| 0: [TypeAccess] int +# 124| 5: [Parameter] p5 +# 124| 0: [TypeAccess] Object +# 124| 5: [BlockStmt] { ... } +# 124| 0: [IfStmt] if (...) +# 124| 0: [EQExpr] ... == ... +# 124| 0: [AndBitwiseExpr] ... & ... +# 124| 0: [IntegerLiteral] 2 +# 124| 1: [VarAccess] p4 +# 124| 1: [IntegerLiteral] 0 +# 124| 1: [ExprStmt] ; +# 124| 0: [AssignExpr] ...=... +# 124| 0: [VarAccess] p2 +# 124| 1: [VarAccess] p1 +# 124| 1: [IfStmt] if (...) +# 124| 0: [EQExpr] ... == ... +# 124| 0: [AndBitwiseExpr] ... & ... +# 124| 0: [IntegerLiteral] 4 +# 124| 1: [VarAccess] p4 +# 124| 1: [IntegerLiteral] 0 +# 124| 1: [ExprStmt] ; +# 124| 0: [AssignExpr] ...=... +# 124| 0: [VarAccess] p3 +# 124| 1: [NullLiteral] null +# 124| 2: [ReturnStmt] return ... +# 124| 0: [MethodCall] f(...) +# 124| -1: [VarAccess] p0 +# 124| 0: [VarAccess] p1 +# 124| 1: [VarAccess] p2 +# 124| 2: [VarAccess] p3 +# 128| 4: [Method] user +# 128| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 128| 0: [Parameter] tgs +# 128| 0: [TypeAccess] TestGeneric +# 128| 0: [TypeAccess] String +# 128| 1: [Parameter] tcs +# 128| 0: [TypeAccess] TestGeneric +# 128| 0: [TypeAccess] CharSequence +# 128| 5: [BlockStmt] { ... } +# 129| 0: [ExprStmt] ; +# 129| 0: [MethodCall] f$default(...) +# 129| -1: [TypeAccess] TestGeneric<> +# 129| 0: [VarAccess] tgs +# 129| 1: [StringLiteral] "generic sunk" +# 1| 2: [NullLiteral] null +# 1| 3: [NullLiteral] null +# 1| 4: [IntegerLiteral] 1 +# 1| 5: [NullLiteral] null +# 130| 1: [ExprStmt] ; +# 130| 0: [MethodCall] f$default(...) +# 130| -1: [TypeAccess] TestGeneric<> +# 130| 0: [VarAccess] tcs +# 130| 1: [StringLiteral] "generic sunk fp" +# 130| 2: [StringLiteral] "generic sunk 2" +# 1| 3: [NullLiteral] null +# 1| 4: [IntegerLiteral] 3 +# 1| 5: [NullLiteral] null +# 131| 2: [ExprStmt] ; +# 131| 0: [MethodCall] f(...) +# 131| -1: [VarAccess] tgs +# 131| 0: [StringLiteral] "not sunk" +# 131| 1: [StringLiteral] "generic sunk 3" +# 131| 2: [StringLiteral] "not sunk" +# 132| 3: [ExprStmt] ; +# 132| 0: [MethodCall] f(...) +# 132| -1: [VarAccess] tcs +# 132| 0: [StringLiteral] "not sunk" +# 132| 1: [StringLiteral] "generic sunk 3" +# 132| 2: [StringLiteral] "not sunk" +# 135| 5: [Method] testReturn +# 135| 3: [TypeAccess] T +#-----| 4: (Parameters) +# 135| 0: [Parameter] t1 +# 135| 0: [TypeAccess] T +# 135| 1: [Parameter] t2 +# 135| 0: [TypeAccess] T +# 135| 5: [BlockStmt] { ... } +# 135| 0: [ReturnStmt] return ... +# 135| 0: [VarAccess] t1 +# 135| 6: [Method] testReturn$default +# 135| 3: [TypeAccess] Object +#-----| 4: (Parameters) +# 135| 0: [Parameter] p0 +# 135| 0: [TypeAccess] TestGeneric<> +# 135| 1: [Parameter] p1 +# 135| 0: [TypeAccess] Object +# 135| 2: [Parameter] p2 +# 135| 0: [TypeAccess] Object +# 135| 3: [Parameter] p3 +# 135| 0: [TypeAccess] int +# 135| 4: [Parameter] p4 +# 135| 0: [TypeAccess] Object +# 135| 5: [BlockStmt] { ... } +# 135| 0: [IfStmt] if (...) +# 135| 0: [EQExpr] ... == ... +# 135| 0: [AndBitwiseExpr] ... & ... +# 135| 0: [IntegerLiteral] 2 +# 135| 1: [VarAccess] p3 +# 135| 1: [IntegerLiteral] 0 +# 135| 1: [ExprStmt] ; +# 135| 0: [AssignExpr] ...=... +# 135| 0: [VarAccess] p2 +# 135| 1: [NullLiteral] null +# 135| 1: [ReturnStmt] return ... +# 135| 0: [MethodCall] testReturn(...) +# 135| -1: [VarAccess] p0 +# 135| 0: [VarAccess] p1 +# 135| 1: [VarAccess] p2 +# 137| 7: [Method] testReturnUser +# 137| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 137| 0: [Parameter] tgs +# 137| 0: [TypeAccess] TestGeneric +# 137| 0: [TypeAccess] String +# 137| 5: [BlockStmt] { ... } +# 138| 0: [ExprStmt] ; +# 138| 0: [MethodCall] sink(...) +# 138| -1: [TypeAccess] TestKt +# 138| 0: [MethodCall] testReturn$default(...) +# 138| -1: [TypeAccess] TestGeneric<> +# 138| 0: [VarAccess] tgs +# 138| 1: [StringLiteral] "sunk return value" +# 1| 2: [NullLiteral] null +# 1| 3: [IntegerLiteral] 1 +# 1| 4: [NullLiteral] null +# 143| 12: [Class,GenericType,ParameterizedType] TestGenericFunction +#-----| -2: (Generic Parameters) +# 143| 0: [TypeVariable] T +# 143| 1: [Constructor] TestGenericFunction +# 143| 5: [BlockStmt] { ... } +# 143| 0: [SuperConstructorInvocationStmt] super(...) +# 143| 1: [BlockStmt] { ... } +# 145| 2: [Method] f +#-----| 2: (Generic Parameters) +# 145| 0: [TypeVariable] S +# 145| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 145| 0: [Parameter] x +# 145| 0: [TypeAccess] S +# 145| 1: [Parameter] y +# 145| 0: [TypeAccess] T +# 145| 2: [Parameter] def1 +# 145| 0: [TypeAccess] T +# 145| 3: [Parameter] def2 +# 145| 0: [TypeAccess] List +# 145| 0: [WildcardTypeAccess] ? ... +# 145| 0: [TypeAccess] T +# 145| 4: [Parameter] def3 +# 145| 0: [TypeAccess] S +# 145| 5: [Parameter] def4 +# 145| 0: [TypeAccess] List +# 145| 0: [WildcardTypeAccess] ? ... +# 145| 0: [TypeAccess] S +# 145| 5: [BlockStmt] { ... } +# 146| 0: [ExprStmt] ; +# 146| 0: [MethodCall] sink(...) +# 146| -1: [TypeAccess] TestKt +# 146| 0: [VarAccess] y +# 145| 3: [Method] f$default +# 145| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 145| 0: [Parameter] p0 +# 145| 0: [TypeAccess] TestGenericFunction<> +# 145| 1: [Parameter] p1 +# 145| 0: [TypeAccess] Object +# 145| 2: [Parameter] p2 +# 145| 0: [TypeAccess] Object +# 145| 3: [Parameter] p3 +# 145| 0: [TypeAccess] Object +# 145| 4: [Parameter] p4 +# 145| 0: [TypeAccess] List<> +# 145| 5: [Parameter] p5 +# 145| 0: [TypeAccess] Object +# 145| 6: [Parameter] p6 +# 145| 0: [TypeAccess] List<> +# 145| 7: [Parameter] p7 +# 145| 0: [TypeAccess] int +# 145| 8: [Parameter] p8 +# 145| 0: [TypeAccess] Object +# 145| 5: [BlockStmt] { ... } +# 145| 0: [IfStmt] if (...) +# 145| 0: [EQExpr] ... == ... +# 145| 0: [AndBitwiseExpr] ... & ... +# 145| 0: [IntegerLiteral] 2 +# 145| 1: [VarAccess] p7 +# 145| 1: [IntegerLiteral] 0 +# 145| 1: [ExprStmt] ; +# 145| 0: [AssignExpr] ...=... +# 145| 0: [VarAccess] p2 +# 145| 1: [VarAccess] p1 +# 145| 1: [IfStmt] if (...) +# 145| 0: [EQExpr] ... == ... +# 145| 0: [AndBitwiseExpr] ... & ... +# 145| 0: [IntegerLiteral] 4 +# 145| 1: [VarAccess] p7 +# 145| 1: [IntegerLiteral] 0 +# 145| 1: [ExprStmt] ; +# 145| 0: [AssignExpr] ...=... +# 145| 0: [VarAccess] p3 +# 145| 1: [NullLiteral] null +# 145| 2: [IfStmt] if (...) +# 145| 0: [EQExpr] ... == ... +# 145| 0: [AndBitwiseExpr] ... & ... +# 145| 0: [IntegerLiteral] 8 +# 145| 1: [VarAccess] p7 +# 145| 1: [IntegerLiteral] 0 +# 145| 1: [ExprStmt] ; +# 145| 0: [AssignExpr] ...=... +# 145| 0: [VarAccess] p4 +# 145| 1: [MethodCall] listOf(...) +# 145| -2: [TypeAccess] T +# 145| -1: [TypeAccess] CollectionsKt +# 145| 0: [VarAccess] p2 +# 145| 3: [IfStmt] if (...) +# 145| 0: [EQExpr] ... == ... +# 145| 0: [AndBitwiseExpr] ... & ... +# 145| 0: [IntegerLiteral] 16 +# 145| 1: [VarAccess] p7 +# 145| 1: [IntegerLiteral] 0 +# 145| 1: [ExprStmt] ; +# 145| 0: [AssignExpr] ...=... +# 145| 0: [VarAccess] p5 +# 145| 1: [NullLiteral] null +# 145| 4: [IfStmt] if (...) +# 145| 0: [EQExpr] ... == ... +# 145| 0: [AndBitwiseExpr] ... & ... +# 145| 0: [IntegerLiteral] 32 +# 145| 1: [VarAccess] p7 +# 145| 1: [IntegerLiteral] 0 +# 145| 1: [ExprStmt] ; +# 145| 0: [AssignExpr] ...=... +# 145| 0: [VarAccess] p6 +# 145| 1: [MethodCall] listOf(...) +# 145| -2: [TypeAccess] S +# 145| -1: [TypeAccess] CollectionsKt +# 145| 0: [VarAccess] p1 +# 145| 5: [ReturnStmt] return ... +# 145| 0: [MethodCall] f(...) +# 145| -1: [VarAccess] p0 +# 145| 0: [VarAccess] p1 +# 145| 1: [VarAccess] p2 +# 145| 2: [VarAccess] p3 +# 145| 3: [VarAccess] p4 +# 145| 4: [VarAccess] p5 +# 145| 5: [VarAccess] p6 +# 149| 4: [Method] user +# 149| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 149| 0: [Parameter] inst +# 149| 0: [TypeAccess] TestGenericFunction +# 149| 0: [TypeAccess] String +# 149| 5: [BlockStmt] { ... } +# 150| 0: [ExprStmt] ; +# 150| 0: [MethodCall] f$default(...) +# 150| -1: [TypeAccess] TestGenericFunction<> +# 150| 0: [VarAccess] inst +# 150| 1: [StringLiteral] "generic function sunk" +# 1| 2: [NullLiteral] null +# 1| 3: [NullLiteral] null +# 1| 4: [NullLiteral] null +# 1| 5: [NullLiteral] null +# 1| 6: [NullLiteral] null +# 1| 7: [IntegerLiteral] 1 +# 1| 8: [NullLiteral] null +# 151| 1: [ExprStmt] ; +# 151| 0: [MethodCall] f$default(...) +# 151| -1: [TypeAccess] TestGenericFunction<> +# 151| 0: [VarAccess] inst +# 151| 1: [StringLiteral] "generic function sunk fp" +# 151| 2: [StringLiteral] "generic function sunk 2" +# 1| 3: [NullLiteral] null +# 1| 4: [NullLiteral] null +# 1| 5: [NullLiteral] null +# 1| 6: [NullLiteral] null +# 1| 7: [IntegerLiteral] 3 +# 1| 8: [NullLiteral] null +# 156| 14: [Class] VisibilityTests +# 156| 1: [Constructor] VisibilityTests +# 156| 5: [BlockStmt] { ... } +# 156| 0: [SuperConstructorInvocationStmt] super(...) +# 156| 1: [BlockStmt] { ... } +# 158| 2: [Method] f +# 158| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 158| 0: [Parameter] x +# 158| 0: [TypeAccess] int +# 158| 1: [Parameter] y +# 158| 0: [TypeAccess] int +# 158| 5: [BlockStmt] { ... } +# 158| 0: [ReturnStmt] return ... +# 158| 0: [AddExpr] ... + ... +# 158| 0: [VarAccess] x +# 158| 1: [VarAccess] y +# 158| 3: [Method] f$default +# 158| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 158| 0: [Parameter] p0 +# 158| 0: [TypeAccess] VisibilityTests +# 158| 1: [Parameter] p1 +# 158| 0: [TypeAccess] int +# 158| 2: [Parameter] p2 +# 158| 0: [TypeAccess] int +# 158| 3: [Parameter] p3 +# 158| 0: [TypeAccess] int +# 158| 4: [Parameter] p4 +# 158| 0: [TypeAccess] Object +# 158| 5: [BlockStmt] { ... } +# 158| 0: [IfStmt] if (...) +# 158| 0: [EQExpr] ... == ... +# 158| 0: [AndBitwiseExpr] ... & ... +# 158| 0: [IntegerLiteral] 2 +# 158| 1: [VarAccess] p3 +# 158| 1: [IntegerLiteral] 0 +# 158| 1: [ExprStmt] ; +# 158| 0: [AssignExpr] ...=... +# 158| 0: [VarAccess] p2 +# 158| 1: [IntegerLiteral] 0 +# 158| 1: [ReturnStmt] return ... +# 158| 0: [MethodCall] f(...) +# 158| -1: [VarAccess] p0 +# 158| 0: [VarAccess] p1 +# 158| 1: [VarAccess] p2 +# 159| 4: [Method] g$main +# 159| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 159| 0: [Parameter] x +# 159| 0: [TypeAccess] int +# 159| 1: [Parameter] y +# 159| 0: [TypeAccess] int +# 159| 5: [BlockStmt] { ... } +# 159| 0: [ReturnStmt] return ... +# 159| 0: [AddExpr] ... + ... +# 159| 0: [VarAccess] x +# 159| 1: [VarAccess] y +# 159| 5: [Method] g$main$default +# 159| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 159| 0: [Parameter] p0 +# 159| 0: [TypeAccess] VisibilityTests +# 159| 1: [Parameter] p1 +# 159| 0: [TypeAccess] int +# 159| 2: [Parameter] p2 +# 159| 0: [TypeAccess] int +# 159| 3: [Parameter] p3 +# 159| 0: [TypeAccess] int +# 159| 4: [Parameter] p4 +# 159| 0: [TypeAccess] Object +# 159| 5: [BlockStmt] { ... } +# 159| 0: [IfStmt] if (...) +# 159| 0: [EQExpr] ... == ... +# 159| 0: [AndBitwiseExpr] ... & ... +# 159| 0: [IntegerLiteral] 2 +# 159| 1: [VarAccess] p3 +# 159| 1: [IntegerLiteral] 0 +# 159| 1: [ExprStmt] ; +# 159| 0: [AssignExpr] ...=... +# 159| 0: [VarAccess] p2 +# 159| 1: [IntegerLiteral] 0 +# 159| 1: [ReturnStmt] return ... +# 159| 0: [MethodCall] g$main(...) +# 159| -1: [VarAccess] p0 +# 159| 0: [VarAccess] p1 +# 159| 1: [VarAccess] p2 +# 160| 6: [Method] h +# 160| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 160| 0: [Parameter] x +# 160| 0: [TypeAccess] int +# 160| 1: [Parameter] y +# 160| 0: [TypeAccess] int +# 160| 5: [BlockStmt] { ... } +# 160| 0: [ReturnStmt] return ... +# 160| 0: [AddExpr] ... + ... +# 160| 0: [VarAccess] x +# 160| 1: [VarAccess] y +# 160| 7: [Method] h$default +# 160| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 160| 0: [Parameter] p0 +# 160| 0: [TypeAccess] VisibilityTests +# 160| 1: [Parameter] p1 +# 160| 0: [TypeAccess] int +# 160| 2: [Parameter] p2 +# 160| 0: [TypeAccess] int +# 160| 3: [Parameter] p3 +# 160| 0: [TypeAccess] int +# 160| 4: [Parameter] p4 +# 160| 0: [TypeAccess] Object +# 160| 5: [BlockStmt] { ... } +# 160| 0: [IfStmt] if (...) +# 160| 0: [EQExpr] ... == ... +# 160| 0: [AndBitwiseExpr] ... & ... +# 160| 0: [IntegerLiteral] 2 +# 160| 1: [VarAccess] p3 +# 160| 1: [IntegerLiteral] 0 +# 160| 1: [ExprStmt] ; +# 160| 0: [AssignExpr] ...=... +# 160| 0: [VarAccess] p2 +# 160| 1: [IntegerLiteral] 0 +# 160| 1: [ReturnStmt] return ... +# 160| 0: [MethodCall] h(...) +# 160| -1: [VarAccess] p0 +# 160| 0: [VarAccess] p1 +# 160| 1: [VarAccess] p2 +# 161| 8: [Method] i +# 161| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 161| 0: [Parameter] x +# 161| 0: [TypeAccess] int +# 161| 1: [Parameter] y +# 161| 0: [TypeAccess] int +# 161| 5: [BlockStmt] { ... } +# 161| 0: [ReturnStmt] return ... +# 161| 0: [AddExpr] ... + ... +# 161| 0: [VarAccess] x +# 161| 1: [VarAccess] y +# 161| 9: [Method] i$default +# 161| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 161| 0: [Parameter] p0 +# 161| 0: [TypeAccess] VisibilityTests +# 161| 1: [Parameter] p1 +# 161| 0: [TypeAccess] int +# 161| 2: [Parameter] p2 +# 161| 0: [TypeAccess] int +# 161| 3: [Parameter] p3 +# 161| 0: [TypeAccess] int +# 161| 4: [Parameter] p4 +# 161| 0: [TypeAccess] Object +# 161| 5: [BlockStmt] { ... } +# 161| 0: [IfStmt] if (...) +# 161| 0: [EQExpr] ... == ... +# 161| 0: [AndBitwiseExpr] ... & ... +# 161| 0: [IntegerLiteral] 2 +# 161| 1: [VarAccess] p3 +# 161| 1: [IntegerLiteral] 0 +# 161| 1: [ExprStmt] ; +# 161| 0: [AssignExpr] ...=... +# 161| 0: [VarAccess] p2 +# 161| 1: [IntegerLiteral] 0 +# 161| 1: [ReturnStmt] return ... +# 161| 0: [MethodCall] i(...) +# 161| -1: [VarAccess] p0 +# 161| 0: [VarAccess] p1 +# 161| 1: [VarAccess] p2 +# 165| 15: [Class,GenericType,ParameterizedType] TestGenericUsedWithinDefaultValue +#-----| -2: (Generic Parameters) +# 165| 0: [TypeVariable] T +# 165| 1: [Constructor] TestGenericUsedWithinDefaultValue +# 165| 5: [BlockStmt] { ... } +# 165| 0: [SuperConstructorInvocationStmt] super(...) +# 165| 1: [BlockStmt] { ... } +# 171| 2: [Method] f +# 171| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 171| 0: [Parameter] x +# 171| 0: [TypeAccess] int +# 171| 1: [Parameter] y +# 171| 0: [TypeAccess] String +# 171| 5: [BlockStmt] { ... } +# 171| 3: [Method] f$default +# 171| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 171| 0: [Parameter] p0 +# 171| 0: [TypeAccess] TestGenericUsedWithinDefaultValue<> +# 171| 1: [Parameter] p1 +# 171| 0: [TypeAccess] int +# 171| 2: [Parameter] p2 +# 171| 0: [TypeAccess] String +# 171| 3: [Parameter] p3 +# 171| 0: [TypeAccess] int +# 171| 4: [Parameter] p4 +# 171| 0: [TypeAccess] Object +# 171| 5: [BlockStmt] { ... } +# 171| 0: [IfStmt] if (...) +# 171| 0: [EQExpr] ... == ... +# 171| 0: [AndBitwiseExpr] ... & ... +# 171| 0: [IntegerLiteral] 2 +# 171| 1: [VarAccess] p3 +# 171| 1: [IntegerLiteral] 0 +# 171| 1: [ExprStmt] ; +# 171| 0: [AssignExpr] ...=... +# 171| 0: [VarAccess] p2 +# 171| 1: [MethodCall] ident(...) +# 171| -1: [ClassInstanceExpr] new TestGenericUsedWithinDefaultValue(...) +# 171| -3: [TypeAccess] TestGenericUsedWithinDefaultValue +# 171| 0: [TypeAccess] String +# 171| 0: [StringLiteral] "Hello world" +# 171| 1: [ReturnStmt] return ... +# 171| 0: [MethodCall] f(...) +# 171| -1: [VarAccess] p0 +# 171| 0: [VarAccess] p1 +# 171| 1: [VarAccess] p2 +# 173| 4: [Method] ident +# 173| 3: [TypeAccess] T +#-----| 4: (Parameters) +# 173| 0: [Parameter] t +# 173| 0: [TypeAccess] T +# 173| 5: [BlockStmt] { ... } +# 173| 0: [ReturnStmt] return ... +# 173| 0: [VarAccess] t +# 177| 17: [Class] TestOverloadsWithDefaults +# 177| 1: [Constructor] TestOverloadsWithDefaults +# 177| 5: [BlockStmt] { ... } +# 177| 0: [SuperConstructorInvocationStmt] super(...) +# 177| 1: [BlockStmt] { ... } +# 179| 2: [Method] f +# 179| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 179| 0: [Parameter] x +# 179| 0: [TypeAccess] int +# 179| 1: [Parameter] y +# 179| 0: [TypeAccess] String +# 179| 5: [BlockStmt] { ... } +# 179| 3: [Method] f$default +# 179| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 179| 0: [Parameter] p0 +# 179| 0: [TypeAccess] TestOverloadsWithDefaults +# 179| 1: [Parameter] p1 +# 179| 0: [TypeAccess] int +# 179| 2: [Parameter] p2 +# 179| 0: [TypeAccess] String +# 179| 3: [Parameter] p3 +# 179| 0: [TypeAccess] int +# 179| 4: [Parameter] p4 +# 179| 0: [TypeAccess] Object +# 179| 5: [BlockStmt] { ... } +# 179| 0: [IfStmt] if (...) +# 179| 0: [EQExpr] ... == ... +# 179| 0: [AndBitwiseExpr] ... & ... +# 179| 0: [IntegerLiteral] 2 +# 179| 1: [VarAccess] p3 +# 179| 1: [IntegerLiteral] 0 +# 179| 1: [ExprStmt] ; +# 179| 0: [AssignExpr] ...=... +# 179| 0: [VarAccess] p2 +# 179| 1: [StringLiteral] "Hello world" +# 179| 1: [ReturnStmt] return ... +# 179| 0: [MethodCall] f(...) +# 179| -1: [VarAccess] p0 +# 179| 0: [VarAccess] p1 +# 179| 1: [VarAccess] p2 +# 180| 4: [Method] f +# 180| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 180| 0: [Parameter] z +# 180| 0: [TypeAccess] String +# 180| 1: [Parameter] w +# 180| 0: [TypeAccess] int +# 180| 5: [BlockStmt] { ... } +# 180| 5: [Method] f$default +# 180| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 180| 0: [Parameter] p0 +# 180| 0: [TypeAccess] TestOverloadsWithDefaults +# 180| 1: [Parameter] p1 +# 180| 0: [TypeAccess] String +# 180| 2: [Parameter] p2 +# 180| 0: [TypeAccess] int +# 180| 3: [Parameter] p3 +# 180| 0: [TypeAccess] int +# 180| 4: [Parameter] p4 +# 180| 0: [TypeAccess] Object +# 180| 5: [BlockStmt] { ... } +# 180| 0: [IfStmt] if (...) +# 180| 0: [EQExpr] ... == ... +# 180| 0: [AndBitwiseExpr] ... & ... +# 180| 0: [IntegerLiteral] 2 +# 180| 1: [VarAccess] p3 +# 180| 1: [IntegerLiteral] 0 +# 180| 1: [ExprStmt] ; +# 180| 0: [AssignExpr] ...=... +# 180| 0: [VarAccess] p2 +# 180| 1: [IntegerLiteral] 0 +# 180| 1: [ReturnStmt] return ... +# 180| 0: [MethodCall] f(...) +# 180| -1: [VarAccess] p0 +# 180| 0: [VarAccess] p1 +# 180| 1: [VarAccess] p2 +# 226| 18: [Class] VarargsConstructorTest +# 226| 1: [Constructor] VarargsConstructorTest +#-----| 4: (Parameters) +# 226| 0: [Parameter] x +# 226| 0: [TypeAccess] String +# 226| 1: [Parameter] y +# 226| 0: [TypeAccess] String[] +# 226| 0: [WildcardTypeAccess] ? ... +# 226| 0: [TypeAccess] String +# 226| 5: [BlockStmt] { ... } +# 226| 0: [SuperConstructorInvocationStmt] super(...) +# 226| 1: [BlockStmt] { ... } +# 228| 0: [ExprStmt] ; +# 228| 0: [MethodCall] sink(...) +# 228| -1: [TypeAccess] TestKt +# 228| 0: [VarAccess] x diff --git a/java/ql/test-kotlin2/library-tests/parameter-defaults/PrintAst.qlref b/java/ql/test-kotlin2/library-tests/parameter-defaults/PrintAst.qlref new file mode 100644 index 00000000000..c7fd5faf239 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/parameter-defaults/PrintAst.qlref @@ -0,0 +1 @@ +semmle/code/java/PrintAst.ql \ No newline at end of file diff --git a/java/ql/test-kotlin2/library-tests/parameter-defaults/defaults.expected b/java/ql/test-kotlin2/library-tests/parameter-defaults/defaults.expected new file mode 100644 index 00000000000..5648ac7cf00 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/parameter-defaults/defaults.expected @@ -0,0 +1,20 @@ +| test.kt:5:3:7:3 | f | test.kt:5:3:7:3 | f$default | +| test.kt:19:3:22:3 | f | test.kt:19:3:22:3 | f$default | +| test.kt:34:14:36:3 | f | test.kt:34:14:36:3 | f$default | +| test.kt:56:3:58:3 | test | test.kt:56:3:58:3 | test$default | +| test.kt:68:1:80:1 | TestConstructor | test.kt:68:1:80:1 | TestConstructor | +| test.kt:86:5:88:5 | f | test.kt:86:5:88:5 | f$default | +| test.kt:106:7:108:7 | f | test.kt:106:7:108:7 | f$default | +| test.kt:124:3:126:3 | f | test.kt:124:3:126:3 | f$default | +| test.kt:135:3:135:43 | testReturn | test.kt:135:3:135:43 | testReturn$default | +| test.kt:145:3:147:3 | f | test.kt:145:3:147:3 | f$default | +| test.kt:158:3:158:35 | f | test.kt:158:3:158:35 | f$default | +| test.kt:159:12:159:44 | g$main | test.kt:159:12:159:44 | g$main$default | +| test.kt:160:13:160:45 | h | test.kt:160:13:160:45 | h$default | +| test.kt:161:11:161:43 | i | test.kt:161:11:161:43 | i$default | +| test.kt:171:3:171:97 | f | test.kt:171:3:171:97 | f$default | +| test.kt:179:3:179:46 | f | test.kt:179:3:179:46 | f$default | +| test.kt:180:3:180:34 | f | test.kt:180:3:180:34 | f$default | +| test.kt:184:1:188:1 | varargsTest | test.kt:184:1:188:1 | varargsTest$default | +| test.kt:199:1:201:1 | varargsTestOnlySinkVarargs | test.kt:199:1:201:1 | varargsTestOnlySinkVarargs$default | +| test.kt:212:1:215:1 | varargsTestOnlySinkRegularArgs | test.kt:212:1:215:1 | varargsTestOnlySinkRegularArgs$default | diff --git a/java/ql/test-kotlin2/library-tests/parameter-defaults/defaults.ql b/java/ql/test-kotlin2/library-tests/parameter-defaults/defaults.ql new file mode 100644 index 00000000000..e6f5f4b54c4 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/parameter-defaults/defaults.ql @@ -0,0 +1,7 @@ +import java + +from Callable realMethod, Callable defaultsProxy +where + defaultsProxy = realMethod.getKotlinParameterDefaultsProxy() and + realMethod.fromSource() +select realMethod, defaultsProxy diff --git a/java/ql/test-kotlin2/library-tests/parameter-defaults/erasure.expected b/java/ql/test-kotlin2/library-tests/parameter-defaults/erasure.expected new file mode 100644 index 00000000000..e6ed6dd1432 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/parameter-defaults/erasure.expected @@ -0,0 +1,36 @@ +| test.kt:124:3:126:3 | ...=... | test.kt:122:19:122:19 | T | +| test.kt:124:3:126:3 | ...=... | test.kt:122:19:122:19 | T | +| test.kt:124:3:126:3 | p1 | test.kt:122:19:122:19 | T | +| test.kt:124:3:126:3 | p2 | test.kt:122:19:122:19 | T | +| test.kt:124:3:126:3 | p2 | test.kt:122:19:122:19 | T | +| test.kt:124:3:126:3 | p3 | test.kt:122:19:122:19 | T | +| test.kt:124:3:126:3 | p3 | test.kt:122:19:122:19 | T | +| test.kt:124:22:124:22 | p1 | test.kt:122:19:122:19 | T | +| test.kt:135:3:135:43 | ...=... | test.kt:122:19:122:19 | T | +| test.kt:135:3:135:43 | p1 | test.kt:122:19:122:19 | T | +| test.kt:135:3:135:43 | p2 | test.kt:122:19:122:19 | T | +| test.kt:135:3:135:43 | p2 | test.kt:122:19:122:19 | T | +| test.kt:135:3:135:43 | testReturn(...) | test.kt:122:19:122:19 | T | +| test.kt:145:3:147:3 | ...=... | file:///modules/java.base/java/util/List.class:0:0:0:0 | List | +| test.kt:145:3:147:3 | ...=... | file:///modules/java.base/java/util/List.class:0:0:0:0 | List | +| test.kt:145:3:147:3 | ...=... | test.kt:143:27:143:27 | T | +| test.kt:145:3:147:3 | ...=... | test.kt:143:27:143:27 | T | +| test.kt:145:3:147:3 | ...=... | test.kt:145:8:145:12 | S | +| test.kt:145:3:147:3 | p1 | test.kt:145:8:145:12 | S | +| test.kt:145:3:147:3 | p2 | test.kt:143:27:143:27 | T | +| test.kt:145:3:147:3 | p2 | test.kt:143:27:143:27 | T | +| test.kt:145:3:147:3 | p3 | test.kt:143:27:143:27 | T | +| test.kt:145:3:147:3 | p3 | test.kt:143:27:143:27 | T | +| test.kt:145:3:147:3 | p4 | file:///modules/java.base/java/util/List.class:0:0:0:0 | List | +| test.kt:145:3:147:3 | p4 | file:///modules/java.base/java/util/List.class:0:0:0:0 | List | +| test.kt:145:3:147:3 | p5 | test.kt:145:8:145:12 | S | +| test.kt:145:3:147:3 | p5 | test.kt:145:8:145:12 | S | +| test.kt:145:3:147:3 | p6 | file:///modules/java.base/java/util/List.class:0:0:0:0 | List | +| test.kt:145:3:147:3 | p6 | file:///modules/java.base/java/util/List.class:0:0:0:0 | List | +| test.kt:145:30:145:30 | p1 | test.kt:145:8:145:12 | S | +| test.kt:145:66:145:74 | T | test.kt:143:27:143:27 | T | +| test.kt:145:66:145:74 | listOf(...) | file:///modules/java.base/java/util/List.class:0:0:0:0 | List | +| test.kt:145:73:145:73 | p2 | test.kt:143:27:143:27 | T | +| test.kt:145:111:145:119 | S | test.kt:145:8:145:12 | S | +| test.kt:145:111:145:119 | listOf(...) | file:///modules/java.base/java/util/List.class:0:0:0:0 | List | +| test.kt:145:118:145:118 | p1 | test.kt:145:8:145:12 | S | diff --git a/java/ql/test-kotlin2/library-tests/parameter-defaults/erasure.ql b/java/ql/test-kotlin2/library-tests/parameter-defaults/erasure.ql new file mode 100644 index 00000000000..9818700479e --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/parameter-defaults/erasure.ql @@ -0,0 +1,21 @@ +import java + +class InstantiatedType extends ParameterizedType { + InstantiatedType() { typeArgs(_, _, this) } +} + +// This checks that all type parameter references are erased in the context of a $default function. +// Note this is currently expected to fail since for the time being we extract type variable references +// even where they should be out of scope. +predicate containsTypeVariables(Type t) { + t instanceof TypeVariable or + containsTypeVariables(t.(InstantiatedType).getATypeArgument()) or + containsTypeVariables(t.(NestedType).getEnclosingType()) or + containsTypeVariables(t.(Wildcard).getATypeBound().getType()) +} + +from Expr e +where + e.getEnclosingCallable().getName().matches("%$default") and + containsTypeVariables(e.getType()) +select e, e.getType() diff --git a/java/ql/test-kotlin2/library-tests/parameter-defaults/flowTest.expected b/java/ql/test-kotlin2/library-tests/parameter-defaults/flowTest.expected new file mode 100644 index 00000000000..37b80612273 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/parameter-defaults/flowTest.expected @@ -0,0 +1,2 @@ +shouldBeSunkButIsnt +shouldntBeSunkButIs diff --git a/java/ql/test-kotlin2/library-tests/parameter-defaults/flowTest.ql b/java/ql/test-kotlin2/library-tests/parameter-defaults/flowTest.ql new file mode 100644 index 00000000000..da0fc33464b --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/parameter-defaults/flowTest.ql @@ -0,0 +1,34 @@ +import java +import semmle.code.java.dataflow.DataFlow + +class ShouldNotBeSunk extends StringLiteral { + ShouldNotBeSunk() { this.getValue().matches("%not sunk%") } +} + +class ShouldBeSunk extends StringLiteral { + ShouldBeSunk() { + this.getValue().matches("%sunk%") and + not this instanceof ShouldNotBeSunk + } +} + +module Config implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node n) { + n.asExpr() instanceof ShouldBeSunk or + n.asExpr() instanceof ShouldNotBeSunk + } + + predicate isSink(DataFlow::Node n) { + n.asExpr().(Argument).getCall().getCallee().getName() = "sink" + } +} + +module Flow = DataFlow::Global; + +predicate isSunk(StringLiteral sl) { + exists(DataFlow::Node source | Flow::flow(source, _) and sl = source.asExpr()) +} + +query predicate shouldBeSunkButIsnt(ShouldBeSunk src) { not isSunk(src) } + +query predicate shouldntBeSunkButIs(ShouldNotBeSunk src) { isSunk(src) } diff --git a/java/ql/test-kotlin2/library-tests/parameter-defaults/test.kt b/java/ql/test-kotlin2/library-tests/parameter-defaults/test.kt new file mode 100644 index 00000000000..1d35eb5193c --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/parameter-defaults/test.kt @@ -0,0 +1,235 @@ +fun sink(a: Any?) { } + +class TestMember { + + fun f(x: String, y: String = x, z: String = "hello world") { + sink(y) + } + + fun user() { + f("member sunk") + f("member sunk fp", "member sunk 2") + f("not sunk", "member sunk 3", "not sunk") + } + +} + +class TestExtensionMember { + + fun String.f(x: String, y: String = x, z: String = "hello world") { + sink(this) + sink(y) + } + + fun user(sunk: String) { + sunk.f("extension sunk") + sunk.f("extension sunk fp", "extension sunk 2") + sunk.f("not sunk", "extension sunk 3", "not sunk") + } + +} + +object TestStaticMember { + + @JvmStatic fun f(x: String, y: String = x, z: String = "hello world") { + sink(y) + } + + fun user() { + f("static sunk") + f("static sunk fp", "static sunk 2") + f("not sunk", "static sunk 3", "not sunk") + } + +} + +class ExtendMe { + + fun f(x: String) = x + +} + +class TestReceiverReferences { + + fun g(x: String) = x + + fun ExtendMe.test(x: String, y: String = this.f(this@TestReceiverReferences.g(x)), z: String = "hello world") { + sink(y) + } + + fun user(t: ExtendMe) { + t.test("receiver refs sunk") + t.test("receiver refs sunk fp", "receiver refs sunk 2") + t.test("not sunk", "receiver refs sunk 3", "not sunk") + } + +} + +class TestConstructor(x: String, y: String = x, z: String = "hello world") { + + init { + sink(y) + } + + fun user() { + TestConstructor("constructor sunk") + TestConstructor("constructor sunk fp", "constructor sunk 2") + TestConstructor("not sunk", "constructor sunk 3", "not sunk") + } + +} + +class TestLocal { + + fun enclosing() { + + fun f(x: String, y: String = x, z: String = "hello world") { + sink(y) + } + + fun user() { + f("local sunk") + f("local sunk fp", "local sunk 2") + f("not sunk", "local sunk 3", "not sunk") + } + + } + +} + +class TestLocalClass { + + fun enclosingFunction() { + + class EnclosingLocalClass { + + fun f(x: String, y: String = x, z: String = "hello world") { + sink(y) + } + + fun user() { + f("local sunk") + f("local sunk fp", "local sunk 2") + f("not sunk", "local sunk 3", "not sunk") + } + + } + + } + +} + +class TestGeneric { + + fun f(x: T, y: T = x, z: T? = null) { + sink(y) + } + + fun user(tgs: TestGeneric, tcs: TestGeneric) { + tgs.f("generic sunk") + tcs.f("generic sunk fp", "generic sunk 2") + tgs.f("not sunk", "generic sunk 3", "not sunk") + tcs.f("not sunk", "generic sunk 3", "not sunk") + } + + fun testReturn(t1: T, t2: T? = null) = t1 + + fun testReturnUser(tgs: TestGeneric) { + sink(tgs.testReturn("sunk return value")) + } + +} + +class TestGenericFunction { + + fun f(x: S, y: T = x, def1: T? = null, def2: List = listOf(y), def3: S? = null, def4: List? = listOf(x)) { + sink(y) + } + + fun user(inst: TestGenericFunction) { + inst.f("generic function sunk") + inst.f("generic function sunk fp", "generic function sunk 2") + } + +} + +class VisibilityTests { + + fun f(x: Int, y: Int = 0) = x + y + internal fun g(x: Int, y: Int = 0) = x + y + protected fun h(x: Int, y: Int = 0) = x + y + private fun i(x: Int, y: Int = 0) = x + y + +} + +class TestGenericUsedWithinDefaultValue { + + // This tests parameter erasure works properly: we should notice that here the type variable T + // isn't used in the specialisation TestGenericUsedWithinDefaultValue, but it can be + // cited in contexts like "the signature of the source declaration of 'TestGenericUsedWithinDefaultValue.f(String)' is 'f(T)'", + // not 'f(Object)' as we might mistakenly conclude if we're inappropriately erasing 'T'. + fun f(x: Int, y: String = TestGenericUsedWithinDefaultValue().ident("Hello world")) { } + + fun ident(t: T) = t + +} + +class TestOverloadsWithDefaults { + + fun f(x: Int, y: String = "Hello world") { } + fun f(z: String, w: Int = 0) { } + +} + +fun varargsTest(x: String = "before-vararg-default sunk", vararg y: String = arrayOf("first-vararg-default sunk", "second-vararg-default sunk"), z: String = "after-vararg-default sunk") { + sink(x) + sink(y[0]) + sink(z) +} + +fun varargsUser() { + varargsTest() + varargsTest(x = "no-varargs-before, no-z-parameter sunk") + varargsTest(x = "no-varargs-before sunk", z = "no-varargs-after sunk") + varargsTest(x = "one-vararg-before sunk", "one-vararg sunk", z = "one-vararg-after sunk") + varargsTest(x = "two-varargs-before sunk", "two-vararg-first sunk", "two-vararg-second sunk", z = "two-varargs-after sunk") + varargsTest("no-z-parmeter sunk", "no-z-parameter first vararg sunk", "no-z-parameter second vararg sunk") +} + +fun varargsTestOnlySinkVarargs(x: String = "before-vararg-default not sunk 2", vararg y: String = arrayOf("first-vararg-default sunk 2", "second-vararg-default sunk 2"), z: String = "after-vararg-default not sunk 2") { + sink(y[0]) +} + +fun varargsUserOnlySinkVarargs() { + varargsTestOnlySinkVarargs() + varargsTestOnlySinkVarargs(x = "no-varargs-before, no-z-parameter not sunk 2") + varargsTestOnlySinkVarargs(x = "no-varargs-before not sunk 2", z = "no-varargs-after not sunk 2") + varargsTestOnlySinkVarargs(x = "one-vararg-before not sunk 2", "one-vararg sunk 2", z = "one-vararg-after not sunk 2") + varargsTestOnlySinkVarargs(x = "two-varargs-before not sunk 2", "two-vararg-first sunk 2", "two-vararg-second sunk 2", z = "two-varargs-after not sunk 2") + varargsTestOnlySinkVarargs("no-z-parmeter not sunk 2", "no-z-parameter first vararg sunk 2", "no-z-parameter second vararg sunk 2") +} + +fun varargsTestOnlySinkRegularArgs(x: String = "before-vararg-default sunk 3", vararg y: String = arrayOf("first-vararg-default not sunk 3", "second-vararg-default not sunk 3"), z: String = "after-vararg-default sunk 3") { + sink(x) + sink(z) +} + +fun varargsUserOnlySinkRegularArgs() { + varargsTestOnlySinkRegularArgs() + varargsTestOnlySinkRegularArgs(x = "no-varargs-before, no-z-parameter sunk 3") + varargsTestOnlySinkRegularArgs(x = "no-varargs-before sunk 3", z = "no-varargs-after sunk 3") + varargsTestOnlySinkRegularArgs(x = "one-vararg-before sunk 3", "one-vararg not sunk 3", z = "one-vararg-after sunk 3") + varargsTestOnlySinkRegularArgs(x = "two-varargs-before sunk 3", "two-vararg-first not sunk 3", "two-vararg-second not sunk 3", z = "two-varargs-after sunk 3") + varargsTestOnlySinkRegularArgs("no-z-parmeter sunk 3", "no-z-parameter first vararg not sunk 3", "no-z-parameter second vararg not sunk 3") +} + +class VarargsConstructorTest(x: String, vararg y: String) { + init { + sink(x) + } +} + +fun varargsConstructorUser() { + VarargsConstructorTest("varargs constructor test sunk") + VarargsConstructorTest("varargs constructor test sunk 2", "varargs constructor test not sunk 1", "varargs constructor test not sunk 2") +} diff --git a/java/ql/test-kotlin2/library-tests/private-anonymous-types/other.kt b/java/ql/test-kotlin2/library-tests/private-anonymous-types/other.kt new file mode 100644 index 00000000000..ace100f9173 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/private-anonymous-types/other.kt @@ -0,0 +1 @@ +class Ext : A("Hello") { } diff --git a/java/ql/test-kotlin2/library-tests/private-anonymous-types/test.expected b/java/ql/test-kotlin2/library-tests/private-anonymous-types/test.expected new file mode 100644 index 00000000000..6eff637457e --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/private-anonymous-types/test.expected @@ -0,0 +1,36 @@ +#select +| file:///!unknown-binary-location/A$.class:0:0:0:0 | new If(...) { ... }<> | file:///!unknown-binary-location/A$.class:0:0:0:0 | | +| file:///!unknown-binary-location/A$.class:0:0:0:0 | new If(...) { ... }<> | file:///!unknown-binary-location/A$.class:0:0:0:0 | | +| file:///!unknown-binary-location/A$.class:0:0:0:0 | new If(...) { ... }<> | file:///!unknown-binary-location/A$.class:0:0:0:0 | getX | +| file:///!unknown-binary-location/A$.class:0:0:0:0 | new If(...) { ... }<> | file:///!unknown-binary-location/A$.class:0:0:0:0 | getX | +| file:///!unknown-binary-location/A.class:0:0:0:0 | A | file:///!unknown-binary-location/A.class:0:0:0:0 | A | +| file:///!unknown-binary-location/A.class:0:0:0:0 | A | file:///!unknown-binary-location/A.class:0:0:0:0 | getAnonType | +| file:///!unknown-binary-location/A.class:0:0:0:0 | A | file:///!unknown-binary-location/A.class:0:0:0:0 | getPrivateAnonType$private | +| file:///!unknown-binary-location/A.class:0:0:0:0 | A | file:///!unknown-binary-location/A.class:0:0:0:0 | privateUser | +| file:///!unknown-binary-location/A.class:0:0:0:0 | A | file:///!unknown-binary-location/A.class:0:0:0:0 | A | +| file:///!unknown-binary-location/A.class:0:0:0:0 | A | file:///!unknown-binary-location/A.class:0:0:0:0 | getAnonType | +| file:///!unknown-binary-location/A.class:0:0:0:0 | A | file:///!unknown-binary-location/A.class:0:0:0:0 | getPrivateAnonType$private | +| file:///!unknown-binary-location/A.class:0:0:0:0 | A | file:///!unknown-binary-location/A.class:0:0:0:0 | privateUser | +| file:///!unknown-binary-location/If.class:0:0:0:0 | If | file:///!unknown-binary-location/If.class:0:0:0:0 | getX | +| file:///!unknown-binary-location/If.class:0:0:0:0 | If | file:///!unknown-binary-location/If.class:0:0:0:0 | getX | +| other.kt:1:1:1:34 | Ext | other.kt:1:1:1:34 | Ext | +| test.kt:0:0:0:0 | TestKt | test.kt:24:1:24:38 | user | +| test.kt:1:1:5:1 | If | test.kt:3:3:3:11 | getX | +| test.kt:7:1:22:1 | A | test.kt:7:16:7:21 | A | +| test.kt:7:1:22:1 | A | test.kt:9:3:11:3 | anonType | +| test.kt:7:1:22:1 | A | test.kt:9:3:11:3 | getAnonType | +| test.kt:7:1:22:1 | A | test.kt:13:3:15:3 | getPrivateAnonType$private | +| test.kt:7:1:22:1 | A | test.kt:13:3:15:3 | privateAnonType | +| test.kt:7:1:22:1 | A | test.kt:17:3:20:3 | privateUser | +| test.kt:9:18:11:3 | new If(...) { ... } | test.kt:9:18:11:3 | | +| test.kt:9:18:11:3 | new If(...) { ... } | test.kt:10:5:10:22 | getX | +| test.kt:9:18:11:3 | new If(...) { ... } | test.kt:10:5:10:22 | x | +| test.kt:13:33:15:3 | new If(...) { ... } | test.kt:13:33:15:3 | | +| test.kt:13:33:15:3 | new If(...) { ... } | test.kt:14:5:14:22 | getX | +| test.kt:13:33:15:3 | new If(...) { ... } | test.kt:14:5:14:22 | x | +enclosingTypes +| file:///!unknown-binary-location/A$.class:0:0:0:0 | new If(...) { ... }<> | file:///!unknown-binary-location/A.class:0:0:0:0 | A | +| file:///!unknown-binary-location/A$.class:0:0:0:0 | new If(...) { ... }<> | file:///!unknown-binary-location/A.class:0:0:0:0 | A | +| test.kt:9:18:11:3 | new If(...) { ... } | test.kt:7:1:22:1 | A | +| test.kt:13:33:15:3 | new If(...) { ... } | test.kt:7:1:22:1 | A | +| test.kt:13:33:15:3 | new If(...) { ... }<> | test.kt:7:1:22:1 | A<> | diff --git a/java/ql/test-kotlin2/library-tests/private-anonymous-types/test.kt b/java/ql/test-kotlin2/library-tests/private-anonymous-types/test.kt new file mode 100644 index 00000000000..7427a8044b4 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/private-anonymous-types/test.kt @@ -0,0 +1,24 @@ +interface If { + + val x : T + +} + +open class A(t: T) { + + val anonType = object : If { + override val x = t + } + + private val privateAnonType = object : If { + override val x = t + } + + fun privateUser(x: A, y: A) { + val a = x.privateAnonType.x + val b = y.privateAnonType.x + } + +} + +fun user(x: A) = x.anonType.x diff --git a/java/ql/test-kotlin2/library-tests/private-anonymous-types/test.ql b/java/ql/test-kotlin2/library-tests/private-anonymous-types/test.ql new file mode 100644 index 00000000000..7383bfa9ad1 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/private-anonymous-types/test.ql @@ -0,0 +1,9 @@ +import java + +from ClassOrInterface ci, Member m +where m = ci.getAMember() and ci.getSourceDeclaration().fromSource() +select ci, m + +query predicate enclosingTypes(NestedType nt, Type encl) { + nt.getSourceDeclaration().fromSource() and encl = nt.getEnclosingType() +} diff --git a/java/ql/test-kotlin2/library-tests/properties/properties.expected b/java/ql/test-kotlin2/library-tests/properties/properties.expected new file mode 100644 index 00000000000..3f11ff28185 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/properties/properties.expected @@ -0,0 +1,54 @@ +#select +| properties.kt:2:27:2:50 | constructorProp | properties.kt:2:27:2:50 | getConstructorProp | file://:0:0:0:0 | | properties.kt:2:27:2:50 | constructorProp | public | +| properties.kt:2:53:2:83 | mutableConstructorProp | properties.kt:2:53:2:83 | getMutableConstructorProp | properties.kt:2:53:2:83 | setMutableConstructorProp | properties.kt:2:53:2:83 | mutableConstructorProp | public | +| properties.kt:3:5:3:25 | modifiableInt | properties.kt:3:5:3:25 | getModifiableInt | properties.kt:3:5:3:25 | setModifiableInt | properties.kt:3:5:3:25 | modifiableInt | public | +| properties.kt:4:5:4:24 | immutableInt | properties.kt:4:5:4:24 | getImmutableInt | file://:0:0:0:0 | | properties.kt:4:5:4:24 | immutableInt | public | +| properties.kt:5:5:5:26 | typedProp | properties.kt:5:5:5:26 | getTypedProp | file://:0:0:0:0 | | properties.kt:5:5:5:26 | typedProp | public | +| properties.kt:6:5:6:38 | abstractTypeProp | properties.kt:6:5:6:38 | getAbstractTypeProp | file://:0:0:0:0 | | file://:0:0:0:0 | | public | +| properties.kt:7:5:7:30 | initialisedInInit | properties.kt:7:5:7:30 | getInitialisedInInit | file://:0:0:0:0 | | properties.kt:7:5:7:30 | initialisedInInit | public | +| properties.kt:11:5:11:40 | useConstructorArg | properties.kt:11:5:11:40 | getUseConstructorArg | file://:0:0:0:0 | | properties.kt:11:5:11:40 | useConstructorArg | public | +| properties.kt:12:5:13:21 | five | properties.kt:13:13:13:21 | getFive | file://:0:0:0:0 | | file://:0:0:0:0 | | public | +| properties.kt:14:5:15:21 | six | properties.kt:15:13:15:21 | getSix | file://:0:0:0:0 | | file://:0:0:0:0 | | public | +| properties.kt:16:5:18:40 | getSet | properties.kt:17:13:17:33 | getGetSet | properties.kt:18:13:18:40 | setGetSet | file://:0:0:0:0 | | public | +| properties.kt:19:5:20:15 | defaultGetter | properties.kt:20:13:20:15 | getDefaultGetter | file://:0:0:0:0 | | properties.kt:19:5:20:15 | defaultGetter | public | +| properties.kt:21:5:22:15 | varDefaultGetter | properties.kt:22:13:22:15 | getVarDefaultGetter | properties.kt:21:5:22:15 | setVarDefaultGetter | properties.kt:21:5:22:15 | varDefaultGetter | public | +| properties.kt:23:5:24:15 | varDefaultSetter | properties.kt:23:5:24:15 | getVarDefaultSetter | properties.kt:24:13:24:15 | setVarDefaultSetter | properties.kt:23:5:24:15 | varDefaultSetter | public | +| properties.kt:25:5:27:15 | varDefaultGetterSetter | properties.kt:26:13:26:15 | getVarDefaultGetterSetter | properties.kt:27:13:27:15 | setVarDefaultGetterSetter | properties.kt:25:5:27:15 | varDefaultGetterSetter | public | +| properties.kt:28:5:29:22 | overrideGetter | properties.kt:29:13:29:22 | getOverrideGetter | properties.kt:28:5:29:22 | setOverrideGetter | properties.kt:28:5:29:22 | overrideGetter | public | +| properties.kt:30:5:31:29 | overrideGetterUseField | properties.kt:31:13:31:29 | getOverrideGetterUseField | properties.kt:30:5:31:29 | setOverrideGetterUseField | properties.kt:30:5:31:29 | overrideGetterUseField | public | +| properties.kt:32:5:33:29 | useField | properties.kt:33:13:33:29 | getUseField | file://:0:0:0:0 | | properties.kt:32:5:33:29 | useField | public | +| properties.kt:34:5:34:36 | lateInitVar | properties.kt:34:5:34:36 | getLateInitVar | properties.kt:34:5:34:36 | setLateInitVar | properties.kt:34:5:34:36 | lateInitVar | lateinit, public | +| properties.kt:35:5:35:32 | privateProp | properties.kt:35:5:35:32 | getPrivateProp$private | file://:0:0:0:0 | | properties.kt:35:5:35:32 | privateProp | private | +| properties.kt:36:5:36:36 | protectedProp | properties.kt:36:5:36:36 | getProtectedProp | file://:0:0:0:0 | | properties.kt:36:5:36:36 | protectedProp | protected | +| properties.kt:37:5:37:30 | publicProp | properties.kt:37:5:37:30 | getPublicProp | file://:0:0:0:0 | | properties.kt:37:5:37:30 | publicProp | public | +| properties.kt:38:5:38:34 | internalProp | properties.kt:38:5:38:34 | getInternalProp$main | file://:0:0:0:0 | | properties.kt:38:5:38:34 | internalProp | internal | +| properties.kt:67:1:67:23 | constVal | properties.kt:67:1:67:23 | getConstVal | file://:0:0:0:0 | | properties.kt:67:1:67:23 | constVal | public | +| properties.kt:70:5:70:16 | prop | properties.kt:70:5:70:16 | getProp | file://:0:0:0:0 | | properties.kt:70:5:70:16 | prop | public | +| properties.kt:78:1:79:13 | x | properties.kt:79:5:79:13 | getX | file://:0:0:0:0 | | file://:0:0:0:0 | | public | +| properties.kt:80:1:81:13 | x | properties.kt:81:5:81:13 | getX | file://:0:0:0:0 | | file://:0:0:0:0 | | public | +| properties.kt:84:5:84:29 | data | properties.kt:84:5:84:29 | getData$private | properties.kt:84:5:84:29 | setData$private | properties.kt:84:5:84:29 | data | private | +| properties.kt:92:5:93:18 | data | properties.kt:93:9:93:18 | getData | properties.kt:92:5:93:18 | setData$private | properties.kt:92:5:93:18 | data | private | +fieldDeclarations +| properties.kt:2:27:2:50 | int constructorProp; | properties.kt:2:27:2:50 | constructorProp | 0 | +| properties.kt:2:53:2:83 | int mutableConstructorProp; | properties.kt:2:53:2:83 | mutableConstructorProp | 0 | +| properties.kt:3:5:3:25 | int modifiableInt; | properties.kt:3:5:3:25 | modifiableInt | 0 | +| properties.kt:4:5:4:24 | int immutableInt; | properties.kt:4:5:4:24 | immutableInt | 0 | +| properties.kt:5:5:5:26 | int typedProp; | properties.kt:5:5:5:26 | typedProp | 0 | +| properties.kt:7:5:7:30 | int initialisedInInit; | properties.kt:7:5:7:30 | initialisedInInit | 0 | +| properties.kt:11:5:11:40 | int useConstructorArg; | properties.kt:11:5:11:40 | useConstructorArg | 0 | +| properties.kt:19:5:20:15 | int defaultGetter; | properties.kt:19:5:20:15 | defaultGetter | 0 | +| properties.kt:21:5:22:15 | int varDefaultGetter; | properties.kt:21:5:22:15 | varDefaultGetter | 0 | +| properties.kt:23:5:24:15 | int varDefaultSetter; | properties.kt:23:5:24:15 | varDefaultSetter | 0 | +| properties.kt:25:5:27:15 | int varDefaultGetterSetter; | properties.kt:25:5:27:15 | varDefaultGetterSetter | 0 | +| properties.kt:28:5:29:22 | int overrideGetter; | properties.kt:28:5:29:22 | overrideGetter | 0 | +| properties.kt:30:5:31:29 | int overrideGetterUseField; | properties.kt:30:5:31:29 | overrideGetterUseField | 0 | +| properties.kt:32:5:33:29 | int useField; | properties.kt:32:5:33:29 | useField | 0 | +| properties.kt:34:5:34:36 | String lateInitVar; | properties.kt:34:5:34:36 | lateInitVar | 0 | +| properties.kt:35:5:35:32 | int privateProp; | properties.kt:35:5:35:32 | privateProp | 0 | +| properties.kt:36:5:36:36 | int protectedProp; | properties.kt:36:5:36:36 | protectedProp | 0 | +| properties.kt:37:5:37:30 | int publicProp; | properties.kt:37:5:37:30 | publicProp | 0 | +| properties.kt:38:5:38:34 | int internalProp; | properties.kt:38:5:38:34 | internalProp | 0 | +| properties.kt:67:1:67:23 | int constVal; | properties.kt:67:1:67:23 | constVal | 0 | +| properties.kt:70:5:70:16 | int prop; | properties.kt:70:5:70:16 | prop | 0 | +| properties.kt:84:5:84:29 | int data; | properties.kt:84:5:84:29 | data | 0 | +| properties.kt:92:5:93:18 | int data; | properties.kt:92:5:93:18 | data | 0 | diff --git a/java/ql/test-kotlin2/library-tests/properties/properties.kt b/java/ql/test-kotlin2/library-tests/properties/properties.kt new file mode 100644 index 00000000000..bde7994f990 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/properties/properties.kt @@ -0,0 +1,98 @@ + +abstract class properties(val constructorProp: Int, var mutableConstructorProp: Int, extractorArg: Int) { + var modifiableInt = 1 + val immutableInt = 2 + val typedProp: Int = 3 + abstract val abstractTypeProp: Int + val initialisedInInit: Int + init { + initialisedInInit = 4 + } + val useConstructorArg = extractorArg + val five: Int + get() = 5 + val six + get() = 6 + var getSet + get() = modifiableInt + set(v) { modifiableInt = v } + val defaultGetter = 7 + get + var varDefaultGetter = 8 + get + var varDefaultSetter = 9 + set + var varDefaultGetterSetter = 10 + get + set + var overrideGetter = 11 + get() = 12 + var overrideGetterUseField = 13 + get() = field + 1 + val useField = 14 + get() = field + 1 + lateinit var lateInitVar: String + private val privateProp = 15 + protected val protectedProp = 16 + public val publicProp = 17 + internal val internalProp = 18 + fun useProps(): Int { + return 0 + + constructorProp + + mutableConstructorProp + + modifiableInt + + immutableInt + + typedProp + + abstractTypeProp + + initialisedInInit + + useConstructorArg + + five + + six + + getSet + + defaultGetter + + varDefaultGetter + + varDefaultSetter + + varDefaultGetterSetter + + overrideGetter + + overrideGetterUseField + + useField + + privateProp + + protectedProp + + publicProp + + internalProp + + constVal + } +} + +const val constVal = 15 + +class C { + val prop = 1 + fun fn() { + val c = C() + println(c.prop) + } +} + + +val Int.x : Int + get() = 5 +val Double.x : Int + get() = 5 + +class A { + private var data: Int = 0 + + fun setData(p: Int) { + data = p + } +} + +class B { + private var data: Int = 5 + get() = 42 + + fun setData(p: Int) { + data = p + } +} diff --git a/java/ql/test-kotlin2/library-tests/properties/properties.ql b/java/ql/test-kotlin2/library-tests/properties/properties.ql new file mode 100644 index 00000000000..c8e28534145 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/properties/properties.ql @@ -0,0 +1,49 @@ +import java + +newtype TMaybeElement = + TElement(Element e) or + TNoElement() + +class MaybeElement extends TMaybeElement { + abstract string toString(); + + abstract Location getLocation(); +} + +class YesMaybeElement extends MaybeElement { + Element e; + + YesMaybeElement() { this = TElement(e) } + + override string toString() { result = e.toString() } + + override Location getLocation() { result = e.getLocation() } +} + +class NoMaybeElement extends MaybeElement { + NoMaybeElement() { this = TNoElement() } + + override string toString() { result = "" } + + override Location getLocation() { none() } +} + +MaybeElement getter(Property p) { + if exists(p.getGetter()) then result = TElement(p.getGetter()) else result = TNoElement() +} + +MaybeElement setter(Property p) { + if exists(p.getSetter()) then result = TElement(p.getSetter()) else result = TNoElement() +} + +MaybeElement backingField(Property p) { + if exists(p.getBackingField()) + then result = TElement(p.getBackingField()) + else result = TNoElement() +} + +from Property p +where p.fromSource() +select p, getter(p), setter(p), backingField(p), concat(string s | p.hasModifier(s) | s, ", ") + +query predicate fieldDeclarations(FieldDeclaration fd, Field f, int i) { fd.getField(i) = f } diff --git a/java/ql/test-kotlin2/library-tests/recursive-instantiations/stack-overflow-1/BaseFoo.java b/java/ql/test-kotlin2/library-tests/recursive-instantiations/stack-overflow-1/BaseFoo.java new file mode 100644 index 00000000000..0c76e1c6373 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/recursive-instantiations/stack-overflow-1/BaseFoo.java @@ -0,0 +1,3 @@ + +public interface BaseFoo> {} + diff --git a/java/ql/test-kotlin2/library-tests/recursive-instantiations/stack-overflow-1/Foo.java b/java/ql/test-kotlin2/library-tests/recursive-instantiations/stack-overflow-1/Foo.java new file mode 100644 index 00000000000..69a6de4e60a --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/recursive-instantiations/stack-overflow-1/Foo.java @@ -0,0 +1,3 @@ + +public interface Foo extends BaseFoo> {} + diff --git a/java/ql/test-kotlin2/library-tests/recursive-instantiations/stack-overflow-1/classes.expected b/java/ql/test-kotlin2/library-tests/recursive-instantiations/stack-overflow-1/classes.expected new file mode 100644 index 00000000000..109b57cafa2 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/recursive-instantiations/stack-overflow-1/classes.expected @@ -0,0 +1,3 @@ +| test.kt:2:1:11:1 | MyClass | +| test.kt:4:13:9:13 | | +| test.kt:5:17:6:17 | SomeClass | diff --git a/java/ql/test-kotlin2/library-tests/recursive-instantiations/stack-overflow-1/classes.ql b/java/ql/test-kotlin2/library-tests/recursive-instantiations/stack-overflow-1/classes.ql new file mode 100644 index 00000000000..35cdaef9da7 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/recursive-instantiations/stack-overflow-1/classes.ql @@ -0,0 +1,5 @@ +import java + +from Class c +where c.fromSource() +select c diff --git a/java/ql/test-kotlin2/library-tests/recursive-instantiations/stack-overflow-1/test.kt b/java/ql/test-kotlin2/library-tests/recursive-instantiations/stack-overflow-1/test.kt new file mode 100644 index 00000000000..7d203b2ad1a --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/recursive-instantiations/stack-overflow-1/test.kt @@ -0,0 +1,11 @@ + +class MyClass() { + fun f1() { + fun f2() { + class SomeClass { + } + + val x: Foo? = null + } + } +} diff --git a/java/ql/test-kotlin2/library-tests/recursive-instantiations/stack-overflow-2/classes.expected b/java/ql/test-kotlin2/library-tests/recursive-instantiations/stack-overflow-2/classes.expected new file mode 100644 index 00000000000..077a5c874fc --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/recursive-instantiations/stack-overflow-2/classes.expected @@ -0,0 +1,3 @@ +| stackOverflow.kt:2:1:14:1 | MyClass | +| stackOverflow.kt:4:13:12:13 | | +| stackOverflow.kt:5:17:6:17 | SomeClass | diff --git a/java/ql/test-kotlin2/library-tests/recursive-instantiations/stack-overflow-2/classes.ql b/java/ql/test-kotlin2/library-tests/recursive-instantiations/stack-overflow-2/classes.ql new file mode 100644 index 00000000000..35cdaef9da7 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/recursive-instantiations/stack-overflow-2/classes.ql @@ -0,0 +1,5 @@ +import java + +from Class c +where c.fromSource() +select c diff --git a/java/ql/test-kotlin2/library-tests/recursive-instantiations/stack-overflow-2/stackOverflow.kt b/java/ql/test-kotlin2/library-tests/recursive-instantiations/stack-overflow-2/stackOverflow.kt new file mode 100644 index 00000000000..ff04c7c3566 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/recursive-instantiations/stack-overflow-2/stackOverflow.kt @@ -0,0 +1,14 @@ + +class MyClass() { + fun f1() { + fun f2() { + class SomeClass { + } + + val ml = mutableListOf() + + for (x in ml) { + } + } + } +} diff --git a/java/ql/test-kotlin2/library-tests/reflection/PrintAst.expected b/java/ql/test-kotlin2/library-tests/reflection/PrintAst.expected new file mode 100644 index 00000000000..b6397b2ce61 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/reflection/PrintAst.expected @@ -0,0 +1,1771 @@ +reflection.kt: +# 0| [CompilationUnit] reflection +# 0| 1: [Class] ReflectionKt +# 47| 1: [ExtensionMethod] getLastChar +# 47| 3: [TypeAccess] char +#-----| 4: (Parameters) +# 46| 0: [Parameter] +# 46| 0: [TypeAccess] String +# 47| 5: [BlockStmt] { ... } +# 47| 0: [ReturnStmt] return ... +# 47| 0: [MethodCall] charAt(...) +# 47| -1: [ExtensionReceiverAccess] this +# 47| 0: [SubExpr] ... - ... +# 47| 0: [MethodCall] length(...) +# 47| -1: [ExtensionReceiverAccess] this +# 47| 1: [IntegerLiteral] 1 +# 49| 2: [Method] fn2 +# 49| 3: [TypeAccess] Unit +# 49| 5: [BlockStmt] { ... } +# 50| 0: [ExprStmt] ; +# 50| 0: [MethodCall] println(...) +# 50| -1: [TypeAccess] ConsoleKt +# 50| 0: [MethodCall] get(...) +# 50| -1: [PropertyRefExpr] ...::... +# 50| -4: [AnonymousClass] new KProperty1(...) { ... } +# 50| 1: [Constructor] +# 50| 5: [BlockStmt] { ... } +# 50| 0: [SuperConstructorInvocationStmt] super(...) +# 50| 2: [Method] get +#-----| 4: (Parameters) +# 50| 0: [Parameter] a0 +# 50| 5: [BlockStmt] { ... } +# 50| 0: [ReturnStmt] return ... +# 50| 0: [MethodCall] getLastChar(...) +# 50| -1: [TypeAccess] ReflectionKt +# 50| 0: [VarAccess] a0 +# 50| 3: [Method] invoke +#-----| 4: (Parameters) +# 50| 0: [Parameter] a0 +# 50| 5: [BlockStmt] { ... } +# 50| 0: [ReturnStmt] return ... +# 50| 0: [MethodCall] get(...) +# 50| -1: [ThisAccess] this +# 50| 0: [VarAccess] a0 +# 50| -3: [TypeAccess] KProperty1 +# 50| 0: [TypeAccess] String +# 50| 1: [TypeAccess] Character +# 50| 0: [StringLiteral] "abc" +# 51| 1: [ExprStmt] ; +# 51| 0: [MethodCall] println(...) +# 51| -1: [TypeAccess] ConsoleKt +# 51| 0: [MethodCall] get(...) +# 51| -1: [PropertyRefExpr] ...::... +# 51| -4: [AnonymousClass] new KProperty0(...) { ... } +# 51| 1: [Constructor] +#-----| 4: (Parameters) +# 51| 0: [Parameter] +# 51| 5: [BlockStmt] { ... } +# 51| 0: [SuperConstructorInvocationStmt] super(...) +# 51| 1: [ExprStmt] ; +# 51| 0: [AssignExpr] ...=... +# 51| 0: [VarAccess] this. +# 51| -1: [ThisAccess] this +# 51| 1: [VarAccess] +# 51| 2: [FieldDeclaration] String ; +# 51| -1: [TypeAccess] String +# 51| 3: [Method] get +# 51| 5: [BlockStmt] { ... } +# 51| 0: [ReturnStmt] return ... +# 51| 0: [MethodCall] getLastChar(...) +# 51| -1: [TypeAccess] ReflectionKt +# 51| 0: [VarAccess] this. +# 51| -1: [ThisAccess] this +# 51| 4: [Method] invoke +# 51| 5: [BlockStmt] { ... } +# 51| 0: [ReturnStmt] return ... +# 51| 0: [MethodCall] get(...) +# 51| -1: [ThisAccess] this +# 51| -3: [TypeAccess] KProperty0 +# 51| 0: [TypeAccess] Character +# 51| 0: [StringLiteral] "abcd" +# 54| 3: [ExtensionMethod] ext1 +#-----| 2: (Generic Parameters) +# 54| 0: [TypeVariable] T2 +# 54| 3: [TypeAccess] String +#-----| 4: (Parameters) +# 54| 0: [Parameter] +# 54| 0: [TypeAccess] Generic +# 54| 0: [TypeAccess] T2 +# 54| 5: [BlockStmt] { ... } +# 54| 0: [ReturnStmt] return ... +# 54| 0: [MethodCall] toString(...) +# 54| -1: [ExtensionReceiverAccess] this +# 56| 4: [ExtensionMethod] ext2 +# 56| 3: [TypeAccess] String +#-----| 4: (Parameters) +# 56| 0: [Parameter] +# 56| 0: [TypeAccess] Generic +# 56| 0: [TypeAccess] Integer +# 56| 5: [BlockStmt] { ... } +# 56| 0: [ReturnStmt] return ... +# 56| 0: [MethodCall] toString(...) +# 56| -1: [ExtensionReceiverAccess] this +# 94| 5: [Method] fn +#-----| 2: (Generic Parameters) +# 94| 0: [TypeVariable] T +# 94| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 94| 0: [Parameter] value +# 94| 0: [TypeAccess] T +# 94| 5: [BlockStmt] { ... } +# 96| 6: [Method] test +# 96| 3: [TypeAccess] Unit +# 96| 5: [BlockStmt] { ... } +# 97| 0: [ExprStmt] ; +# 97| 0: [MethodCall] fn11(...) +# 97| -3: [TypeAccess] Class2 +# 97| 0: [TypeAccess] String +# 97| -2: [TypeAccess] String +# 97| -1: [TypeAccess] ReflectionKt +# 97| 0: [StringLiteral] "" +# 97| 1: [MemberRefExpr] ...::... +# 97| -4: [AnonymousClass] new Function1>(...) { ... } +# 97| 1: [Constructor] +# 97| 5: [BlockStmt] { ... } +# 97| 0: [SuperConstructorInvocationStmt] super(...) +# 97| 0: [IntegerLiteral] 1 +# 97| 2: [Method] invoke +#-----| 4: (Parameters) +# 97| 0: [Parameter] a0 +# 97| 5: [BlockStmt] { ... } +# 97| 0: [ReturnStmt] return ... +# 97| 0: [ClassInstanceExpr] new Class2(...) +# 97| -3: [TypeAccess] Class2 +# 97| 0: [TypeAccess] String +# 97| 0: [VarAccess] a0 +# 97| -3: [TypeAccess] Function1> +# 97| 0: [TypeAccess] String +# 97| 1: [TypeAccess] Class2 +# 97| 0: [TypeAccess] String +# 98| 1: [ExprStmt] ; +# 98| 0: [MethodCall] fn11(...) +# 98| -3: [TypeAccess] Unit +# 98| -2: [TypeAccess] String +# 98| -1: [TypeAccess] ReflectionKt +# 98| 0: [StringLiteral] "" +# 98| 1: [MemberRefExpr] ...::... +# 98| -4: [AnonymousClass] new Function1(...) { ... } +# 98| 1: [Constructor] +# 98| 5: [BlockStmt] { ... } +# 98| 0: [SuperConstructorInvocationStmt] super(...) +# 98| 0: [IntegerLiteral] 1 +# 98| 2: [Method] invoke +#-----| 4: (Parameters) +# 98| 0: [Parameter] a0 +# 98| 5: [BlockStmt] { ... } +# 98| 0: [ReturnStmt] return ... +# 98| 0: [MethodCall] fn(...) +# 98| -2: [TypeAccess] String +# 98| -1: [TypeAccess] ReflectionKt +# 98| 0: [VarAccess] a0 +# 98| -3: [TypeAccess] Function1 +# 98| 0: [TypeAccess] String +# 98| 1: [TypeAccess] Unit +# 99| 2: [ExprStmt] ; +# 99| 0: [MethodCall] fn12(...) +# 99| -3: [TypeAccess] Inner +# 99| 0: [TypeAccess] String +# 99| 1: [TypeAccess] Integer +# 99| -2: [TypeAccess] String +# 99| -1: [TypeAccess] ReflectionKt +# 99| 0: [StringLiteral] "" +# 99| 1: [MemberRefExpr] ...::... +# 99| -4: [AnonymousClass] new Function1>(...) { ... } +# 99| 1: [Constructor] +#-----| 4: (Parameters) +# 99| 0: [Parameter] +# 99| 5: [BlockStmt] { ... } +# 99| 0: [SuperConstructorInvocationStmt] super(...) +# 99| 0: [IntegerLiteral] 1 +# 99| 1: [ExprStmt] ; +# 99| 0: [AssignExpr] ...=... +# 99| 0: [VarAccess] this. +# 99| -1: [ThisAccess] this +# 99| 1: [VarAccess] +# 99| 2: [FieldDeclaration] Class2 ; +# 99| -1: [TypeAccess] Class2 +# 99| 0: [TypeAccess] Integer +# 99| 3: [Method] invoke +#-----| 4: (Parameters) +# 99| 0: [Parameter] a0 +# 99| 5: [BlockStmt] { ... } +# 99| 0: [ReturnStmt] return ... +# 99| 0: [ClassInstanceExpr] new Inner(...) +# 99| -3: [TypeAccess] Inner +# 99| 0: [TypeAccess] String +# 99| -2: [VarAccess] this. +# 99| -1: [ThisAccess] this +# 99| 0: [VarAccess] a0 +# 99| -3: [TypeAccess] Function1> +# 99| 0: [TypeAccess] String +# 99| 1: [TypeAccess] Inner +# 99| 0: [TypeAccess] String +# 99| 0: [ClassInstanceExpr] new Class2(...) +# 99| -3: [TypeAccess] Class2 +# 99| 0: [TypeAccess] Integer +# 99| 0: [IntegerLiteral] 5 +# 102| 7: [Method] fn11 +#-----| 2: (Generic Parameters) +# 102| 0: [TypeVariable] T +# 102| 1: [TypeVariable] R +# 102| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 102| 0: [Parameter] l +# 102| 0: [TypeAccess] T +# 102| 1: [Parameter] transform +# 102| 0: [TypeAccess] Function1 +# 102| 0: [WildcardTypeAccess] ? ... +# 102| 1: [TypeAccess] T +# 102| 1: [WildcardTypeAccess] ? ... +# 102| 0: [TypeAccess] R +# 102| 5: [BlockStmt] { ... } +# 103| 8: [Method] fn12 +#-----| 2: (Generic Parameters) +# 103| 0: [TypeVariable] T1 +# 103| 1: [TypeVariable] R +# 103| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 103| 0: [Parameter] l +# 103| 0: [TypeAccess] T1 +# 103| 1: [Parameter] l2 +# 103| 0: [TypeAccess] Function1 +# 103| 0: [WildcardTypeAccess] ? ... +# 103| 1: [TypeAccess] T1 +# 103| 1: [WildcardTypeAccess] ? ... +# 103| 0: [TypeAccess] R +# 103| 5: [BlockStmt] { ... } +# 121| 9: [Method] fn1 +# 121| 3: [TypeAccess] int +# 121| 5: [BlockStmt] { ... } +# 121| 0: [ReturnStmt] return ... +# 121| 0: [IntegerLiteral] 5 +# 123| 10: [Method] fn2 +# 123| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 123| 0: [Parameter] f +# 123| 0: [TypeAccess] Function0 +# 123| 0: [TypeAccess] Unit +# 123| 5: [BlockStmt] { ... } +# 123| 0: [ReturnStmt] return ... +# 123| 0: [MethodCall] invoke(...) +# 123| -1: [VarAccess] f +# 125| 11: [Method] adapted +# 125| 3: [TypeAccess] Unit +# 125| 5: [BlockStmt] { ... } +# 126| 0: [ExprStmt] ; +# 126| 0: [MethodCall] fn2(...) +# 126| -1: [TypeAccess] ReflectionKt +# 126| 0: [StmtExpr] +# 126| 0: [BlockStmt] { ... } +# 126| 0: [LocalTypeDeclStmt] class ... +# 126| 0: [LocalClass] +# 126| 1: [Constructor] +# 126| 5: [BlockStmt] { ... } +# 126| 0: [SuperConstructorInvocationStmt] super(...) +# 126| 2: [Method] fn1 +# 126| 3: [TypeAccess] Unit +# 126| 5: [BlockStmt] { ... } +# 126| 0: [ExprStmt] ; +# 126| 0: [ImplicitCoercionToUnitExpr] +# 126| 0: [TypeAccess] Unit +# 126| 1: [MethodCall] fn1(...) +# 126| -1: [TypeAccess] ReflectionKt +# 126| 1: [ExprStmt] ; +# 126| 0: [MemberRefExpr] ...::... +# 126| -4: [AnonymousClass] new Function0(...) { ... } +# 126| 1: [Constructor] +# 126| 5: [BlockStmt] { ... } +# 126| 0: [SuperConstructorInvocationStmt] super(...) +# 126| 0: [IntegerLiteral] 0 +# 126| 2: [Method] invoke +# 126| 5: [BlockStmt] { ... } +# 126| 0: [ReturnStmt] return ... +# 126| 0: [MethodCall] fn1(...) +# 126| -1: [ClassInstanceExpr] new (...) +# 126| -3: [TypeAccess] Object +# 126| -3: [TypeAccess] Function0 +# 126| 0: [TypeAccess] Unit +# 129| 12: [Method] expectsOneParam +# 129| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 129| 0: [Parameter] f +# 129| 0: [TypeAccess] Function1 +# 129| 0: [WildcardTypeAccess] ? ... +# 129| 1: [TypeAccess] Integer +# 129| 1: [TypeAccess] Integer +# 129| 5: [BlockStmt] { ... } +# 129| 0: [ReturnStmt] return ... +# 129| 0: [MethodCall] invoke(...) +# 129| -1: [VarAccess] f +# 129| 0: [IntegerLiteral] 0 +# 131| 13: [Method] takesOptionalParam +# 131| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 131| 0: [Parameter] x +# 131| 0: [TypeAccess] int +# 131| 1: [Parameter] y +# 131| 0: [TypeAccess] int +# 131| 5: [BlockStmt] { ... } +# 131| 0: [ReturnStmt] return ... +# 131| 0: [AddExpr] ... + ... +# 131| 0: [VarAccess] x +# 131| 1: [VarAccess] y +# 131| 14: [Method] takesOptionalParam$default +# 131| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 131| 0: [Parameter] p0 +# 131| 0: [TypeAccess] int +# 131| 1: [Parameter] p1 +# 131| 0: [TypeAccess] int +# 131| 2: [Parameter] p2 +# 131| 0: [TypeAccess] int +# 131| 3: [Parameter] p3 +# 131| 0: [TypeAccess] Object +# 131| 5: [BlockStmt] { ... } +# 131| 0: [IfStmt] if (...) +# 131| 0: [EQExpr] ... == ... +# 131| 0: [AndBitwiseExpr] ... & ... +# 131| 0: [IntegerLiteral] 2 +# 131| 1: [VarAccess] p2 +# 131| 1: [IntegerLiteral] 0 +# 131| 1: [ExprStmt] ; +# 131| 0: [AssignExpr] ...=... +# 131| 0: [VarAccess] p1 +# 131| 1: [IntegerLiteral] 0 +# 131| 1: [ReturnStmt] return ... +# 131| 0: [MethodCall] takesOptionalParam(...) +# 131| -1: [TypeAccess] ReflectionKt +# 131| 0: [VarAccess] p0 +# 131| 1: [VarAccess] p1 +# 133| 15: [Method] adaptedParams +# 133| 3: [TypeAccess] Unit +# 133| 5: [BlockStmt] { ... } +# 134| 0: [ExprStmt] ; +# 134| 0: [ImplicitCoercionToUnitExpr] +# 134| 0: [TypeAccess] Unit +# 134| 1: [MethodCall] expectsOneParam(...) +# 134| -1: [TypeAccess] ReflectionKt +# 134| 0: [StmtExpr] +# 134| 0: [BlockStmt] { ... } +# 134| 0: [LocalTypeDeclStmt] class ... +# 134| 0: [LocalClass] +# 134| 1: [Constructor] +# 134| 5: [BlockStmt] { ... } +# 134| 0: [SuperConstructorInvocationStmt] super(...) +# 134| 2: [Method] takesOptionalParam +# 134| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 134| 0: [Parameter] p0 +# 134| 0: [TypeAccess] int +# 134| 5: [BlockStmt] { ... } +# 134| 0: [ReturnStmt] return ... +# 134| 0: [MethodCall] takesOptionalParam$default(...) +# 134| -1: [TypeAccess] ReflectionKt +# 134| 0: [VarAccess] p0 +# 1| 1: [IntegerLiteral] 0 +# 1| 2: [IntegerLiteral] 1 +# 1| 3: [NullLiteral] null +# 134| 1: [ExprStmt] ; +# 134| 0: [MemberRefExpr] ...::... +# 134| -4: [AnonymousClass] new Function1(...) { ... } +# 134| 1: [Constructor] +# 134| 5: [BlockStmt] { ... } +# 134| 0: [SuperConstructorInvocationStmt] super(...) +# 134| 0: [IntegerLiteral] 1 +# 134| 2: [Method] invoke +#-----| 4: (Parameters) +# 134| 0: [Parameter] a0 +# 134| 5: [BlockStmt] { ... } +# 134| 0: [ReturnStmt] return ... +# 134| 0: [MethodCall] takesOptionalParam(...) +# 134| -1: [ClassInstanceExpr] new (...) +# 134| -3: [TypeAccess] Object +# 134| 0: [VarAccess] a0 +# 134| -3: [TypeAccess] Function1 +# 134| 0: [TypeAccess] Integer +# 134| 1: [TypeAccess] Integer +# 137| 16: [Method] expectsOneParamAndReceiver +# 137| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 137| 0: [Parameter] f +# 137| 0: [TypeAccess] Function2 +# 137| 0: [WildcardTypeAccess] ? ... +# 137| 1: [TypeAccess] MemberOptionalsTest +# 137| 1: [WildcardTypeAccess] ? ... +# 137| 1: [TypeAccess] Integer +# 137| 2: [TypeAccess] Integer +# 137| 5: [BlockStmt] { ... } +# 143| 17: [Method] memberAdaptedParams +# 143| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 143| 0: [Parameter] m +# 143| 0: [TypeAccess] MemberOptionalsTest +# 143| 5: [BlockStmt] { ... } +# 144| 0: [ExprStmt] ; +# 144| 0: [ImplicitCoercionToUnitExpr] +# 144| 0: [TypeAccess] Unit +# 144| 1: [MethodCall] expectsOneParam(...) +# 144| -1: [TypeAccess] ReflectionKt +# 144| 0: [StmtExpr] +# 144| 0: [BlockStmt] { ... } +# 144| 0: [LocalTypeDeclStmt] class ... +# 144| 0: [LocalClass] +# 144| 1: [Constructor] +# 144| 5: [BlockStmt] { ... } +# 144| 0: [SuperConstructorInvocationStmt] super(...) +# 144| 2: [ExtensionMethod] takesOptionalParam +# 144| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 144| 0: [Parameter] receiver +# 144| 0: [TypeAccess] MemberOptionalsTest +# 144| 1: [Parameter] p0 +# 144| 0: [TypeAccess] int +# 144| 5: [BlockStmt] { ... } +# 144| 0: [ReturnStmt] return ... +# 144| 0: [MethodCall] takesOptionalParam$default(...) +# 144| -1: [TypeAccess] MemberOptionalsTest +# 144| 0: [ExtensionReceiverAccess] this +# 144| 1: [VarAccess] p0 +# 1| 2: [IntegerLiteral] 0 +# 1| 3: [IntegerLiteral] 1 +# 1| 4: [NullLiteral] null +# 144| 1: [ExprStmt] ; +# 144| 0: [MemberRefExpr] ...::... +# 144| -4: [AnonymousClass] new Function1(...) { ... } +# 144| 1: [Constructor] +#-----| 4: (Parameters) +# 144| 0: [Parameter] +# 144| 5: [BlockStmt] { ... } +# 144| 0: [SuperConstructorInvocationStmt] super(...) +# 144| 0: [IntegerLiteral] 1 +# 144| 1: [ExprStmt] ; +# 144| 0: [AssignExpr] ...=... +# 144| 0: [VarAccess] this. +# 144| -1: [ThisAccess] this +# 144| 1: [VarAccess] +# 144| 2: [FieldDeclaration] MemberOptionalsTest ; +# 144| -1: [TypeAccess] MemberOptionalsTest +# 144| 3: [Method] invoke +#-----| 4: (Parameters) +# 144| 0: [Parameter] a0 +# 144| 5: [BlockStmt] { ... } +# 144| 0: [ReturnStmt] return ... +# 144| 0: [MethodCall] takesOptionalParam(...) +# 144| -1: [ClassInstanceExpr] new (...) +# 144| -3: [TypeAccess] Object +# 144| 0: [VarAccess] this. +# 144| -1: [ThisAccess] this +# 144| 1: [VarAccess] a0 +# 144| -3: [TypeAccess] Function1 +# 144| 0: [TypeAccess] Integer +# 144| 1: [TypeAccess] Integer +# 144| 0: [VarAccess] m +# 145| 1: [ExprStmt] ; +# 145| 0: [MethodCall] expectsOneParamAndReceiver(...) +# 145| -1: [TypeAccess] ReflectionKt +# 145| 0: [StmtExpr] +# 145| 0: [BlockStmt] { ... } +# 145| 0: [LocalTypeDeclStmt] class ... +# 145| 0: [LocalClass] +# 145| 1: [Constructor] +# 145| 5: [BlockStmt] { ... } +# 145| 0: [SuperConstructorInvocationStmt] super(...) +# 145| 2: [Method] takesOptionalParam +# 145| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 145| 0: [Parameter] p0 +# 145| 0: [TypeAccess] MemberOptionalsTest +# 145| 1: [Parameter] p1 +# 145| 0: [TypeAccess] int +# 145| 5: [BlockStmt] { ... } +# 145| 0: [ReturnStmt] return ... +# 145| 0: [MethodCall] takesOptionalParam$default(...) +# 145| -1: [TypeAccess] MemberOptionalsTest +# 145| 0: [VarAccess] p0 +# 145| 1: [VarAccess] p1 +# 1| 2: [IntegerLiteral] 0 +# 1| 3: [IntegerLiteral] 1 +# 1| 4: [NullLiteral] null +# 145| 1: [ExprStmt] ; +# 145| 0: [MemberRefExpr] ...::... +# 145| -4: [AnonymousClass] new Function2(...) { ... } +# 145| 1: [Constructor] +# 145| 5: [BlockStmt] { ... } +# 145| 0: [SuperConstructorInvocationStmt] super(...) +# 145| 0: [IntegerLiteral] 2 +# 145| 2: [Method] invoke +#-----| 4: (Parameters) +# 145| 0: [Parameter] a0 +# 145| 1: [Parameter] a1 +# 145| 5: [BlockStmt] { ... } +# 145| 0: [ReturnStmt] return ... +# 145| 0: [MethodCall] takesOptionalParam(...) +# 145| -1: [ClassInstanceExpr] new (...) +# 145| -3: [TypeAccess] Object +# 145| 0: [VarAccess] a0 +# 145| 1: [VarAccess] a1 +# 145| -3: [TypeAccess] Function2 +# 145| 0: [TypeAccess] MemberOptionalsTest +# 145| 1: [TypeAccess] Integer +# 145| 2: [TypeAccess] Integer +# 148| 18: [Method] expectsOneParamAndExtension +# 148| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 148| 0: [Parameter] f +# 148| 0: [TypeAccess] Function2 +# 148| 0: [WildcardTypeAccess] ? ... +# 148| 1: [TypeAccess] String +# 148| 1: [WildcardTypeAccess] ? ... +# 148| 1: [TypeAccess] Integer +# 148| 2: [TypeAccess] Integer +# 148| 5: [BlockStmt] { ... } +# 150| 19: [ExtensionMethod] extTakesOptionalParam +# 150| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 150| 0: [Parameter] +# 150| 0: [TypeAccess] String +# 150| 1: [Parameter] x +# 150| 0: [TypeAccess] int +# 150| 2: [Parameter] y +# 150| 0: [TypeAccess] int +# 150| 5: [BlockStmt] { ... } +# 150| 0: [ReturnStmt] return ... +# 150| 0: [AddExpr] ... + ... +# 150| 0: [VarAccess] x +# 150| 1: [VarAccess] y +# 150| 20: [ExtensionMethod] extTakesOptionalParam$default +# 150| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 150| 0: [Parameter] p0 +# 150| 0: [TypeAccess] String +# 150| 1: [Parameter] p1 +# 150| 0: [TypeAccess] int +# 150| 2: [Parameter] p2 +# 150| 0: [TypeAccess] int +# 150| 3: [Parameter] p3 +# 150| 0: [TypeAccess] int +# 150| 4: [Parameter] p4 +# 150| 0: [TypeAccess] Object +# 150| 5: [BlockStmt] { ... } +# 150| 0: [IfStmt] if (...) +# 150| 0: [EQExpr] ... == ... +# 150| 0: [AndBitwiseExpr] ... & ... +# 150| 0: [IntegerLiteral] 2 +# 150| 1: [VarAccess] p3 +# 150| 1: [IntegerLiteral] 0 +# 150| 1: [ExprStmt] ; +# 150| 0: [AssignExpr] ...=... +# 150| 0: [VarAccess] p2 +# 150| 1: [IntegerLiteral] 0 +# 150| 1: [ReturnStmt] return ... +# 150| 0: [MethodCall] extTakesOptionalParam(...) +# 150| -1: [TypeAccess] ReflectionKt +# 150| 0: [ExtensionReceiverAccess] this +# 150| 1: [VarAccess] p1 +# 150| 2: [VarAccess] p2 +# 152| 21: [Method] extensionAdaptedParams +# 152| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 152| 0: [Parameter] s +# 152| 0: [TypeAccess] String +# 152| 5: [BlockStmt] { ... } +# 153| 0: [ExprStmt] ; +# 153| 0: [ImplicitCoercionToUnitExpr] +# 153| 0: [TypeAccess] Unit +# 153| 1: [MethodCall] expectsOneParam(...) +# 153| -1: [TypeAccess] ReflectionKt +# 153| 0: [StmtExpr] +# 153| 0: [BlockStmt] { ... } +# 153| 0: [LocalTypeDeclStmt] class ... +# 153| 0: [LocalClass] +# 153| 1: [Constructor] +# 153| 5: [BlockStmt] { ... } +# 153| 0: [SuperConstructorInvocationStmt] super(...) +# 153| 2: [ExtensionMethod] extTakesOptionalParam +# 153| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 153| 0: [Parameter] receiver +# 153| 0: [TypeAccess] String +# 153| 1: [Parameter] p0 +# 153| 0: [TypeAccess] int +# 153| 5: [BlockStmt] { ... } +# 153| 0: [ReturnStmt] return ... +# 153| 0: [MethodCall] extTakesOptionalParam$default(...) +# 153| -1: [TypeAccess] ReflectionKt +# 153| 0: [ExtensionReceiverAccess] this +# 153| 1: [VarAccess] p0 +# 1| 2: [IntegerLiteral] 0 +# 1| 3: [IntegerLiteral] 1 +# 1| 4: [NullLiteral] null +# 153| 1: [ExprStmt] ; +# 153| 0: [MemberRefExpr] ...::... +# 153| -4: [AnonymousClass] new Function1(...) { ... } +# 153| 1: [Constructor] +#-----| 4: (Parameters) +# 153| 0: [Parameter] +# 153| 5: [BlockStmt] { ... } +# 153| 0: [SuperConstructorInvocationStmt] super(...) +# 153| 0: [IntegerLiteral] 1 +# 153| 1: [ExprStmt] ; +# 153| 0: [AssignExpr] ...=... +# 153| 0: [VarAccess] this. +# 153| -1: [ThisAccess] this +# 153| 1: [VarAccess] +# 153| 2: [FieldDeclaration] String ; +# 153| -1: [TypeAccess] String +# 153| 3: [Method] invoke +#-----| 4: (Parameters) +# 153| 0: [Parameter] a0 +# 153| 5: [BlockStmt] { ... } +# 153| 0: [ReturnStmt] return ... +# 153| 0: [MethodCall] extTakesOptionalParam(...) +# 153| -1: [ClassInstanceExpr] new (...) +# 153| -3: [TypeAccess] Object +# 153| 0: [VarAccess] this. +# 153| -1: [ThisAccess] this +# 153| 1: [VarAccess] a0 +# 153| -3: [TypeAccess] Function1 +# 153| 0: [TypeAccess] Integer +# 153| 1: [TypeAccess] Integer +# 153| 0: [VarAccess] s +# 154| 1: [ExprStmt] ; +# 154| 0: [MethodCall] expectsOneParamAndExtension(...) +# 154| -1: [TypeAccess] ReflectionKt +# 154| 0: [StmtExpr] +# 154| 0: [BlockStmt] { ... } +# 154| 0: [LocalTypeDeclStmt] class ... +# 154| 0: [LocalClass] +# 154| 1: [Constructor] +# 154| 5: [BlockStmt] { ... } +# 154| 0: [SuperConstructorInvocationStmt] super(...) +# 154| 2: [Method] extTakesOptionalParam +# 154| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 154| 0: [Parameter] p0 +# 154| 0: [TypeAccess] String +# 154| 1: [Parameter] p1 +# 154| 0: [TypeAccess] int +# 154| 5: [BlockStmt] { ... } +# 154| 0: [ReturnStmt] return ... +# 154| 0: [MethodCall] extTakesOptionalParam$default(...) +# 154| -1: [TypeAccess] ReflectionKt +# 154| 0: [VarAccess] p0 +# 154| 1: [VarAccess] p1 +# 1| 2: [IntegerLiteral] 0 +# 1| 3: [IntegerLiteral] 1 +# 1| 4: [NullLiteral] null +# 154| 1: [ExprStmt] ; +# 154| 0: [MemberRefExpr] ...::... +# 154| -4: [AnonymousClass] new Function2(...) { ... } +# 154| 1: [Constructor] +# 154| 5: [BlockStmt] { ... } +# 154| 0: [SuperConstructorInvocationStmt] super(...) +# 154| 0: [IntegerLiteral] 2 +# 154| 2: [Method] invoke +#-----| 4: (Parameters) +# 154| 0: [Parameter] a0 +# 154| 1: [Parameter] a1 +# 154| 5: [BlockStmt] { ... } +# 154| 0: [ReturnStmt] return ... +# 154| 0: [MethodCall] extTakesOptionalParam(...) +# 154| -1: [ClassInstanceExpr] new (...) +# 154| -3: [TypeAccess] Object +# 154| 0: [VarAccess] a0 +# 154| 1: [VarAccess] a1 +# 154| -3: [TypeAccess] Function2 +# 154| 0: [TypeAccess] String +# 154| 1: [TypeAccess] Integer +# 154| 2: [TypeAccess] Integer +# 159| 22: [Method] expectsOneParamCons +# 159| 3: [TypeAccess] ConstructorOptional +#-----| 4: (Parameters) +# 159| 0: [Parameter] f +# 159| 0: [TypeAccess] Function1 +# 159| 0: [WildcardTypeAccess] ? ... +# 159| 1: [TypeAccess] Integer +# 159| 1: [TypeAccess] ConstructorOptional +# 159| 5: [BlockStmt] { ... } +# 159| 0: [ReturnStmt] return ... +# 159| 0: [MethodCall] invoke(...) +# 159| -1: [VarAccess] f +# 159| 0: [IntegerLiteral] 0 +# 161| 23: [Method] constructorAdaptedParams +# 161| 3: [TypeAccess] Unit +# 161| 5: [BlockStmt] { ... } +# 162| 0: [ExprStmt] ; +# 162| 0: [ImplicitCoercionToUnitExpr] +# 162| 0: [TypeAccess] Unit +# 162| 1: [MethodCall] expectsOneParamCons(...) +# 162| -1: [TypeAccess] ReflectionKt +# 162| 0: [StmtExpr] +# 162| 0: [BlockStmt] { ... } +# 162| 0: [LocalTypeDeclStmt] class ... +# 162| 0: [LocalClass] +# 162| 1: [Constructor] +# 162| 5: [BlockStmt] { ... } +# 162| 0: [SuperConstructorInvocationStmt] super(...) +# 162| 2: [Method] +# 162| 3: [TypeAccess] ConstructorOptional +#-----| 4: (Parameters) +# 162| 0: [Parameter] p0 +# 162| 0: [TypeAccess] int +# 162| 5: [BlockStmt] { ... } +# 162| 0: [ReturnStmt] return ... +# 162| 0: [ClassInstanceExpr] new ConstructorOptional(...) +# 162| -3: [TypeAccess] ConstructorOptional +# 162| 0: [VarAccess] p0 +# 1| 1: [IntegerLiteral] 0 +# 1| 2: [IntegerLiteral] 1 +# 1| 3: [NullLiteral] null +# 162| 1: [ExprStmt] ; +# 162| 0: [MemberRefExpr] ...::... +# 162| -4: [AnonymousClass] new Function1(...) { ... } +# 162| 1: [Constructor] +# 162| 5: [BlockStmt] { ... } +# 162| 0: [SuperConstructorInvocationStmt] super(...) +# 162| 0: [IntegerLiteral] 1 +# 162| 2: [Method] invoke +#-----| 4: (Parameters) +# 162| 0: [Parameter] a0 +# 162| 5: [BlockStmt] { ... } +# 162| 0: [ReturnStmt] return ... +# 162| 0: [MethodCall] (...) +# 162| -1: [ClassInstanceExpr] new (...) +# 162| -3: [TypeAccess] Object +# 162| 0: [VarAccess] a0 +# 162| -3: [TypeAccess] Function1 +# 162| 0: [TypeAccess] Integer +# 162| 1: [TypeAccess] ConstructorOptional +# 5| 2: [Class] Reflection +# 5| 1: [Constructor] Reflection +# 5| 5: [BlockStmt] { ... } +# 5| 0: [SuperConstructorInvocationStmt] super(...) +# 5| 1: [BlockStmt] { ... } +# 6| 2: [Method] fn +# 6| 3: [TypeAccess] Unit +# 6| 5: [BlockStmt] { ... } +# 7| 0: [LocalVariableDeclStmt] var ...; +# 7| 1: [LocalVariableDeclExpr] ref +# 7| 0: [MemberRefExpr] ...::... +# 7| -4: [AnonymousClass] new Function2(...) { ... } +# 7| 1: [Constructor] +# 7| 5: [BlockStmt] { ... } +# 7| 0: [SuperConstructorInvocationStmt] super(...) +# 7| 0: [IntegerLiteral] 2 +# 7| 2: [Method] invoke +#-----| 4: (Parameters) +# 7| 0: [Parameter] a0 +# 7| 1: [Parameter] a1 +# 7| 5: [BlockStmt] { ... } +# 7| 0: [ReturnStmt] return ... +# 7| 0: [MethodCall] m(...) +# 7| -1: [VarAccess] a0 +# 7| 0: [VarAccess] a1 +# 7| -3: [TypeAccess] Function2 +# 7| 0: [TypeAccess] Ccc +# 7| 1: [TypeAccess] Integer +# 7| 2: [TypeAccess] Double +# 8| 1: [ExprStmt] ; +# 8| 0: [MethodCall] println(...) +# 8| -1: [TypeAccess] ConsoleKt +# 8| 0: [MethodCall] getName(...) +# 8| -1: [VarAccess] ref +# 10| 2: [LocalVariableDeclStmt] var ...; +# 10| 1: [LocalVariableDeclExpr] x0 +# 10| 0: [PropertyRefExpr] ...::... +# 10| -4: [AnonymousClass] new KProperty1(...) { ... } +# 10| 1: [Constructor] +# 10| 5: [BlockStmt] { ... } +# 10| 0: [SuperConstructorInvocationStmt] super(...) +# 10| 2: [Method] get +#-----| 4: (Parameters) +# 10| 0: [Parameter] a0 +# 10| 5: [BlockStmt] { ... } +# 10| 0: [ReturnStmt] return ... +# 10| 0: [MethodCall] getP0(...) +# 10| -1: [VarAccess] a0 +# 10| 3: [Method] invoke +#-----| 4: (Parameters) +# 10| 0: [Parameter] a0 +# 10| 5: [BlockStmt] { ... } +# 10| 0: [ReturnStmt] return ... +# 10| 0: [MethodCall] get(...) +# 10| -1: [ThisAccess] this +# 10| 0: [VarAccess] a0 +# 10| -3: [TypeAccess] KProperty1 +# 10| 0: [TypeAccess] C +# 10| 1: [TypeAccess] Integer +# 11| 3: [LocalVariableDeclStmt] var ...; +# 11| 1: [LocalVariableDeclExpr] x1 +# 11| 0: [MethodCall] get(...) +# 11| -1: [VarAccess] x0 +# 11| 0: [ClassInstanceExpr] new C(...) +# 11| -3: [TypeAccess] C +# 12| 4: [LocalVariableDeclStmt] var ...; +# 12| 1: [LocalVariableDeclExpr] x2 +# 12| 0: [MethodCall] getName(...) +# 12| -1: [VarAccess] x0 +# 13| 5: [LocalVariableDeclStmt] var ...; +# 13| 1: [LocalVariableDeclExpr] x3 +# 13| 0: [MethodCall] getGetter(...) +# 13| -1: [VarAccess] x0 +# 14| 6: [LocalVariableDeclStmt] var ...; +# 14| 1: [LocalVariableDeclExpr] x4 +# 14| 0: [MemberRefExpr] ...::... +# 14| -4: [AnonymousClass] new Function1(...) { ... } +# 14| 1: [Constructor] +#-----| 4: (Parameters) +# 14| 0: [Parameter] +# 14| 5: [BlockStmt] { ... } +# 14| 0: [SuperConstructorInvocationStmt] super(...) +# 14| 0: [IntegerLiteral] 1 +# 14| 1: [ExprStmt] ; +# 14| 0: [AssignExpr] ...=... +# 14| 0: [VarAccess] this. +# 14| -1: [ThisAccess] this +# 14| 1: [VarAccess] +# 14| 2: [FieldDeclaration] KProperty1 ; +# 14| -1: [TypeAccess] KProperty1 +# 14| 0: [TypeAccess] C +# 14| 1: [TypeAccess] Integer +# 14| 3: [Method] invoke +#-----| 4: (Parameters) +# 14| 0: [Parameter] a0 +# 14| 5: [BlockStmt] { ... } +# 14| 0: [ReturnStmt] return ... +# 14| 0: [MethodCall] get(...) +# 14| -1: [VarAccess] this. +# 14| -1: [ThisAccess] this +# 14| 0: [VarAccess] a0 +# 14| -3: [TypeAccess] Function1 +# 14| 0: [TypeAccess] C +# 14| 1: [TypeAccess] Integer +# 14| 0: [VarAccess] x0 +# 15| 7: [LocalVariableDeclStmt] var ...; +# 15| 1: [LocalVariableDeclExpr] x5 +# 15| 0: [PropertyRefExpr] ...::... +# 15| -4: [AnonymousClass] new KProperty0(...) { ... } +# 15| 1: [Constructor] +#-----| 4: (Parameters) +# 15| 0: [Parameter] +# 15| 5: [BlockStmt] { ... } +# 15| 0: [SuperConstructorInvocationStmt] super(...) +# 15| 1: [ExprStmt] ; +# 15| 0: [AssignExpr] ...=... +# 15| 0: [VarAccess] this. +# 15| -1: [ThisAccess] this +# 15| 1: [VarAccess] +# 15| 2: [FieldDeclaration] C ; +# 15| -1: [TypeAccess] C +# 15| 3: [Method] get +# 15| 5: [BlockStmt] { ... } +# 15| 0: [ReturnStmt] return ... +# 15| 0: [MethodCall] getP0(...) +# 15| -1: [VarAccess] this. +# 15| -1: [ThisAccess] this +# 15| 4: [Method] invoke +# 15| 5: [BlockStmt] { ... } +# 15| 0: [ReturnStmt] return ... +# 15| 0: [MethodCall] get(...) +# 15| -1: [ThisAccess] this +# 15| -3: [TypeAccess] KProperty0 +# 15| 0: [TypeAccess] Integer +# 15| 0: [ClassInstanceExpr] new C(...) +# 15| -3: [TypeAccess] C +# 17| 8: [LocalVariableDeclStmt] var ...; +# 17| 1: [LocalVariableDeclExpr] y0 +# 17| 0: [PropertyRefExpr] ...::... +# 17| -4: [AnonymousClass] new KMutableProperty1(...) { ... } +# 17| 1: [Constructor] +# 17| 5: [BlockStmt] { ... } +# 17| 0: [SuperConstructorInvocationStmt] super(...) +# 17| 2: [Method] get +#-----| 4: (Parameters) +# 17| 0: [Parameter] a0 +# 17| 5: [BlockStmt] { ... } +# 17| 0: [ReturnStmt] return ... +# 17| 0: [MethodCall] getP1(...) +# 17| -1: [VarAccess] a0 +# 17| 3: [Method] invoke +#-----| 4: (Parameters) +# 17| 0: [Parameter] a0 +# 17| 5: [BlockStmt] { ... } +# 17| 0: [ReturnStmt] return ... +# 17| 0: [MethodCall] get(...) +# 17| -1: [ThisAccess] this +# 17| 0: [VarAccess] a0 +# 17| 4: [Method] set +#-----| 4: (Parameters) +# 17| 0: [Parameter] a0 +# 17| 1: [Parameter] a1 +# 17| 5: [BlockStmt] { ... } +# 17| 0: [ReturnStmt] return ... +# 17| 0: [MethodCall] setP1(...) +# 17| -1: [VarAccess] a0 +# 17| 0: [VarAccess] a1 +# 17| -3: [TypeAccess] KMutableProperty1 +# 17| 0: [TypeAccess] C +# 17| 1: [TypeAccess] Integer +# 18| 9: [LocalVariableDeclStmt] var ...; +# 18| 1: [LocalVariableDeclExpr] y1 +# 18| 0: [MethodCall] set(...) +# 18| -1: [VarAccess] y0 +# 18| 0: [ClassInstanceExpr] new C(...) +# 18| -3: [TypeAccess] C +# 18| 1: [IntegerLiteral] 5 +# 19| 10: [LocalVariableDeclStmt] var ...; +# 19| 1: [LocalVariableDeclExpr] y2 +# 19| 0: [MethodCall] getName(...) +# 19| -1: [VarAccess] y0 +# 20| 11: [LocalVariableDeclStmt] var ...; +# 20| 1: [LocalVariableDeclExpr] y3 +# 20| 0: [MethodCall] getSetter(...) +# 20| -1: [VarAccess] y0 +# 21| 12: [LocalVariableDeclStmt] var ...; +# 21| 1: [LocalVariableDeclExpr] y4 +# 21| 0: [MemberRefExpr] ...::... +# 21| -4: [AnonymousClass] new Function2(...) { ... } +# 21| 1: [Constructor] +#-----| 4: (Parameters) +# 21| 0: [Parameter] +# 21| 5: [BlockStmt] { ... } +# 21| 0: [SuperConstructorInvocationStmt] super(...) +# 21| 0: [IntegerLiteral] 2 +# 21| 1: [ExprStmt] ; +# 21| 0: [AssignExpr] ...=... +# 21| 0: [VarAccess] this. +# 21| -1: [ThisAccess] this +# 21| 1: [VarAccess] +# 21| 2: [FieldDeclaration] KMutableProperty1 ; +# 21| -1: [TypeAccess] KMutableProperty1 +# 21| 0: [TypeAccess] C +# 21| 1: [TypeAccess] Integer +# 21| 3: [Method] invoke +#-----| 4: (Parameters) +# 21| 0: [Parameter] a0 +# 21| 1: [Parameter] a1 +# 21| 5: [BlockStmt] { ... } +# 21| 0: [ReturnStmt] return ... +# 21| 0: [MethodCall] set(...) +# 21| -1: [VarAccess] this. +# 21| -1: [ThisAccess] this +# 21| 0: [VarAccess] a0 +# 21| 1: [VarAccess] a1 +# 21| -3: [TypeAccess] Function2 +# 21| 0: [TypeAccess] C +# 21| 1: [TypeAccess] Integer +# 21| 2: [TypeAccess] Unit +# 21| 0: [VarAccess] y0 +# 22| 13: [LocalVariableDeclStmt] var ...; +# 22| 1: [LocalVariableDeclExpr] y5 +# 22| 0: [PropertyRefExpr] ...::... +# 22| -4: [AnonymousClass] new KMutableProperty0(...) { ... } +# 22| 1: [Constructor] +#-----| 4: (Parameters) +# 22| 0: [Parameter] +# 22| 5: [BlockStmt] { ... } +# 22| 0: [SuperConstructorInvocationStmt] super(...) +# 22| 1: [ExprStmt] ; +# 22| 0: [AssignExpr] ...=... +# 22| 0: [VarAccess] this. +# 22| -1: [ThisAccess] this +# 22| 1: [VarAccess] +# 22| 2: [FieldDeclaration] C ; +# 22| -1: [TypeAccess] C +# 22| 3: [Method] get +# 22| 5: [BlockStmt] { ... } +# 22| 0: [ReturnStmt] return ... +# 22| 0: [MethodCall] getP1(...) +# 22| -1: [VarAccess] this. +# 22| -1: [ThisAccess] this +# 22| 4: [Method] invoke +# 22| 5: [BlockStmt] { ... } +# 22| 0: [ReturnStmt] return ... +# 22| 0: [MethodCall] get(...) +# 22| -1: [ThisAccess] this +# 22| 5: [Method] set +#-----| 4: (Parameters) +# 22| 0: [Parameter] a0 +# 22| 5: [BlockStmt] { ... } +# 22| 0: [ReturnStmt] return ... +# 22| 0: [MethodCall] setP1(...) +# 22| -1: [VarAccess] this. +# 22| -1: [ThisAccess] this +# 22| 0: [VarAccess] a0 +# 22| -3: [TypeAccess] KMutableProperty0 +# 22| 0: [TypeAccess] Integer +# 22| 0: [ClassInstanceExpr] new C(...) +# 22| -3: [TypeAccess] C +# 24| 14: [LocalVariableDeclStmt] var ...; +# 24| 1: [LocalVariableDeclExpr] prop +# 24| 0: [CastExpr] (...)... +# 24| 0: [TypeAccess] KProperty2 +# 24| 0: [TypeAccess] C +# 24| 1: [TypeAccess] Integer +# 24| 2: [TypeAccess] Integer +# 24| 1: [MethodCall] single(...) +# 24| -2: [TypeAccess] KCallable +# 24| -1: [TypeAccess] CollectionsKt +# 24| 0: [MethodCall] getMembers(...) +# 24| -1: [TypeLiteral] C.class +# 24| 0: [TypeAccess] C +# 24| 1: [LambdaExpr] ...->... +# 24| -4: [AnonymousClass] new Function1,Boolean>(...) { ... } +# 24| 1: [Constructor] +# 24| 5: [BlockStmt] { ... } +# 24| 0: [SuperConstructorInvocationStmt] super(...) +# 24| 2: [Method] invoke +# 24| 3: [TypeAccess] boolean +#-----| 4: (Parameters) +# 24| 0: [Parameter] it +# 24| 0: [TypeAccess] KCallable +# 24| 0: [WildcardTypeAccess] ? ... +# 24| 5: [BlockStmt] { ... } +# 24| 0: [ReturnStmt] return ... +# 24| 0: [ValueEQExpr] ... (value equals) ... +# 24| 0: [MethodCall] getName(...) +# 24| -1: [VarAccess] it +# 24| 1: [StringLiteral] "p3" +# 24| -3: [TypeAccess] Function1,Boolean> +# 24| 0: [TypeAccess] KCallable +# 24| 1: [TypeAccess] Boolean +# 25| 15: [LocalVariableDeclStmt] var ...; +# 25| 1: [LocalVariableDeclExpr] z0 +# 25| 0: [MethodCall] get(...) +# 25| -1: [VarAccess] prop +# 25| 0: [ClassInstanceExpr] new C(...) +# 25| -3: [TypeAccess] C +# 25| 1: [IntegerLiteral] 5 +# 28| 3: [Class] Ccc +# 28| 1: [Constructor] Ccc +# 28| 5: [BlockStmt] { ... } +# 28| 0: [SuperConstructorInvocationStmt] super(...) +# 28| 1: [BlockStmt] { ... } +# 29| 2: [Method] m +# 29| 3: [TypeAccess] double +#-----| 4: (Parameters) +# 29| 0: [Parameter] i +# 29| 0: [TypeAccess] int +# 29| 5: [BlockStmt] { ... } +# 29| 0: [ReturnStmt] return ... +# 29| 0: [DoubleLiteral] 5.0 +# 32| 4: [Class] C +# 32| 1: [Constructor] C +# 32| 5: [BlockStmt] { ... } +# 32| 0: [SuperConstructorInvocationStmt] super(...) +# 32| 1: [BlockStmt] { ... } +# 33| 0: [ExprStmt] ; +# 33| 0: [KtInitializerAssignExpr] ...=... +# 33| 0: [VarAccess] p0 +# 34| 1: [ExprStmt] ; +# 34| 0: [KtInitializerAssignExpr] ...=... +# 34| 0: [VarAccess] p1 +# 33| 2: [Method] getP0 +# 33| 3: [TypeAccess] int +# 33| 5: [BlockStmt] { ... } +# 33| 0: [ReturnStmt] return ... +# 33| 0: [VarAccess] this.p0 +# 33| -1: [ThisAccess] this +# 33| 3: [FieldDeclaration] int p0; +# 33| -1: [TypeAccess] int +# 33| 0: [IntegerLiteral] 1 +# 34| 4: [Method] getP1 +# 34| 3: [TypeAccess] int +# 34| 5: [BlockStmt] { ... } +# 34| 0: [ReturnStmt] return ... +# 34| 0: [VarAccess] this.p1 +# 34| -1: [ThisAccess] this +# 34| 5: [FieldDeclaration] int p1; +# 34| -1: [TypeAccess] int +# 34| 0: [IntegerLiteral] 2 +# 34| 6: [Method] setP1 +# 34| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 34| 0: [Parameter] +# 34| 0: [TypeAccess] int +# 34| 5: [BlockStmt] { ... } +# 34| 0: [ExprStmt] ; +# 34| 0: [AssignExpr] ...=... +# 34| 0: [VarAccess] this.p1 +# 34| -1: [ThisAccess] this +# 34| 1: [VarAccess] +# 36| 7: [Method] getP2 +# 36| 3: [TypeAccess] int +# 36| 5: [BlockStmt] { ... } +# 36| 0: [ReturnStmt] return ... +# 36| 0: [IntegerLiteral] 1 +# 37| 8: [Method] setP2 +# 37| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 37| 0: [Parameter] value +# 37| 0: [TypeAccess] int +# 37| 5: [BlockStmt] { ... } +# 37| 0: [ReturnStmt] return ... +# 37| 0: [VarAccess] INSTANCE +# 40| 9: [ExtensionMethod] getP3 +# 40| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 39| 0: [Parameter] +# 39| 0: [TypeAccess] int +# 40| 5: [BlockStmt] { ... } +# 40| 0: [ReturnStmt] return ... +# 40| 0: [IntegerLiteral] 1 +# 41| 10: [ExtensionMethod] setP3 +# 41| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 39| 0: [Parameter] +# 39| 0: [TypeAccess] int +# 41| 1: [Parameter] value +# 41| 0: [TypeAccess] int +# 41| 5: [BlockStmt] { ... } +# 41| 0: [ReturnStmt] return ... +# 41| 0: [VarAccess] INSTANCE +# 58| 3: [Class] Class1 +# 58| 3: [Constructor] Class1 +# 58| 5: [BlockStmt] { ... } +# 58| 0: [SuperConstructorInvocationStmt] super(...) +# 58| 1: [BlockStmt] { ... } +# 59| 4: [Method] fn +# 59| 3: [TypeAccess] Unit +# 59| 5: [BlockStmt] { ... } +# 60| 0: [ExprStmt] ; +# 60| 0: [MethodCall] println(...) +# 60| -1: [TypeAccess] ConsoleKt +# 60| 0: [MemberRefExpr] ...::... +# 60| -4: [AnonymousClass] new Function2,Integer,String>(...) { ... } +# 60| 1: [Constructor] +# 60| 5: [BlockStmt] { ... } +# 60| 0: [SuperConstructorInvocationStmt] super(...) +# 60| 0: [IntegerLiteral] 2 +# 60| 2: [Method] invoke +#-----| 4: (Parameters) +# 60| 0: [Parameter] a0 +# 60| 1: [Parameter] a1 +# 60| 5: [BlockStmt] { ... } +# 60| 0: [ReturnStmt] return ... +# 60| 0: [MethodCall] m1(...) +# 60| -1: [VarAccess] a0 +# 60| 0: [VarAccess] a1 +# 60| -3: [TypeAccess] Function2,Integer,String> +# 60| 0: [TypeAccess] Generic +# 60| 0: [TypeAccess] Integer +# 60| 1: [TypeAccess] Integer +# 60| 2: [TypeAccess] String +# 61| 1: [ExprStmt] ; +# 61| 0: [MethodCall] println(...) +# 61| -1: [TypeAccess] ConsoleKt +# 61| 0: [MemberRefExpr] ...::... +# 61| -4: [AnonymousClass] new Function1(...) { ... } +# 61| 1: [Constructor] +#-----| 4: (Parameters) +# 61| 0: [Parameter] +# 61| 5: [BlockStmt] { ... } +# 61| 0: [SuperConstructorInvocationStmt] super(...) +# 61| 0: [IntegerLiteral] 1 +# 61| 1: [ExprStmt] ; +# 61| 0: [AssignExpr] ...=... +# 61| 0: [VarAccess] this. +# 61| -1: [ThisAccess] this +# 61| 1: [VarAccess] +# 61| 2: [FieldDeclaration] Generic ; +# 61| -1: [TypeAccess] Generic +# 61| 0: [TypeAccess] Integer +# 61| 3: [Method] invoke +#-----| 4: (Parameters) +# 61| 0: [Parameter] a0 +# 61| 5: [BlockStmt] { ... } +# 61| 0: [ReturnStmt] return ... +# 61| 0: [MethodCall] m1(...) +# 61| -1: [VarAccess] this. +# 61| -1: [ThisAccess] this +# 61| 0: [VarAccess] a0 +# 61| -3: [TypeAccess] Function1 +# 61| 0: [TypeAccess] Integer +# 61| 1: [TypeAccess] String +# 61| 0: [ClassInstanceExpr] new Generic(...) +# 61| -3: [TypeAccess] Generic +# 61| 0: [TypeAccess] Integer +# 62| 2: [ExprStmt] ; +# 62| 0: [MethodCall] println(...) +# 62| -1: [TypeAccess] ConsoleKt +# 62| 0: [MemberRefExpr] ...::... +# 62| -4: [AnonymousClass] new Function1,String>(...) { ... } +# 62| 1: [Constructor] +# 62| 5: [BlockStmt] { ... } +# 62| 0: [SuperConstructorInvocationStmt] super(...) +# 62| 0: [IntegerLiteral] 1 +# 62| 2: [Method] invoke +#-----| 4: (Parameters) +# 62| 0: [Parameter] a0 +# 62| 5: [BlockStmt] { ... } +# 62| 0: [ReturnStmt] return ... +# 62| 0: [MethodCall] ext1(...) +# 62| -2: [TypeAccess] Integer +# 62| -1: [TypeAccess] ReflectionKt +# 62| 0: [VarAccess] a0 +# 62| -3: [TypeAccess] Function1,String> +# 62| 0: [TypeAccess] Generic +# 62| 0: [TypeAccess] Integer +# 62| 1: [TypeAccess] String +# 63| 3: [ExprStmt] ; +# 63| 0: [MethodCall] println(...) +# 63| -1: [TypeAccess] ConsoleKt +# 63| 0: [MemberRefExpr] ...::... +# 63| -4: [AnonymousClass] new Function0(...) { ... } +# 63| 1: [Constructor] +#-----| 4: (Parameters) +# 63| 0: [Parameter] +# 63| 5: [BlockStmt] { ... } +# 63| 0: [SuperConstructorInvocationStmt] super(...) +# 63| 0: [IntegerLiteral] 0 +# 63| 1: [ExprStmt] ; +# 63| 0: [AssignExpr] ...=... +# 63| 0: [VarAccess] this. +# 63| -1: [ThisAccess] this +# 63| 1: [VarAccess] +# 63| 2: [FieldDeclaration] Generic ; +# 63| -1: [TypeAccess] Generic +# 63| 0: [TypeAccess] Integer +# 63| 3: [Method] invoke +# 63| 5: [BlockStmt] { ... } +# 63| 0: [ReturnStmt] return ... +# 63| 0: [MethodCall] ext1(...) +# 63| -2: [TypeAccess] Integer +# 63| -1: [TypeAccess] ReflectionKt +# 63| 0: [VarAccess] this. +# 63| -1: [ThisAccess] this +# 63| -3: [TypeAccess] Function0 +# 63| 0: [TypeAccess] String +# 63| 0: [ClassInstanceExpr] new Generic(...) +# 63| -3: [TypeAccess] Generic +# 63| 0: [TypeAccess] Integer +# 64| 4: [ExprStmt] ; +# 64| 0: [MethodCall] println(...) +# 64| -1: [TypeAccess] ConsoleKt +# 64| 0: [MemberRefExpr] ...::... +# 64| -4: [AnonymousClass] new Function1,String>(...) { ... } +# 64| 1: [Constructor] +# 64| 5: [BlockStmt] { ... } +# 64| 0: [SuperConstructorInvocationStmt] super(...) +# 64| 0: [IntegerLiteral] 1 +# 64| 2: [Method] invoke +#-----| 4: (Parameters) +# 64| 0: [Parameter] a0 +# 64| 5: [BlockStmt] { ... } +# 64| 0: [ReturnStmt] return ... +# 64| 0: [MethodCall] ext2(...) +# 64| -1: [TypeAccess] ReflectionKt +# 64| 0: [VarAccess] a0 +# 64| -3: [TypeAccess] Function1,String> +# 64| 0: [TypeAccess] Generic +# 64| 0: [TypeAccess] Integer +# 64| 1: [TypeAccess] String +# 65| 5: [ExprStmt] ; +# 65| 0: [MethodCall] println(...) +# 65| -1: [TypeAccess] ConsoleKt +# 65| 0: [MemberRefExpr] ...::... +# 65| -4: [AnonymousClass] new Function0(...) { ... } +# 65| 1: [Constructor] +#-----| 4: (Parameters) +# 65| 0: [Parameter] +# 65| 5: [BlockStmt] { ... } +# 65| 0: [SuperConstructorInvocationStmt] super(...) +# 65| 0: [IntegerLiteral] 0 +# 65| 1: [ExprStmt] ; +# 65| 0: [AssignExpr] ...=... +# 65| 0: [VarAccess] this. +# 65| -1: [ThisAccess] this +# 65| 1: [VarAccess] +# 65| 2: [FieldDeclaration] Generic ; +# 65| -1: [TypeAccess] Generic +# 65| 0: [TypeAccess] Integer +# 65| 3: [Method] invoke +# 65| 5: [BlockStmt] { ... } +# 65| 0: [ReturnStmt] return ... +# 65| 0: [MethodCall] ext2(...) +# 65| -1: [TypeAccess] ReflectionKt +# 65| 0: [VarAccess] this. +# 65| -1: [ThisAccess] this +# 65| -3: [TypeAccess] Function0 +# 65| 0: [TypeAccess] String +# 65| 0: [ClassInstanceExpr] new Generic(...) +# 65| -3: [TypeAccess] Generic +# 65| 0: [TypeAccess] Integer +# 67| 6: [ExprStmt] ; +# 67| 0: [MethodCall] println(...) +# 67| -1: [TypeAccess] ConsoleKt +# 67| 0: [PropertyRefExpr] ...::... +# 67| -4: [AnonymousClass] new KMutableProperty1,Integer>(...) { ... } +# 67| 1: [Constructor] +# 67| 5: [BlockStmt] { ... } +# 67| 0: [SuperConstructorInvocationStmt] super(...) +# 67| 2: [Method] get +#-----| 4: (Parameters) +# 67| 0: [Parameter] a0 +# 67| 5: [BlockStmt] { ... } +# 67| 0: [ReturnStmt] return ... +# 67| 0: [MethodCall] getP2(...) +# 67| -1: [VarAccess] a0 +# 67| 3: [Method] invoke +#-----| 4: (Parameters) +# 67| 0: [Parameter] a0 +# 67| 5: [BlockStmt] { ... } +# 67| 0: [ReturnStmt] return ... +# 67| 0: [MethodCall] get(...) +# 67| -1: [ThisAccess] this +# 67| 0: [VarAccess] a0 +# 67| 4: [Method] set +#-----| 4: (Parameters) +# 67| 0: [Parameter] a0 +# 67| 1: [Parameter] a1 +# 67| 5: [BlockStmt] { ... } +# 67| 0: [ReturnStmt] return ... +# 67| 0: [MethodCall] setP2(...) +# 67| -1: [VarAccess] a0 +# 67| 0: [VarAccess] a1 +# 67| -3: [TypeAccess] KMutableProperty1,Integer> +# 67| 0: [TypeAccess] Generic +# 67| 0: [TypeAccess] Integer +# 67| 1: [TypeAccess] Integer +# 68| 7: [ExprStmt] ; +# 68| 0: [MethodCall] println(...) +# 68| -1: [TypeAccess] ConsoleKt +# 68| 0: [PropertyRefExpr] ...::... +# 68| -4: [AnonymousClass] new KMutableProperty0(...) { ... } +# 68| 1: [Constructor] +#-----| 4: (Parameters) +# 68| 0: [Parameter] +# 68| 5: [BlockStmt] { ... } +# 68| 0: [SuperConstructorInvocationStmt] super(...) +# 68| 1: [ExprStmt] ; +# 68| 0: [AssignExpr] ...=... +# 68| 0: [VarAccess] this. +# 68| -1: [ThisAccess] this +# 68| 1: [VarAccess] +# 68| 2: [FieldDeclaration] Generic ; +# 68| -1: [TypeAccess] Generic +# 68| 0: [TypeAccess] Integer +# 68| 3: [Method] get +# 68| 5: [BlockStmt] { ... } +# 68| 0: [ReturnStmt] return ... +# 68| 0: [MethodCall] getP2(...) +# 68| -1: [VarAccess] this. +# 68| -1: [ThisAccess] this +# 68| 4: [Method] invoke +# 68| 5: [BlockStmt] { ... } +# 68| 0: [ReturnStmt] return ... +# 68| 0: [MethodCall] get(...) +# 68| -1: [ThisAccess] this +# 68| 5: [Method] set +#-----| 4: (Parameters) +# 68| 0: [Parameter] a0 +# 68| 5: [BlockStmt] { ... } +# 68| 0: [ReturnStmt] return ... +# 68| 0: [MethodCall] setP2(...) +# 68| -1: [VarAccess] this. +# 68| -1: [ThisAccess] this +# 68| 0: [VarAccess] a0 +# 68| -3: [TypeAccess] KMutableProperty0 +# 68| 0: [TypeAccess] Integer +# 68| 0: [ClassInstanceExpr] new Generic(...) +# 68| -3: [TypeAccess] Generic +# 68| 0: [TypeAccess] Integer +# 70| 8: [ExprStmt] ; +# 70| 0: [MethodCall] println(...) +# 70| -1: [TypeAccess] ConsoleKt +# 70| 0: [PropertyRefExpr] ...::... +# 70| -4: [AnonymousClass] new KProperty0(...) { ... } +# 70| 1: [Constructor] +#-----| 4: (Parameters) +# 70| 0: [Parameter] +# 70| 5: [BlockStmt] { ... } +# 70| 0: [SuperConstructorInvocationStmt] super(...) +# 70| 1: [ExprStmt] ; +# 70| 0: [AssignExpr] ...=... +# 70| 0: [VarAccess] this. +# 70| -1: [ThisAccess] this +# 70| 1: [VarAccess] +# 70| 2: [FieldDeclaration] IntCompanionObject ; +# 70| -1: [TypeAccess] IntCompanionObject +# 70| 3: [Method] get +# 70| 5: [BlockStmt] { ... } +# 70| 0: [ReturnStmt] return ... +# 70| 0: [MethodCall] getMAX_VALUE(...) +# 70| -1: [VarAccess] this. +# 70| -1: [ThisAccess] this +# 70| 4: [Method] invoke +# 70| 5: [BlockStmt] { ... } +# 70| 0: [ReturnStmt] return ... +# 70| 0: [MethodCall] get(...) +# 70| -1: [ThisAccess] this +# 70| -3: [TypeAccess] KProperty0 +# 70| 0: [TypeAccess] Integer +# 70| 0: [VarAccess] Companion +# 71| 9: [ExprStmt] ; +# 71| 0: [MethodCall] println(...) +# 71| -1: [TypeAccess] ConsoleKt +# 71| 0: [PropertyRefExpr] ...::... +# 71| -4: [AnonymousClass] new KProperty0(...) { ... } +# 71| 1: [Constructor] +# 71| 5: [BlockStmt] { ... } +# 71| 0: [SuperConstructorInvocationStmt] super(...) +# 71| 2: [Method] get +# 71| 5: [BlockStmt] { ... } +# 71| 0: [ReturnStmt] return ... +# 71| 0: [VarAccess] MAX_VALUE +# 71| 3: [Method] invoke +# 71| 5: [BlockStmt] { ... } +# 71| 0: [ReturnStmt] return ... +# 71| 0: [MethodCall] get(...) +# 71| -1: [ThisAccess] this +# 71| -3: [TypeAccess] KProperty0 +# 71| 0: [TypeAccess] Integer +# 72| 10: [ExprStmt] ; +# 72| 0: [MethodCall] println(...) +# 72| -1: [TypeAccess] ConsoleKt +# 72| 0: [PropertyRefExpr] ...::... +# 72| -4: [AnonymousClass] new KMutableProperty0(...) { ... } +# 72| 1: [Constructor] +#-----| 4: (Parameters) +# 72| 0: [Parameter] +# 72| 5: [BlockStmt] { ... } +# 72| 0: [SuperConstructorInvocationStmt] super(...) +# 72| 1: [ExprStmt] ; +# 72| 0: [AssignExpr] ...=... +# 72| 0: [VarAccess] this. +# 72| -1: [ThisAccess] this +# 72| 1: [VarAccess] +# 72| 2: [FieldDeclaration] Rectangle ; +# 72| -1: [TypeAccess] Rectangle +# 72| 3: [Method] get +# 72| 5: [BlockStmt] { ... } +# 72| 0: [ReturnStmt] return ... +# 72| 0: [VarAccess] this..height +# 72| -1: [VarAccess] this. +# 72| -1: [ThisAccess] this +# 72| 4: [Method] invoke +# 72| 5: [BlockStmt] { ... } +# 72| 0: [ReturnStmt] return ... +# 72| 0: [MethodCall] get(...) +# 72| -1: [ThisAccess] this +# 72| 5: [Method] set +#-----| 4: (Parameters) +# 72| 0: [Parameter] a0 +# 72| 5: [BlockStmt] { ... } +# 72| 0: [ExprStmt] ; +# 72| 0: [AssignExpr] ...=... +# 72| 0: [VarAccess] this..height +# 72| -1: [VarAccess] this. +# 72| -1: [ThisAccess] this +# 72| 1: [VarAccess] a0 +# 72| -3: [TypeAccess] KMutableProperty0 +# 72| 0: [TypeAccess] Integer +# 72| 0: [ClassInstanceExpr] new Rectangle(...) +# 72| -3: [TypeAccess] Rectangle +# 75| 5: [Class,GenericType,ParameterizedType] Generic +#-----| -2: (Generic Parameters) +# 75| 0: [TypeVariable] T1 +# 75| 1: [Constructor] Generic +# 75| 5: [BlockStmt] { ... } +# 75| 0: [SuperConstructorInvocationStmt] super(...) +# 75| 1: [BlockStmt] { ... } +# 76| 2: [Method] m1 +# 76| 3: [TypeAccess] String +#-----| 4: (Parameters) +# 76| 0: [Parameter] i +# 76| 0: [TypeAccess] T1 +# 76| 5: [BlockStmt] { ... } +# 76| 0: [ReturnStmt] return ... +# 76| 0: [MethodCall] toString(...) +# 76| -1: [ThisAccess] this +# 78| 3: [Method] getP2 +# 78| 3: [TypeAccess] T1 +# 78| 5: [BlockStmt] { ... } +# 78| 0: [ReturnStmt] return ... +# 78| 0: [NullLiteral] null +# 79| 4: [Method] setP2 +# 79| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 79| 0: [Parameter] value +# 79| 0: [TypeAccess] T1 +# 79| 5: [BlockStmt] { ... } +# 79| 0: [ReturnStmt] return ... +# 79| 0: [VarAccess] INSTANCE +# 83| 4: [Class,GenericType,ParameterizedType] Class2 +#-----| -2: (Generic Parameters) +# 83| 0: [TypeVariable] T +# 83| 3: [Constructor] Class2 +#-----| 4: (Parameters) +# 83| 0: [Parameter] value +# 83| 0: [TypeAccess] T +# 83| 5: [BlockStmt] { ... } +# 83| 0: [SuperConstructorInvocationStmt] super(...) +# 83| 1: [BlockStmt] { ... } +# 83| 0: [ExprStmt] ; +# 83| 0: [KtInitializerAssignExpr] ...=... +# 83| 0: [VarAccess] value +# 83| 4: [FieldDeclaration] T value; +# 83| -1: [TypeAccess] T +# 83| 0: [VarAccess] value +# 83| 5: [Method] getValue +# 83| 3: [TypeAccess] T +# 83| 5: [BlockStmt] { ... } +# 83| 0: [ReturnStmt] return ... +# 83| 0: [VarAccess] this.value +# 83| -1: [ThisAccess] this +# 85| 6: [Class,GenericType,ParameterizedType] Inner +#-----| -2: (Generic Parameters) +# 85| 0: [TypeVariable] T1 +# 86| 1: [Constructor] Inner +#-----| 4: (Parameters) +# 86| 0: [Parameter] t +# 86| 0: [TypeAccess] T1 +# 86| 5: [BlockStmt] { ... } +# 86| 0: [SuperConstructorInvocationStmt] super(...) +# 86| 1: [BlockStmt] { ... } +# 89| 8: [Method] test +# 89| 3: [TypeAccess] Unit +# 89| 5: [BlockStmt] { ... } +# 90| 0: [ExprStmt] ; +# 90| 0: [MethodCall] fn11(...) +# 90| -3: [TypeAccess] Inner +# 90| 0: [TypeAccess] String +# 90| 1: [TypeAccess] T +# 90| -2: [TypeAccess] String +# 90| -1: [TypeAccess] ReflectionKt +# 90| 0: [StringLiteral] "" +# 90| 1: [MemberRefExpr] ...::... +# 90| -4: [AnonymousClass] new Function1>(...) { ... } +# 90| 1: [Constructor] +#-----| 4: (Parameters) +# 90| 0: [Parameter] +# 90| 5: [BlockStmt] { ... } +# 90| 0: [SuperConstructorInvocationStmt] super(...) +# 90| 0: [IntegerLiteral] 1 +# 90| 1: [ExprStmt] ; +# 90| 0: [AssignExpr] ...=... +# 90| 0: [VarAccess] this. +# 90| -1: [ThisAccess] this +# 90| 1: [VarAccess] +# 90| 2: [FieldDeclaration] Class2 ; +# 90| -1: [TypeAccess] Class2 +# 90| 0: [TypeAccess] T +# 90| 3: [Method] invoke +#-----| 4: (Parameters) +# 90| 0: [Parameter] a0 +# 90| 5: [BlockStmt] { ... } +# 90| 0: [ReturnStmt] return ... +# 90| 0: [ClassInstanceExpr] new Inner(...) +# 90| -3: [TypeAccess] Inner +# 90| 0: [TypeAccess] String +# 90| -2: [VarAccess] this. +# 90| -1: [ThisAccess] this +# 90| 0: [VarAccess] a0 +# 90| -3: [TypeAccess] Function1> +# 90| 0: [TypeAccess] String +# 90| 1: [TypeAccess] Inner +# 90| 0: [TypeAccess] String +# 90| 0: [ThisAccess] this +# 105| 6: [Class] Base1 +# 105| 1: [Constructor] Base1 +#-----| 4: (Parameters) +# 105| 0: [Parameter] prop1 +# 105| 0: [TypeAccess] int +# 105| 5: [BlockStmt] { ... } +# 105| 0: [SuperConstructorInvocationStmt] super(...) +# 105| 1: [BlockStmt] { ... } +# 105| 0: [ExprStmt] ; +# 105| 0: [KtInitializerAssignExpr] ...=... +# 105| 0: [VarAccess] prop1 +# 105| 2: [Method] getProp1 +# 105| 3: [TypeAccess] int +# 105| 5: [BlockStmt] { ... } +# 105| 0: [ReturnStmt] return ... +# 105| 0: [VarAccess] this.prop1 +# 105| -1: [ThisAccess] this +# 105| 3: [FieldDeclaration] int prop1; +# 105| -1: [TypeAccess] int +# 105| 0: [VarAccess] prop1 +# 105| 4: [Method] setProp1 +# 105| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 105| 0: [Parameter] +# 105| 0: [TypeAccess] int +# 105| 5: [BlockStmt] { ... } +# 105| 0: [ExprStmt] ; +# 105| 0: [AssignExpr] ...=... +# 105| 0: [VarAccess] this.prop1 +# 105| -1: [ThisAccess] this +# 105| 1: [VarAccess] +# 107| 7: [Class] Derived1 +# 107| 1: [Constructor] Derived1 +#-----| 4: (Parameters) +# 107| 0: [Parameter] prop1 +# 107| 0: [TypeAccess] int +# 107| 5: [BlockStmt] { ... } +# 107| 0: [SuperConstructorInvocationStmt] super(...) +# 107| 0: [VarAccess] prop1 +# 107| 1: [BlockStmt] { ... } +# 108| 2: [Method] fn +# 108| 3: [TypeAccess] Unit +# 108| 5: [BlockStmt] { ... } +# 109| 0: [ExprStmt] ; +# 109| 0: [MethodCall] println(...) +# 109| -1: [TypeAccess] ConsoleKt +# 109| 0: [PropertyRefExpr] ...::... +# 109| -4: [AnonymousClass] new KMutableProperty0(...) { ... } +# 109| 1: [Constructor] +#-----| 4: (Parameters) +# 109| 0: [Parameter] +# 109| 5: [BlockStmt] { ... } +# 109| 0: [SuperConstructorInvocationStmt] super(...) +# 109| 1: [ExprStmt] ; +# 109| 0: [AssignExpr] ...=... +# 109| 0: [VarAccess] this. +# 109| -1: [ThisAccess] this +# 109| 1: [VarAccess] +# 109| 2: [FieldDeclaration] Derived1 ; +# 109| -1: [TypeAccess] Derived1 +# 109| 3: [Method] get +# 109| 5: [BlockStmt] { ... } +# 109| 0: [ReturnStmt] return ... +# 109| 0: [MethodCall] getProp1(...) +# 109| -1: [VarAccess] this. +# 109| -1: [ThisAccess] this +# 109| 4: [Method] invoke +# 109| 5: [BlockStmt] { ... } +# 109| 0: [ReturnStmt] return ... +# 109| 0: [MethodCall] get(...) +# 109| -1: [ThisAccess] this +# 109| 5: [Method] set +#-----| 4: (Parameters) +# 109| 0: [Parameter] a0 +# 109| 5: [BlockStmt] { ... } +# 109| 0: [ReturnStmt] return ... +# 109| 0: [MethodCall] setProp1(...) +# 109| -1: [VarAccess] this. +# 109| -1: [ThisAccess] this +# 109| 0: [VarAccess] a0 +# 109| -3: [TypeAccess] KMutableProperty0 +# 109| 0: [TypeAccess] Integer +# 109| 0: [ThisAccess] this +# 113| 8: [Class] LocalFn +# 113| 1: [Constructor] LocalFn +# 113| 5: [BlockStmt] { ... } +# 113| 0: [SuperConstructorInvocationStmt] super(...) +# 113| 1: [BlockStmt] { ... } +# 114| 2: [Method] fn +# 114| 3: [TypeAccess] Unit +# 114| 5: [BlockStmt] { ... } +# 115| 0: [LocalTypeDeclStmt] class ... +# 115| 0: [LocalClass] +# 115| 1: [Constructor] +# 115| 5: [BlockStmt] { ... } +# 115| 0: [SuperConstructorInvocationStmt] super(...) +# 115| 2: [Method] fn1 +# 115| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 115| 0: [Parameter] i +# 115| 0: [TypeAccess] int +# 115| 5: [BlockStmt] { ... } +# 116| 1: [LocalVariableDeclStmt] var ...; +# 116| 1: [LocalVariableDeclExpr] x +# 116| 0: [MemberRefExpr] ...::... +# 116| -4: [AnonymousClass] new Function1(...) { ... } +# 116| 1: [Constructor] +# 116| 5: [BlockStmt] { ... } +# 116| 0: [SuperConstructorInvocationStmt] super(...) +# 116| 0: [IntegerLiteral] 1 +# 116| 2: [Method] invoke +#-----| 4: (Parameters) +# 116| 0: [Parameter] a0 +# 116| 5: [BlockStmt] { ... } +# 116| 0: [ReturnStmt] return ... +# 116| 0: [MethodCall] fn1(...) +# 116| -1: [ClassInstanceExpr] new (...) +# 116| -3: [TypeAccess] Object +# 116| 0: [VarAccess] a0 +# 116| -3: [TypeAccess] Function1 +# 116| 0: [TypeAccess] Integer +# 116| 1: [TypeAccess] Unit +# 139| 9: [Class] MemberOptionalsTest +# 139| 1: [Constructor] MemberOptionalsTest +# 139| 5: [BlockStmt] { ... } +# 139| 0: [SuperConstructorInvocationStmt] super(...) +# 139| 1: [BlockStmt] { ... } +# 140| 2: [Method] takesOptionalParam +# 140| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 140| 0: [Parameter] x +# 140| 0: [TypeAccess] int +# 140| 1: [Parameter] y +# 140| 0: [TypeAccess] int +# 140| 5: [BlockStmt] { ... } +# 140| 0: [ReturnStmt] return ... +# 140| 0: [AddExpr] ... + ... +# 140| 0: [VarAccess] x +# 140| 1: [VarAccess] y +# 140| 3: [Method] takesOptionalParam$default +# 140| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 140| 0: [Parameter] p0 +# 140| 0: [TypeAccess] MemberOptionalsTest +# 140| 1: [Parameter] p1 +# 140| 0: [TypeAccess] int +# 140| 2: [Parameter] p2 +# 140| 0: [TypeAccess] int +# 140| 3: [Parameter] p3 +# 140| 0: [TypeAccess] int +# 140| 4: [Parameter] p4 +# 140| 0: [TypeAccess] Object +# 140| 5: [BlockStmt] { ... } +# 140| 0: [IfStmt] if (...) +# 140| 0: [EQExpr] ... == ... +# 140| 0: [AndBitwiseExpr] ... & ... +# 140| 0: [IntegerLiteral] 2 +# 140| 1: [VarAccess] p3 +# 140| 1: [IntegerLiteral] 0 +# 140| 1: [ExprStmt] ; +# 140| 0: [AssignExpr] ...=... +# 140| 0: [VarAccess] p2 +# 140| 1: [IntegerLiteral] 0 +# 140| 1: [ReturnStmt] return ... +# 140| 0: [MethodCall] takesOptionalParam(...) +# 140| -1: [VarAccess] p0 +# 140| 0: [VarAccess] p1 +# 140| 1: [VarAccess] p2 +# 157| 10: [Class] ConstructorOptional +# 157| 1: [Constructor] ConstructorOptional +#-----| 4: (Parameters) +# 157| 0: [Parameter] x +# 157| 0: [TypeAccess] int +# 157| 1: [Parameter] y +# 157| 0: [TypeAccess] int +# 157| 5: [BlockStmt] { ... } +# 157| 0: [SuperConstructorInvocationStmt] super(...) +# 157| 1: [BlockStmt] { ... } +# 157| 2: [Constructor] ConstructorOptional +#-----| 4: (Parameters) +# 157| 0: [Parameter] p0 +# 157| 0: [TypeAccess] int +# 157| 1: [Parameter] p1 +# 157| 0: [TypeAccess] int +# 157| 2: [Parameter] p2 +# 157| 0: [TypeAccess] int +# 157| 3: [Parameter] p3 +# 157| 0: [TypeAccess] DefaultConstructorMarker +# 157| 5: [BlockStmt] { ... } +# 157| 0: [IfStmt] if (...) +# 157| 0: [EQExpr] ... == ... +# 157| 0: [AndBitwiseExpr] ... & ... +# 157| 0: [IntegerLiteral] 2 +# 157| 1: [VarAccess] p2 +# 157| 1: [IntegerLiteral] 0 +# 157| 1: [ExprStmt] ; +# 157| 0: [AssignExpr] ...=... +# 157| 0: [VarAccess] p1 +# 157| 1: [IntegerLiteral] 0 +# 157| 1: [ThisConstructorInvocationStmt] this(...) +# 157| 0: [VarAccess] p0 +# 157| 1: [VarAccess] p1 diff --git a/java/ql/test-kotlin2/library-tests/reflection/PrintAst.qlref b/java/ql/test-kotlin2/library-tests/reflection/PrintAst.qlref new file mode 100644 index 00000000000..c7fd5faf239 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/reflection/PrintAst.qlref @@ -0,0 +1 @@ +semmle/code/java/PrintAst.ql \ No newline at end of file diff --git a/java/ql/test-kotlin2/library-tests/reflection/checkParameterCounts.expected b/java/ql/test-kotlin2/library-tests/reflection/checkParameterCounts.expected new file mode 100644 index 00000000000..e69de29bb2d diff --git a/java/ql/test-kotlin2/library-tests/reflection/checkParameterCounts.ql b/java/ql/test-kotlin2/library-tests/reflection/checkParameterCounts.ql new file mode 100644 index 00000000000..854bfbc5af4 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/reflection/checkParameterCounts.ql @@ -0,0 +1,9 @@ +import java + +from Call call, Callable callable, int argCount, int paramCount +where + call.getCallee() = callable and + argCount = count(call.getAnArgument()) and + paramCount = count(callable.getAParameter()) and + argCount != paramCount +select "Call should have " + paramCount + " arguments but actually has " + argCount, call, callable diff --git a/java/ql/test-kotlin2/library-tests/reflection/reflection.expected b/java/ql/test-kotlin2/library-tests/reflection/reflection.expected new file mode 100644 index 00000000000..d149bd24563 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/reflection/reflection.expected @@ -0,0 +1,589 @@ +variableInitializerType +| reflection.kt:7:13:7:15 | KFunction ref | file:///KFunction.class:0:0:0:0 | KFunction | reflection.kt:7:49:7:54 | new Function2(...) { ... } | file:///Function2.class:0:0:0:0 | Function2 | true | +| reflection.kt:7:13:7:15 | KFunction ref | file:///KFunction.class:0:0:0:0 | KFunction | reflection.kt:7:49:7:54 | new Function2(...) { ... } | file:///FunctionReference.class:0:0:0:0 | FunctionReference | true | +| reflection.kt:10:13:10:14 | KProperty1 x0 | file:///KProperty1.class:0:0:0:0 | KProperty1 | reflection.kt:10:38:10:42 | new KProperty1(...) { ... } | file:///KProperty1.class:0:0:0:0 | KProperty1 | true | +| reflection.kt:10:13:10:14 | KProperty1 x0 | file:///KProperty1.class:0:0:0:0 | KProperty1 | reflection.kt:10:38:10:42 | new KProperty1(...) { ... } | file:///PropertyReference.class:0:0:0:0 | PropertyReference | true | +| reflection.kt:13:13:13:14 | Getter x3 | file:///KProperty1$Getter.class:0:0:0:0 | Getter | file:///KProperty1$Getter.class:0:0:0:0 | Getter | file:///Function1.class:0:0:0:0 | Function1 | true | +| reflection.kt:13:13:13:14 | Getter x3 | file:///KProperty1$Getter.class:0:0:0:0 | Getter | file:///KProperty1$Getter.class:0:0:0:0 | Getter | file:///KProperty$Getter.class:0:0:0:0 | Getter | true | +| reflection.kt:14:13:14:14 | KFunction x4 | file:///KFunction.class:0:0:0:0 | KFunction | reflection.kt:14:38:14:44 | new Function1(...) { ... } | file:///Function1.class:0:0:0:0 | Function1 | true | +| reflection.kt:14:13:14:14 | KFunction x4 | file:///KFunction.class:0:0:0:0 | KFunction | reflection.kt:14:38:14:44 | new Function1(...) { ... } | file:///FunctionReference.class:0:0:0:0 | FunctionReference | true | +| reflection.kt:15:13:15:14 | KProperty0 x5 | file:///KProperty0.class:0:0:0:0 | KProperty0 | reflection.kt:15:35:15:41 | new KProperty0(...) { ... } | file:///KProperty0.class:0:0:0:0 | KProperty0 | true | +| reflection.kt:15:13:15:14 | KProperty0 x5 | file:///KProperty0.class:0:0:0:0 | KProperty0 | reflection.kt:15:35:15:41 | new KProperty0(...) { ... } | file:///PropertyReference.class:0:0:0:0 | PropertyReference | true | +| reflection.kt:17:13:17:14 | KMutableProperty1 y0 | file:///KMutableProperty1.class:0:0:0:0 | KMutableProperty1 | reflection.kt:17:45:17:49 | new KMutableProperty1(...) { ... } | file:///KMutableProperty1.class:0:0:0:0 | KMutableProperty1 | true | +| reflection.kt:17:13:17:14 | KMutableProperty1 y0 | file:///KMutableProperty1.class:0:0:0:0 | KMutableProperty1 | reflection.kt:17:45:17:49 | new KMutableProperty1(...) { ... } | file:///PropertyReference.class:0:0:0:0 | PropertyReference | true | +| reflection.kt:20:13:20:14 | Setter y3 | file:///KMutableProperty1$Setter.class:0:0:0:0 | Setter | file:///KMutableProperty1$Setter.class:0:0:0:0 | Setter | file:///Function2.class:0:0:0:0 | Function2 | true | +| reflection.kt:20:13:20:14 | Setter y3 | file:///KMutableProperty1$Setter.class:0:0:0:0 | Setter | file:///KMutableProperty1$Setter.class:0:0:0:0 | Setter | file:///KMutableProperty$Setter.class:0:0:0:0 | Setter | true | +| reflection.kt:21:13:21:14 | KFunction y4 | file:///KFunction.class:0:0:0:0 | KFunction | reflection.kt:21:44:21:50 | new Function2(...) { ... } | file:///Function2.class:0:0:0:0 | Function2 | true | +| reflection.kt:21:13:21:14 | KFunction y4 | file:///KFunction.class:0:0:0:0 | KFunction | reflection.kt:21:44:21:50 | new Function2(...) { ... } | file:///FunctionReference.class:0:0:0:0 | FunctionReference | true | +| reflection.kt:22:13:22:14 | KMutableProperty0 y5 | file:///KMutableProperty0.class:0:0:0:0 | KMutableProperty0 | reflection.kt:22:42:22:48 | new KMutableProperty0(...) { ... } | file:///KMutableProperty0.class:0:0:0:0 | KMutableProperty0 | true | +| reflection.kt:22:13:22:14 | KMutableProperty0 y5 | file:///KMutableProperty0.class:0:0:0:0 | KMutableProperty0 | reflection.kt:22:42:22:48 | new KMutableProperty0(...) { ... } | file:///PropertyReference.class:0:0:0:0 | PropertyReference | true | +| reflection.kt:24:13:24:16 | KProperty2 prop | file:///KProperty2.class:0:0:0:0 | KProperty2 | file:///KProperty2.class:0:0:0:0 | KProperty2 | file:///Function2.class:0:0:0:0 | Function2 | true | +| reflection.kt:24:13:24:16 | KProperty2 prop | file:///KProperty2.class:0:0:0:0 | KProperty2 | file:///KProperty2.class:0:0:0:0 | KProperty2 | file:///KProperty.class:0:0:0:0 | KProperty | true | +| reflection.kt:116:13:116:13 | KFunction x | file:///KFunction.class:0:0:0:0 | KFunction | reflection.kt:116:40:116:44 | new Function1(...) { ... } | file:///Function1.class:0:0:0:0 | Function1 | true | +| reflection.kt:116:13:116:13 | KFunction x | file:///KFunction.class:0:0:0:0 | KFunction | reflection.kt:116:40:116:44 | new Function1(...) { ... } | file:///FunctionReference.class:0:0:0:0 | FunctionReference | true | +invocation +| reflection.kt:8:17:8:24 | getName(...) | file:///KCallable.class:0:0:0:0 | getName | +| reflection.kt:11:23:11:33 | get(...) | file:///KProperty1.class:0:0:0:0 | get | +| reflection.kt:12:26:12:32 | getName(...) | file:///KCallable.class:0:0:0:0 | getName | +| reflection.kt:13:45:13:53 | getGetter(...) | file:///KProperty1.class:0:0:0:0 | getGetter | +| reflection.kt:14:38:14:44 | get(...) | file:///KProperty1.class:0:0:0:0 | get | +| reflection.kt:18:24:18:37 | set(...) | file:///KMutableProperty1.class:0:0:0:0 | set | +| reflection.kt:19:26:19:32 | getName(...) | file:///KCallable.class:0:0:0:0 | getName | +| reflection.kt:20:52:20:60 | getSetter(...) | file:///KMutableProperty1.class:0:0:0:0 | getSetter | +| reflection.kt:21:44:21:50 | set(...) | file:///KMutableProperty1.class:0:0:0:0 | set | +| reflection.kt:24:21:24:37 | getMembers(...) | file:///KClass.class:0:0:0:0 | getMembers | +| reflection.kt:24:48:24:54 | getName(...) | file:///KCallable.class:0:0:0:0 | getName | +| reflection.kt:25:18:25:33 | get(...) | file:///KProperty2.class:0:0:0:0 | get | +| reflection.kt:50:13:50:39 | get(...) | file:///KProperty1.class:0:0:0:0 | get | +| reflection.kt:51:13:51:34 | get(...) | file:///KProperty0.class:0:0:0:0 | get | +functionReferences +| reflection.kt:7:49:7:54 | ...::... | reflection.kt:7:49:7:54 | invoke | reflection.kt:29:9:29:33 | m | +| reflection.kt:14:38:14:44 | ...::... | reflection.kt:14:38:14:44 | invoke | file:///KProperty1.class:0:0:0:0 | get | +| reflection.kt:21:44:21:50 | ...::... | reflection.kt:21:44:21:50 | invoke | file:///KMutableProperty1.class:0:0:0:0 | set | +| reflection.kt:60:17:60:32 | ...::... | reflection.kt:60:17:60:32 | invoke | file:///Class1$Generic.class:0:0:0:0 | m1 | +| reflection.kt:61:17:61:34 | ...::... | reflection.kt:61:17:61:34 | invoke | file:///Class1$Generic.class:0:0:0:0 | m1 | +| reflection.kt:62:17:62:34 | ...::... | reflection.kt:62:17:62:34 | invoke | reflection.kt:54:1:54:52 | ext1 | +| reflection.kt:63:17:63:36 | ...::... | reflection.kt:63:17:63:36 | invoke | reflection.kt:54:1:54:52 | ext1 | +| reflection.kt:64:17:64:34 | ...::... | reflection.kt:64:17:64:34 | invoke | reflection.kt:56:1:56:48 | ext2 | +| reflection.kt:65:17:65:36 | ...::... | reflection.kt:65:17:65:36 | invoke | reflection.kt:56:1:56:48 | ext2 | +| reflection.kt:90:18:90:24 | ...::... | reflection.kt:90:18:90:24 | invoke | file:///Class2$Inner.class:0:0:0:0 | Inner | +| reflection.kt:97:14:97:21 | ...::... | reflection.kt:97:14:97:21 | invoke | file:///Class2.class:0:0:0:0 | Class2 | +| reflection.kt:98:14:98:17 | ...::... | reflection.kt:98:14:98:17 | invoke | reflection.kt:94:1:94:24 | fn | +| reflection.kt:99:14:99:29 | ...::... | reflection.kt:99:14:99:29 | invoke | file:///Class2$Inner.class:0:0:0:0 | Inner | +| reflection.kt:116:40:116:44 | ...::... | reflection.kt:116:40:116:44 | invoke | reflection.kt:115:9:115:27 | fn1 | +| reflection.kt:126:9:126:13 | ...::... | reflection.kt:126:9:126:13 | invoke | reflection.kt:126:9:126:13 | fn1 | +| reflection.kt:134:21:134:40 | ...::... | reflection.kt:134:21:134:40 | invoke | reflection.kt:134:21:134:40 | takesOptionalParam | +| reflection.kt:144:21:144:41 | ...::... | reflection.kt:144:21:144:41 | invoke | reflection.kt:144:21:144:41 | takesOptionalParam | +| reflection.kt:145:32:145:70 | ...::... | reflection.kt:145:32:145:70 | invoke | reflection.kt:145:32:145:70 | takesOptionalParam | +| reflection.kt:153:21:153:44 | ...::... | reflection.kt:153:21:153:44 | invoke | reflection.kt:153:21:153:44 | extTakesOptionalParam | +| reflection.kt:154:33:154:61 | ...::... | reflection.kt:154:33:154:61 | invoke | reflection.kt:154:33:154:61 | extTakesOptionalParam | +| reflection.kt:162:25:162:45 | ...::... | reflection.kt:162:25:162:45 | invoke | reflection.kt:162:25:162:45 | | +propertyGetReferences +| reflection.kt:10:38:10:42 | ...::... | reflection.kt:10:38:10:42 | get | reflection.kt:33:9:33:23 | getP0 | +| reflection.kt:15:35:15:41 | ...::... | reflection.kt:15:35:15:41 | get | reflection.kt:33:9:33:23 | getP0 | +| reflection.kt:17:45:17:49 | ...::... | reflection.kt:17:45:17:49 | get | reflection.kt:34:9:34:23 | getP1 | +| reflection.kt:22:42:22:48 | ...::... | reflection.kt:22:42:22:48 | get | reflection.kt:34:9:34:23 | getP1 | +| reflection.kt:50:13:50:28 | ...::... | reflection.kt:50:13:50:28 | get | reflection.kt:47:5:47:28 | getLastChar | +| reflection.kt:51:13:51:28 | ...::... | reflection.kt:51:13:51:28 | get | reflection.kt:47:5:47:28 | getLastChar | +| reflection.kt:67:17:67:32 | ...::... | reflection.kt:67:17:67:32 | get | file:///Class1$Generic.class:0:0:0:0 | getP2 | +| reflection.kt:68:17:68:34 | ...::... | reflection.kt:68:17:68:34 | get | file:///Class1$Generic.class:0:0:0:0 | getP2 | +| reflection.kt:70:17:70:30 | ...::... | reflection.kt:70:17:70:30 | get | file:///IntCompanionObject.class:0:0:0:0 | getMAX_VALUE | +| reflection.kt:109:17:109:27 | ...::... | reflection.kt:109:17:109:27 | get | reflection.kt:105:18:105:31 | getProp1 | +propertyFieldReferences +| reflection.kt:71:17:71:34 | ...::... | reflection.kt:71:17:71:34 | get | file:///modules/java.base/java/lang/Integer.class:0:0:0:0 | MAX_VALUE | +| reflection.kt:72:17:72:35 | ...::... | reflection.kt:72:17:72:35 | get | file:///modules/java.desktop/java/awt/Rectangle.class:0:0:0:0 | height | +propertySetReferences +| reflection.kt:17:45:17:49 | ...::... | reflection.kt:17:45:17:49 | set | reflection.kt:34:9:34:23 | setP1 | +| reflection.kt:22:42:22:48 | ...::... | reflection.kt:22:42:22:48 | set | reflection.kt:34:9:34:23 | setP1 | +| reflection.kt:67:17:67:32 | ...::... | reflection.kt:67:17:67:32 | set | file:///Class1$Generic.class:0:0:0:0 | setP2 | +| reflection.kt:68:17:68:34 | ...::... | reflection.kt:68:17:68:34 | set | file:///Class1$Generic.class:0:0:0:0 | setP2 | +| reflection.kt:109:17:109:27 | ...::... | reflection.kt:109:17:109:27 | set | reflection.kt:105:18:105:31 | setProp1 | +callsInsideInvocationMethods +| reflection.kt:7:49:7:54 | ...::... | reflection.kt:7:49:7:54 | new Function2(...) { ... } | reflection.kt:7:49:7:54 | invoke | reflection.kt:7:49:7:54 | m(...) | Reflection$Ccc.m | +| reflection.kt:10:38:10:42 | ...::... | reflection.kt:10:38:10:42 | new KProperty1(...) { ... } | reflection.kt:10:38:10:42 | get | reflection.kt:10:38:10:42 | getP0(...) | Reflection$C.getP0 | +| reflection.kt:10:38:10:42 | ...::... | reflection.kt:10:38:10:42 | new KProperty1(...) { ... } | reflection.kt:10:38:10:42 | invoke | reflection.kt:10:38:10:42 | get(...) | .get | +| reflection.kt:14:38:14:44 | ...::... | reflection.kt:14:38:14:44 | new Function1(...) { ... } | reflection.kt:14:38:14:44 | invoke | reflection.kt:14:38:14:44 | get(...) | kotlin.reflect.KProperty1.get | +| reflection.kt:15:35:15:41 | ...::... | reflection.kt:15:35:15:41 | new KProperty0(...) { ... } | reflection.kt:15:35:15:41 | get | reflection.kt:15:35:15:41 | getP0(...) | Reflection$C.getP0 | +| reflection.kt:15:35:15:41 | ...::... | reflection.kt:15:35:15:41 | new KProperty0(...) { ... } | reflection.kt:15:35:15:41 | invoke | reflection.kt:15:35:15:41 | get(...) | .get | +| reflection.kt:17:45:17:49 | ...::... | reflection.kt:17:45:17:49 | new KMutableProperty1(...) { ... } | reflection.kt:17:45:17:49 | get | reflection.kt:17:45:17:49 | getP1(...) | Reflection$C.getP1 | +| reflection.kt:17:45:17:49 | ...::... | reflection.kt:17:45:17:49 | new KMutableProperty1(...) { ... } | reflection.kt:17:45:17:49 | invoke | reflection.kt:17:45:17:49 | get(...) | .get | +| reflection.kt:17:45:17:49 | ...::... | reflection.kt:17:45:17:49 | new KMutableProperty1(...) { ... } | reflection.kt:17:45:17:49 | set | reflection.kt:17:45:17:49 | setP1(...) | Reflection$C.setP1 | +| reflection.kt:21:44:21:50 | ...::... | reflection.kt:21:44:21:50 | new Function2(...) { ... } | reflection.kt:21:44:21:50 | invoke | reflection.kt:21:44:21:50 | set(...) | kotlin.reflect.KMutableProperty1.set | +| reflection.kt:22:42:22:48 | ...::... | reflection.kt:22:42:22:48 | new KMutableProperty0(...) { ... } | reflection.kt:22:42:22:48 | get | reflection.kt:22:42:22:48 | getP1(...) | Reflection$C.getP1 | +| reflection.kt:22:42:22:48 | ...::... | reflection.kt:22:42:22:48 | new KMutableProperty0(...) { ... } | reflection.kt:22:42:22:48 | invoke | reflection.kt:22:42:22:48 | get(...) | .get | +| reflection.kt:22:42:22:48 | ...::... | reflection.kt:22:42:22:48 | new KMutableProperty0(...) { ... } | reflection.kt:22:42:22:48 | set | reflection.kt:22:42:22:48 | setP1(...) | Reflection$C.setP1 | +| reflection.kt:50:13:50:28 | ...::... | reflection.kt:50:13:50:28 | new KProperty1(...) { ... } | reflection.kt:50:13:50:28 | get | reflection.kt:50:13:50:28 | getLastChar(...) | ReflectionKt.getLastChar | +| reflection.kt:50:13:50:28 | ...::... | reflection.kt:50:13:50:28 | new KProperty1(...) { ... } | reflection.kt:50:13:50:28 | invoke | reflection.kt:50:13:50:28 | get(...) | .get | +| reflection.kt:51:13:51:28 | ...::... | reflection.kt:51:13:51:28 | new KProperty0(...) { ... } | reflection.kt:51:13:51:28 | get | reflection.kt:51:13:51:28 | getLastChar(...) | ReflectionKt.getLastChar | +| reflection.kt:51:13:51:28 | ...::... | reflection.kt:51:13:51:28 | new KProperty0(...) { ... } | reflection.kt:51:13:51:28 | invoke | reflection.kt:51:13:51:28 | get(...) | .get | +| reflection.kt:60:17:60:32 | ...::... | reflection.kt:60:17:60:32 | new Function2,Integer,String>(...) { ... } | reflection.kt:60:17:60:32 | invoke | reflection.kt:60:17:60:32 | m1(...) | Class1$Generic.m1 | +| reflection.kt:61:17:61:34 | ...::... | reflection.kt:61:17:61:34 | new Function1(...) { ... } | reflection.kt:61:17:61:34 | invoke | reflection.kt:61:17:61:34 | m1(...) | Class1$Generic.m1 | +| reflection.kt:62:17:62:34 | ...::... | reflection.kt:62:17:62:34 | new Function1,String>(...) { ... } | reflection.kt:62:17:62:34 | invoke | reflection.kt:62:17:62:34 | ext1(...) | ReflectionKt.ext1 | +| reflection.kt:63:17:63:36 | ...::... | reflection.kt:63:17:63:36 | new Function0(...) { ... } | reflection.kt:63:17:63:36 | invoke | reflection.kt:63:17:63:36 | ext1(...) | ReflectionKt.ext1 | +| reflection.kt:64:17:64:34 | ...::... | reflection.kt:64:17:64:34 | new Function1,String>(...) { ... } | reflection.kt:64:17:64:34 | invoke | reflection.kt:64:17:64:34 | ext2(...) | ReflectionKt.ext2 | +| reflection.kt:65:17:65:36 | ...::... | reflection.kt:65:17:65:36 | new Function0(...) { ... } | reflection.kt:65:17:65:36 | invoke | reflection.kt:65:17:65:36 | ext2(...) | ReflectionKt.ext2 | +| reflection.kt:67:17:67:32 | ...::... | reflection.kt:67:17:67:32 | new KMutableProperty1,Integer>(...) { ... } | reflection.kt:67:17:67:32 | get | reflection.kt:67:17:67:32 | getP2(...) | Class1$Generic.getP2 | +| reflection.kt:67:17:67:32 | ...::... | reflection.kt:67:17:67:32 | new KMutableProperty1,Integer>(...) { ... } | reflection.kt:67:17:67:32 | invoke | reflection.kt:67:17:67:32 | get(...) | .get | +| reflection.kt:67:17:67:32 | ...::... | reflection.kt:67:17:67:32 | new KMutableProperty1,Integer>(...) { ... } | reflection.kt:67:17:67:32 | set | reflection.kt:67:17:67:32 | setP2(...) | Class1$Generic.setP2 | +| reflection.kt:68:17:68:34 | ...::... | reflection.kt:68:17:68:34 | new KMutableProperty0(...) { ... } | reflection.kt:68:17:68:34 | get | reflection.kt:68:17:68:34 | getP2(...) | Class1$Generic.getP2 | +| reflection.kt:68:17:68:34 | ...::... | reflection.kt:68:17:68:34 | new KMutableProperty0(...) { ... } | reflection.kt:68:17:68:34 | invoke | reflection.kt:68:17:68:34 | get(...) | .get | +| reflection.kt:68:17:68:34 | ...::... | reflection.kt:68:17:68:34 | new KMutableProperty0(...) { ... } | reflection.kt:68:17:68:34 | set | reflection.kt:68:17:68:34 | setP2(...) | Class1$Generic.setP2 | +| reflection.kt:70:17:70:30 | ...::... | reflection.kt:70:17:70:30 | new KProperty0(...) { ... } | reflection.kt:70:17:70:30 | get | reflection.kt:70:17:70:30 | getMAX_VALUE(...) | kotlin.jvm.internal.IntCompanionObject.getMAX_VALUE | +| reflection.kt:70:17:70:30 | ...::... | reflection.kt:70:17:70:30 | new KProperty0(...) { ... } | reflection.kt:70:17:70:30 | invoke | reflection.kt:70:17:70:30 | get(...) | .get | +| reflection.kt:71:17:71:34 | ...::... | reflection.kt:71:17:71:34 | new KProperty0(...) { ... } | reflection.kt:71:17:71:34 | invoke | reflection.kt:71:17:71:34 | get(...) | .get | +| reflection.kt:72:17:72:35 | ...::... | reflection.kt:72:17:72:35 | new KMutableProperty0(...) { ... } | reflection.kt:72:17:72:35 | invoke | reflection.kt:72:17:72:35 | get(...) | .get | +| reflection.kt:90:18:90:24 | ...::... | reflection.kt:90:18:90:24 | new Function1>(...) { ... } | reflection.kt:90:18:90:24 | invoke | reflection.kt:90:18:90:24 | new Inner(...) | Class2$Inner.Inner | +| reflection.kt:97:14:97:21 | ...::... | reflection.kt:97:14:97:21 | new Function1>(...) { ... } | reflection.kt:97:14:97:21 | invoke | reflection.kt:97:14:97:21 | new Class2(...) | Class2.Class2 | +| reflection.kt:98:14:98:17 | ...::... | reflection.kt:98:14:98:17 | new Function1(...) { ... } | reflection.kt:98:14:98:17 | invoke | reflection.kt:98:14:98:17 | fn(...) | ReflectionKt.fn | +| reflection.kt:99:14:99:29 | ...::... | reflection.kt:99:14:99:29 | new Function1>(...) { ... } | reflection.kt:99:14:99:29 | invoke | reflection.kt:99:14:99:29 | new Inner(...) | Class2$Inner.Inner | +| reflection.kt:109:17:109:27 | ...::... | reflection.kt:109:17:109:27 | new KMutableProperty0(...) { ... } | reflection.kt:109:17:109:27 | get | reflection.kt:109:17:109:27 | getProp1(...) | Base1.getProp1 | +| reflection.kt:109:17:109:27 | ...::... | reflection.kt:109:17:109:27 | new KMutableProperty0(...) { ... } | reflection.kt:109:17:109:27 | invoke | reflection.kt:109:17:109:27 | get(...) | .get | +| reflection.kt:109:17:109:27 | ...::... | reflection.kt:109:17:109:27 | new KMutableProperty0(...) { ... } | reflection.kt:109:17:109:27 | set | reflection.kt:109:17:109:27 | setProp1(...) | Base1.setProp1 | +| reflection.kt:116:40:116:44 | ...::... | reflection.kt:116:40:116:44 | new Function1(...) { ... } | reflection.kt:116:40:116:44 | invoke | reflection.kt:116:40:116:44 | fn1(...) | LocalFn$.fn1 | +| reflection.kt:116:40:116:44 | ...::... | reflection.kt:116:40:116:44 | new Function1(...) { ... } | reflection.kt:116:40:116:44 | invoke | reflection.kt:116:40:116:44 | new (...) | LocalFn$. | +| reflection.kt:126:9:126:13 | ...::... | reflection.kt:126:9:126:13 | new Function0(...) { ... } | reflection.kt:126:9:126:13 | invoke | reflection.kt:126:9:126:13 | fn1(...) | ReflectionKt$.fn1 | +| reflection.kt:126:9:126:13 | ...::... | reflection.kt:126:9:126:13 | new Function0(...) { ... } | reflection.kt:126:9:126:13 | invoke | reflection.kt:126:9:126:13 | new (...) | ReflectionKt$. | +| reflection.kt:134:21:134:40 | ...::... | reflection.kt:134:21:134:40 | new Function1(...) { ... } | reflection.kt:134:21:134:40 | invoke | reflection.kt:134:21:134:40 | new (...) | ReflectionKt$. | +| reflection.kt:134:21:134:40 | ...::... | reflection.kt:134:21:134:40 | new Function1(...) { ... } | reflection.kt:134:21:134:40 | invoke | reflection.kt:134:21:134:40 | takesOptionalParam(...) | ReflectionKt$.takesOptionalParam | +| reflection.kt:144:21:144:41 | ...::... | reflection.kt:144:21:144:41 | new Function1(...) { ... } | reflection.kt:144:21:144:41 | invoke | reflection.kt:144:21:144:41 | new (...) | ReflectionKt$. | +| reflection.kt:144:21:144:41 | ...::... | reflection.kt:144:21:144:41 | new Function1(...) { ... } | reflection.kt:144:21:144:41 | invoke | reflection.kt:144:21:144:41 | takesOptionalParam(...) | ReflectionKt$.takesOptionalParam | +| reflection.kt:145:32:145:70 | ...::... | reflection.kt:145:32:145:70 | new Function2(...) { ... } | reflection.kt:145:32:145:70 | invoke | reflection.kt:145:32:145:70 | new (...) | ReflectionKt$. | +| reflection.kt:145:32:145:70 | ...::... | reflection.kt:145:32:145:70 | new Function2(...) { ... } | reflection.kt:145:32:145:70 | invoke | reflection.kt:145:32:145:70 | takesOptionalParam(...) | ReflectionKt$.takesOptionalParam | +| reflection.kt:153:21:153:44 | ...::... | reflection.kt:153:21:153:44 | new Function1(...) { ... } | reflection.kt:153:21:153:44 | invoke | reflection.kt:153:21:153:44 | extTakesOptionalParam(...) | ReflectionKt$.extTakesOptionalParam | +| reflection.kt:153:21:153:44 | ...::... | reflection.kt:153:21:153:44 | new Function1(...) { ... } | reflection.kt:153:21:153:44 | invoke | reflection.kt:153:21:153:44 | new (...) | ReflectionKt$. | +| reflection.kt:154:33:154:61 | ...::... | reflection.kt:154:33:154:61 | new Function2(...) { ... } | reflection.kt:154:33:154:61 | invoke | reflection.kt:154:33:154:61 | extTakesOptionalParam(...) | ReflectionKt$.extTakesOptionalParam | +| reflection.kt:154:33:154:61 | ...::... | reflection.kt:154:33:154:61 | new Function2(...) { ... } | reflection.kt:154:33:154:61 | invoke | reflection.kt:154:33:154:61 | new (...) | ReflectionKt$. | +| reflection.kt:162:25:162:45 | ...::... | reflection.kt:162:25:162:45 | new Function1(...) { ... } | reflection.kt:162:25:162:45 | invoke | reflection.kt:162:25:162:45 | (...) | ReflectionKt$. | +| reflection.kt:162:25:162:45 | ...::... | reflection.kt:162:25:162:45 | new Function1(...) { ... } | reflection.kt:162:25:162:45 | invoke | reflection.kt:162:25:162:45 | new (...) | ReflectionKt$. | +fieldAccessInsideInvocationMethods +| reflection.kt:14:38:14:44 | ...::... | reflection.kt:14:38:14:44 | new Function1(...) { ... } | reflection.kt:14:38:14:44 | invoke | reflection.kt:14:38:14:44 | this. | +| reflection.kt:15:35:15:41 | ...::... | reflection.kt:15:35:15:41 | new KProperty0(...) { ... } | reflection.kt:15:35:15:41 | get | reflection.kt:15:35:15:41 | this. | +| reflection.kt:21:44:21:50 | ...::... | reflection.kt:21:44:21:50 | new Function2(...) { ... } | reflection.kt:21:44:21:50 | invoke | reflection.kt:21:44:21:50 | this. | +| reflection.kt:22:42:22:48 | ...::... | reflection.kt:22:42:22:48 | new KMutableProperty0(...) { ... } | reflection.kt:22:42:22:48 | get | reflection.kt:22:42:22:48 | this. | +| reflection.kt:22:42:22:48 | ...::... | reflection.kt:22:42:22:48 | new KMutableProperty0(...) { ... } | reflection.kt:22:42:22:48 | set | reflection.kt:22:42:22:48 | this. | +| reflection.kt:51:13:51:28 | ...::... | reflection.kt:51:13:51:28 | new KProperty0(...) { ... } | reflection.kt:51:13:51:28 | get | reflection.kt:51:13:51:28 | this. | +| reflection.kt:61:17:61:34 | ...::... | reflection.kt:61:17:61:34 | new Function1(...) { ... } | reflection.kt:61:17:61:34 | invoke | reflection.kt:61:17:61:34 | this. | +| reflection.kt:63:17:63:36 | ...::... | reflection.kt:63:17:63:36 | new Function0(...) { ... } | reflection.kt:63:17:63:36 | invoke | reflection.kt:63:17:63:36 | this. | +| reflection.kt:65:17:65:36 | ...::... | reflection.kt:65:17:65:36 | new Function0(...) { ... } | reflection.kt:65:17:65:36 | invoke | reflection.kt:65:17:65:36 | this. | +| reflection.kt:68:17:68:34 | ...::... | reflection.kt:68:17:68:34 | new KMutableProperty0(...) { ... } | reflection.kt:68:17:68:34 | get | reflection.kt:68:17:68:34 | this. | +| reflection.kt:68:17:68:34 | ...::... | reflection.kt:68:17:68:34 | new KMutableProperty0(...) { ... } | reflection.kt:68:17:68:34 | set | reflection.kt:68:17:68:34 | this. | +| reflection.kt:70:17:70:30 | ...::... | reflection.kt:70:17:70:30 | new KProperty0(...) { ... } | reflection.kt:70:17:70:30 | get | reflection.kt:70:17:70:30 | this. | +| reflection.kt:71:17:71:34 | ...::... | reflection.kt:71:17:71:34 | new KProperty0(...) { ... } | reflection.kt:71:17:71:34 | get | reflection.kt:71:17:71:34 | MAX_VALUE | +| reflection.kt:72:17:72:35 | ...::... | reflection.kt:72:17:72:35 | new KMutableProperty0(...) { ... } | reflection.kt:72:17:72:35 | get | reflection.kt:72:17:72:35 | this. | +| reflection.kt:72:17:72:35 | ...::... | reflection.kt:72:17:72:35 | new KMutableProperty0(...) { ... } | reflection.kt:72:17:72:35 | get | reflection.kt:72:17:72:35 | this..height | +| reflection.kt:72:17:72:35 | ...::... | reflection.kt:72:17:72:35 | new KMutableProperty0(...) { ... } | reflection.kt:72:17:72:35 | set | reflection.kt:72:17:72:35 | this. | +| reflection.kt:72:17:72:35 | ...::... | reflection.kt:72:17:72:35 | new KMutableProperty0(...) { ... } | reflection.kt:72:17:72:35 | set | reflection.kt:72:17:72:35 | this..height | +| reflection.kt:90:18:90:24 | ...::... | reflection.kt:90:18:90:24 | new Function1>(...) { ... } | reflection.kt:90:18:90:24 | invoke | reflection.kt:90:18:90:24 | this. | +| reflection.kt:99:14:99:29 | ...::... | reflection.kt:99:14:99:29 | new Function1>(...) { ... } | reflection.kt:99:14:99:29 | invoke | reflection.kt:99:14:99:29 | this. | +| reflection.kt:109:17:109:27 | ...::... | reflection.kt:109:17:109:27 | new KMutableProperty0(...) { ... } | reflection.kt:109:17:109:27 | get | reflection.kt:109:17:109:27 | this. | +| reflection.kt:109:17:109:27 | ...::... | reflection.kt:109:17:109:27 | new KMutableProperty0(...) { ... } | reflection.kt:109:17:109:27 | set | reflection.kt:109:17:109:27 | this. | +| reflection.kt:144:21:144:41 | ...::... | reflection.kt:144:21:144:41 | new Function1(...) { ... } | reflection.kt:144:21:144:41 | invoke | reflection.kt:144:21:144:41 | this. | +| reflection.kt:153:21:153:44 | ...::... | reflection.kt:153:21:153:44 | new Function1(...) { ... } | reflection.kt:153:21:153:44 | invoke | reflection.kt:153:21:153:44 | this. | +modifiers +| reflection.kt:7:49:7:54 | ...::... | reflection.kt:7:49:7:54 | invoke | override | +| reflection.kt:7:49:7:54 | ...::... | reflection.kt:7:49:7:54 | invoke | public | +| reflection.kt:10:38:10:42 | ...::... | reflection.kt:10:38:10:42 | get | override | +| reflection.kt:10:38:10:42 | ...::... | reflection.kt:10:38:10:42 | get | public | +| reflection.kt:10:38:10:42 | ...::... | reflection.kt:10:38:10:42 | invoke | override | +| reflection.kt:10:38:10:42 | ...::... | reflection.kt:10:38:10:42 | invoke | public | +| reflection.kt:14:38:14:44 | ...::... | reflection.kt:14:38:14:44 | invoke | override | +| reflection.kt:14:38:14:44 | ...::... | reflection.kt:14:38:14:44 | invoke | public | +| reflection.kt:15:35:15:41 | ...::... | reflection.kt:15:35:15:41 | get | override | +| reflection.kt:15:35:15:41 | ...::... | reflection.kt:15:35:15:41 | get | public | +| reflection.kt:15:35:15:41 | ...::... | reflection.kt:15:35:15:41 | invoke | override | +| reflection.kt:15:35:15:41 | ...::... | reflection.kt:15:35:15:41 | invoke | public | +| reflection.kt:17:45:17:49 | ...::... | reflection.kt:17:45:17:49 | get | override | +| reflection.kt:17:45:17:49 | ...::... | reflection.kt:17:45:17:49 | get | public | +| reflection.kt:17:45:17:49 | ...::... | reflection.kt:17:45:17:49 | invoke | override | +| reflection.kt:17:45:17:49 | ...::... | reflection.kt:17:45:17:49 | invoke | public | +| reflection.kt:17:45:17:49 | ...::... | reflection.kt:17:45:17:49 | set | override | +| reflection.kt:17:45:17:49 | ...::... | reflection.kt:17:45:17:49 | set | public | +| reflection.kt:21:44:21:50 | ...::... | reflection.kt:21:44:21:50 | invoke | override | +| reflection.kt:21:44:21:50 | ...::... | reflection.kt:21:44:21:50 | invoke | public | +| reflection.kt:22:42:22:48 | ...::... | reflection.kt:22:42:22:48 | get | override | +| reflection.kt:22:42:22:48 | ...::... | reflection.kt:22:42:22:48 | get | public | +| reflection.kt:22:42:22:48 | ...::... | reflection.kt:22:42:22:48 | invoke | override | +| reflection.kt:22:42:22:48 | ...::... | reflection.kt:22:42:22:48 | invoke | public | +| reflection.kt:22:42:22:48 | ...::... | reflection.kt:22:42:22:48 | set | override | +| reflection.kt:22:42:22:48 | ...::... | reflection.kt:22:42:22:48 | set | public | +| reflection.kt:50:13:50:28 | ...::... | reflection.kt:50:13:50:28 | get | override | +| reflection.kt:50:13:50:28 | ...::... | reflection.kt:50:13:50:28 | get | public | +| reflection.kt:50:13:50:28 | ...::... | reflection.kt:50:13:50:28 | invoke | override | +| reflection.kt:50:13:50:28 | ...::... | reflection.kt:50:13:50:28 | invoke | public | +| reflection.kt:51:13:51:28 | ...::... | reflection.kt:51:13:51:28 | get | override | +| reflection.kt:51:13:51:28 | ...::... | reflection.kt:51:13:51:28 | get | public | +| reflection.kt:51:13:51:28 | ...::... | reflection.kt:51:13:51:28 | invoke | override | +| reflection.kt:51:13:51:28 | ...::... | reflection.kt:51:13:51:28 | invoke | public | +| reflection.kt:60:17:60:32 | ...::... | reflection.kt:60:17:60:32 | invoke | override | +| reflection.kt:60:17:60:32 | ...::... | reflection.kt:60:17:60:32 | invoke | public | +| reflection.kt:61:17:61:34 | ...::... | reflection.kt:61:17:61:34 | invoke | override | +| reflection.kt:61:17:61:34 | ...::... | reflection.kt:61:17:61:34 | invoke | public | +| reflection.kt:62:17:62:34 | ...::... | reflection.kt:62:17:62:34 | invoke | override | +| reflection.kt:62:17:62:34 | ...::... | reflection.kt:62:17:62:34 | invoke | public | +| reflection.kt:63:17:63:36 | ...::... | reflection.kt:63:17:63:36 | invoke | override | +| reflection.kt:63:17:63:36 | ...::... | reflection.kt:63:17:63:36 | invoke | public | +| reflection.kt:64:17:64:34 | ...::... | reflection.kt:64:17:64:34 | invoke | override | +| reflection.kt:64:17:64:34 | ...::... | reflection.kt:64:17:64:34 | invoke | public | +| reflection.kt:65:17:65:36 | ...::... | reflection.kt:65:17:65:36 | invoke | override | +| reflection.kt:65:17:65:36 | ...::... | reflection.kt:65:17:65:36 | invoke | public | +| reflection.kt:67:17:67:32 | ...::... | reflection.kt:67:17:67:32 | get | override | +| reflection.kt:67:17:67:32 | ...::... | reflection.kt:67:17:67:32 | get | public | +| reflection.kt:67:17:67:32 | ...::... | reflection.kt:67:17:67:32 | invoke | override | +| reflection.kt:67:17:67:32 | ...::... | reflection.kt:67:17:67:32 | invoke | public | +| reflection.kt:67:17:67:32 | ...::... | reflection.kt:67:17:67:32 | set | override | +| reflection.kt:67:17:67:32 | ...::... | reflection.kt:67:17:67:32 | set | public | +| reflection.kt:68:17:68:34 | ...::... | reflection.kt:68:17:68:34 | get | override | +| reflection.kt:68:17:68:34 | ...::... | reflection.kt:68:17:68:34 | get | public | +| reflection.kt:68:17:68:34 | ...::... | reflection.kt:68:17:68:34 | invoke | override | +| reflection.kt:68:17:68:34 | ...::... | reflection.kt:68:17:68:34 | invoke | public | +| reflection.kt:68:17:68:34 | ...::... | reflection.kt:68:17:68:34 | set | override | +| reflection.kt:68:17:68:34 | ...::... | reflection.kt:68:17:68:34 | set | public | +| reflection.kt:70:17:70:30 | ...::... | reflection.kt:70:17:70:30 | get | override | +| reflection.kt:70:17:70:30 | ...::... | reflection.kt:70:17:70:30 | get | public | +| reflection.kt:70:17:70:30 | ...::... | reflection.kt:70:17:70:30 | invoke | override | +| reflection.kt:70:17:70:30 | ...::... | reflection.kt:70:17:70:30 | invoke | public | +| reflection.kt:71:17:71:34 | ...::... | reflection.kt:71:17:71:34 | get | override | +| reflection.kt:71:17:71:34 | ...::... | reflection.kt:71:17:71:34 | get | public | +| reflection.kt:71:17:71:34 | ...::... | reflection.kt:71:17:71:34 | invoke | override | +| reflection.kt:71:17:71:34 | ...::... | reflection.kt:71:17:71:34 | invoke | public | +| reflection.kt:72:17:72:35 | ...::... | reflection.kt:72:17:72:35 | get | override | +| reflection.kt:72:17:72:35 | ...::... | reflection.kt:72:17:72:35 | get | public | +| reflection.kt:72:17:72:35 | ...::... | reflection.kt:72:17:72:35 | invoke | override | +| reflection.kt:72:17:72:35 | ...::... | reflection.kt:72:17:72:35 | invoke | public | +| reflection.kt:72:17:72:35 | ...::... | reflection.kt:72:17:72:35 | set | override | +| reflection.kt:72:17:72:35 | ...::... | reflection.kt:72:17:72:35 | set | public | +| reflection.kt:90:18:90:24 | ...::... | reflection.kt:90:18:90:24 | invoke | override | +| reflection.kt:90:18:90:24 | ...::... | reflection.kt:90:18:90:24 | invoke | public | +| reflection.kt:97:14:97:21 | ...::... | reflection.kt:97:14:97:21 | invoke | override | +| reflection.kt:97:14:97:21 | ...::... | reflection.kt:97:14:97:21 | invoke | public | +| reflection.kt:98:14:98:17 | ...::... | reflection.kt:98:14:98:17 | invoke | override | +| reflection.kt:98:14:98:17 | ...::... | reflection.kt:98:14:98:17 | invoke | public | +| reflection.kt:99:14:99:29 | ...::... | reflection.kt:99:14:99:29 | invoke | override | +| reflection.kt:99:14:99:29 | ...::... | reflection.kt:99:14:99:29 | invoke | public | +| reflection.kt:109:17:109:27 | ...::... | reflection.kt:109:17:109:27 | get | override | +| reflection.kt:109:17:109:27 | ...::... | reflection.kt:109:17:109:27 | get | public | +| reflection.kt:109:17:109:27 | ...::... | reflection.kt:109:17:109:27 | invoke | override | +| reflection.kt:109:17:109:27 | ...::... | reflection.kt:109:17:109:27 | invoke | public | +| reflection.kt:109:17:109:27 | ...::... | reflection.kt:109:17:109:27 | set | override | +| reflection.kt:109:17:109:27 | ...::... | reflection.kt:109:17:109:27 | set | public | +| reflection.kt:116:40:116:44 | ...::... | reflection.kt:116:40:116:44 | invoke | override | +| reflection.kt:116:40:116:44 | ...::... | reflection.kt:116:40:116:44 | invoke | public | +| reflection.kt:126:9:126:13 | ...::... | reflection.kt:126:9:126:13 | invoke | override | +| reflection.kt:126:9:126:13 | ...::... | reflection.kt:126:9:126:13 | invoke | public | +| reflection.kt:134:21:134:40 | ...::... | reflection.kt:134:21:134:40 | invoke | override | +| reflection.kt:134:21:134:40 | ...::... | reflection.kt:134:21:134:40 | invoke | public | +| reflection.kt:144:21:144:41 | ...::... | reflection.kt:144:21:144:41 | invoke | override | +| reflection.kt:144:21:144:41 | ...::... | reflection.kt:144:21:144:41 | invoke | public | +| reflection.kt:145:32:145:70 | ...::... | reflection.kt:145:32:145:70 | invoke | override | +| reflection.kt:145:32:145:70 | ...::... | reflection.kt:145:32:145:70 | invoke | public | +| reflection.kt:153:21:153:44 | ...::... | reflection.kt:153:21:153:44 | invoke | override | +| reflection.kt:153:21:153:44 | ...::... | reflection.kt:153:21:153:44 | invoke | public | +| reflection.kt:154:33:154:61 | ...::... | reflection.kt:154:33:154:61 | invoke | override | +| reflection.kt:154:33:154:61 | ...::... | reflection.kt:154:33:154:61 | invoke | public | +| reflection.kt:162:25:162:45 | ...::... | reflection.kt:162:25:162:45 | invoke | override | +| reflection.kt:162:25:162:45 | ...::... | reflection.kt:162:25:162:45 | invoke | public | +compGenerated +| file:///CharProgression.class:0:0:0:0 | forEach | Forwarder for a Kotlin class inheriting an interface default method | +| file:///CharProgression.class:0:0:0:0 | spliterator | Forwarder for a Kotlin class inheriting an interface default method | +| file:///CharRange.class:0:0:0:0 | forEach | Forwarder for a Kotlin class inheriting an interface default method | +| file:///CharRange.class:0:0:0:0 | spliterator | Forwarder for a Kotlin class inheriting an interface default method | +| file:///Class2.class:0:0:0:0 | getValue | Default property accessor | +| file:///Class2.class:0:0:0:0 | getValue | Default property accessor | +| file:///EnumEntries.class:0:0:0:0 | forEach | Forwarder for a Kotlin class inheriting an interface default method | +| file:///EnumEntries.class:0:0:0:0 | parallelStream | Forwarder for a Kotlin class inheriting an interface default method | +| file:///EnumEntries.class:0:0:0:0 | spliterator | Forwarder for a Kotlin class inheriting an interface default method | +| file:///EnumEntries.class:0:0:0:0 | stream | Forwarder for a Kotlin class inheriting an interface default method | +| file:///EnumEntries.class:0:0:0:0 | toArray | Forwarder for a Kotlin class inheriting an interface default method | +| file:///IntProgression.class:0:0:0:0 | forEach | Forwarder for a Kotlin class inheriting an interface default method | +| file:///IntProgression.class:0:0:0:0 | spliterator | Forwarder for a Kotlin class inheriting an interface default method | +| file:///IntRange.class:0:0:0:0 | forEach | Forwarder for a Kotlin class inheriting an interface default method | +| file:///IntRange.class:0:0:0:0 | spliterator | Forwarder for a Kotlin class inheriting an interface default method | +| file:///KTypeProjection.class:0:0:0:0 | contravariant | Proxy static method for a @JvmStatic-annotated function or property | +| file:///KTypeProjection.class:0:0:0:0 | copy$default | Forwarder for Kotlin calls that need default arguments filling in | +| file:///KTypeProjection.class:0:0:0:0 | covariant | Proxy static method for a @JvmStatic-annotated function or property | +| file:///KTypeProjection.class:0:0:0:0 | invariant | Proxy static method for a @JvmStatic-annotated function or property | +| file:///LongProgression.class:0:0:0:0 | forEach | Forwarder for a Kotlin class inheriting an interface default method | +| file:///LongProgression.class:0:0:0:0 | spliterator | Forwarder for a Kotlin class inheriting an interface default method | +| file:///LongRange.class:0:0:0:0 | forEach | Forwarder for a Kotlin class inheriting an interface default method | +| file:///LongRange.class:0:0:0:0 | spliterator | Forwarder for a Kotlin class inheriting an interface default method | +| file:///String.class:0:0:0:0 | isEmpty | Forwarder for a Kotlin class inheriting an interface default method | +| reflection.kt:7:49:7:54 | new Function2(...) { ... } | The class around a local function, a lambda, or a function reference | +| reflection.kt:10:38:10:42 | new KProperty1(...) { ... } | The class around a local function, a lambda, or a function reference | +| reflection.kt:14:38:14:44 | new Function1(...) { ... } | The class around a local function, a lambda, or a function reference | +| reflection.kt:15:35:15:41 | new KProperty0(...) { ... } | The class around a local function, a lambda, or a function reference | +| reflection.kt:17:45:17:49 | new KMutableProperty1(...) { ... } | The class around a local function, a lambda, or a function reference | +| reflection.kt:21:44:21:50 | new Function2(...) { ... } | The class around a local function, a lambda, or a function reference | +| reflection.kt:22:42:22:48 | new KMutableProperty0(...) { ... } | The class around a local function, a lambda, or a function reference | +| reflection.kt:24:46:24:64 | new Function1,Boolean>(...) { ... } | The class around a local function, a lambda, or a function reference | +| reflection.kt:33:9:33:23 | getP0 | Default property accessor | +| reflection.kt:34:9:34:23 | getP1 | Default property accessor | +| reflection.kt:34:9:34:23 | setP1 | Default property accessor | +| reflection.kt:50:13:50:28 | new KProperty1(...) { ... } | The class around a local function, a lambda, or a function reference | +| reflection.kt:51:13:51:28 | new KProperty0(...) { ... } | The class around a local function, a lambda, or a function reference | +| reflection.kt:60:17:60:32 | new Function2,Integer,String>(...) { ... } | The class around a local function, a lambda, or a function reference | +| reflection.kt:61:17:61:34 | new Function1(...) { ... } | The class around a local function, a lambda, or a function reference | +| reflection.kt:62:17:62:34 | new Function1,String>(...) { ... } | The class around a local function, a lambda, or a function reference | +| reflection.kt:63:17:63:36 | new Function0(...) { ... } | The class around a local function, a lambda, or a function reference | +| reflection.kt:64:17:64:34 | new Function1,String>(...) { ... } | The class around a local function, a lambda, or a function reference | +| reflection.kt:65:17:65:36 | new Function0(...) { ... } | The class around a local function, a lambda, or a function reference | +| reflection.kt:67:17:67:32 | new KMutableProperty1,Integer>(...) { ... } | The class around a local function, a lambda, or a function reference | +| reflection.kt:68:17:68:34 | new KMutableProperty0(...) { ... } | The class around a local function, a lambda, or a function reference | +| reflection.kt:70:17:70:30 | new KProperty0(...) { ... } | The class around a local function, a lambda, or a function reference | +| reflection.kt:71:17:71:34 | new KProperty0(...) { ... } | The class around a local function, a lambda, or a function reference | +| reflection.kt:72:17:72:35 | new KMutableProperty0(...) { ... } | The class around a local function, a lambda, or a function reference | +| reflection.kt:83:17:83:28 | getValue | Default property accessor | +| reflection.kt:90:18:90:24 | new Function1>(...) { ... } | The class around a local function, a lambda, or a function reference | +| reflection.kt:97:14:97:21 | new Function1>(...) { ... } | The class around a local function, a lambda, or a function reference | +| reflection.kt:98:14:98:17 | new Function1(...) { ... } | The class around a local function, a lambda, or a function reference | +| reflection.kt:99:14:99:29 | new Function1>(...) { ... } | The class around a local function, a lambda, or a function reference | +| reflection.kt:105:18:105:31 | getProp1 | Default property accessor | +| reflection.kt:105:18:105:31 | setProp1 | Default property accessor | +| reflection.kt:109:17:109:27 | new KMutableProperty0(...) { ... } | The class around a local function, a lambda, or a function reference | +| reflection.kt:115:9:115:27 | | The class around a local function, a lambda, or a function reference | +| reflection.kt:116:40:116:44 | new Function1(...) { ... } | The class around a local function, a lambda, or a function reference | +| reflection.kt:126:9:126:13 | | Declaring classes of adapter functions in Kotlin | +| reflection.kt:126:9:126:13 | new Function0(...) { ... } | The class around a local function, a lambda, or a function reference | +| reflection.kt:131:1:131:50 | takesOptionalParam$default | Forwarder for Kotlin calls that need default arguments filling in | +| reflection.kt:134:21:134:40 | | Declaring classes of adapter functions in Kotlin | +| reflection.kt:134:21:134:40 | new Function1(...) { ... } | The class around a local function, a lambda, or a function reference | +| reflection.kt:140:5:140:54 | takesOptionalParam$default | Forwarder for Kotlin calls that need default arguments filling in | +| reflection.kt:144:21:144:41 | | Declaring classes of adapter functions in Kotlin | +| reflection.kt:144:21:144:41 | new Function1(...) { ... } | The class around a local function, a lambda, or a function reference | +| reflection.kt:145:32:145:70 | | Declaring classes of adapter functions in Kotlin | +| reflection.kt:145:32:145:70 | new Function2(...) { ... } | The class around a local function, a lambda, or a function reference | +| reflection.kt:150:1:150:60 | extTakesOptionalParam$default | Forwarder for Kotlin calls that need default arguments filling in | +| reflection.kt:153:21:153:44 | | Declaring classes of adapter functions in Kotlin | +| reflection.kt:153:21:153:44 | new Function1(...) { ... } | The class around a local function, a lambda, or a function reference | +| reflection.kt:154:33:154:61 | | Declaring classes of adapter functions in Kotlin | +| reflection.kt:154:33:154:61 | new Function2(...) { ... } | The class around a local function, a lambda, or a function reference | +| reflection.kt:157:1:157:49 | ConstructorOptional | Forwarder for Kotlin calls that need default arguments filling in | +| reflection.kt:162:25:162:45 | | Declaring classes of adapter functions in Kotlin | +| reflection.kt:162:25:162:45 | new Function1(...) { ... } | The class around a local function, a lambda, or a function reference | +propertyReferenceOverrides +| reflection.kt:10:38:10:42 | ...::... | reflection.kt:10:38:10:42 | get | kotlin.reflect.KProperty1.get(Reflection.C) | +| reflection.kt:10:38:10:42 | ...::... | reflection.kt:10:38:10:42 | invoke | kotlin.jvm.functions.Function1.invoke(Reflection.C) | +| reflection.kt:15:35:15:41 | ...::... | reflection.kt:15:35:15:41 | get | kotlin.reflect.KProperty0.get() | +| reflection.kt:15:35:15:41 | ...::... | reflection.kt:15:35:15:41 | invoke | kotlin.jvm.functions.Function0.invoke() | +| reflection.kt:17:45:17:49 | ...::... | reflection.kt:17:45:17:49 | get | kotlin.reflect.KProperty1.get(Reflection.C) | +| reflection.kt:17:45:17:49 | ...::... | reflection.kt:17:45:17:49 | invoke | kotlin.jvm.functions.Function1.invoke(Reflection.C) | +| reflection.kt:22:42:22:48 | ...::... | reflection.kt:22:42:22:48 | get | kotlin.reflect.KProperty0.get() | +| reflection.kt:22:42:22:48 | ...::... | reflection.kt:22:42:22:48 | invoke | kotlin.jvm.functions.Function0.invoke() | +| reflection.kt:50:13:50:28 | ...::... | reflection.kt:50:13:50:28 | get | kotlin.reflect.KProperty1.get(java.lang.String) | +| reflection.kt:50:13:50:28 | ...::... | reflection.kt:50:13:50:28 | invoke | kotlin.jvm.functions.Function1.invoke(java.lang.String) | +| reflection.kt:51:13:51:28 | ...::... | reflection.kt:51:13:51:28 | get | kotlin.reflect.KProperty0.get() | +| reflection.kt:51:13:51:28 | ...::... | reflection.kt:51:13:51:28 | invoke | kotlin.jvm.functions.Function0.invoke() | +| reflection.kt:67:17:67:32 | ...::... | reflection.kt:67:17:67:32 | get | kotlin.reflect.KProperty1,Integer>.get(Class1.Generic) | +| reflection.kt:67:17:67:32 | ...::... | reflection.kt:67:17:67:32 | invoke | kotlin.jvm.functions.Function1,Integer>.invoke(Class1.Generic) | +| reflection.kt:67:17:67:32 | ...::... | reflection.kt:67:17:67:32 | set | kotlin.reflect.KMutableProperty1,Integer>.set(Class1.Generic,java.lang.Integer) | +| reflection.kt:68:17:68:34 | ...::... | reflection.kt:68:17:68:34 | get | kotlin.reflect.KProperty0.get() | +| reflection.kt:68:17:68:34 | ...::... | reflection.kt:68:17:68:34 | invoke | kotlin.jvm.functions.Function0.invoke() | +| reflection.kt:68:17:68:34 | ...::... | reflection.kt:68:17:68:34 | set | kotlin.reflect.KMutableProperty0.set(java.lang.Integer) | +| reflection.kt:70:17:70:30 | ...::... | reflection.kt:70:17:70:30 | get | kotlin.reflect.KProperty0.get() | +| reflection.kt:70:17:70:30 | ...::... | reflection.kt:70:17:70:30 | invoke | kotlin.jvm.functions.Function0.invoke() | +| reflection.kt:71:17:71:34 | ...::... | reflection.kt:71:17:71:34 | get | kotlin.reflect.KProperty0.get() | +| reflection.kt:71:17:71:34 | ...::... | reflection.kt:71:17:71:34 | invoke | kotlin.jvm.functions.Function0.invoke() | +| reflection.kt:72:17:72:35 | ...::... | reflection.kt:72:17:72:35 | get | kotlin.reflect.KProperty0.get() | +| reflection.kt:72:17:72:35 | ...::... | reflection.kt:72:17:72:35 | invoke | kotlin.jvm.functions.Function0.invoke() | +| reflection.kt:109:17:109:27 | ...::... | reflection.kt:109:17:109:27 | get | kotlin.reflect.KProperty0.get() | +| reflection.kt:109:17:109:27 | ...::... | reflection.kt:109:17:109:27 | invoke | kotlin.jvm.functions.Function0.invoke() | +notImplementedInterfaceMembers +| reflection.kt:10:38:10:42 | ...::... | kotlin.reflect.KCallable.call(java.lang.Object[]) | +| reflection.kt:10:38:10:42 | ...::... | kotlin.reflect.KCallable.callBy(java.util.Map) | +| reflection.kt:10:38:10:42 | ...::... | kotlin.reflect.KCallable.getName() | +| reflection.kt:10:38:10:42 | ...::... | kotlin.reflect.KCallable.getParameters() | +| reflection.kt:10:38:10:42 | ...::... | kotlin.reflect.KCallable.getReturnType() | +| reflection.kt:10:38:10:42 | ...::... | kotlin.reflect.KCallable.getTypeParameters() | +| reflection.kt:10:38:10:42 | ...::... | kotlin.reflect.KCallable.getVisibility() | +| reflection.kt:10:38:10:42 | ...::... | kotlin.reflect.KCallable.isAbstract() | +| reflection.kt:10:38:10:42 | ...::... | kotlin.reflect.KCallable.isFinal() | +| reflection.kt:10:38:10:42 | ...::... | kotlin.reflect.KCallable.isOpen() | +| reflection.kt:10:38:10:42 | ...::... | kotlin.reflect.KCallable.isSuspend() | +| reflection.kt:10:38:10:42 | ...::... | kotlin.reflect.KProperty1.getDelegate(Reflection.C) | +| reflection.kt:10:38:10:42 | ...::... | kotlin.reflect.KProperty1.getGetter() | +| reflection.kt:10:38:10:42 | ...::... | kotlin.reflect.KProperty.getGetter() | +| reflection.kt:10:38:10:42 | ...::... | kotlin.reflect.KProperty.isConst() | +| reflection.kt:10:38:10:42 | ...::... | kotlin.reflect.KProperty.isLateinit() | +| reflection.kt:10:38:10:42 | ...::... | kotlin.reflect.KProperty.getGetter() | +| reflection.kt:15:35:15:41 | ...::... | kotlin.reflect.KCallable.call(java.lang.Object[]) | +| reflection.kt:15:35:15:41 | ...::... | kotlin.reflect.KCallable.callBy(java.util.Map) | +| reflection.kt:15:35:15:41 | ...::... | kotlin.reflect.KCallable.getName() | +| reflection.kt:15:35:15:41 | ...::... | kotlin.reflect.KCallable.getParameters() | +| reflection.kt:15:35:15:41 | ...::... | kotlin.reflect.KCallable.getReturnType() | +| reflection.kt:15:35:15:41 | ...::... | kotlin.reflect.KCallable.getTypeParameters() | +| reflection.kt:15:35:15:41 | ...::... | kotlin.reflect.KCallable.getVisibility() | +| reflection.kt:15:35:15:41 | ...::... | kotlin.reflect.KCallable.isAbstract() | +| reflection.kt:15:35:15:41 | ...::... | kotlin.reflect.KCallable.isFinal() | +| reflection.kt:15:35:15:41 | ...::... | kotlin.reflect.KCallable.isOpen() | +| reflection.kt:15:35:15:41 | ...::... | kotlin.reflect.KCallable.isSuspend() | +| reflection.kt:15:35:15:41 | ...::... | kotlin.reflect.KProperty0.getDelegate() | +| reflection.kt:15:35:15:41 | ...::... | kotlin.reflect.KProperty0.getGetter() | +| reflection.kt:15:35:15:41 | ...::... | kotlin.reflect.KProperty.getGetter() | +| reflection.kt:15:35:15:41 | ...::... | kotlin.reflect.KProperty.isConst() | +| reflection.kt:15:35:15:41 | ...::... | kotlin.reflect.KProperty.isLateinit() | +| reflection.kt:15:35:15:41 | ...::... | kotlin.reflect.KProperty.getGetter() | +| reflection.kt:17:45:17:49 | ...::... | kotlin.reflect.KCallable.call(java.lang.Object[]) | +| reflection.kt:17:45:17:49 | ...::... | kotlin.reflect.KCallable.callBy(java.util.Map) | +| reflection.kt:17:45:17:49 | ...::... | kotlin.reflect.KCallable.getName() | +| reflection.kt:17:45:17:49 | ...::... | kotlin.reflect.KCallable.getParameters() | +| reflection.kt:17:45:17:49 | ...::... | kotlin.reflect.KCallable.getReturnType() | +| reflection.kt:17:45:17:49 | ...::... | kotlin.reflect.KCallable.getTypeParameters() | +| reflection.kt:17:45:17:49 | ...::... | kotlin.reflect.KCallable.getVisibility() | +| reflection.kt:17:45:17:49 | ...::... | kotlin.reflect.KCallable.isAbstract() | +| reflection.kt:17:45:17:49 | ...::... | kotlin.reflect.KCallable.isFinal() | +| reflection.kt:17:45:17:49 | ...::... | kotlin.reflect.KCallable.isOpen() | +| reflection.kt:17:45:17:49 | ...::... | kotlin.reflect.KCallable.isSuspend() | +| reflection.kt:17:45:17:49 | ...::... | kotlin.reflect.KMutableProperty1.getSetter() | +| reflection.kt:17:45:17:49 | ...::... | kotlin.reflect.KMutableProperty1.set(Reflection.C,java.lang.Integer) | +| reflection.kt:17:45:17:49 | ...::... | kotlin.reflect.KMutableProperty.getSetter() | +| reflection.kt:17:45:17:49 | ...::... | kotlin.reflect.KProperty1.getDelegate(Reflection.C) | +| reflection.kt:17:45:17:49 | ...::... | kotlin.reflect.KProperty1.getGetter() | +| reflection.kt:17:45:17:49 | ...::... | kotlin.reflect.KProperty.getGetter() | +| reflection.kt:17:45:17:49 | ...::... | kotlin.reflect.KProperty.isConst() | +| reflection.kt:17:45:17:49 | ...::... | kotlin.reflect.KProperty.isLateinit() | +| reflection.kt:17:45:17:49 | ...::... | kotlin.reflect.KProperty.getGetter() | +| reflection.kt:22:42:22:48 | ...::... | kotlin.reflect.KCallable.call(java.lang.Object[]) | +| reflection.kt:22:42:22:48 | ...::... | kotlin.reflect.KCallable.callBy(java.util.Map) | +| reflection.kt:22:42:22:48 | ...::... | kotlin.reflect.KCallable.getName() | +| reflection.kt:22:42:22:48 | ...::... | kotlin.reflect.KCallable.getParameters() | +| reflection.kt:22:42:22:48 | ...::... | kotlin.reflect.KCallable.getReturnType() | +| reflection.kt:22:42:22:48 | ...::... | kotlin.reflect.KCallable.getTypeParameters() | +| reflection.kt:22:42:22:48 | ...::... | kotlin.reflect.KCallable.getVisibility() | +| reflection.kt:22:42:22:48 | ...::... | kotlin.reflect.KCallable.isAbstract() | +| reflection.kt:22:42:22:48 | ...::... | kotlin.reflect.KCallable.isFinal() | +| reflection.kt:22:42:22:48 | ...::... | kotlin.reflect.KCallable.isOpen() | +| reflection.kt:22:42:22:48 | ...::... | kotlin.reflect.KCallable.isSuspend() | +| reflection.kt:22:42:22:48 | ...::... | kotlin.reflect.KMutableProperty0.getSetter() | +| reflection.kt:22:42:22:48 | ...::... | kotlin.reflect.KMutableProperty0.set(java.lang.Integer) | +| reflection.kt:22:42:22:48 | ...::... | kotlin.reflect.KMutableProperty.getSetter() | +| reflection.kt:22:42:22:48 | ...::... | kotlin.reflect.KProperty0.getDelegate() | +| reflection.kt:22:42:22:48 | ...::... | kotlin.reflect.KProperty0.getGetter() | +| reflection.kt:22:42:22:48 | ...::... | kotlin.reflect.KProperty.getGetter() | +| reflection.kt:22:42:22:48 | ...::... | kotlin.reflect.KProperty.isConst() | +| reflection.kt:22:42:22:48 | ...::... | kotlin.reflect.KProperty.isLateinit() | +| reflection.kt:22:42:22:48 | ...::... | kotlin.reflect.KProperty.getGetter() | +| reflection.kt:50:13:50:28 | ...::... | kotlin.reflect.KCallable.call(java.lang.Object[]) | +| reflection.kt:50:13:50:28 | ...::... | kotlin.reflect.KCallable.callBy(java.util.Map) | +| reflection.kt:50:13:50:28 | ...::... | kotlin.reflect.KCallable.getName() | +| reflection.kt:50:13:50:28 | ...::... | kotlin.reflect.KCallable.getParameters() | +| reflection.kt:50:13:50:28 | ...::... | kotlin.reflect.KCallable.getReturnType() | +| reflection.kt:50:13:50:28 | ...::... | kotlin.reflect.KCallable.getTypeParameters() | +| reflection.kt:50:13:50:28 | ...::... | kotlin.reflect.KCallable.getVisibility() | +| reflection.kt:50:13:50:28 | ...::... | kotlin.reflect.KCallable.isAbstract() | +| reflection.kt:50:13:50:28 | ...::... | kotlin.reflect.KCallable.isFinal() | +| reflection.kt:50:13:50:28 | ...::... | kotlin.reflect.KCallable.isOpen() | +| reflection.kt:50:13:50:28 | ...::... | kotlin.reflect.KCallable.isSuspend() | +| reflection.kt:50:13:50:28 | ...::... | kotlin.reflect.KProperty1.getDelegate(java.lang.String) | +| reflection.kt:50:13:50:28 | ...::... | kotlin.reflect.KProperty1.getGetter() | +| reflection.kt:50:13:50:28 | ...::... | kotlin.reflect.KProperty.getGetter() | +| reflection.kt:50:13:50:28 | ...::... | kotlin.reflect.KProperty.isConst() | +| reflection.kt:50:13:50:28 | ...::... | kotlin.reflect.KProperty.isLateinit() | +| reflection.kt:50:13:50:28 | ...::... | kotlin.reflect.KProperty.getGetter() | +| reflection.kt:51:13:51:28 | ...::... | kotlin.reflect.KCallable.call(java.lang.Object[]) | +| reflection.kt:51:13:51:28 | ...::... | kotlin.reflect.KCallable.callBy(java.util.Map) | +| reflection.kt:51:13:51:28 | ...::... | kotlin.reflect.KCallable.getName() | +| reflection.kt:51:13:51:28 | ...::... | kotlin.reflect.KCallable.getParameters() | +| reflection.kt:51:13:51:28 | ...::... | kotlin.reflect.KCallable.getReturnType() | +| reflection.kt:51:13:51:28 | ...::... | kotlin.reflect.KCallable.getTypeParameters() | +| reflection.kt:51:13:51:28 | ...::... | kotlin.reflect.KCallable.getVisibility() | +| reflection.kt:51:13:51:28 | ...::... | kotlin.reflect.KCallable.isAbstract() | +| reflection.kt:51:13:51:28 | ...::... | kotlin.reflect.KCallable.isFinal() | +| reflection.kt:51:13:51:28 | ...::... | kotlin.reflect.KCallable.isOpen() | +| reflection.kt:51:13:51:28 | ...::... | kotlin.reflect.KCallable.isSuspend() | +| reflection.kt:51:13:51:28 | ...::... | kotlin.reflect.KProperty0.getDelegate() | +| reflection.kt:51:13:51:28 | ...::... | kotlin.reflect.KProperty0.getGetter() | +| reflection.kt:51:13:51:28 | ...::... | kotlin.reflect.KProperty.getGetter() | +| reflection.kt:51:13:51:28 | ...::... | kotlin.reflect.KProperty.isConst() | +| reflection.kt:51:13:51:28 | ...::... | kotlin.reflect.KProperty.isLateinit() | +| reflection.kt:51:13:51:28 | ...::... | kotlin.reflect.KProperty.getGetter() | +| reflection.kt:67:17:67:32 | ...::... | kotlin.reflect.KCallable.call(java.lang.Object[]) | +| reflection.kt:67:17:67:32 | ...::... | kotlin.reflect.KCallable.callBy(java.util.Map) | +| reflection.kt:67:17:67:32 | ...::... | kotlin.reflect.KCallable.getName() | +| reflection.kt:67:17:67:32 | ...::... | kotlin.reflect.KCallable.getParameters() | +| reflection.kt:67:17:67:32 | ...::... | kotlin.reflect.KCallable.getReturnType() | +| reflection.kt:67:17:67:32 | ...::... | kotlin.reflect.KCallable.getTypeParameters() | +| reflection.kt:67:17:67:32 | ...::... | kotlin.reflect.KCallable.getVisibility() | +| reflection.kt:67:17:67:32 | ...::... | kotlin.reflect.KCallable.isAbstract() | +| reflection.kt:67:17:67:32 | ...::... | kotlin.reflect.KCallable.isFinal() | +| reflection.kt:67:17:67:32 | ...::... | kotlin.reflect.KCallable.isOpen() | +| reflection.kt:67:17:67:32 | ...::... | kotlin.reflect.KCallable.isSuspend() | +| reflection.kt:67:17:67:32 | ...::... | kotlin.reflect.KMutableProperty1,Integer>.getSetter() | +| reflection.kt:67:17:67:32 | ...::... | kotlin.reflect.KMutableProperty.getSetter() | +| reflection.kt:67:17:67:32 | ...::... | kotlin.reflect.KProperty1,Integer>.getDelegate(Class1.Generic) | +| reflection.kt:67:17:67:32 | ...::... | kotlin.reflect.KProperty1,Integer>.getGetter() | +| reflection.kt:67:17:67:32 | ...::... | kotlin.reflect.KProperty.getGetter() | +| reflection.kt:67:17:67:32 | ...::... | kotlin.reflect.KProperty.isConst() | +| reflection.kt:67:17:67:32 | ...::... | kotlin.reflect.KProperty.isLateinit() | +| reflection.kt:67:17:67:32 | ...::... | kotlin.reflect.KProperty.getGetter() | +| reflection.kt:68:17:68:34 | ...::... | kotlin.reflect.KCallable.call(java.lang.Object[]) | +| reflection.kt:68:17:68:34 | ...::... | kotlin.reflect.KCallable.callBy(java.util.Map) | +| reflection.kt:68:17:68:34 | ...::... | kotlin.reflect.KCallable.getName() | +| reflection.kt:68:17:68:34 | ...::... | kotlin.reflect.KCallable.getParameters() | +| reflection.kt:68:17:68:34 | ...::... | kotlin.reflect.KCallable.getReturnType() | +| reflection.kt:68:17:68:34 | ...::... | kotlin.reflect.KCallable.getTypeParameters() | +| reflection.kt:68:17:68:34 | ...::... | kotlin.reflect.KCallable.getVisibility() | +| reflection.kt:68:17:68:34 | ...::... | kotlin.reflect.KCallable.isAbstract() | +| reflection.kt:68:17:68:34 | ...::... | kotlin.reflect.KCallable.isFinal() | +| reflection.kt:68:17:68:34 | ...::... | kotlin.reflect.KCallable.isOpen() | +| reflection.kt:68:17:68:34 | ...::... | kotlin.reflect.KCallable.isSuspend() | +| reflection.kt:68:17:68:34 | ...::... | kotlin.reflect.KMutableProperty0.getSetter() | +| reflection.kt:68:17:68:34 | ...::... | kotlin.reflect.KMutableProperty.getSetter() | +| reflection.kt:68:17:68:34 | ...::... | kotlin.reflect.KProperty0.getDelegate() | +| reflection.kt:68:17:68:34 | ...::... | kotlin.reflect.KProperty0.getGetter() | +| reflection.kt:68:17:68:34 | ...::... | kotlin.reflect.KProperty.getGetter() | +| reflection.kt:68:17:68:34 | ...::... | kotlin.reflect.KProperty.isConst() | +| reflection.kt:68:17:68:34 | ...::... | kotlin.reflect.KProperty.isLateinit() | +| reflection.kt:68:17:68:34 | ...::... | kotlin.reflect.KProperty.getGetter() | +| reflection.kt:70:17:70:30 | ...::... | kotlin.reflect.KCallable.call(java.lang.Object[]) | +| reflection.kt:70:17:70:30 | ...::... | kotlin.reflect.KCallable.callBy(java.util.Map) | +| reflection.kt:70:17:70:30 | ...::... | kotlin.reflect.KCallable.getName() | +| reflection.kt:70:17:70:30 | ...::... | kotlin.reflect.KCallable.getParameters() | +| reflection.kt:70:17:70:30 | ...::... | kotlin.reflect.KCallable.getReturnType() | +| reflection.kt:70:17:70:30 | ...::... | kotlin.reflect.KCallable.getTypeParameters() | +| reflection.kt:70:17:70:30 | ...::... | kotlin.reflect.KCallable.getVisibility() | +| reflection.kt:70:17:70:30 | ...::... | kotlin.reflect.KCallable.isAbstract() | +| reflection.kt:70:17:70:30 | ...::... | kotlin.reflect.KCallable.isFinal() | +| reflection.kt:70:17:70:30 | ...::... | kotlin.reflect.KCallable.isOpen() | +| reflection.kt:70:17:70:30 | ...::... | kotlin.reflect.KCallable.isSuspend() | +| reflection.kt:70:17:70:30 | ...::... | kotlin.reflect.KProperty0.getDelegate() | +| reflection.kt:70:17:70:30 | ...::... | kotlin.reflect.KProperty0.getGetter() | +| reflection.kt:70:17:70:30 | ...::... | kotlin.reflect.KProperty.getGetter() | +| reflection.kt:70:17:70:30 | ...::... | kotlin.reflect.KProperty.isConst() | +| reflection.kt:70:17:70:30 | ...::... | kotlin.reflect.KProperty.isLateinit() | +| reflection.kt:70:17:70:30 | ...::... | kotlin.reflect.KProperty.getGetter() | +| reflection.kt:71:17:71:34 | ...::... | kotlin.reflect.KCallable.call(java.lang.Object[]) | +| reflection.kt:71:17:71:34 | ...::... | kotlin.reflect.KCallable.callBy(java.util.Map) | +| reflection.kt:71:17:71:34 | ...::... | kotlin.reflect.KCallable.getName() | +| reflection.kt:71:17:71:34 | ...::... | kotlin.reflect.KCallable.getParameters() | +| reflection.kt:71:17:71:34 | ...::... | kotlin.reflect.KCallable.getReturnType() | +| reflection.kt:71:17:71:34 | ...::... | kotlin.reflect.KCallable.getTypeParameters() | +| reflection.kt:71:17:71:34 | ...::... | kotlin.reflect.KCallable.getVisibility() | +| reflection.kt:71:17:71:34 | ...::... | kotlin.reflect.KCallable.isAbstract() | +| reflection.kt:71:17:71:34 | ...::... | kotlin.reflect.KCallable.isFinal() | +| reflection.kt:71:17:71:34 | ...::... | kotlin.reflect.KCallable.isOpen() | +| reflection.kt:71:17:71:34 | ...::... | kotlin.reflect.KCallable.isSuspend() | +| reflection.kt:71:17:71:34 | ...::... | kotlin.reflect.KProperty0.getDelegate() | +| reflection.kt:71:17:71:34 | ...::... | kotlin.reflect.KProperty0.getGetter() | +| reflection.kt:71:17:71:34 | ...::... | kotlin.reflect.KProperty.getGetter() | +| reflection.kt:71:17:71:34 | ...::... | kotlin.reflect.KProperty.isConst() | +| reflection.kt:71:17:71:34 | ...::... | kotlin.reflect.KProperty.isLateinit() | +| reflection.kt:71:17:71:34 | ...::... | kotlin.reflect.KProperty.getGetter() | +| reflection.kt:72:17:72:35 | ...::... | kotlin.reflect.KCallable.call(java.lang.Object[]) | +| reflection.kt:72:17:72:35 | ...::... | kotlin.reflect.KCallable.callBy(java.util.Map) | +| reflection.kt:72:17:72:35 | ...::... | kotlin.reflect.KCallable.getName() | +| reflection.kt:72:17:72:35 | ...::... | kotlin.reflect.KCallable.getParameters() | +| reflection.kt:72:17:72:35 | ...::... | kotlin.reflect.KCallable.getReturnType() | +| reflection.kt:72:17:72:35 | ...::... | kotlin.reflect.KCallable.getTypeParameters() | +| reflection.kt:72:17:72:35 | ...::... | kotlin.reflect.KCallable.getVisibility() | +| reflection.kt:72:17:72:35 | ...::... | kotlin.reflect.KCallable.isAbstract() | +| reflection.kt:72:17:72:35 | ...::... | kotlin.reflect.KCallable.isFinal() | +| reflection.kt:72:17:72:35 | ...::... | kotlin.reflect.KCallable.isOpen() | +| reflection.kt:72:17:72:35 | ...::... | kotlin.reflect.KCallable.isSuspend() | +| reflection.kt:72:17:72:35 | ...::... | kotlin.reflect.KMutableProperty0.getSetter() | +| reflection.kt:72:17:72:35 | ...::... | kotlin.reflect.KMutableProperty0.set(java.lang.Integer) | +| reflection.kt:72:17:72:35 | ...::... | kotlin.reflect.KMutableProperty.getSetter() | +| reflection.kt:72:17:72:35 | ...::... | kotlin.reflect.KProperty0.getDelegate() | +| reflection.kt:72:17:72:35 | ...::... | kotlin.reflect.KProperty0.getGetter() | +| reflection.kt:72:17:72:35 | ...::... | kotlin.reflect.KProperty.getGetter() | +| reflection.kt:72:17:72:35 | ...::... | kotlin.reflect.KProperty.isConst() | +| reflection.kt:72:17:72:35 | ...::... | kotlin.reflect.KProperty.isLateinit() | +| reflection.kt:72:17:72:35 | ...::... | kotlin.reflect.KProperty.getGetter() | +| reflection.kt:109:17:109:27 | ...::... | kotlin.reflect.KCallable.call(java.lang.Object[]) | +| reflection.kt:109:17:109:27 | ...::... | kotlin.reflect.KCallable.callBy(java.util.Map) | +| reflection.kt:109:17:109:27 | ...::... | kotlin.reflect.KCallable.getName() | +| reflection.kt:109:17:109:27 | ...::... | kotlin.reflect.KCallable.getParameters() | +| reflection.kt:109:17:109:27 | ...::... | kotlin.reflect.KCallable.getReturnType() | +| reflection.kt:109:17:109:27 | ...::... | kotlin.reflect.KCallable.getTypeParameters() | +| reflection.kt:109:17:109:27 | ...::... | kotlin.reflect.KCallable.getVisibility() | +| reflection.kt:109:17:109:27 | ...::... | kotlin.reflect.KCallable.isAbstract() | +| reflection.kt:109:17:109:27 | ...::... | kotlin.reflect.KCallable.isFinal() | +| reflection.kt:109:17:109:27 | ...::... | kotlin.reflect.KCallable.isOpen() | +| reflection.kt:109:17:109:27 | ...::... | kotlin.reflect.KCallable.isSuspend() | +| reflection.kt:109:17:109:27 | ...::... | kotlin.reflect.KMutableProperty0.getSetter() | +| reflection.kt:109:17:109:27 | ...::... | kotlin.reflect.KMutableProperty0.set(java.lang.Integer) | +| reflection.kt:109:17:109:27 | ...::... | kotlin.reflect.KMutableProperty.getSetter() | +| reflection.kt:109:17:109:27 | ...::... | kotlin.reflect.KProperty0.getDelegate() | +| reflection.kt:109:17:109:27 | ...::... | kotlin.reflect.KProperty0.getGetter() | +| reflection.kt:109:17:109:27 | ...::... | kotlin.reflect.KProperty.getGetter() | +| reflection.kt:109:17:109:27 | ...::... | kotlin.reflect.KProperty.isConst() | +| reflection.kt:109:17:109:27 | ...::... | kotlin.reflect.KProperty.isLateinit() | +| reflection.kt:109:17:109:27 | ...::... | kotlin.reflect.KProperty.getGetter() | diff --git a/java/ql/test-kotlin2/library-tests/reflection/reflection.kt b/java/ql/test-kotlin2/library-tests/reflection/reflection.kt new file mode 100644 index 00000000000..9d9c74835d9 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/reflection/reflection.kt @@ -0,0 +1,163 @@ +import java.awt.Rectangle + +import kotlin.reflect.* + +class Reflection { + fun fn() { + val ref: KFunction2 = Ccc::m + println(ref.name) + + val x0: KProperty1 = C::p0 + val x1: Int = x0.get(C()) + val x2: String = x0.name + val x3: KProperty1.Getter = x0.getter + val x4: KFunction1 = x0::get + val x5: KProperty0 = C()::p0 + + val y0: KMutableProperty1 = C::p1 + val y1: Unit = y0.set(C(), 5) + val y2: String = y0.name + val y3: KMutableProperty1.Setter = y0.setter + val y4: KFunction2 = y0::set + val y5: KMutableProperty0 = C()::p1 + + val prop = (C::class).members.single { it.name == "p3" } as KProperty2 + val z0 = prop.get(C(), 5) + } + + class Ccc { + fun m(i:Int):Double = 5.0 + } + + class C { + val p0: Int = 1 + var p1: Int = 2 + var p2: Int + get() = 1 + set(value) = Unit + + var Int.p3: Int // this can't be referenced through a property reference + get() = 1 + set(value) = Unit + } +} + + +val String.lastChar: Char + get() = this[length - 1] + +fun fn2() { + println(String::lastChar.get("abc")) + println("abcd"::lastChar.get()) +} + +fun Class1.Generic.ext1() = this.toString() + +fun Class1.Generic.ext2() = this.toString() + +class Class1 { + fun fn() { + println(Generic::m1) + println(Generic()::m1) + println(Generic::ext1) + println(Generic()::ext1) + println(Generic::ext2) + println(Generic()::ext2) + + println(Generic::p2) + println(Generic()::p2) + + println(Int::MAX_VALUE) // Companion object and property getter + println(Integer::MAX_VALUE) // Static field access, no getter + println(Rectangle()::height) // Field access, no getter, with dispatch receiver + } + + class Generic { + fun m1(i:T1) = this.toString() + var p2: T1? + get() = null + set(value) = Unit + } +} + +class Class2(val value: T) { + + inner class Inner { + constructor(t: T1) { } + } + + fun test() { + fn11("", ::Inner) + } +} + +fun fn(value: T) { } + +fun test() { + fn11("", ::Class2) + fn11("", ::fn) + fn12("", Class2(5)::Inner) +} + +fun fn11(l: T, transform: (T) -> R) { } +fun fn12(l: T1, l2: (T1) -> R) { } + +open class Base1(var prop1: Int) {} + +class Derived1(prop1: Int) : Base1(prop1) { + fun fn() { + println(this::prop1) + } +} + +class LocalFn { + fun fn() { + fun fn1(i: Int) { } + val x: KFunction1 = ::fn1 + } +} + + +fun fn1() = 5 + +fun fn2(f: () -> Unit) = f() + +fun adapted() { + fn2(::fn1) +} + +fun expectsOneParam(f: (Int) -> Int) = f(0) + +fun takesOptionalParam(x: Int, y: Int = 0) = x + y + +fun adaptedParams() { + expectsOneParam(::takesOptionalParam) +} + +fun expectsOneParamAndReceiver(f: (MemberOptionalsTest, Int) -> Int) { } + +class MemberOptionalsTest { + fun takesOptionalParam(x: Int, y: Int = 0) = x + y +} + +fun memberAdaptedParams(m: MemberOptionalsTest) { + expectsOneParam(m::takesOptionalParam) + expectsOneParamAndReceiver(MemberOptionalsTest::takesOptionalParam) +} + +fun expectsOneParamAndExtension(f: (String, Int) -> Int) { } + +fun String.extTakesOptionalParam(x: Int, y: Int = 0) = x + y + +fun extensionAdaptedParams(s: String) { + expectsOneParam(s::extTakesOptionalParam) + expectsOneParamAndExtension(String::extTakesOptionalParam) +} + +class ConstructorOptional(x: Int, y: Int = 0) { } + +fun expectsOneParamCons(f: (Int) -> ConstructorOptional) = f(0) + +fun constructorAdaptedParams() { + expectsOneParamCons(::ConstructorOptional) +} diff --git a/java/ql/test-kotlin2/library-tests/reflection/reflection.ql b/java/ql/test-kotlin2/library-tests/reflection/reflection.ql new file mode 100644 index 00000000000..f181cea705f --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/reflection/reflection.ql @@ -0,0 +1,110 @@ +import java + +// Stop external filepaths from appearing in the results +class ClassOrInterfaceLocation extends ClassOrInterface { + override predicate hasLocationInfo(string path, int sl, int sc, int el, int ec) { + exists(string fullPath | super.hasLocationInfo(fullPath, sl, sc, el, ec) | + if exists(this.getFile().getRelativePath()) + then path = fullPath + else path = fullPath.regexpReplaceAll(".*/", "/") + ) + } +} + +class CallableLocation extends Callable { + override predicate hasLocationInfo(string path, int sl, int sc, int el, int ec) { + exists(string fullPath | super.hasLocationInfo(fullPath, sl, sc, el, ec) | + if exists(this.getFile().getRelativePath()) + then path = fullPath + else path = fullPath.regexpReplaceAll(".*/", "/") + ) + } +} + +query predicate variableInitializerType( + LocalVariableDecl decl, RefType t1, RefType t2, RefType t3, boolean compatible +) { + decl.getType() = t1 and + t1.getPackage().getName() = "kotlin.reflect" and + decl.getInitializer().getType() = t2 and + t2.extendsOrImplements(t3) and + ( + compatible = true and haveIntersection(t1, t2) + or + compatible = false and notHaveIntersection(t1, t2) + ) +} + +query predicate invocation(Call c, Callable callee) { + c.getCallee() = callee and callee.getDeclaringType().getPackage().getName() = "kotlin.reflect" +} + +query predicate functionReferences(MemberRefExpr e, Method m, Callable c) { + e.asMethod() = m and + e.getReferencedCallable() = c +} + +query predicate propertyGetReferences(PropertyRefExpr e, Method m, Callable c) { + e.asGetMethod() = m and + e.getGetterCallable() = c +} + +query predicate propertyFieldReferences(PropertyRefExpr e, Method m, Field f) { + e.asGetMethod() = m and + e.getField() = f +} + +query predicate propertySetReferences(PropertyRefExpr e, Method m, Callable c) { + e.asSetMethod() = m and + e.getSetterCallable() = c +} + +query predicate callsInsideInvocationMethods( + ClassInstanceExpr e, AnonymousClass c, Method m, Call call, string callee +) { + (e instanceof MemberRefExpr or e instanceof PropertyRefExpr) and + e.getAnonymousClass() = c and + c.getAMethod() = m and + m.getName() = ["invoke", "get", "set"] and + call.getEnclosingCallable() = m and + callee = call.getCallee().getQualifiedName() +} + +query predicate fieldAccessInsideInvocationMethods( + ClassInstanceExpr e, AnonymousClass c, Method m, FieldAccess access +) { + (e instanceof MemberRefExpr or e instanceof PropertyRefExpr) and + e.getAnonymousClass() = c and + c.getAMethod() = m and + m.getName() = ["invoke", "get", "set"] and + access.getEnclosingCallable() = m +} + +query predicate modifiers(ClassInstanceExpr e, Method m, string modifier) { + (e instanceof MemberRefExpr or e instanceof PropertyRefExpr) and + e.getAnonymousClass().getAMethod() = m and + m.hasModifier(modifier) +} + +query predicate compGenerated(Element e, string reason) { reason = e.compilerGeneratedReason() } + +query predicate propertyReferenceOverrides(PropertyRefExpr e, Method m, string overridden) { + e.getAnonymousClass().getAMember() = m and + exists(Method n | + m.overrides(n) and + overridden = n.getDeclaringType().getQualifiedName() + "." + n.getSignature() + ) +} + +query predicate notImplementedInterfaceMembers(PropertyRefExpr e, string interfaceMember) { + exists(Interface i, Method interfaceMethod | + e.getAnonymousClass().extendsOrImplements+(i) and + i.getAMethod() = interfaceMethod and + interfaceMember = i.getQualifiedName() + "." + interfaceMethod.getSignature() and + not exists(Class c, Method classMethod | + e.getAnonymousClass().extendsOrImplements*(c) and + c.getAMethod() = classMethod and + classMethod.overrides(interfaceMethod) + ) + ) +} diff --git a/java/ql/test-kotlin2/library-tests/special-method-getters/test.expected b/java/ql/test-kotlin2/library-tests/special-method-getters/test.expected new file mode 100644 index 00000000000..7bdebe05c72 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/special-method-getters/test.expected @@ -0,0 +1,11 @@ +#select +| test.kt:1:81:1:89 | length(...) | java.lang.CharSequence | length | +| test.kt:1:93:1:100 | size(...) | java.util.Collection | size | +| test.kt:1:104:1:111 | size(...) | java.util.Map | size | +| test.kt:1:115:1:122 | keySet(...) | java.util.Map | keySet | +| test.kt:1:115:1:127 | size(...) | java.util.Set | size | +| test.kt:1:131:1:140 | values(...) | java.util.Map | values | +| test.kt:1:131:1:145 | size(...) | java.util.Collection | size | +| test.kt:1:149:1:159 | entrySet(...) | java.util.Map | entrySet | +| test.kt:1:149:1:164 | size(...) | java.util.Set> | size | +diag diff --git a/java/ql/test-kotlin2/library-tests/special-method-getters/test.kt b/java/ql/test-kotlin2/library-tests/special-method-getters/test.kt new file mode 100644 index 00000000000..d83aee0f131 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/special-method-getters/test.kt @@ -0,0 +1 @@ +fun test(cs: CharSequence, col: Collection, map: Map) = cs.length + col.size + map.size + map.keys.size + map.values.size + map.entries.size diff --git a/java/ql/test-kotlin2/library-tests/special-method-getters/test.ql b/java/ql/test-kotlin2/library-tests/special-method-getters/test.ql new file mode 100644 index 00000000000..0e8e1996ba9 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/special-method-getters/test.ql @@ -0,0 +1,7 @@ +import java +import semmle.code.java.Diagnostics + +from MethodCall ma +select ma, ma.getCallee().getDeclaringType().getQualifiedName(), ma.getCallee().getName() + +query predicate diag(Diagnostic d) { any() } diff --git a/java/ql/test-kotlin2/library-tests/static-method-calls/test.expected b/java/ql/test-kotlin2/library-tests/static-method-calls/test.expected new file mode 100644 index 00000000000..d1a9ecc4de0 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/static-method-calls/test.expected @@ -0,0 +1,2 @@ +| test.kt:4:17:4:30 | Class<> | TypeAccess | forName | +| test.kt:7:11:7:44 | StringsKt | TypeAccess | format | diff --git a/java/ql/test-kotlin2/library-tests/static-method-calls/test.kt b/java/ql/test-kotlin2/library-tests/static-method-calls/test.kt new file mode 100644 index 00000000000..0ada565eb99 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/static-method-calls/test.kt @@ -0,0 +1,9 @@ +fun test() { + + // Static method of a class with type parameters: + val c = Class.forName("xyz") + + // Static method of a class without one: + val s = String.format("Hello %s", "world") + +} diff --git a/java/ql/test-kotlin2/library-tests/static-method-calls/test.ql b/java/ql/test-kotlin2/library-tests/static-method-calls/test.ql new file mode 100644 index 00000000000..b1c8e0390d9 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/static-method-calls/test.ql @@ -0,0 +1,4 @@ +import java + +from MethodCall ma +select ma.getQualifier(), ma.getQualifier().getAPrimaryQlClass(), ma.getCallee().toString() diff --git a/java/ql/test-kotlin2/library-tests/stmts/PrintAst.expected b/java/ql/test-kotlin2/library-tests/stmts/PrintAst.expected new file mode 100644 index 00000000000..b8b27a5af0b --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/stmts/PrintAst.expected @@ -0,0 +1,198 @@ +stmts.kt: +# 0| [CompilationUnit] stmts +# 0| 1: [Class] StmtsKt +# 2| 1: [Method] topLevelMethod +# 2| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 2| 0: [Parameter] x +# 2| 0: [TypeAccess] int +# 2| 1: [Parameter] y +# 2| 0: [TypeAccess] int +# 2| 5: [BlockStmt] { ... } +# 3| 0: [ExprStmt] ; +# 3| 0: [WhenExpr] when ... +# 3| 0: [WhenBranch] ... -> ... +# 3| 0: [GTExpr] ... > ... +# 3| 0: [VarAccess] x +# 3| 1: [VarAccess] y +# 3| 1: [BlockStmt] { ... } +# 4| 1: [WhenBranch] ... -> ... +# 4| 0: [LTExpr] ... < ... +# 4| 0: [VarAccess] x +# 4| 1: [VarAccess] y +# 4| 1: [BlockStmt] { ... } +# 5| 2: [WhenBranch] ... -> ... +# 5| 0: [BooleanLiteral] true +# 5| 1: [BlockStmt] { ... } +# 7| 1: [WhileStmt] while (...) +# 7| 0: [GTExpr] ... > ... +# 7| 0: [VarAccess] x +# 7| 1: [VarAccess] y +# 8| 1: [ReturnStmt] return ... +# 8| 0: [VarAccess] x +# 9| 2: [WhileStmt] while (...) +# 9| 0: [LTExpr] ... < ... +# 9| 0: [VarAccess] x +# 9| 1: [VarAccess] y +# 9| 1: [BlockStmt] { ... } +# 10| 0: [ReturnStmt] return ... +# 10| 0: [VarAccess] y +# 12| 3: [BlockStmt] { ... } +# 12| 0: [DoStmt] do ... while (...) +# 14| 0: [LTExpr] ... < ... +# 14| 0: [VarAccess] x +# 14| 1: [VarAccess] y +# 12| 1: [BlockStmt] { ... } +# 13| 0: [ReturnStmt] return ... +# 13| 0: [VarAccess] y +# 15| 4: [LocalVariableDeclStmt] var ...; +# 15| 1: [LocalVariableDeclExpr] z +# 15| 0: [IntegerLiteral] 3 +# 17| 5: [LocalVariableDeclStmt] var ...; +# 17| 1: [LocalVariableDeclExpr] q2 +# 17| 0: [WhenExpr] when ... +# 17| 0: [WhenBranch] ... -> ... +# 17| 0: [BooleanLiteral] true +# 17| 1: [BlockStmt] { ... } +# 17| 0: [ExprStmt] ; +# 17| 0: [AssignExpr] ...=... +# 17| 0: [VarAccess] z +# 17| 1: [IntegerLiteral] 4 +# 17| 1: [WhenBranch] ... -> ... +# 17| 0: [BooleanLiteral] true +# 17| 1: [BlockStmt] { ... } +# 17| 0: [ExprStmt] ; +# 17| 0: [AssignExpr] ...=... +# 17| 0: [VarAccess] z +# 17| 1: [IntegerLiteral] 5 +# 18| 6: [LocalVariableDeclStmt] var ...; +# 18| 1: [LocalVariableDeclExpr] q3 +# 18| 0: [WhenExpr] when ... +# 18| 0: [WhenBranch] ... -> ... +# 18| 0: [BooleanLiteral] true +# 18| 1: [ExprStmt] ; +# 18| 0: [AssignExpr] ...=... +# 18| 0: [VarAccess] z +# 18| 1: [IntegerLiteral] 4 +# 18| 1: [WhenBranch] ... -> ... +# 18| 0: [BooleanLiteral] true +# 18| 1: [ExprStmt] ; +# 18| 0: [AssignExpr] ...=... +# 18| 0: [VarAccess] z +# 18| 1: [IntegerLiteral] 5 +# 19| 7: [ReturnStmt] return ... +# 19| 0: [AddExpr] ... + ... +# 19| 0: [VarAccess] x +# 19| 1: [VarAccess] y +# 22| 2: [Method] loops +# 22| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 22| 0: [Parameter] x +# 22| 0: [TypeAccess] int +# 22| 1: [Parameter] y +# 22| 0: [TypeAccess] int +# 22| 5: [BlockStmt] { ... } +# 23| 0: [LabeledStmt]