diff --git a/CODEOWNERS b/CODEOWNERS index b2eb53f0bb0..738605d6032 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -8,6 +8,8 @@ /swift/ @github/codeql-swift /misc/codegen/ @github/codeql-swift /java/kotlin-extractor/ @github/codeql-kotlin +/java/ql/test-kotlin1/ @github/codeql-kotlin +/java/ql/test-kotlin2/ @github/codeql-kotlin # ML-powered queries /javascript/ql/experimental/adaptivethreatmodeling/ @github/codeql-ml-powered-queries-reviewers 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/cpp/ql/lib/CHANGELOG.md b/cpp/ql/lib/CHANGELOG.md index c458d28ec7d..cf81a85004d 100644 --- a/cpp/ql/lib/CHANGELOG.md +++ b/cpp/ql/lib/CHANGELOG.md @@ -1,3 +1,17 @@ +## 0.12.0 + +### Breaking Changes + +* The expressions `AssignPointerAddExpr` and `AssignPointerSubExpr` are no longer subtypes of `AssignBitwiseOperation`. + +### Minor Analysis Improvements + +* The "Returning stack-allocated memory" (`cpp/return-stack-allocated-memory`) query now also detects returning stack-allocated memory allocated by calls to `alloca`, `strdupa`, and `strndupa`. +* Added models for `strlcpy` and `strlcat`. +* Added models for the `sprintf` variants from the `StrSafe.h` header. +* Added SQL API models for `ODBC`. +* Added taint models for `realloc` and related functions. + ## 0.11.0 ### Breaking Changes diff --git a/cpp/ql/lib/change-notes/2023-10-30-realloc-flow.md b/cpp/ql/lib/change-notes/2023-10-30-realloc-flow.md deleted file mode 100644 index 69f00c5a820..00000000000 --- a/cpp/ql/lib/change-notes/2023-10-30-realloc-flow.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* Added taint models for `realloc` and related functions. diff --git a/cpp/ql/lib/change-notes/2023-10-31-assign-pointer-add-sub-expr.md b/cpp/ql/lib/change-notes/2023-10-31-assign-pointer-add-sub-expr.md deleted file mode 100644 index a1407c9222c..00000000000 --- a/cpp/ql/lib/change-notes/2023-10-31-assign-pointer-add-sub-expr.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: breaking ---- -* The expressions `AssignPointerAddExpr` and `AssignPointerSubExpr` are no longer subtypes of `AssignBitwiseOperation`. diff --git a/cpp/ql/lib/change-notes/2023-11-08-strsafe-models.md b/cpp/ql/lib/change-notes/2023-11-08-strsafe-models.md deleted file mode 100644 index 26e9d6dc747..00000000000 --- a/cpp/ql/lib/change-notes/2023-11-08-strsafe-models.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* Added models for the `sprintf` variants from the `StrSafe.h` header. diff --git a/cpp/ql/lib/change-notes/2023-11-10-strlcpy-strlcat-models.md b/cpp/ql/lib/change-notes/2023-11-10-strlcpy-strlcat-models.md deleted file mode 100644 index 6e4e1fe8a53..00000000000 --- a/cpp/ql/lib/change-notes/2023-11-10-strlcpy-strlcat-models.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* Added models for `strlcpy` and `strlcat`. diff --git a/cpp/ql/lib/change-notes/released/0.12.0.md b/cpp/ql/lib/change-notes/released/0.12.0.md new file mode 100644 index 00000000000..e383369ad78 --- /dev/null +++ b/cpp/ql/lib/change-notes/released/0.12.0.md @@ -0,0 +1,13 @@ +## 0.12.0 + +### Breaking Changes + +* The expressions `AssignPointerAddExpr` and `AssignPointerSubExpr` are no longer subtypes of `AssignBitwiseOperation`. + +### Minor Analysis Improvements + +* The "Returning stack-allocated memory" (`cpp/return-stack-allocated-memory`) query now also detects returning stack-allocated memory allocated by calls to `alloca`, `strdupa`, and `strndupa`. +* Added models for `strlcpy` and `strlcat`. +* Added models for the `sprintf` variants from the `StrSafe.h` header. +* Added SQL API models for `ODBC`. +* Added taint models for `realloc` and related functions. diff --git a/cpp/ql/lib/codeql-pack.release.yml b/cpp/ql/lib/codeql-pack.release.yml index fce68697d68..5e2fb32b059 100644 --- a/cpp/ql/lib/codeql-pack.release.yml +++ b/cpp/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.11.0 +lastReleaseVersion: 0.12.0 diff --git a/cpp/ql/lib/qlpack.yml b/cpp/ql/lib/qlpack.yml index 28a3d13cd58..a8d13434ceb 100644 --- a/cpp/ql/lib/qlpack.yml +++ b/cpp/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/cpp-all -version: 0.11.1-dev +version: 0.12.1-dev groups: cpp dbscheme: semmlecode.cpp.dbscheme extractor: cpp diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowPrivate.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowPrivate.qll index 9548ff68074..7b1a9ca3123 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowPrivate.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowPrivate.qll @@ -645,6 +645,24 @@ class GlobalLikeVariable extends Variable { } } +/** + * Returns the smallest indirection for the type `t`. + * + * For most types this is `1`, but for `ArrayType`s (which are allocated on + * the stack) this is `0` + */ +int getMinIndirectionsForType(Type t) { + if t.getUnspecifiedType() instanceof Cpp::ArrayType then result = 0 else result = 1 +} + +private int getMinIndirectionForGlobalUse(Ssa::GlobalUse use) { + result = getMinIndirectionsForType(use.getUnspecifiedType()) +} + +private int getMinIndirectionForGlobalDef(Ssa::GlobalDef def) { + result = getMinIndirectionsForType(def.getUnspecifiedType()) +} + /** * Holds if data can flow from `node1` to `node2` in a way that loses the * calling context. For example, this would happen with flow through a @@ -656,7 +674,7 @@ predicate jumpStep(Node n1, Node n2) { v = globalUse.getVariable() and n1.(FinalGlobalValue).getGlobalUse() = globalUse | - globalUse.getIndirection() = 1 and + globalUse.getIndirection() = getMinIndirectionForGlobalUse(globalUse) and v = n2.asVariable() or v = n2.asIndirectVariable(globalUse.getIndirection()) @@ -666,7 +684,7 @@ predicate jumpStep(Node n1, Node n2) { v = globalDef.getVariable() and n2.(InitialGlobalValue).getGlobalDef() = globalDef | - globalDef.getIndirection() = 1 and + globalDef.getIndirection() = getMinIndirectionForGlobalDef(globalDef) and v = n1.asVariable() or v = n1.asIndirectVariable(globalDef.getIndirection()) diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowUtil.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowUtil.qll index 50b374c5b04..07015db1c08 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowUtil.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowUtil.qll @@ -34,7 +34,8 @@ cached private newtype TIRDataFlowNode = TNode0(Node0Impl node) { DataFlowImplCommon::forceCachingInSameStage() } or TVariableNode(Variable var, int indirectionIndex) { - indirectionIndex = [1 .. Ssa::getMaxIndirectionsForType(var.getUnspecifiedType())] + indirectionIndex = + [getMinIndirectionsForType(var.getUnspecifiedType()) .. Ssa::getMaxIndirectionsForType(var.getUnspecifiedType())] } or TPostFieldUpdateNode(FieldAddress operand, int indirectionIndex) { indirectionIndex = @@ -346,7 +347,9 @@ class Node extends TIRDataFlowNode { * Gets the variable corresponding to this node, if any. This can be used for * modeling flow in and out of global variables. */ - Variable asVariable() { this = TVariableNode(result, 1) } + Variable asVariable() { + this = TVariableNode(result, getMinIndirectionsForType(result.getUnspecifiedType())) + } /** * Gets the `indirectionIndex`'th indirection of this node's underlying variable, if any. @@ -354,7 +357,7 @@ class Node extends TIRDataFlowNode { * This can be used for modeling flow in and out of global variables. */ Variable asIndirectVariable(int indirectionIndex) { - indirectionIndex > 1 and + indirectionIndex > getMinIndirectionsForType(result.getUnspecifiedType()) and this = TVariableNode(result, indirectionIndex) } @@ -1273,31 +1276,90 @@ abstract private class IndirectExprNodeBase extends Node { } } -private class IndirectOperandIndirectExprNode extends IndirectExprNodeBase instanceof IndirectOperand -{ - IndirectOperandIndirectExprNode() { - exists(Expr e, int n, int indirectionIndex | - indirectExprNodeShouldBeIndirectOperand(this, e, n, indirectionIndex) and - not indirectExprNodeShouldBeIndirectOperand(_, e, n + 1, indirectionIndex) - ) +/** A signature for converting an indirect node to an expression. */ +private signature module IndirectNodeToIndirectExprSig { + /** The indirect node class to be converted to an expression */ + class IndirectNode; + + /** + * Holds if the indirect expression at indirection index `indirectionIndex` + * of `node` is `e`. The integer `n` specifies how many conversions has been + * applied to `node`. + */ + predicate indirectNodeHasIndirectExpr(IndirectNode node, Expr e, int n, int indirectionIndex); +} + +/** + * A module that implements the logic for deciding whether an indirect node + * should be an `IndirectExprNode`. + */ +private module IndirectNodeToIndirectExpr { + import Sig + + /** + * This predicate shifts the indirection index by one when `conv` is a + * `ReferenceDereferenceExpr`. + * + * This is necessary because `ReferenceDereferenceExpr` is a conversion + * in the AST, but appears as a `LoadInstruction` in the IR. + */ + bindingset[e, indirectionIndex] + private predicate adjustForReference( + Expr e, int indirectionIndex, Expr conv, int adjustedIndirectionIndex + ) { + conv.(ReferenceDereferenceExpr).getExpr() = e and + adjustedIndirectionIndex = indirectionIndex - 1 + or + not conv instanceof ReferenceDereferenceExpr and + conv = e and + adjustedIndirectionIndex = indirectionIndex } - final override Expr getConvertedExpr(int n, int index) { - indirectExprNodeShouldBeIndirectOperand(this, result, n, index) + /** Holds if `node` should be an `IndirectExprNode`. */ + predicate charpred(IndirectNode node) { + exists(Expr e, int n, int indirectionIndex | + indirectNodeHasIndirectExpr(node, e, n, indirectionIndex) and + not exists(Expr conv, int adjustedIndirectionIndex | + adjustForReference(e, indirectionIndex, conv, adjustedIndirectionIndex) and + indirectNodeHasIndirectExpr(_, conv, n + 1, adjustedIndirectionIndex) + ) + ) } } -private class IndirectInstructionIndirectExprNode extends IndirectExprNodeBase instanceof IndirectInstruction +private module IndirectOperandIndirectExprNodeImpl implements IndirectNodeToIndirectExprSig { + class IndirectNode = IndirectOperand; + + predicate indirectNodeHasIndirectExpr = indirectExprNodeShouldBeIndirectOperand/4; +} + +module IndirectOperandToIndirectExpr = + IndirectNodeToIndirectExpr; + +private class IndirectOperandIndirectExprNode extends IndirectExprNodeBase instanceof IndirectOperand { - IndirectInstructionIndirectExprNode() { - exists(Expr e, int n, int indirectionIndex | - indirectExprNodeShouldBeIndirectInstruction(this, e, n, indirectionIndex) and - not indirectExprNodeShouldBeIndirectInstruction(_, e, n + 1, indirectionIndex) - ) - } + IndirectOperandIndirectExprNode() { IndirectOperandToIndirectExpr::charpred(this) } final override Expr getConvertedExpr(int n, int index) { - indirectExprNodeShouldBeIndirectInstruction(this, result, n, index) + IndirectOperandToIndirectExpr::indirectNodeHasIndirectExpr(this, result, n, index) + } +} + +private module IndirectInstructionIndirectExprNodeImpl implements IndirectNodeToIndirectExprSig { + class IndirectNode = IndirectInstruction; + + predicate indirectNodeHasIndirectExpr = indirectExprNodeShouldBeIndirectInstruction/4; +} + +module IndirectInstructionToIndirectExpr = + IndirectNodeToIndirectExpr; + +private class IndirectInstructionIndirectExprNode extends IndirectExprNodeBase instanceof IndirectInstruction +{ + IndirectInstructionIndirectExprNode() { IndirectInstructionToIndirectExpr::charpred(this) } + + final override Expr getConvertedExpr(int n, int index) { + IndirectInstructionToIndirectExpr::indirectNodeHasIndirectExpr(this, result, n, index) } } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaInternals.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaInternals.qll index 76741dfc5cc..5c0174be32d 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaInternals.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaInternals.qll @@ -59,6 +59,9 @@ private module SourceVariables { then result = base.getType() else result = getTypeImpl(base.getType(), ind - 1) } + + /** Gets the location of this variable. */ + Location getLocation() { result = this.getBaseVariable().getLocation() } } } @@ -869,7 +872,7 @@ private predicate sourceVariableIsGlobal( ) } -private module SsaInput implements SsaImplCommon::InputSig { +private module SsaInput implements SsaImplCommon::InputSig { import InputSigCommon import SourceVariables @@ -1092,7 +1095,7 @@ class Def extends DefOrUse { predicate isCertain() { defOrUse.isCertain() } } -private module SsaImpl = SsaImplCommon::Make; +private module SsaImpl = SsaImplCommon::Make; class PhiNode extends SsaImpl::DefinitionExt { PhiNode() { diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaInternalsCommon.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaInternalsCommon.qll index fc718693dbd..0ea5c45df4f 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaInternalsCommon.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaInternalsCommon.qll @@ -377,6 +377,9 @@ abstract private class AbstractBaseSourceVariable extends TBaseSourceVariable { /** Gets a textual representation of this element. */ abstract string toString(); + /** Gets the location of this variable. */ + abstract Location getLocation(); + /** Gets the type of this base source variable. */ final DataFlowType getType() { this.getLanguageType().hasUnspecifiedType(result, _) } @@ -395,6 +398,8 @@ class BaseIRVariable extends AbstractBaseSourceVariable, TBaseIRVariable { override string toString() { result = var.toString() } + override Location getLocation() { result = var.getLocation() } + override CppType getLanguageType() { result = var.getLanguageType() } } @@ -407,6 +412,8 @@ class BaseCallVariable extends AbstractBaseSourceVariable, TBaseCallVariable { override string toString() { result = call.toString() } + override Location getLocation() { result = call.getLocation() } + override CppType getLanguageType() { result = getResultLanguageType(call) } } @@ -872,7 +879,7 @@ private module Cached { upper = countIndirectionsForCppType(type) and ind = ind0 + [lower .. upper] and indirectionIndex = ind - (ind0 + lower) and - (if type.hasType(any(Cpp::ArrayType arrayType), true) then lower = 0 else lower = 1) + lower = getMinIndirectionsForType(any(Type t | type.hasUnspecifiedType(t, _))) ) } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/ssa0/SsaInternals.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/ssa0/SsaInternals.qll index fd27a4e354f..ce53005470d 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/ssa0/SsaInternals.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/ssa0/SsaInternals.qll @@ -229,7 +229,7 @@ private class FinalParameterUse extends UseImpl, TFinalParameterUse { override predicate isCertain() { any() } } -private module SsaInput implements SsaImplCommon::InputSig { +private module SsaInput implements SsaImplCommon::InputSig { import InputSigCommon import SourceVariables @@ -335,7 +335,7 @@ class Def extends DefOrUse { predicate isIteratorDef() { defOrUse instanceof IteratorDef } } -private module SsaImpl = SsaImplCommon::Make; +private module SsaImpl = SsaImplCommon::Make; class PhiNode extends SsaImpl::DefinitionExt { PhiNode() { diff --git a/cpp/ql/src/CHANGELOG.md b/cpp/ql/src/CHANGELOG.md index 487feb533c4..4d374ad0ccf 100644 --- a/cpp/ql/src/CHANGELOG.md +++ b/cpp/ql/src/CHANGELOG.md @@ -1,3 +1,9 @@ +## 0.8.3 + +### Minor Analysis Improvements + +* The `cpp/uninitialized-local` query has been improved to produce fewer false positives. + ## 0.8.2 No user-facing changes. diff --git a/cpp/ql/src/Likely Bugs/Memory Management/ReturnStackAllocatedMemory.ql b/cpp/ql/src/Likely Bugs/Memory Management/ReturnStackAllocatedMemory.ql index af4bd8c61a3..16679d67fd2 100644 --- a/cpp/ql/src/Likely Bugs/Memory Management/ReturnStackAllocatedMemory.ql +++ b/cpp/ql/src/Likely Bugs/Memory Management/ReturnStackAllocatedMemory.ql @@ -27,16 +27,26 @@ class ReturnStackAllocatedMemoryConfig extends MustFlowConfiguration { ReturnStackAllocatedMemoryConfig() { this = "ReturnStackAllocatedMemoryConfig" } override predicate isSource(Instruction source) { - // Holds if `source` is a node that represents the use of a stack variable - exists(VariableAddressInstruction var, Function func | - var = source and - func = source.getEnclosingFunction() and - var.getAstVariable() instanceof StackVariable and - // Pointer-to-member types aren't properly handled in the dbscheme. - not var.getResultType() instanceof PointerToMemberType and + exists(Function func | // Rule out FPs caused by extraction errors. not any(ErrorExpr e).getEnclosingFunction() = func and - not intentionallyReturnsStackPointer(func) + not intentionallyReturnsStackPointer(func) and + func = source.getEnclosingFunction() + | + // `source` is an instruction that represents the use of a stack variable + exists(VariableAddressInstruction var | + var = source and + var.getAstVariable() instanceof StackVariable and + // Pointer-to-member types aren't properly handled in the dbscheme. + not var.getResultType() instanceof PointerToMemberType + ) + or + // `source` is an instruction that represents the return value of a + // function that is known to return stack-allocated memory. + exists(Call call | + call.getTarget().hasGlobalName(["alloca", "strdupa", "strndupa", "_alloca", "_malloca"]) and + source.getUnconvertedResultExpression() = call + ) ) } @@ -85,10 +95,10 @@ class ReturnStackAllocatedMemoryConfig extends MustFlowConfiguration { } from - MustFlowPathNode source, MustFlowPathNode sink, VariableAddressInstruction var, + MustFlowPathNode source, MustFlowPathNode sink, Instruction instr, ReturnStackAllocatedMemoryConfig conf where conf.hasFlowPath(pragma[only_bind_into](source), pragma[only_bind_into](sink)) and - source.getInstruction() = var + source.getInstruction() = instr select sink.getInstruction(), source, sink, "May return stack-allocated memory from $@.", - var.getAst(), var.getAst().toString() + instr.getAst(), instr.getAst().toString() diff --git a/cpp/ql/src/Security/CWE/CWE-114/UncontrolledProcessOperation.ql b/cpp/ql/src/Security/CWE/CWE-114/UncontrolledProcessOperation.ql index 883a6b07423..3e1c62b02c2 100644 --- a/cpp/ql/src/Security/CWE/CWE-114/UncontrolledProcessOperation.ql +++ b/cpp/ql/src/Security/CWE/CWE-114/UncontrolledProcessOperation.ql @@ -14,25 +14,47 @@ import cpp import semmle.code.cpp.security.Security -import semmle.code.cpp.ir.dataflow.internal.DefaultTaintTrackingImpl -import TaintedWithPath +import semmle.code.cpp.security.FlowSources +import semmle.code.cpp.ir.dataflow.TaintTracking +import semmle.code.cpp.ir.IR +import Flow::PathGraph -predicate isProcessOperationExplanation(Expr arg, string processOperation) { +predicate isProcessOperationExplanation(DataFlow::Node arg, string processOperation) { exists(int processOperationArg, FunctionCall call | isProcessOperationArgument(processOperation, processOperationArg) and call.getTarget().getName() = processOperation and - call.getArgument(processOperationArg) = arg + call.getArgument(processOperationArg) = [arg.asExpr(), arg.asIndirectExpr()] ) } -class Configuration extends TaintTrackingConfiguration { - override predicate isSink(Element arg) { isProcessOperationExplanation(arg, _) } +predicate isSource(FlowSource source, string sourceType) { + not source instanceof DataFlow::ExprNode and + sourceType = source.getSourceType() } -from string processOperation, Expr arg, Expr source, PathNode sourceNode, PathNode sinkNode +module Config implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node node) { isSource(node, _) } + + predicate isSink(DataFlow::Node node) { isProcessOperationExplanation(node, _) } + + predicate isBarrier(DataFlow::Node node) { + isSink(node) and node.asExpr().getUnspecifiedType() instanceof ArithmeticType + or + node.asInstruction().(StoreInstruction).getResultType() instanceof ArithmeticType + } +} + +module Flow = TaintTracking::Global; + +from + string processOperation, string sourceType, DataFlow::Node source, DataFlow::Node sink, + Flow::PathNode sourceNode, Flow::PathNode sinkNode where - isProcessOperationExplanation(arg, processOperation) and - taintedWithPath(source, arg, sourceNode, sinkNode) -select arg, sourceNode, sinkNode, + source = sourceNode.getNode() and + sink = sinkNode.getNode() and + isSource(source, sourceType) and + isProcessOperationExplanation(sink, processOperation) and + Flow::flowPath(sourceNode, sinkNode) +select sink, sourceNode, sinkNode, "The value of this argument may come from $@ and is being passed to " + processOperation + ".", - source, source.toString() + source, sourceType diff --git a/cpp/ql/src/Security/CWE/CWE-134/UncontrolledFormatStringThroughGlobalVar.c b/cpp/ql/src/Security/CWE/CWE-134/UncontrolledFormatStringThroughGlobalVar.c deleted file mode 100644 index 2700109a586..00000000000 --- a/cpp/ql/src/Security/CWE/CWE-134/UncontrolledFormatStringThroughGlobalVar.c +++ /dev/null @@ -1,24 +0,0 @@ -#include - -char *copy; - -void copyArgv(char **argv) { - copy = argv[1]; -} - -void printWrapper(char *str) { - printf(str); -} - -int main(int argc, char **argv) { - copyArgv(argv); - - // This should be avoided - printf(copy); - - // This should be avoided too, because it has the same effect - printWrapper(copy); - - // This is fine - printf("%s", copy); -} diff --git a/cpp/ql/src/Security/CWE/CWE-134/UncontrolledFormatStringThroughGlobalVar.qhelp b/cpp/ql/src/Security/CWE/CWE-134/UncontrolledFormatStringThroughGlobalVar.qhelp deleted file mode 100644 index 80b84580a57..00000000000 --- a/cpp/ql/src/Security/CWE/CWE-134/UncontrolledFormatStringThroughGlobalVar.qhelp +++ /dev/null @@ -1,36 +0,0 @@ - - - -

The program uses input from the user, propagated via a global variable, as a format string for printf style functions. -This can lead to buffer overflows or data representation problems. An attacker can exploit this weakness to crash the program, -disclose information or even execute arbitrary code.

- -

This rule only identifies inputs from the user that are transferred through global variables before being used in printf style functions. -Analyzing the flow of data through global variables is more prone to errors and so this rule may identify some examples of code where -the input is not really from the user. For example, when a global variable is set in two places, one that comes from the user and one that does not. -In this case we would mark all usages of the global variable as input from the user, but the input from the user may always came after the call to the -printf style functions.

- -

The results of this rule should be considered alongside the related rule "Uncontrolled format string" which tracks the flow of the -values input by a user, excluding global variables, until the values are used as the format argument for a printf like function call.

- -
- -

Use constant expressions as the format strings. If you need to print a value from the user, use printf("%s", value_from_user).

- -
- - - - - - -
  • CERT C Coding -Standard: FIO30-C. Exclude -user input from format strings.
  • - - -
    -
    diff --git a/cpp/ql/src/Security/CWE/CWE-134/UncontrolledFormatStringThroughGlobalVar.ql b/cpp/ql/src/Security/CWE/CWE-134/UncontrolledFormatStringThroughGlobalVar.ql deleted file mode 100644 index b37e34c296c..00000000000 --- a/cpp/ql/src/Security/CWE/CWE-134/UncontrolledFormatStringThroughGlobalVar.ql +++ /dev/null @@ -1,40 +0,0 @@ -/** - * @name Uncontrolled format string (through global variable) - * @description Using externally-controlled format strings in - * printf-style functions can lead to buffer overflows - * or data representation problems. - * @kind path-problem - * @problem.severity warning - * @security-severity 9.3 - * @precision high - * @id cpp/tainted-format-string-through-global - * @tags reliability - * security - * external/cwe/cwe-134 - */ - -import cpp -import semmle.code.cpp.security.FunctionWithWrappers -import semmle.code.cpp.security.Security -import semmle.code.cpp.ir.dataflow.internal.DefaultTaintTrackingImpl -import TaintedWithPath - -class Configuration extends TaintTrackingConfiguration { - override predicate isSink(Element tainted) { - exists(PrintfLikeFunction printf | printf.outermostWrapperFunctionCall(tainted, _)) - } - - override predicate taintThroughGlobals() { any() } -} - -from - PrintfLikeFunction printf, Expr arg, PathNode sourceNode, PathNode sinkNode, - string printfFunction, Expr userValue, string cause -where - printf.outermostWrapperFunctionCall(arg, printfFunction) and - not taintedWithoutGlobals(arg) and - taintedWithPath(userValue, arg, sourceNode, sinkNode) and - isUserInput(userValue, cause) -select arg, sourceNode, sinkNode, - "The value of this argument may come from $@ and is being used as a formatting argument to " + - printfFunction + ".", userValue, cause diff --git a/cpp/ql/src/Security/CWE/CWE-190/ArithmeticTainted.ql b/cpp/ql/src/Security/CWE/CWE-190/ArithmeticTainted.ql index 1981836a923..810039f4e1a 100644 --- a/cpp/ql/src/Security/CWE/CWE-190/ArithmeticTainted.ql +++ b/cpp/ql/src/Security/CWE/CWE-190/ArithmeticTainted.ql @@ -14,10 +14,13 @@ import cpp import semmle.code.cpp.security.Overflow -import semmle.code.cpp.security.Security -import semmle.code.cpp.ir.dataflow.internal.DefaultTaintTrackingImpl -import TaintedWithPath +import semmle.code.cpp.dataflow.new.TaintTracking +import semmle.code.cpp.dataflow.new.DataFlow +import semmle.code.cpp.ir.IR +import semmle.code.cpp.controlflow.IRGuards as IRGuards +import semmle.code.cpp.security.FlowSources as FS import Bounded +import Flow::PathGraph bindingset[op] predicate missingGuard(Operation op, Expr e, string effect) { @@ -28,28 +31,90 @@ predicate missingGuard(Operation op, Expr e, string effect) { not e instanceof VariableAccess and effect = "overflow" } -class Configuration extends TaintTrackingConfiguration { - override predicate isSink(Element e) { - exists(Operation op | - missingGuard(op, e, _) and - op.getAnOperand() = e - | - op instanceof UnaryArithmeticOperation or - op instanceof BinaryArithmeticOperation or - op instanceof AssignArithmeticOperation - ) - } +predicate isSource(FS::FlowSource source, string sourceType) { sourceType = source.getSourceType() } - override predicate isBarrier(Expr e) { - super.isBarrier(e) or bounded(e) or e.getUnspecifiedType().(IntegralType).getSize() <= 1 +predicate isSink(DataFlow::Node sink, Operation op, Expr e) { + e = sink.asExpr() and + missingGuard(op, e, _) and + op.getAnOperand() = e and + ( + op instanceof UnaryArithmeticOperation or + op instanceof BinaryArithmeticOperation or + op instanceof AssignArithmeticOperation + ) +} + +predicate hasUpperBoundsCheck(Variable var) { + exists(RelationalOperation oper, VariableAccess access | + oper.getAnOperand() = access and + access.getTarget() = var and + // Comparing to 0 is not an upper bound check + not oper.getAnOperand().getValue() = "0" + ) +} + +predicate constantInstruction(Instruction instr) { + instr instanceof ConstantInstruction or + constantInstruction(instr.(UnaryInstruction).getUnary()) +} + +predicate readsVariable(LoadInstruction load, Variable var) { + load.getSourceAddress().(VariableAddressInstruction).getAstVariable() = var +} + +predicate nodeIsBarrierEqualityCandidate(DataFlow::Node node, Operand access, Variable checkedVar) { + exists(Instruction instr | instr = node.asInstruction() | + readsVariable(instr, checkedVar) and + any(IRGuards::IRGuardCondition guard).ensuresEq(access, _, _, instr.getBlock(), true) + ) +} + +module Config implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { isSource(source, _) } + + predicate isSink(DataFlow::Node sink) { isSink(sink, _, _) } + + predicate isBarrier(DataFlow::Node node) { + exists(StoreInstruction store | store = node.asInstruction() | + // Block flow to "likely small expressions" + bounded(store.getSourceValue().getUnconvertedResultExpression()) + or + // Block flow to "small types" + store.getResultType().getUnspecifiedType().(IntegralType).getSize() <= 1 + ) + or + // Block flow if there's an upper bound check of the variable anywhere in the program + exists(Variable checkedVar, Instruction instr | instr = node.asInstruction() | + readsVariable(instr, checkedVar) and + hasUpperBoundsCheck(checkedVar) + ) + or + // Block flow if the node is guarded by an equality check + exists(Variable checkedVar, Operand access | + nodeIsBarrierEqualityCandidate(node, access, checkedVar) and + readsVariable(access.getDef(), checkedVar) + ) + or + // Block flow to any binary instruction whose operands are both non-constants. + exists(BinaryInstruction iTo | + iTo = node.asInstruction() and + not constantInstruction(iTo.getLeft()) and + not constantInstruction(iTo.getRight()) and + // propagate taint from either the pointer or the offset, regardless of constantness + not iTo instanceof PointerArithmeticInstruction + ) } } -from Expr origin, Expr e, string effect, PathNode sourceNode, PathNode sinkNode, Operation op +module Flow = TaintTracking::Global; + +from + Expr e, string effect, Flow::PathNode source, Flow::PathNode sink, Operation op, string sourceType where - taintedWithPath(origin, e, sourceNode, sinkNode) and - op.getAnOperand() = e and + Flow::flowPath(source, sink) and + isSource(source.getNode(), sourceType) and + isSink(sink.getNode(), op, e) and missingGuard(op, e, effect) -select e, sourceNode, sinkNode, +select e, source, sink, "$@ flows to an operand of an arithmetic expression, potentially causing an " + effect + ".", - origin, "User-provided value" + source, sourceType diff --git a/cpp/ql/src/Security/CWE/CWE-190/ArithmeticWithExtremeValues.ql b/cpp/ql/src/Security/CWE/CWE-190/ArithmeticWithExtremeValues.ql index 6034b4f5ffd..15fd2cbca15 100644 --- a/cpp/ql/src/Security/CWE/CWE-190/ArithmeticWithExtremeValues.ql +++ b/cpp/ql/src/Security/CWE/CWE-190/ArithmeticWithExtremeValues.ql @@ -16,45 +16,30 @@ import cpp import semmle.code.cpp.security.Overflow -import semmle.code.cpp.security.Security -import semmle.code.cpp.ir.dataflow.internal.DefaultTaintTrackingImpl +import semmle.code.cpp.dataflow.new.TaintTracking +import semmle.code.cpp.ir.IR +import semmle.code.cpp.controlflow.IRGuards as IRGuards predicate isMaxValue(Expr mie) { exists(MacroInvocation mi | mi.getExpr() = mie and - ( - mi.getMacroName() = "CHAR_MAX" or - mi.getMacroName() = "LLONG_MAX" or - mi.getMacroName() = "INT_MAX" or - mi.getMacroName() = "SHRT_MAX" or - mi.getMacroName() = "UINT_MAX" - ) + mi.getMacroName() = ["CHAR_MAX", "LLONG_MAX", "INT_MAX", "SHRT_MAX", "UINT_MAX"] ) } predicate isMinValue(Expr mie) { exists(MacroInvocation mi | mi.getExpr() = mie and - ( - mi.getMacroName() = "CHAR_MIN" or - mi.getMacroName() = "LLONG_MIN" or - mi.getMacroName() = "INT_MIN" or - mi.getMacroName() = "SHRT_MIN" - ) + mi.getMacroName() = ["CHAR_MIN", "LLONG_MIN", "INT_MIN", "SHRT_MIN"] ) } -class SecurityOptionsArith extends SecurityOptions { - override predicate isUserInput(Expr expr, string cause) { +predicate isSource(DataFlow::Node source, string cause) { + exists(Expr expr | expr = source.asExpr() | isMaxValue(expr) and cause = "max value" or isMinValue(expr) and cause = "min value" - } -} - -predicate taintedVarAccess(Expr origin, VariableAccess va, string cause) { - isUserInput(origin, cause) and - tainted(origin, va) + ) } predicate causeEffectCorrespond(string cause, string effect) { @@ -65,16 +50,79 @@ predicate causeEffectCorrespond(string cause, string effect) { effect = "underflow" } -from Expr origin, Operation op, VariableAccess va, string cause, string effect -where - taintedVarAccess(origin, va, cause) and - op.getAnOperand() = va and - ( +predicate isSink(DataFlow::Node sink, VariableAccess va, string effect) { + exists(Operation op | + sink.asExpr() = va and + op.getAnOperand() = va + | missingGuardAgainstUnderflow(op, va) and effect = "underflow" or missingGuardAgainstOverflow(op, va) and effect = "overflow" - ) and - causeEffectCorrespond(cause, effect) + ) +} + +predicate hasUpperBoundsCheck(Variable var) { + exists(RelationalOperation oper, VariableAccess access | + oper.getAnOperand() = access and + access.getTarget() = var and + // Comparing to 0 is not an upper bound check + not oper.getAnOperand().getValue() = "0" + ) +} + +predicate constantInstruction(Instruction instr) { + instr instanceof ConstantInstruction or + constantInstruction(instr.(UnaryInstruction).getUnary()) +} + +predicate readsVariable(LoadInstruction load, Variable var) { + load.getSourceAddress().(VariableAddressInstruction).getAstVariable() = var +} + +predicate nodeIsBarrierEqualityCandidate(DataFlow::Node node, Operand access, Variable checkedVar) { + exists(Instruction instr | instr = node.asInstruction() | + readsVariable(instr, checkedVar) and + any(IRGuards::IRGuardCondition guard).ensuresEq(access, _, _, instr.getBlock(), true) + ) +} + +module Config implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { isSource(source, _) } + + predicate isSink(DataFlow::Node sink) { isSink(sink, _, _) } + + predicate isBarrier(DataFlow::Node node) { + // Block flow if there's an upper bound check of the variable anywhere in the program + exists(Variable checkedVar, Instruction instr | instr = node.asInstruction() | + readsVariable(instr, checkedVar) and + hasUpperBoundsCheck(checkedVar) + ) + or + // Block flow if the node is guarded by an equality check + exists(Variable checkedVar, Operand access | + nodeIsBarrierEqualityCandidate(node, access, checkedVar) and + readsVariable(access.getDef(), checkedVar) + ) + or + // Block flow to any binary instruction whose operands are both non-constants. + exists(BinaryInstruction iTo | + iTo = node.asInstruction() and + not constantInstruction(iTo.getLeft()) and + not constantInstruction(iTo.getRight()) and + // propagate taint from either the pointer or the offset, regardless of constantness + not iTo instanceof PointerArithmeticInstruction + ) + } +} + +module Flow = TaintTracking::Global; + +from DataFlow::Node source, DataFlow::Node sink, VariableAccess va, string cause, string effect +where + Flow::flow(source, sink) and + isSource(source, cause) and + causeEffectCorrespond(cause, effect) and + isSink(sink, va, effect) select va, "$@ flows to an operand of an arithmetic expression, potentially causing an " + effect + ".", - origin, "Extreme value" + source, "Extreme value" diff --git a/cpp/ql/src/Security/CWE/CWE-190/IntegerOverflowTainted.ql b/cpp/ql/src/Security/CWE/CWE-190/IntegerOverflowTainted.ql index 19fe7df4c44..98c53828d2a 100644 --- a/cpp/ql/src/Security/CWE/CWE-190/IntegerOverflowTainted.ql +++ b/cpp/ql/src/Security/CWE/CWE-190/IntegerOverflowTainted.ql @@ -15,7 +15,11 @@ import cpp import semmle.code.cpp.rangeanalysis.SimpleRangeAnalysis -import semmle.code.cpp.ir.dataflow.internal.DefaultTaintTrackingImpl +import semmle.code.cpp.dataflow.new.DataFlow +import semmle.code.cpp.security.FlowSources as FS +import semmle.code.cpp.dataflow.new.TaintTracking +import semmle.code.cpp.ir.IR +import semmle.code.cpp.controlflow.IRGuards as IRGuards /** Holds if `expr` might overflow. */ predicate outOfBoundsExpr(Expr expr, string kind) { @@ -27,13 +31,76 @@ predicate outOfBoundsExpr(Expr expr, string kind) { else none() } -from Expr use, Expr origin, string kind +predicate isSource(FS::FlowSource source, string sourceType) { sourceType = source.getSourceType() } + +predicate isSink(DataFlow::Node sink, string kind) { + exists(Expr use | + use = sink.asExpr() and + not use.getUnspecifiedType() instanceof PointerType and + outOfBoundsExpr(use, kind) and + not inSystemMacroExpansion(use) + ) +} + +predicate hasUpperBoundsCheck(Variable var) { + exists(RelationalOperation oper, VariableAccess access | + oper.getAnOperand() = access and + access.getTarget() = var and + // Comparing to 0 is not an upper bound check + not oper.getAnOperand().getValue() = "0" + ) +} + +predicate constantInstruction(Instruction instr) { + instr instanceof ConstantInstruction or + constantInstruction(instr.(UnaryInstruction).getUnary()) +} + +predicate readsVariable(LoadInstruction load, Variable var) { + load.getSourceAddress().(VariableAddressInstruction).getAstVariable() = var +} + +predicate nodeIsBarrierEqualityCandidate(DataFlow::Node node, Operand access, Variable checkedVar) { + exists(Instruction instr | instr = node.asInstruction() | + readsVariable(instr, checkedVar) and + any(IRGuards::IRGuardCondition guard).ensuresEq(access, _, _, instr.getBlock(), true) + ) +} + +module Config implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { isSource(source, _) } + + predicate isSink(DataFlow::Node sink) { isSink(sink, _) } + + predicate isBarrier(DataFlow::Node node) { + // Block flow if there's an upper bound check of the variable anywhere in the program + exists(Variable checkedVar, Instruction instr | instr = node.asInstruction() | + readsVariable(instr, checkedVar) and + hasUpperBoundsCheck(checkedVar) + ) + or + // Block flow if the node is guarded by an equality check + exists(Variable checkedVar, Operand access | + nodeIsBarrierEqualityCandidate(node, access, checkedVar) and + readsVariable(access.getDef(), checkedVar) + ) + or + // Block flow to any binary instruction whose operands are both non-constants. + exists(BinaryInstruction iTo | + iTo = node.asInstruction() and + not constantInstruction(iTo.getLeft()) and + not constantInstruction(iTo.getRight()) and + // propagate taint from either the pointer or the offset, regardless of constantness + not iTo instanceof PointerArithmeticInstruction + ) + } +} + +module Flow = TaintTracking::Global; + +from DataFlow::Node source, DataFlow::Node sink, string kind, string sourceType where - not use.getUnspecifiedType() instanceof PointerType and - outOfBoundsExpr(use, kind) and - tainted(origin, use) and - origin != use and - not inSystemMacroExpansion(use) and - // Avoid double-counting: don't include all the conversions of `use`. - not use instanceof Conversion -select use, "$@ flows an expression which might " + kind + ".", origin, "User-provided value" + Flow::flow(source, sink) and + isSource(source, sourceType) and + isSink(sink, kind) +select sink, "$@ flows an expression which might " + kind + ".", source, sourceType diff --git a/cpp/ql/src/Summary/LinesOfCode.ql b/cpp/ql/src/Summary/LinesOfCode.ql index 3b2aa2ac4c9..9e2cab4851b 100644 --- a/cpp/ql/src/Summary/LinesOfCode.ql +++ b/cpp/ql/src/Summary/LinesOfCode.ql @@ -4,6 +4,7 @@ * @description The total number of lines of C/C++ code across all files, including system headers, libraries, and auto-generated files. This is a useful metric of the size of a database. For all files that were seen during the build, this query counts the lines of code, excluding whitespace or comments. * @kind metric * @tags summary + * telemetry */ import cpp diff --git a/cpp/ql/src/change-notes/2023-10-31-odbc-models.md b/cpp/ql/src/change-notes/2023-10-31-odbc-models.md deleted file mode 100644 index c31883675b3..00000000000 --- a/cpp/ql/src/change-notes/2023-10-31-odbc-models.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* Added SQL API models for `ODBC`. diff --git a/cpp/ql/src/change-notes/2023-11-16-tainted-format-string-through-global-deleted.md b/cpp/ql/src/change-notes/2023-11-16-tainted-format-string-through-global-deleted.md new file mode 100644 index 00000000000..a4b3be355bc --- /dev/null +++ b/cpp/ql/src/change-notes/2023-11-16-tainted-format-string-through-global-deleted.md @@ -0,0 +1,4 @@ +--- +category: breaking +--- +* The `cpp/tainted-format-string-through-global` query has been deleted. This does not lead to a loss of relevant alerts, as the query duplicated a subset of the alerts from `cpp/tainted-format-string`. diff --git a/cpp/ql/src/change-notes/2023-11-07-uninitialized-local.md b/cpp/ql/src/change-notes/released/0.8.3.md similarity index 67% rename from cpp/ql/src/change-notes/2023-11-07-uninitialized-local.md rename to cpp/ql/src/change-notes/released/0.8.3.md index bdb67692534..80a15f8fccc 100644 --- a/cpp/ql/src/change-notes/2023-11-07-uninitialized-local.md +++ b/cpp/ql/src/change-notes/released/0.8.3.md @@ -1,4 +1,5 @@ ---- -category: minorAnalysis ---- +## 0.8.3 + +### Minor Analysis Improvements + * The `cpp/uninitialized-local` query has been improved to produce fewer false positives. diff --git a/cpp/ql/src/codeql-pack.release.yml b/cpp/ql/src/codeql-pack.release.yml index 404110129dc..b6e46394f37 100644 --- a/cpp/ql/src/codeql-pack.release.yml +++ b/cpp/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.8.2 +lastReleaseVersion: 0.8.3 diff --git a/cpp/ql/src/experimental/cryptography/inventory/new_models/AllAsymmetricAlgorithms.ql b/cpp/ql/src/experimental/cryptography/inventory/new_models/AllAsymmetricAlgorithms.ql index 138664b7665..275049d8aea 100644 --- a/cpp/ql/src/experimental/cryptography/inventory/new_models/AllAsymmetricAlgorithms.ql +++ b/cpp/ql/src/experimental/cryptography/inventory/new_models/AllAsymmetricAlgorithms.ql @@ -4,7 +4,6 @@ * @kind problem * @id cpp/quantum-readiness/cbom/all-asymmetric-algorithms * @problem.severity error - * @precision high * @tags cbom * cryptography */ diff --git a/cpp/ql/src/experimental/cryptography/inventory/new_models/AllCryptoAlgorithms.ql b/cpp/ql/src/experimental/cryptography/inventory/new_models/AllCryptoAlgorithms.ql index 1fe71b00a58..41c3d625a70 100644 --- a/cpp/ql/src/experimental/cryptography/inventory/new_models/AllCryptoAlgorithms.ql +++ b/cpp/ql/src/experimental/cryptography/inventory/new_models/AllCryptoAlgorithms.ql @@ -4,7 +4,6 @@ * @kind problem * @id cpp/quantum-readiness/cbom/all-cryptographic-algorithms * @problem.severity error - * @precision high * @tags cbom * cryptography */ diff --git a/cpp/ql/src/experimental/cryptography/inventory/new_models/AsymmetricEncryptionAlgorithms.ql b/cpp/ql/src/experimental/cryptography/inventory/new_models/AsymmetricEncryptionAlgorithms.ql index 29e429af95f..4edafed9499 100644 --- a/cpp/ql/src/experimental/cryptography/inventory/new_models/AsymmetricEncryptionAlgorithms.ql +++ b/cpp/ql/src/experimental/cryptography/inventory/new_models/AsymmetricEncryptionAlgorithms.ql @@ -4,7 +4,6 @@ * @kind problem * @id cpp/quantum-readiness/cbom/all-asymmetric-encryption-algorithms * @problem.severity error - * @precision high * @tags cbom * cryptography */ diff --git a/cpp/ql/src/experimental/cryptography/inventory/new_models/AuthenticatedEncryptionAlgorithms.ql b/cpp/ql/src/experimental/cryptography/inventory/new_models/AuthenticatedEncryptionAlgorithms.ql index d855e50ea88..cbf62036359 100644 --- a/cpp/ql/src/experimental/cryptography/inventory/new_models/AuthenticatedEncryptionAlgorithms.ql +++ b/cpp/ql/src/experimental/cryptography/inventory/new_models/AuthenticatedEncryptionAlgorithms.ql @@ -4,7 +4,6 @@ * @kind problem * @id cpp/quantum-readiness/cbom/authenticated-encryption-algorithms * @problem.severity error - * @precision high * @tags cbom * cryptography */ diff --git a/cpp/ql/src/experimental/cryptography/inventory/new_models/BlockModeAlgorithms.ql b/cpp/ql/src/experimental/cryptography/inventory/new_models/BlockModeAlgorithms.ql index 36b5d52a7c1..33cb44742d2 100644 --- a/cpp/ql/src/experimental/cryptography/inventory/new_models/BlockModeAlgorithms.ql +++ b/cpp/ql/src/experimental/cryptography/inventory/new_models/BlockModeAlgorithms.ql @@ -4,7 +4,6 @@ * @kind problem * @id cpp/quantum-readiness/cbom/block-cipher-mode * @problem.severity error - * @precision high * @tags cbom * cryptography */ diff --git a/cpp/ql/src/experimental/cryptography/inventory/new_models/BlockModeKnownIVsOrNonces.ql b/cpp/ql/src/experimental/cryptography/inventory/new_models/BlockModeKnownIVsOrNonces.ql index 6b91e84edba..9bfafee3696 100644 --- a/cpp/ql/src/experimental/cryptography/inventory/new_models/BlockModeKnownIVsOrNonces.ql +++ b/cpp/ql/src/experimental/cryptography/inventory/new_models/BlockModeKnownIVsOrNonces.ql @@ -4,7 +4,6 @@ * @kind problem * @id cpp/quantum-readiness/cbom/iv-sources * @problem.severity error - * @precision high * @tags cbom * cryptography */ diff --git a/cpp/ql/src/experimental/cryptography/inventory/new_models/BlockModeUnknownIVsOrNonces.ql b/cpp/ql/src/experimental/cryptography/inventory/new_models/BlockModeUnknownIVsOrNonces.ql index 6acf3bb598f..4d54d6acce5 100644 --- a/cpp/ql/src/experimental/cryptography/inventory/new_models/BlockModeUnknownIVsOrNonces.ql +++ b/cpp/ql/src/experimental/cryptography/inventory/new_models/BlockModeUnknownIVsOrNonces.ql @@ -4,7 +4,6 @@ * @kind problem * @id cpp/quantum-readiness/cbom/unkown-iv-sources * @problem.severity error - * @precision high * @tags cbom * cryptography */ diff --git a/cpp/ql/src/experimental/cryptography/inventory/new_models/EllipticCurveAlgorithmSize.ql b/cpp/ql/src/experimental/cryptography/inventory/new_models/EllipticCurveAlgorithmSize.ql index ad9206b5ba4..4fbe4cc881a 100644 --- a/cpp/ql/src/experimental/cryptography/inventory/new_models/EllipticCurveAlgorithmSize.ql +++ b/cpp/ql/src/experimental/cryptography/inventory/new_models/EllipticCurveAlgorithmSize.ql @@ -4,7 +4,6 @@ * @kind problem * @id cpp/quantum-readiness/cbom/elliptic-curve-key-length * @problem.severity error - * @precision high * @tags cbom * cryptography */ diff --git a/cpp/ql/src/experimental/cryptography/inventory/new_models/EllipticCurveAlgorithms.ql b/cpp/ql/src/experimental/cryptography/inventory/new_models/EllipticCurveAlgorithms.ql index 06aa44cd1bb..79d4ab7750a 100644 --- a/cpp/ql/src/experimental/cryptography/inventory/new_models/EllipticCurveAlgorithms.ql +++ b/cpp/ql/src/experimental/cryptography/inventory/new_models/EllipticCurveAlgorithms.ql @@ -4,7 +4,6 @@ * @kind problem * @id cpp/quantum-readiness/cbom/elliptic-curve-algorithms * @problem.severity error - * @precision high * @tags cbom * cryptography */ diff --git a/cpp/ql/src/experimental/cryptography/inventory/new_models/HashingAlgorithms.ql b/cpp/ql/src/experimental/cryptography/inventory/new_models/HashingAlgorithms.ql index 175ba39e138..17541f45177 100644 --- a/cpp/ql/src/experimental/cryptography/inventory/new_models/HashingAlgorithms.ql +++ b/cpp/ql/src/experimental/cryptography/inventory/new_models/HashingAlgorithms.ql @@ -4,7 +4,6 @@ * @kind problem * @id cpp/quantum-readiness/cbom/hash-algorithms * @problem.severity error - * @precision high * @tags cbom * cryptography */ diff --git a/cpp/ql/src/experimental/cryptography/inventory/new_models/KeyExchangeAlgorithms.ql b/cpp/ql/src/experimental/cryptography/inventory/new_models/KeyExchangeAlgorithms.ql index 7f7ceb17c39..193a895f30e 100644 --- a/cpp/ql/src/experimental/cryptography/inventory/new_models/KeyExchangeAlgorithms.ql +++ b/cpp/ql/src/experimental/cryptography/inventory/new_models/KeyExchangeAlgorithms.ql @@ -4,7 +4,6 @@ * @kind problem * @id cpp/quantum-readiness/cbom/key-exchange * @problem.severity error - * @precision high * @tags cbom * cryptography */ diff --git a/cpp/ql/src/experimental/cryptography/inventory/new_models/KnownAsymmetricKeyGeneration.ql b/cpp/ql/src/experimental/cryptography/inventory/new_models/KnownAsymmetricKeyGeneration.ql index 34fca159fdb..240c6e6c8ca 100644 --- a/cpp/ql/src/experimental/cryptography/inventory/new_models/KnownAsymmetricKeyGeneration.ql +++ b/cpp/ql/src/experimental/cryptography/inventory/new_models/KnownAsymmetricKeyGeneration.ql @@ -4,7 +4,6 @@ * @kind problem * @id cpp/quantum-readiness/cbom/asymmetric-key-generation * @problem.severity error - * @precision high * @tags cbom * cryptography */ diff --git a/cpp/ql/src/experimental/cryptography/inventory/new_models/SigningAlgorithms.ql b/cpp/ql/src/experimental/cryptography/inventory/new_models/SigningAlgorithms.ql index b052e48a664..fa79d6635d9 100644 --- a/cpp/ql/src/experimental/cryptography/inventory/new_models/SigningAlgorithms.ql +++ b/cpp/ql/src/experimental/cryptography/inventory/new_models/SigningAlgorithms.ql @@ -4,7 +4,6 @@ * @kind problem * @id cpp/quantum-readiness/cbom/signing-algorithms * @problem.severity error - * @precision high * @tags cbom * cryptography */ diff --git a/cpp/ql/src/experimental/cryptography/inventory/new_models/SymmetricEncryptionAlgorithms.ql b/cpp/ql/src/experimental/cryptography/inventory/new_models/SymmetricEncryptionAlgorithms.ql index 2a4c3f1056a..4d518d09058 100644 --- a/cpp/ql/src/experimental/cryptography/inventory/new_models/SymmetricEncryptionAlgorithms.ql +++ b/cpp/ql/src/experimental/cryptography/inventory/new_models/SymmetricEncryptionAlgorithms.ql @@ -4,7 +4,6 @@ * @kind problem * @id cpp/quantum-readiness/cbom/symmetric-encryption-algorithms * @problem.severity error - * @precision high * @tags cbom * cryptography */ diff --git a/cpp/ql/src/experimental/cryptography/inventory/new_models/UnknownAsymmetricKeyGeneration.ql b/cpp/ql/src/experimental/cryptography/inventory/new_models/UnknownAsymmetricKeyGeneration.ql index 63ab3fdcffb..6c1018ecc2a 100644 --- a/cpp/ql/src/experimental/cryptography/inventory/new_models/UnknownAsymmetricKeyGeneration.ql +++ b/cpp/ql/src/experimental/cryptography/inventory/new_models/UnknownAsymmetricKeyGeneration.ql @@ -4,7 +4,6 @@ * @kind problem * @id cpp/quantum-readiness/cbom/unkwon-asymmetric-key-generation * @problem.severity error - * @precision high * @tags cbom * cryptography */ diff --git a/cpp/ql/src/qlpack.yml b/cpp/ql/src/qlpack.yml index 7f07ad77a21..72f1a8849e0 100644 --- a/cpp/ql/src/qlpack.yml +++ b/cpp/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/cpp-queries -version: 0.8.3-dev +version: 0.8.4-dev groups: - cpp - queries diff --git a/cpp/ql/test/library-tests/dataflow/dataflow-tests/TestBase.qll b/cpp/ql/test/library-tests/dataflow/dataflow-tests/TestBase.qll new file mode 100644 index 00000000000..528e7ca6ad3 --- /dev/null +++ b/cpp/ql/test/library-tests/dataflow/dataflow-tests/TestBase.qll @@ -0,0 +1,111 @@ +module AstTest { + import semmle.code.cpp.dataflow.DataFlow + private import semmle.code.cpp.controlflow.Guards + + /** + * A `BarrierGuard` that stops flow to all occurrences of `x` within statement + * S in `if (guarded(x)) S`. + */ + // This is tested in `BarrierGuard.cpp`. + predicate testBarrierGuard(GuardCondition g, Expr checked, boolean isTrue) { + g.(FunctionCall).getTarget().getName() = "guarded" and + checked = g.(FunctionCall).getArgument(0) and + isTrue = true + } + + /** Common data flow configuration to be used by tests. */ + module AstTestAllocationConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { + source.asExpr().(FunctionCall).getTarget().getName() = "source" + or + source.asParameter().getName().matches("source%") + or + source.asExpr().(FunctionCall).getTarget().getName() = "indirect_source" + or + source.(DataFlow::DefinitionByReferenceNode).getParameter().getName().matches("ref_source%") + or + // Track uninitialized variables + exists(source.asUninitialized()) + } + + predicate isSink(DataFlow::Node sink) { + exists(FunctionCall call | + call.getTarget().getName() = ["sink", "indirect_sink"] and + sink.asExpr() = call.getAnArgument() + ) + } + + predicate isBarrier(DataFlow::Node barrier) { + barrier.asExpr().(VariableAccess).getTarget().hasName("barrier") or + barrier = DataFlow::BarrierGuard::getABarrierNode() + } + } + + module AstFlow = DataFlow::Global; +} + +module IRTest { + private import cpp + import semmle.code.cpp.ir.dataflow.DataFlow + private import semmle.code.cpp.ir.IR + private import semmle.code.cpp.controlflow.IRGuards + + /** + * A `BarrierGuard` that stops flow to all occurrences of `x` within statement + * S in `if (guarded(x)) S`. + */ + // This is tested in `BarrierGuard.cpp`. + predicate testBarrierGuard(IRGuardCondition g, Expr checked, boolean isTrue) { + exists(Call call | + call = g.getUnconvertedResultExpression() and + call.getTarget().hasName("guarded") and + checked = call.getArgument(0) and + isTrue = true + ) + } + + /** Common data flow configuration to be used by tests. */ + module IRTestAllocationConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { + source.asExpr().(FunctionCall).getTarget().getName() = "source" + or + source.asIndirectExpr(1).(FunctionCall).getTarget().getName() = "indirect_source" + or + source.asExpr().(StringLiteral).getValue() = "source" + or + // indirect_source(n) gives the dataflow node representing the indirect node after n dereferences. + exists(int n, string s | + n = s.regexpCapture("indirect_source\\((\\d)\\)", 1).toInt() and + source.asIndirectExpr(n).(StringLiteral).getValue() = s + ) + or + source.asParameter().getName().matches("source%") + or + source.(DataFlow::DefinitionByReferenceNode).getParameter().getName().matches("ref_source%") + or + exists(source.asUninitialized()) + } + + predicate isSink(DataFlow::Node sink) { + exists(FunctionCall call, Expr e | e = call.getAnArgument() | + call.getTarget().getName() = "sink" and + sink.asExpr() = e + or + call.getTarget().getName() = "indirect_sink" and + sink.asIndirectExpr() = e + ) + } + + predicate isBarrier(DataFlow::Node barrier) { + exists(Expr barrierExpr | barrierExpr in [barrier.asExpr(), barrier.asIndirectExpr()] | + barrierExpr.(VariableAccess).getTarget().hasName("barrier") + ) + or + barrier = DataFlow::BarrierGuard::getABarrierNode() + or + barrier = DataFlow::BarrierGuard::getAnIndirectBarrierNode() + } + } + + module IRFlow = DataFlow::Global; +} diff --git a/cpp/ql/test/library-tests/dataflow/dataflow-tests/dataflow-consistency.expected b/cpp/ql/test/library-tests/dataflow/dataflow-tests/dataflow-consistency.expected index da59987d742..a98cfd7e22a 100644 --- a/cpp/ql/test/library-tests/dataflow/dataflow-tests/dataflow-consistency.expected +++ b/cpp/ql/test/library-tests/dataflow/dataflow-tests/dataflow-consistency.expected @@ -1,5 +1,11 @@ uniqueEnclosingCallable +| test.cpp:864:44:864:58 | {...} | Node should have one enclosing callable but has 0. | +| test.cpp:864:47:864:54 | call to source | Node should have one enclosing callable but has 0. | +| test.cpp:872:46:872:51 | call to source | Node should have one enclosing callable but has 0. | +| test.cpp:872:53:872:56 | 1 | Node should have one enclosing callable but has 0. | uniqueCallEnclosingCallable +| test.cpp:864:47:864:54 | call to source | Call should have one enclosing callable but has 0. | +| test.cpp:872:46:872:51 | call to source | Call should have one enclosing callable but has 0. | uniqueType uniqueNodeLocation missingLocation @@ -24,6 +30,7 @@ argHasPostUpdate | lambdas.cpp:45:2:45:2 | e | ArgumentNode is missing PostUpdateNode. | | test.cpp:67:29:67:35 | source1 | ArgumentNode is missing PostUpdateNode. | | test.cpp:813:19:813:35 | * ... | ArgumentNode is missing PostUpdateNode. | +| test.cpp:848:23:848:25 | rpx | ArgumentNode is missing PostUpdateNode. | postWithInFlow | BarrierGuard.cpp:49:6:49:6 | x [post update] | PostUpdateNode should not be the target of local flow. | | BarrierGuard.cpp:60:7:60:7 | x [post update] | PostUpdateNode should not be the target of local flow. | diff --git a/cpp/ql/test/library-tests/dataflow/dataflow-tests/test-source-sink.expected b/cpp/ql/test/library-tests/dataflow/dataflow-tests/test-source-sink.expected new file mode 100644 index 00000000000..c98bc68c884 --- /dev/null +++ b/cpp/ql/test/library-tests/dataflow/dataflow-tests/test-source-sink.expected @@ -0,0 +1,306 @@ +WARNING: Module DataFlow has been deprecated and may be removed in future (test-source-sink.ql:3,25-42) +WARNING: Module DataFlow has been deprecated and may be removed in future (test-source-sink.ql:3,57-74) +astFlow +| BarrierGuard.cpp:5:19:5:24 | source | BarrierGuard.cpp:9:10:9:15 | source | +| BarrierGuard.cpp:13:17:13:22 | source | BarrierGuard.cpp:15:10:15:15 | source | +| BarrierGuard.cpp:21:17:21:22 | source | BarrierGuard.cpp:25:10:25:15 | source | +| BarrierGuard.cpp:29:16:29:21 | source | BarrierGuard.cpp:31:10:31:15 | source | +| BarrierGuard.cpp:29:16:29:21 | source | BarrierGuard.cpp:33:10:33:15 | source | +| BarrierGuard.cpp:49:10:49:15 | call to source | BarrierGuard.cpp:51:13:51:13 | x | +| BarrierGuard.cpp:49:10:49:15 | call to source | BarrierGuard.cpp:53:13:53:13 | x | +| BarrierGuard.cpp:49:10:49:15 | call to source | BarrierGuard.cpp:55:13:55:13 | x | +| BarrierGuard.cpp:60:11:60:16 | call to source | BarrierGuard.cpp:62:14:62:14 | x | +| BarrierGuard.cpp:60:11:60:16 | call to source | BarrierGuard.cpp:64:14:64:14 | x | +| BarrierGuard.cpp:60:11:60:16 | call to source | BarrierGuard.cpp:66:14:66:14 | x | +| acrossLinkTargets.cpp:19:27:19:32 | call to source | acrossLinkTargets.cpp:12:8:12:8 | x | +| clang.cpp:12:9:12:20 | sourceArray1 | clang.cpp:18:8:18:19 | sourceArray1 | +| clang.cpp:12:9:12:20 | sourceArray1 | clang.cpp:22:8:22:20 | & ... | +| clang.cpp:12:9:12:20 | sourceArray1 | clang.cpp:23:17:23:29 | & ... | +| clang.cpp:29:27:29:32 | call to source | clang.cpp:30:27:30:28 | m1 | +| clang.cpp:29:27:29:32 | call to source | clang.cpp:31:27:31:34 | call to getFirst | +| clang.cpp:35:32:35:37 | call to source | clang.cpp:38:10:38:11 | m2 | +| clang.cpp:44:35:44:40 | call to source | clang.cpp:46:17:46:18 | m2 | +| clang.cpp:51:19:51:24 | call to source | clang.cpp:52:8:52:17 | stackArray | +| clang.cpp:51:19:51:24 | call to source | clang.cpp:53:17:53:26 | stackArray | +| dispatch.cpp:9:37:9:42 | call to source | dispatch.cpp:35:16:35:25 | call to notSource1 | +| dispatch.cpp:9:37:9:42 | call to source | dispatch.cpp:43:15:43:24 | call to notSource1 | +| dispatch.cpp:10:37:10:42 | call to source | dispatch.cpp:36:16:36:25 | call to notSource2 | +| dispatch.cpp:10:37:10:42 | call to source | dispatch.cpp:44:15:44:24 | call to notSource2 | +| dispatch.cpp:37:19:37:24 | call to source | dispatch.cpp:11:38:11:38 | x | +| dispatch.cpp:45:18:45:23 | call to source | dispatch.cpp:11:38:11:38 | x | +| globals.cpp:5:17:5:22 | call to source | globals.cpp:6:10:6:14 | local | +| lambdas.cpp:8:10:8:15 | call to source | lambdas.cpp:14:3:14:6 | t | +| lambdas.cpp:8:10:8:15 | call to source | lambdas.cpp:18:8:18:8 | call to operator() | +| lambdas.cpp:8:10:8:15 | call to source | lambdas.cpp:21:3:21:6 | t | +| lambdas.cpp:8:10:8:15 | call to source | lambdas.cpp:29:3:29:6 | t | +| lambdas.cpp:8:10:8:15 | call to source | lambdas.cpp:35:8:35:8 | a | +| lambdas.cpp:8:10:8:15 | call to source | lambdas.cpp:41:8:41:8 | a | +| lambdas.cpp:43:7:43:12 | call to source | lambdas.cpp:46:7:46:7 | w | +| ref.cpp:29:11:29:16 | call to source | ref.cpp:62:10:62:11 | x3 | +| ref.cpp:53:9:53:10 | x1 | ref.cpp:56:10:56:11 | x1 | +| ref.cpp:53:13:53:14 | x2 | ref.cpp:59:10:59:11 | x2 | +| ref.cpp:53:17:53:18 | x3 | ref.cpp:62:10:62:11 | x3 | +| ref.cpp:53:21:53:22 | x4 | ref.cpp:65:10:65:11 | x4 | +| ref.cpp:55:23:55:28 | call to source | ref.cpp:56:10:56:11 | x1 | +| ref.cpp:94:15:94:20 | call to source | ref.cpp:129:13:129:15 | val | +| ref.cpp:109:15:109:20 | call to source | ref.cpp:132:13:132:15 | val | +| ref.cpp:122:23:122:28 | call to source | ref.cpp:123:13:123:15 | val | +| ref.cpp:125:19:125:24 | call to source | ref.cpp:126:13:126:15 | val | +| self-Iterator.cpp:19:23:19:28 | call to source | self-Iterator.cpp:20:10:20:10 | x | +| test.cpp:6:12:6:17 | call to source | test.cpp:7:8:7:9 | t1 | +| test.cpp:6:12:6:17 | call to source | test.cpp:9:8:9:9 | t1 | +| test.cpp:6:12:6:17 | call to source | test.cpp:10:8:10:9 | t2 | +| test.cpp:6:12:6:17 | call to source | test.cpp:15:8:15:9 | t2 | +| test.cpp:6:12:6:17 | call to source | test.cpp:26:8:26:9 | t1 | +| test.cpp:35:10:35:15 | call to source | test.cpp:30:8:30:8 | t | +| test.cpp:36:13:36:18 | call to source | test.cpp:31:8:31:8 | c | +| test.cpp:50:14:50:19 | call to source | test.cpp:58:10:58:10 | t | +| test.cpp:66:30:66:36 | source1 | test.cpp:71:8:71:9 | x4 | +| test.cpp:75:7:75:8 | u1 | test.cpp:76:8:76:9 | u1 | +| test.cpp:83:7:83:8 | u2 | test.cpp:84:8:84:18 | ... ? ... : ... | +| test.cpp:83:7:83:8 | u2 | test.cpp:86:8:86:9 | i1 | +| test.cpp:89:28:89:34 | source1 | test.cpp:90:8:90:14 | source1 | +| test.cpp:100:13:100:18 | call to source | test.cpp:103:10:103:12 | ref | +| test.cpp:138:27:138:32 | call to source | test.cpp:140:8:140:8 | y | +| test.cpp:151:33:151:38 | call to source | test.cpp:144:8:144:8 | s | +| test.cpp:151:33:151:38 | call to source | test.cpp:152:8:152:8 | y | +| test.cpp:164:34:164:39 | call to source | test.cpp:157:8:157:8 | x | +| test.cpp:164:34:164:39 | call to source | test.cpp:165:8:165:8 | y | +| test.cpp:171:11:171:16 | call to source | test.cpp:178:8:178:8 | y | +| test.cpp:245:14:245:19 | call to source | test.cpp:260:12:260:12 | x | +| test.cpp:265:22:265:27 | call to source | test.cpp:266:12:266:12 | x | +| test.cpp:305:17:305:22 | call to source | test.cpp:289:14:289:14 | x | +| test.cpp:314:4:314:9 | call to source | test.cpp:318:7:318:7 | x | +| test.cpp:347:17:347:22 | call to source | test.cpp:349:10:349:18 | globalVar | +| test.cpp:359:13:359:18 | call to source | test.cpp:365:10:365:14 | field | +| test.cpp:373:13:373:18 | call to source | test.cpp:369:10:369:14 | field | +| test.cpp:373:13:373:18 | call to source | test.cpp:375:10:375:14 | field | +| test.cpp:382:48:382:54 | source1 | test.cpp:385:8:385:10 | tmp | +| test.cpp:388:53:388:59 | source1 | test.cpp:392:8:392:10 | tmp | +| test.cpp:388:53:388:59 | source1 | test.cpp:394:10:394:12 | tmp | +| test.cpp:399:7:399:9 | tmp | test.cpp:401:8:401:10 | tmp | +| test.cpp:405:7:405:9 | tmp | test.cpp:408:8:408:10 | tmp | +| test.cpp:416:7:416:11 | local | test.cpp:418:8:418:12 | local | +| test.cpp:417:16:417:20 | ref arg local | test.cpp:418:8:418:12 | local | +| test.cpp:422:7:422:11 | local | test.cpp:424:8:424:12 | local | +| test.cpp:423:20:423:25 | ref arg & ... | test.cpp:424:8:424:12 | local | +| test.cpp:433:7:433:11 | local | test.cpp:435:8:435:12 | local | +| test.cpp:433:7:433:11 | local | test.cpp:436:8:436:13 | * ... | +| test.cpp:434:20:434:24 | ref arg local | test.cpp:435:8:435:12 | local | +| test.cpp:434:20:434:24 | ref arg local | test.cpp:436:8:436:13 | * ... | +| test.cpp:440:7:440:11 | local | test.cpp:442:8:442:12 | local | +| test.cpp:441:18:441:23 | ref arg & ... | test.cpp:442:8:442:12 | local | +| test.cpp:448:7:448:11 | local | test.cpp:450:8:450:12 | local | +| test.cpp:448:7:448:11 | local | test.cpp:451:8:451:13 | * ... | +| test.cpp:449:18:449:22 | ref arg local | test.cpp:450:8:450:12 | local | +| test.cpp:449:18:449:22 | ref arg local | test.cpp:451:8:451:13 | * ... | +| test.cpp:456:26:456:32 | source1 | test.cpp:457:9:457:22 | (statement expression) | +| test.cpp:456:26:456:32 | source1 | test.cpp:468:8:468:12 | local | +| test.cpp:472:8:472:13 | call to source | test.cpp:478:8:478:8 | x | +| test.cpp:506:8:506:13 | call to source | test.cpp:513:8:513:8 | x | +| test.cpp:517:7:517:16 | stackArray | test.cpp:521:8:521:20 | access to array | +| test.cpp:519:19:519:24 | call to source | test.cpp:521:8:521:20 | access to array | +| test.cpp:551:9:551:9 | y | test.cpp:541:10:541:10 | y | +| test.cpp:583:11:583:16 | call to source | test.cpp:590:8:590:8 | x | +| test.cpp:628:20:628:25 | ref arg buffer | test.cpp:629:17:629:22 | buffer | +| test.cpp:633:18:633:23 | call to source | test.cpp:634:8:634:8 | x | +| test.cpp:702:38:702:43 | source | test.cpp:695:8:695:10 | buf | +| test.cpp:726:11:726:16 | call to source | test.cpp:735:8:735:8 | x | +| test.cpp:733:7:733:7 | x | test.cpp:735:8:735:8 | x | +| test.cpp:749:27:749:32 | call to source | test.cpp:740:10:740:10 | x | +| test.cpp:751:27:751:32 | call to source | test.cpp:740:10:740:10 | x | +| test.cpp:753:32:753:37 | call to source | test.cpp:740:10:740:10 | x | +| test.cpp:755:32:755:37 | call to source | test.cpp:740:10:740:10 | x | +| test.cpp:769:27:769:32 | call to source | test.cpp:760:10:760:10 | x | +| test.cpp:771:27:771:32 | call to source | test.cpp:760:10:760:10 | x | +| test.cpp:773:32:773:37 | call to source | test.cpp:760:10:760:10 | x | +| test.cpp:775:32:775:37 | call to source | test.cpp:760:10:760:10 | x | +| test.cpp:788:31:788:36 | call to source | test.cpp:782:12:782:12 | x | +| test.cpp:790:31:790:36 | call to source | test.cpp:782:12:782:12 | x | +| test.cpp:797:22:797:28 | ref arg content | test.cpp:798:19:798:25 | content | +| test.cpp:842:11:842:16 | call to source | test.cpp:844:8:844:8 | y | +| test.cpp:846:13:846:27 | call to indirect_source | test.cpp:848:23:848:25 | rpx | +| test.cpp:860:54:860:59 | call to source | test.cpp:861:10:861:37 | static_local_pointer_dynamic | +| true_upon_entry.cpp:17:11:17:16 | call to source | true_upon_entry.cpp:21:8:21:8 | x | +| true_upon_entry.cpp:27:9:27:14 | call to source | true_upon_entry.cpp:29:8:29:8 | x | +| true_upon_entry.cpp:33:11:33:16 | call to source | true_upon_entry.cpp:39:8:39:8 | x | +| true_upon_entry.cpp:43:11:43:16 | call to source | true_upon_entry.cpp:49:8:49:8 | x | +| true_upon_entry.cpp:54:11:54:16 | call to source | true_upon_entry.cpp:57:8:57:8 | x | +| true_upon_entry.cpp:70:11:70:16 | call to source | true_upon_entry.cpp:78:8:78:8 | x | +| true_upon_entry.cpp:83:11:83:16 | call to source | true_upon_entry.cpp:86:8:86:8 | x | +irFlow +| BarrierGuard.cpp:5:19:5:24 | source | BarrierGuard.cpp:9:10:9:15 | source | +| BarrierGuard.cpp:13:17:13:22 | source | BarrierGuard.cpp:15:10:15:15 | source | +| BarrierGuard.cpp:21:17:21:22 | source | BarrierGuard.cpp:25:10:25:15 | source | +| BarrierGuard.cpp:29:16:29:21 | source | BarrierGuard.cpp:31:10:31:15 | source | +| BarrierGuard.cpp:29:16:29:21 | source | BarrierGuard.cpp:33:10:33:15 | source | +| BarrierGuard.cpp:49:10:49:15 | call to source | BarrierGuard.cpp:53:13:53:13 | x | +| BarrierGuard.cpp:49:10:49:15 | call to source | BarrierGuard.cpp:55:13:55:13 | x | +| BarrierGuard.cpp:60:11:60:16 | call to source | BarrierGuard.cpp:64:14:64:14 | x | +| BarrierGuard.cpp:60:11:60:16 | call to source | BarrierGuard.cpp:66:14:66:14 | x | +| acrossLinkTargets.cpp:19:27:19:32 | call to source | acrossLinkTargets.cpp:12:8:12:8 | x | +| clang.cpp:12:9:12:20 | sourceArray1 | clang.cpp:18:8:18:19 | sourceArray1 | +| clang.cpp:12:9:12:20 | sourceArray1 | clang.cpp:23:17:23:29 | & ... indirection | +| clang.cpp:29:27:29:32 | call to source | clang.cpp:30:27:30:28 | m1 | +| clang.cpp:29:27:29:32 | call to source | clang.cpp:31:27:31:34 | call to getFirst | +| clang.cpp:35:32:35:37 | call to source | clang.cpp:38:10:38:11 | m2 | +| clang.cpp:40:42:40:47 | call to source | clang.cpp:42:18:42:19 | m2 | +| clang.cpp:44:35:44:40 | call to source | clang.cpp:46:17:46:18 | m2 | +| clang.cpp:50:7:50:16 | definition of stackArray | clang.cpp:52:8:52:17 | stackArray | +| clang.cpp:50:25:50:30 | call to source | clang.cpp:53:17:53:26 | stackArray indirection | +| clang.cpp:50:35:50:40 | call to source | clang.cpp:53:17:53:26 | stackArray indirection | +| clang.cpp:51:19:51:24 | call to source | clang.cpp:53:17:53:26 | stackArray indirection | +| dispatch.cpp:9:37:9:42 | call to source | dispatch.cpp:35:16:35:25 | call to notSource1 | +| dispatch.cpp:9:37:9:42 | call to source | dispatch.cpp:43:15:43:24 | call to notSource1 | +| dispatch.cpp:10:37:10:42 | call to source | dispatch.cpp:36:16:36:25 | call to notSource2 | +| dispatch.cpp:10:37:10:42 | call to source | dispatch.cpp:44:15:44:24 | call to notSource2 | +| dispatch.cpp:16:37:16:42 | call to source | dispatch.cpp:32:16:32:24 | call to isSource2 | +| dispatch.cpp:16:37:16:42 | call to source | dispatch.cpp:40:15:40:23 | call to isSource2 | +| dispatch.cpp:22:37:22:42 | call to source | dispatch.cpp:31:16:31:24 | call to isSource1 | +| dispatch.cpp:22:37:22:42 | call to source | dispatch.cpp:39:15:39:23 | call to isSource1 | +| dispatch.cpp:22:37:22:42 | call to source | dispatch.cpp:55:22:55:30 | call to isSource1 | +| dispatch.cpp:22:37:22:42 | call to source | dispatch.cpp:58:28:58:36 | call to isSource1 | +| dispatch.cpp:33:18:33:23 | call to source | dispatch.cpp:23:38:23:38 | x | +| dispatch.cpp:37:19:37:24 | call to source | dispatch.cpp:11:38:11:38 | x | +| dispatch.cpp:41:17:41:22 | call to source | dispatch.cpp:23:38:23:38 | x | +| dispatch.cpp:45:18:45:23 | call to source | dispatch.cpp:11:38:11:38 | x | +| dispatch.cpp:69:15:69:20 | call to source | dispatch.cpp:23:38:23:38 | x | +| dispatch.cpp:73:14:73:19 | call to source | dispatch.cpp:23:38:23:38 | x | +| dispatch.cpp:81:13:81:18 | call to source | dispatch.cpp:23:38:23:38 | x | +| dispatch.cpp:107:17:107:22 | call to source | dispatch.cpp:96:8:96:8 | x | +| dispatch.cpp:140:8:140:13 | call to source | dispatch.cpp:96:8:96:8 | x | +| dispatch.cpp:144:8:144:13 | call to source | dispatch.cpp:96:8:96:8 | x | +| flowOut.cpp:5:16:5:21 | call to source | flowOut.cpp:19:9:19:9 | x | +| globals.cpp:5:17:5:22 | call to source | globals.cpp:6:10:6:14 | local | +| globals.cpp:13:23:13:28 | call to source | globals.cpp:12:10:12:24 | flowTestGlobal1 | +| globals.cpp:23:23:23:28 | call to source | globals.cpp:19:10:19:24 | flowTestGlobal2 | +| lambdas.cpp:8:10:8:15 | call to source | lambdas.cpp:14:8:14:8 | t | +| lambdas.cpp:8:10:8:15 | call to source | lambdas.cpp:18:8:18:8 | call to operator() | +| lambdas.cpp:8:10:8:15 | call to source | lambdas.cpp:21:8:21:8 | t | +| lambdas.cpp:8:10:8:15 | call to source | lambdas.cpp:29:8:29:8 | t | +| lambdas.cpp:8:10:8:15 | call to source | lambdas.cpp:35:8:35:8 | a | +| lambdas.cpp:8:10:8:15 | call to source | lambdas.cpp:41:8:41:8 | a | +| lambdas.cpp:43:7:43:12 | call to source | lambdas.cpp:46:7:46:7 | w | +| ref.cpp:29:11:29:16 | call to source | ref.cpp:62:10:62:11 | x3 | +| ref.cpp:53:9:53:10 | definition of x1 | ref.cpp:56:10:56:11 | x1 | +| ref.cpp:53:13:53:14 | definition of x2 | ref.cpp:59:10:59:11 | x2 | +| ref.cpp:53:17:53:18 | definition of x3 | ref.cpp:62:10:62:11 | x3 | +| ref.cpp:53:21:53:22 | definition of x4 | ref.cpp:65:10:65:11 | x4 | +| ref.cpp:55:23:55:28 | call to source | ref.cpp:56:10:56:11 | x1 | +| ref.cpp:94:15:94:20 | call to source | ref.cpp:129:13:129:15 | val | +| ref.cpp:109:15:109:20 | call to source | ref.cpp:132:13:132:15 | val | +| ref.cpp:122:23:122:28 | call to source | ref.cpp:123:13:123:15 | val | +| ref.cpp:125:19:125:24 | call to source | ref.cpp:126:13:126:15 | val | +| self-Iterator.cpp:19:23:19:30 | call to source | self-Iterator.cpp:20:10:20:10 | x | +| test.cpp:6:12:6:17 | call to source | test.cpp:7:8:7:9 | t1 | +| test.cpp:6:12:6:17 | call to source | test.cpp:9:8:9:9 | t1 | +| test.cpp:6:12:6:17 | call to source | test.cpp:10:8:10:9 | t2 | +| test.cpp:6:12:6:17 | call to source | test.cpp:15:8:15:9 | t2 | +| test.cpp:6:12:6:17 | call to source | test.cpp:26:8:26:9 | t1 | +| test.cpp:35:10:35:15 | call to source | test.cpp:30:8:30:8 | t | +| test.cpp:36:13:36:18 | call to source | test.cpp:31:8:31:8 | c | +| test.cpp:50:14:50:19 | call to source | test.cpp:58:10:58:10 | t | +| test.cpp:66:30:66:36 | source1 | test.cpp:71:8:71:9 | x4 | +| test.cpp:75:7:75:8 | definition of u1 | test.cpp:76:8:76:9 | u1 | +| test.cpp:83:7:83:8 | definition of u2 | test.cpp:84:8:84:18 | ... ? ... : ... | +| test.cpp:83:7:83:8 | definition of u2 | test.cpp:86:8:86:9 | i1 | +| test.cpp:89:28:89:34 | source1 indirection | test.cpp:90:8:90:14 | source1 | +| test.cpp:100:13:100:18 | call to source | test.cpp:103:10:103:12 | ref | +| test.cpp:138:27:138:32 | call to source | test.cpp:140:8:140:8 | y | +| test.cpp:151:33:151:38 | call to source | test.cpp:144:8:144:8 | s | +| test.cpp:151:33:151:38 | call to source | test.cpp:152:8:152:8 | y | +| test.cpp:164:34:164:39 | call to source | test.cpp:157:8:157:8 | x | +| test.cpp:164:34:164:39 | call to source | test.cpp:165:8:165:8 | y | +| test.cpp:171:11:171:16 | call to source | test.cpp:178:8:178:8 | y | +| test.cpp:245:14:245:19 | call to source | test.cpp:260:12:260:12 | x | +| test.cpp:265:22:265:27 | call to source | test.cpp:266:12:266:12 | x | +| test.cpp:305:17:305:22 | call to source | test.cpp:289:14:289:14 | x | +| test.cpp:314:4:314:9 | call to source | test.cpp:318:7:318:7 | x | +| test.cpp:333:17:333:22 | call to source | test.cpp:337:10:337:18 | globalVar | +| test.cpp:333:17:333:22 | call to source | test.cpp:339:10:339:18 | globalVar | +| test.cpp:333:17:333:22 | call to source | test.cpp:343:10:343:18 | globalVar | +| test.cpp:333:17:333:22 | call to source | test.cpp:349:10:349:18 | globalVar | +| test.cpp:347:17:347:22 | call to source | test.cpp:337:10:337:18 | globalVar | +| test.cpp:347:17:347:22 | call to source | test.cpp:339:10:339:18 | globalVar | +| test.cpp:347:17:347:22 | call to source | test.cpp:343:10:343:18 | globalVar | +| test.cpp:347:17:347:22 | call to source | test.cpp:349:10:349:18 | globalVar | +| test.cpp:359:13:359:18 | call to source | test.cpp:365:10:365:14 | field | +| test.cpp:373:13:373:18 | call to source | test.cpp:369:10:369:14 | field | +| test.cpp:373:13:373:18 | call to source | test.cpp:375:10:375:14 | field | +| test.cpp:382:48:382:54 | source1 | test.cpp:385:8:385:10 | tmp | +| test.cpp:388:53:388:59 | source1 | test.cpp:392:8:392:10 | tmp | +| test.cpp:388:53:388:59 | source1 | test.cpp:394:10:394:12 | tmp | +| test.cpp:399:7:399:9 | definition of tmp | test.cpp:401:8:401:10 | tmp | +| test.cpp:405:7:405:9 | definition of tmp | test.cpp:408:8:408:10 | tmp | +| test.cpp:416:7:416:11 | definition of local | test.cpp:418:8:418:12 | local | +| test.cpp:417:16:417:20 | intRefSource output argument | test.cpp:418:8:418:12 | local | +| test.cpp:422:7:422:11 | definition of local | test.cpp:424:8:424:12 | local | +| test.cpp:423:20:423:25 | intPointerSource output argument | test.cpp:424:8:424:12 | local | +| test.cpp:433:7:433:11 | definition of local | test.cpp:435:8:435:12 | local | +| test.cpp:434:20:434:24 | intPointerSource output argument | test.cpp:436:8:436:13 | * ... | +| test.cpp:440:7:440:11 | definition of local | test.cpp:442:8:442:12 | local | +| test.cpp:441:18:441:23 | intArraySource output argument | test.cpp:442:8:442:12 | local | +| test.cpp:448:7:448:11 | definition of local | test.cpp:450:8:450:12 | local | +| test.cpp:449:18:449:22 | intArraySource output argument | test.cpp:451:8:451:13 | * ... | +| test.cpp:456:26:456:32 | source1 | test.cpp:457:9:457:22 | (statement expression) | +| test.cpp:456:26:456:32 | source1 | test.cpp:468:8:468:12 | local | +| test.cpp:472:8:472:13 | call to source | test.cpp:478:8:478:8 | x | +| test.cpp:506:8:506:13 | call to source | test.cpp:513:8:513:8 | x | +| test.cpp:519:19:519:24 | call to source | test.cpp:521:8:521:20 | access to array | +| test.cpp:531:29:531:34 | call to source | test.cpp:532:8:532:9 | * ... | +| test.cpp:547:9:547:9 | definition of x | test.cpp:536:10:536:11 | * ... | +| test.cpp:551:9:551:9 | definition of y | test.cpp:541:10:541:10 | y | +| test.cpp:562:17:562:31 | call to indirect_source indirection | test.cpp:566:10:566:19 | * ... | +| test.cpp:562:17:562:31 | call to indirect_source indirection | test.cpp:568:10:568:19 | * ... | +| test.cpp:562:17:562:31 | call to indirect_source indirection | test.cpp:572:10:572:19 | * ... | +| test.cpp:562:17:562:31 | call to indirect_source indirection | test.cpp:578:10:578:19 | * ... | +| test.cpp:576:17:576:31 | call to indirect_source indirection | test.cpp:566:10:566:19 | * ... | +| test.cpp:576:17:576:31 | call to indirect_source indirection | test.cpp:568:10:568:19 | * ... | +| test.cpp:576:17:576:31 | call to indirect_source indirection | test.cpp:572:10:572:19 | * ... | +| test.cpp:576:17:576:31 | call to indirect_source indirection | test.cpp:578:10:578:19 | * ... | +| test.cpp:594:12:594:26 | call to indirect_source indirection | test.cpp:597:8:597:13 | * ... | +| test.cpp:601:20:601:20 | intPointerSource output argument | test.cpp:603:8:603:9 | * ... | +| test.cpp:607:20:607:20 | intPointerSource output argument | test.cpp:609:8:609:9 | * ... | +| test.cpp:614:20:614:20 | intPointerSource output argument | test.cpp:616:8:616:17 | * ... | +| test.cpp:628:20:628:25 | intPointerSource output argument | test.cpp:629:17:629:22 | buffer indirection | +| test.cpp:633:18:633:23 | call to source | test.cpp:634:8:634:8 | x | +| test.cpp:646:7:646:12 | call to source | test.cpp:645:8:645:8 | x | +| test.cpp:660:7:660:12 | call to source | test.cpp:658:8:658:8 | x | +| test.cpp:664:18:664:23 | call to source | test.cpp:666:8:666:16 | * ... | +| test.cpp:681:7:681:12 | call to source | test.cpp:679:8:679:16 | * ... | +| test.cpp:733:7:733:7 | definition of x | test.cpp:735:8:735:8 | x | +| test.cpp:751:27:751:32 | call to source | test.cpp:740:10:740:10 | x | +| test.cpp:753:32:753:37 | call to source | test.cpp:740:10:740:10 | x | +| test.cpp:755:32:755:37 | call to source | test.cpp:740:10:740:10 | x | +| test.cpp:771:27:771:32 | call to source | test.cpp:760:10:760:10 | x | +| test.cpp:773:32:773:37 | call to source | test.cpp:760:10:760:10 | x | +| test.cpp:775:32:775:37 | call to source | test.cpp:760:10:760:10 | x | +| test.cpp:788:31:788:36 | call to source | test.cpp:782:12:782:12 | x | +| test.cpp:790:31:790:36 | call to source | test.cpp:782:12:782:12 | x | +| test.cpp:797:22:797:28 | intPointerSource output argument | test.cpp:798:19:798:25 | content indirection | +| test.cpp:808:25:808:39 | call to indirect_source indirection | test.cpp:813:19:813:35 | * ... indirection | +| test.cpp:818:26:818:31 | call to source | test.cpp:823:10:823:27 | * ... | +| test.cpp:832:21:832:26 | call to source | test.cpp:836:10:836:22 | global_direct | +| test.cpp:842:11:842:16 | call to source | test.cpp:844:8:844:8 | y | +| test.cpp:846:13:846:27 | call to indirect_source indirection | test.cpp:848:17:848:25 | rpx indirection | +| test.cpp:853:55:853:62 | call to source | test.cpp:854:10:854:36 | * ... | +| test.cpp:860:54:860:59 | call to source | test.cpp:861:10:861:37 | static_local_pointer_dynamic | +| test.cpp:872:46:872:51 | call to source | test.cpp:875:10:875:31 | global_pointer_dynamic | +| test.cpp:880:64:880:83 | indirect_source(1) indirection | test.cpp:883:10:883:45 | static_local_array_static_indirect_1 | +| test.cpp:881:64:881:83 | indirect_source(2) indirection | test.cpp:886:19:886:54 | static_local_array_static_indirect_2 indirection | +| test.cpp:890:54:890:61 | source | test.cpp:893:10:893:36 | static_local_pointer_static | +| test.cpp:891:65:891:84 | indirect_source(1) indirection | test.cpp:895:19:895:56 | static_local_pointer_static_indirect_1 indirection | +| test.cpp:901:56:901:75 | indirect_source(1) indirection | test.cpp:907:10:907:39 | global_array_static_indirect_1 | +| test.cpp:902:56:902:75 | indirect_source(2) indirection | test.cpp:911:19:911:48 | global_array_static_indirect_2 indirection | +| test.cpp:914:46:914:53 | source | test.cpp:919:10:919:30 | global_pointer_static | +| test.cpp:915:57:915:76 | indirect_source(1) indirection | test.cpp:921:19:921:50 | global_pointer_static_indirect_1 indirection | +| true_upon_entry.cpp:9:11:9:16 | call to source | true_upon_entry.cpp:13:8:13:8 | x | +| true_upon_entry.cpp:17:11:17:16 | call to source | true_upon_entry.cpp:21:8:21:8 | x | +| true_upon_entry.cpp:27:9:27:14 | call to source | true_upon_entry.cpp:29:8:29:8 | x | +| true_upon_entry.cpp:33:11:33:16 | call to source | true_upon_entry.cpp:39:8:39:8 | x | +| true_upon_entry.cpp:43:11:43:16 | call to source | true_upon_entry.cpp:49:8:49:8 | x | +| true_upon_entry.cpp:54:11:54:16 | call to source | true_upon_entry.cpp:57:8:57:8 | x | +| true_upon_entry.cpp:62:11:62:16 | call to source | true_upon_entry.cpp:66:8:66:8 | x | +| true_upon_entry.cpp:70:11:70:16 | call to source | true_upon_entry.cpp:78:8:78:8 | x | +| true_upon_entry.cpp:83:11:83:16 | call to source | true_upon_entry.cpp:86:8:86:8 | x | +| true_upon_entry.cpp:98:11:98:16 | call to source | true_upon_entry.cpp:105:8:105:8 | x | diff --git a/cpp/ql/test/library-tests/dataflow/dataflow-tests/test-source-sink.ql b/cpp/ql/test/library-tests/dataflow/dataflow-tests/test-source-sink.ql new file mode 100644 index 00000000000..4198e007d2e --- /dev/null +++ b/cpp/ql/test/library-tests/dataflow/dataflow-tests/test-source-sink.ql @@ -0,0 +1,9 @@ +import TestBase + +query predicate astFlow(AstTest::DataFlow::Node source, AstTest::DataFlow::Node sink) { + AstTest::AstFlow::flow(source, sink) +} + +query predicate irFlow(IRTest::DataFlow::Node source, IRTest::DataFlow::Node sink) { + IRTest::IRFlow::flow(source, sink) +} diff --git a/cpp/ql/test/library-tests/dataflow/dataflow-tests/test.cpp b/cpp/ql/test/library-tests/dataflow/dataflow-tests/test.cpp index 73c9fd28b93..b5883963620 100644 --- a/cpp/ql/test/library-tests/dataflow/dataflow-tests/test.cpp +++ b/cpp/ql/test/library-tests/dataflow/dataflow-tests/test.cpp @@ -1,5 +1,5 @@ int source(); -void sink(int); void sink(const int *); void sink(int **); void indirect_sink(...); +void sink(...); void indirect_sink(...); void intraprocedural_with_local_flow() { int t2; @@ -836,4 +836,90 @@ namespace MoreGlobalTests { sink(global_direct); // $ ir MISSING: ast indirect_sink(global_direct); // clean } +} + +void test_references() { + int x = source(); + int &y = x; + sink(y); // $ ast,ir + + int* px = indirect_source(); + int*& rpx = px; + indirect_sink((int*)rpx); // $ ast,ir +} + +namespace GlobalArrays { + void test1() { + static const int static_local_array_dynamic[] = { ::source() }; + sink(*static_local_array_dynamic); // $ ir MISSING: ast + } + + const int* source(bool); + + void test2() { + static const int* static_local_pointer_dynamic = source(true); + sink(static_local_pointer_dynamic); // $ ast,ir + } + + static const int global_array_dynamic[] = { ::source() }; + + void test3() { + sink(*global_array_dynamic); // $ MISSING: ir,ast // Missing in IR because no 'IRFunction' for global_array is generated because the type of global_array_dynamic is "deeply const". + } + + const int* source(bool); + + static const int* global_pointer_dynamic = source(true); + + void test4() { + sink(global_pointer_dynamic); // $ ir MISSING: ast + } + + void test5() { + static const char static_local_array_static[] = "source"; + static const char static_local_array_static_indirect_1[] = "indirect_source(1)"; + static const char static_local_array_static_indirect_2[] = "indirect_source(2)"; + sink(static_local_array_static); // clean + sink(static_local_array_static_indirect_1); // $ ir MISSING: ast + indirect_sink(static_local_array_static_indirect_1); // clean + sink(static_local_array_static_indirect_2); // clean + indirect_sink(static_local_array_static_indirect_2); // $ ir MISSING: ast + } + + void test6() { + static const char* static_local_pointer_static = "source"; + static const char* static_local_pointer_static_indirect_1 = "indirect_source(1)"; + static const char* static_local_pointer_static_indirect_2 = "indirect_source(2)"; + sink(static_local_pointer_static); // $ ir MISSING: ast + sink(static_local_pointer_static_indirect_1); // clean + indirect_sink(static_local_pointer_static_indirect_1); // $ ir MISSING: ast + sink(static_local_pointer_static_indirect_2); // clean: static_local_pointer_static_indirect_2 does not have 2 indirections + indirect_sink(static_local_pointer_static_indirect_2); // clean: static_local_pointer_static_indirect_2 does not have 2 indirections + } + + static const char global_array_static[] = "source"; + static const char global_array_static_indirect_1[] = "indirect_source(1)"; + static const char global_array_static_indirect_2[] = "indirect_source(2)"; + + void test7() { + sink(global_array_static); // clean + sink(*global_array_static); // clean + sink(global_array_static_indirect_1); // $ ir MISSING: ast + sink(*global_array_static_indirect_1); // clean + indirect_sink(global_array_static); // clean + indirect_sink(global_array_static_indirect_1); // clean + indirect_sink(global_array_static_indirect_2); // $ ir MISSING: ast + } + + static const char* global_pointer_static = "source"; + static const char* global_pointer_static_indirect_1 = "indirect_source(1)"; + static const char* global_pointer_static_indirect_2 = "indirect_source(2)"; + + void test8() { + sink(global_pointer_static); // $ ir MISSING: ast + sink(global_pointer_static_indirect_1); // clean + indirect_sink(global_pointer_static_indirect_1); // $ ir MISSING: ast + sink(global_pointer_static_indirect_2); // clean: global_pointer_static_indirect_2 does not have 2 indirections + indirect_sink(global_pointer_static_indirect_2); // clean: global_pointer_static_indirect_2 does not have 2 indirections + } } \ No newline at end of file diff --git a/cpp/ql/test/library-tests/dataflow/dataflow-tests/test.expected b/cpp/ql/test/library-tests/dataflow/dataflow-tests/test.expected index d4756e8d808..8ec8033d086 100644 --- a/cpp/ql/test/library-tests/dataflow/dataflow-tests/test.expected +++ b/cpp/ql/test/library-tests/dataflow/dataflow-tests/test.expected @@ -1,9 +1,2 @@ -WARNING: Module DataFlow has been deprecated and may be removed in future (test.ql:19,45-53) -WARNING: Module DataFlow has been deprecated and may be removed in future (test.ql:20,24-32) -WARNING: Module DataFlow has been deprecated and may be removed in future (test.ql:27,15-23) -WARNING: Module DataFlow has been deprecated and may be removed in future (test.ql:33,22-30) -WARNING: Module DataFlow has been deprecated and may be removed in future (test.ql:40,25-33) -WARNING: Module DataFlow has been deprecated and may be removed in future (test.ql:42,17-25) -WARNING: Module DataFlow has been deprecated and may be removed in future (test.ql:46,20-28) testFailures failures diff --git a/cpp/ql/test/library-tests/dataflow/dataflow-tests/test.ql b/cpp/ql/test/library-tests/dataflow/dataflow-tests/test.ql index ea27ec0d51d..05e1112d5f3 100644 --- a/cpp/ql/test/library-tests/dataflow/dataflow-tests/test.ql +++ b/cpp/ql/test/library-tests/dataflow/dataflow-tests/test.ql @@ -1,107 +1,3 @@ +import TestBase import TestUtilities.dataflow.FlowTestCommon - -module AstTest { - private import semmle.code.cpp.dataflow.DataFlow - private import semmle.code.cpp.controlflow.Guards - - /** - * A `BarrierGuard` that stops flow to all occurrences of `x` within statement - * S in `if (guarded(x)) S`. - */ - // This is tested in `BarrierGuard.cpp`. - predicate testBarrierGuard(GuardCondition g, Expr checked, boolean isTrue) { - g.(FunctionCall).getTarget().getName() = "guarded" and - checked = g.(FunctionCall).getArgument(0) and - isTrue = true - } - - /** Common data flow configuration to be used by tests. */ - module AstTestAllocationConfig implements DataFlow::ConfigSig { - predicate isSource(DataFlow::Node source) { - source.asExpr().(FunctionCall).getTarget().getName() = "source" - or - source.asParameter().getName().matches("source%") - or - source.asExpr().(FunctionCall).getTarget().getName() = "indirect_source" - or - source.(DataFlow::DefinitionByReferenceNode).getParameter().getName().matches("ref_source%") - or - // Track uninitialized variables - exists(source.asUninitialized()) - } - - predicate isSink(DataFlow::Node sink) { - exists(FunctionCall call | - call.getTarget().getName() = ["sink", "indirect_sink"] and - sink.asExpr() = call.getAnArgument() - ) - } - - predicate isBarrier(DataFlow::Node barrier) { - barrier.asExpr().(VariableAccess).getTarget().hasName("barrier") or - barrier = DataFlow::BarrierGuard::getABarrierNode() - } - } - - module AstFlow = DataFlow::Global; -} - -module IRTest { - private import cpp - private import semmle.code.cpp.ir.dataflow.DataFlow - private import semmle.code.cpp.ir.IR - private import semmle.code.cpp.controlflow.IRGuards - - /** - * A `BarrierGuard` that stops flow to all occurrences of `x` within statement - * S in `if (guarded(x)) S`. - */ - // This is tested in `BarrierGuard.cpp`. - predicate testBarrierGuard(IRGuardCondition g, Expr checked, boolean isTrue) { - exists(Call call | - call = g.getUnconvertedResultExpression() and - call.getTarget().hasName("guarded") and - checked = call.getArgument(0) and - isTrue = true - ) - } - - /** Common data flow configuration to be used by tests. */ - module IRTestAllocationConfig implements DataFlow::ConfigSig { - predicate isSource(DataFlow::Node source) { - source.asExpr().(FunctionCall).getTarget().getName() = "source" - or - source.asIndirectExpr(1).(FunctionCall).getTarget().getName() = "indirect_source" - or - source.asParameter().getName().matches("source%") - or - source.(DataFlow::DefinitionByReferenceNode).getParameter().getName().matches("ref_source%") - or - exists(source.asUninitialized()) - } - - predicate isSink(DataFlow::Node sink) { - exists(FunctionCall call, Expr e | e = call.getAnArgument() | - call.getTarget().getName() = "sink" and - sink.asExpr() = e - or - call.getTarget().getName() = "indirect_sink" and - sink.asIndirectExpr() = e - ) - } - - predicate isBarrier(DataFlow::Node barrier) { - exists(Expr barrierExpr | barrierExpr in [barrier.asExpr(), barrier.asIndirectExpr()] | - barrierExpr.(VariableAccess).getTarget().hasName("barrier") - ) - or - barrier = DataFlow::BarrierGuard::getABarrierNode() - or - barrier = DataFlow::BarrierGuard::getAnIndirectBarrierNode() - } - } - - module IRFlow = DataFlow::Global; -} - import MakeTest, IRFlowTest>> diff --git a/cpp/ql/test/query-tests/Likely Bugs/Memory Management/ReturnStackAllocatedMemory/ReturnStackAllocatedMemory.expected b/cpp/ql/test/query-tests/Likely Bugs/Memory Management/ReturnStackAllocatedMemory/ReturnStackAllocatedMemory.expected index b7b598a13c5..6aa457b1e8a 100644 --- a/cpp/ql/test/query-tests/Likely Bugs/Memory Management/ReturnStackAllocatedMemory/ReturnStackAllocatedMemory.expected +++ b/cpp/ql/test/query-tests/Likely Bugs/Memory Management/ReturnStackAllocatedMemory/ReturnStackAllocatedMemory.expected @@ -43,6 +43,11 @@ edges | test.cpp:189:16:189:16 | p | test.cpp:189:16:189:16 | (reference to) | | test.cpp:190:10:190:13 | (reference dereference) | test.cpp:190:10:190:13 | (reference to) | | test.cpp:190:10:190:13 | pRef | test.cpp:190:10:190:13 | (reference dereference) | +| test.cpp:237:12:237:17 | call to alloca | test.cpp:237:12:237:17 | call to alloca | +| test.cpp:237:12:237:17 | call to alloca | test.cpp:238:9:238:9 | p | +| test.cpp:249:13:249:20 | call to strndupa | test.cpp:249:13:249:20 | call to strndupa | +| test.cpp:249:13:249:20 | call to strndupa | test.cpp:250:9:250:10 | s2 | +| test.cpp:250:9:250:10 | s2 | test.cpp:250:9:250:10 | (void *)... | nodes | test.cpp:17:9:17:11 | & ... | semmle.label | & ... | | test.cpp:17:10:17:11 | mc | semmle.label | mc | @@ -101,6 +106,14 @@ nodes | test.cpp:190:10:190:13 | (reference dereference) | semmle.label | (reference dereference) | | test.cpp:190:10:190:13 | (reference to) | semmle.label | (reference to) | | test.cpp:190:10:190:13 | pRef | semmle.label | pRef | +| test.cpp:237:12:237:17 | call to alloca | semmle.label | call to alloca | +| test.cpp:237:12:237:17 | call to alloca | semmle.label | call to alloca | +| test.cpp:238:9:238:9 | p | semmle.label | p | +| test.cpp:245:9:245:15 | call to strdupa | semmle.label | call to strdupa | +| test.cpp:249:13:249:20 | call to strndupa | semmle.label | call to strndupa | +| test.cpp:249:13:249:20 | call to strndupa | semmle.label | call to strndupa | +| test.cpp:250:9:250:10 | (void *)... | semmle.label | (void *)... | +| test.cpp:250:9:250:10 | s2 | semmle.label | s2 | #select | test.cpp:17:9:17:11 | CopyValue: & ... | test.cpp:17:10:17:11 | mc | test.cpp:17:9:17:11 | & ... | May return stack-allocated memory from $@. | test.cpp:17:10:17:11 | mc | mc | | test.cpp:25:9:25:11 | Load: ptr | test.cpp:23:18:23:19 | mc | test.cpp:25:9:25:11 | ptr | May return stack-allocated memory from $@. | test.cpp:23:18:23:19 | mc | mc | @@ -115,3 +128,6 @@ nodes | test.cpp:177:10:177:23 | Convert: (void *)... | test.cpp:176:25:176:34 | localArray | test.cpp:177:10:177:23 | (void *)... | May return stack-allocated memory from $@. | test.cpp:176:25:176:34 | localArray | localArray | | test.cpp:183:10:183:19 | CopyValue: (reference to) | test.cpp:182:21:182:27 | myLocal | test.cpp:183:10:183:19 | (reference to) | May return stack-allocated memory from $@. | test.cpp:182:21:182:27 | myLocal | myLocal | | test.cpp:190:10:190:13 | CopyValue: (reference to) | test.cpp:189:16:189:16 | p | test.cpp:190:10:190:13 | (reference to) | May return stack-allocated memory from $@. | test.cpp:189:16:189:16 | p | p | +| test.cpp:238:9:238:9 | Load: p | test.cpp:237:12:237:17 | call to alloca | test.cpp:238:9:238:9 | p | May return stack-allocated memory from $@. | test.cpp:237:12:237:17 | call to alloca | call to alloca | +| test.cpp:245:9:245:15 | Call: call to strdupa | test.cpp:245:9:245:15 | call to strdupa | test.cpp:245:9:245:15 | call to strdupa | May return stack-allocated memory from $@. | test.cpp:245:9:245:15 | call to strdupa | call to strdupa | +| test.cpp:250:9:250:10 | Convert: (void *)... | test.cpp:249:13:249:20 | call to strndupa | test.cpp:250:9:250:10 | (void *)... | May return stack-allocated memory from $@. | test.cpp:249:13:249:20 | call to strndupa | call to strndupa | diff --git a/cpp/ql/test/query-tests/Likely Bugs/Memory Management/ReturnStackAllocatedMemory/test.cpp b/cpp/ql/test/query-tests/Likely Bugs/Memory Management/ReturnStackAllocatedMemory/test.cpp index 487a4e77285..44afcd7ee5f 100644 --- a/cpp/ql/test/query-tests/Likely Bugs/Memory Management/ReturnStackAllocatedMemory/test.cpp +++ b/cpp/ql/test/query-tests/Likely Bugs/Memory Management/ReturnStackAllocatedMemory/test.cpp @@ -229,4 +229,23 @@ int* id(int* px) { void f() { int x; int* px = id(&x); // GOOD +} + +void *alloca(size_t); + +void* test_alloca() { + void* p = alloca(10); + return p; // BAD +} + +char *strdupa(const char *); +char *strndupa(const char *, size_t); + +char* test_strdupa(const char* s) { + return strdupa(s); // BAD +} + +void* test_strndupa(const char* s, size_t size) { + char* s2 = strndupa(s, size); + return s2; // BAD } \ No newline at end of file diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-114/SAMATE/UncontrolledProcessOperation/UncontrolledProcessOperation.expected b/cpp/ql/test/query-tests/Security/CWE/CWE-114/SAMATE/UncontrolledProcessOperation/UncontrolledProcessOperation.expected index 66433529adf..35161adb8f8 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-114/SAMATE/UncontrolledProcessOperation/UncontrolledProcessOperation.expected +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-114/SAMATE/UncontrolledProcessOperation/UncontrolledProcessOperation.expected @@ -1,23 +1,12 @@ edges -| test.cpp:37:73:37:76 | data | test.cpp:43:32:43:35 | data | -| test.cpp:37:73:37:76 | data | test.cpp:43:32:43:35 | data | -| test.cpp:37:73:37:76 | data indirection | test.cpp:43:32:43:35 | data | -| test.cpp:37:73:37:76 | data indirection | test.cpp:43:32:43:35 | data | -| test.cpp:64:30:64:35 | call to getenv | test.cpp:73:24:73:27 | data | -| test.cpp:64:30:64:35 | call to getenv | test.cpp:73:24:73:27 | data | -| test.cpp:64:30:64:35 | call to getenv | test.cpp:73:24:73:27 | data indirection | -| test.cpp:64:30:64:35 | call to getenv | test.cpp:73:24:73:27 | data indirection | -| test.cpp:73:24:73:27 | data | test.cpp:37:73:37:76 | data | +| test.cpp:37:73:37:76 | data indirection | test.cpp:43:32:43:35 | data indirection | +| test.cpp:64:30:64:35 | call to getenv indirection | test.cpp:73:24:73:27 | data indirection | | test.cpp:73:24:73:27 | data indirection | test.cpp:37:73:37:76 | data indirection | -subpaths nodes -| test.cpp:37:73:37:76 | data | semmle.label | data | | test.cpp:37:73:37:76 | data indirection | semmle.label | data indirection | -| test.cpp:43:32:43:35 | data | semmle.label | data | -| test.cpp:43:32:43:35 | data | semmle.label | data | -| test.cpp:64:30:64:35 | call to getenv | semmle.label | call to getenv | -| test.cpp:64:30:64:35 | call to getenv | semmle.label | call to getenv | -| test.cpp:73:24:73:27 | data | semmle.label | data | +| test.cpp:43:32:43:35 | data indirection | semmle.label | data indirection | +| test.cpp:64:30:64:35 | call to getenv indirection | semmle.label | call to getenv indirection | | test.cpp:73:24:73:27 | data indirection | semmle.label | data indirection | +subpaths #select -| test.cpp:43:32:43:35 | data | test.cpp:64:30:64:35 | call to getenv | test.cpp:43:32:43:35 | data | The value of this argument may come from $@ and is being passed to LoadLibraryA. | test.cpp:64:30:64:35 | call to getenv | call to getenv | +| test.cpp:43:32:43:35 | data indirection | test.cpp:64:30:64:35 | call to getenv indirection | test.cpp:43:32:43:35 | data indirection | The value of this argument may come from $@ and is being passed to LoadLibraryA. | test.cpp:64:30:64:35 | call to getenv indirection | an environment variable | diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-114/semmle/UncontrolledProcessOperation/UncontrolledProcessOperation.expected b/cpp/ql/test/query-tests/Security/CWE/CWE-114/semmle/UncontrolledProcessOperation/UncontrolledProcessOperation.expected index 08f5d0161d5..816c8f156e7 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-114/semmle/UncontrolledProcessOperation/UncontrolledProcessOperation.expected +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-114/semmle/UncontrolledProcessOperation/UncontrolledProcessOperation.expected @@ -1,112 +1,45 @@ edges -| test.cpp:24:30:24:36 | command | test.cpp:26:10:26:16 | command | -| test.cpp:24:30:24:36 | command | test.cpp:26:10:26:16 | command | -| test.cpp:29:30:29:36 | command | test.cpp:31:10:31:16 | command | -| test.cpp:29:30:29:36 | command | test.cpp:31:10:31:16 | command | -| test.cpp:42:18:42:23 | call to getenv | test.cpp:24:30:24:36 | command | -| test.cpp:42:18:42:34 | call to getenv | test.cpp:24:30:24:36 | command | -| test.cpp:43:18:43:23 | call to getenv | test.cpp:29:30:29:36 | command | -| test.cpp:43:18:43:34 | call to getenv | test.cpp:29:30:29:36 | command | -| test.cpp:56:12:56:17 | buffer | test.cpp:62:10:62:15 | buffer | -| test.cpp:56:12:56:17 | buffer | test.cpp:62:10:62:15 | buffer | -| test.cpp:56:12:56:17 | buffer | test.cpp:62:10:62:15 | buffer | -| test.cpp:56:12:56:17 | buffer | test.cpp:62:10:62:15 | buffer | -| test.cpp:56:12:56:17 | buffer | test.cpp:63:10:63:13 | data | -| test.cpp:56:12:56:17 | buffer | test.cpp:63:10:63:13 | data | -| test.cpp:56:12:56:17 | buffer | test.cpp:63:10:63:13 | data | -| test.cpp:56:12:56:17 | buffer | test.cpp:63:10:63:13 | data | -| test.cpp:56:12:56:17 | buffer | test.cpp:64:10:64:16 | dataref | -| test.cpp:56:12:56:17 | buffer | test.cpp:64:10:64:16 | dataref | -| test.cpp:56:12:56:17 | buffer | test.cpp:64:10:64:16 | dataref | -| test.cpp:56:12:56:17 | buffer | test.cpp:64:10:64:16 | dataref | -| test.cpp:56:12:56:17 | buffer | test.cpp:64:10:64:16 | dataref | -| test.cpp:56:12:56:17 | buffer | test.cpp:64:10:64:16 | dataref | -| test.cpp:56:12:56:17 | buffer | test.cpp:65:10:65:14 | data2 | -| test.cpp:56:12:56:17 | buffer | test.cpp:65:10:65:14 | data2 | -| test.cpp:56:12:56:17 | buffer | test.cpp:65:10:65:14 | data2 | -| test.cpp:56:12:56:17 | buffer | test.cpp:65:10:65:14 | data2 | -| test.cpp:56:12:56:17 | fgets output argument | test.cpp:62:10:62:15 | buffer | -| test.cpp:56:12:56:17 | fgets output argument | test.cpp:62:10:62:15 | buffer | -| test.cpp:56:12:56:17 | fgets output argument | test.cpp:63:10:63:13 | data | -| test.cpp:56:12:56:17 | fgets output argument | test.cpp:63:10:63:13 | data | -| test.cpp:56:12:56:17 | fgets output argument | test.cpp:64:10:64:16 | dataref | -| test.cpp:56:12:56:17 | fgets output argument | test.cpp:64:10:64:16 | dataref | -| test.cpp:56:12:56:17 | fgets output argument | test.cpp:64:10:64:16 | dataref | -| test.cpp:56:12:56:17 | fgets output argument | test.cpp:65:10:65:14 | data2 | -| test.cpp:56:12:56:17 | fgets output argument | test.cpp:65:10:65:14 | data2 | -| test.cpp:76:12:76:17 | buffer | test.cpp:78:10:78:15 | buffer | -| test.cpp:76:12:76:17 | buffer | test.cpp:78:10:78:15 | buffer | -| test.cpp:76:12:76:17 | buffer | test.cpp:78:10:78:15 | buffer | -| test.cpp:76:12:76:17 | buffer | test.cpp:78:10:78:15 | buffer | -| test.cpp:76:12:76:17 | fgets output argument | test.cpp:78:10:78:15 | buffer | -| test.cpp:76:12:76:17 | fgets output argument | test.cpp:78:10:78:15 | buffer | -| test.cpp:98:17:98:22 | buffer | test.cpp:99:15:99:20 | buffer | -| test.cpp:98:17:98:22 | buffer | test.cpp:99:15:99:20 | buffer | -| test.cpp:98:17:98:22 | buffer | test.cpp:99:15:99:20 | buffer | -| test.cpp:98:17:98:22 | buffer | test.cpp:99:15:99:20 | buffer | -| test.cpp:98:17:98:22 | recv output argument | test.cpp:99:15:99:20 | buffer | -| test.cpp:98:17:98:22 | recv output argument | test.cpp:99:15:99:20 | buffer | -| test.cpp:106:17:106:22 | buffer | test.cpp:107:15:107:20 | buffer | -| test.cpp:106:17:106:22 | buffer | test.cpp:107:15:107:20 | buffer | -| test.cpp:106:17:106:22 | buffer | test.cpp:107:15:107:20 | buffer | -| test.cpp:106:17:106:22 | buffer | test.cpp:107:15:107:20 | buffer | -| test.cpp:106:17:106:22 | recv output argument | test.cpp:107:15:107:20 | buffer | -| test.cpp:106:17:106:22 | recv output argument | test.cpp:107:15:107:20 | buffer | -| test.cpp:113:8:113:12 | call to fgets | test.cpp:114:9:114:11 | ptr | -| test.cpp:113:8:113:12 | call to fgets | test.cpp:114:9:114:11 | ptr | -| test.cpp:113:8:113:12 | call to fgets | test.cpp:114:9:114:11 | ptr | -| test.cpp:113:8:113:12 | call to fgets | test.cpp:114:9:114:11 | ptr | -subpaths +| test.cpp:24:30:24:36 | command indirection | test.cpp:26:10:26:16 | command indirection | +| test.cpp:29:30:29:36 | command indirection | test.cpp:31:10:31:16 | command indirection | +| test.cpp:42:18:42:34 | call to getenv indirection | test.cpp:24:30:24:36 | command indirection | +| test.cpp:43:18:43:34 | call to getenv indirection | test.cpp:29:30:29:36 | command indirection | +| test.cpp:56:12:56:17 | fgets output argument | test.cpp:62:10:62:15 | buffer indirection | +| test.cpp:56:12:56:17 | fgets output argument | test.cpp:63:10:63:13 | data indirection | +| test.cpp:56:12:56:17 | fgets output argument | test.cpp:64:10:64:16 | dataref indirection | +| test.cpp:56:12:56:17 | fgets output argument | test.cpp:65:10:65:14 | data2 indirection | +| test.cpp:76:12:76:17 | fgets output argument | test.cpp:78:10:78:15 | buffer indirection | +| test.cpp:98:17:98:22 | recv output argument | test.cpp:99:15:99:20 | buffer indirection | +| test.cpp:106:17:106:22 | recv output argument | test.cpp:107:15:107:20 | buffer indirection | +| test.cpp:113:8:113:12 | call to fgets indirection | test.cpp:114:9:114:11 | ptr indirection | nodes -| test.cpp:24:30:24:36 | command | semmle.label | command | -| test.cpp:26:10:26:16 | command | semmle.label | command | -| test.cpp:26:10:26:16 | command | semmle.label | command | -| test.cpp:29:30:29:36 | command | semmle.label | command | -| test.cpp:31:10:31:16 | command | semmle.label | command | -| test.cpp:31:10:31:16 | command | semmle.label | command | -| test.cpp:42:18:42:23 | call to getenv | semmle.label | call to getenv | -| test.cpp:42:18:42:34 | call to getenv | semmle.label | call to getenv | -| test.cpp:43:18:43:23 | call to getenv | semmle.label | call to getenv | -| test.cpp:43:18:43:34 | call to getenv | semmle.label | call to getenv | -| test.cpp:56:12:56:17 | buffer | semmle.label | buffer | -| test.cpp:56:12:56:17 | buffer | semmle.label | buffer | +| test.cpp:24:30:24:36 | command indirection | semmle.label | command indirection | +| test.cpp:26:10:26:16 | command indirection | semmle.label | command indirection | +| test.cpp:29:30:29:36 | command indirection | semmle.label | command indirection | +| test.cpp:31:10:31:16 | command indirection | semmle.label | command indirection | +| test.cpp:42:18:42:34 | call to getenv indirection | semmle.label | call to getenv indirection | +| test.cpp:43:18:43:34 | call to getenv indirection | semmle.label | call to getenv indirection | | test.cpp:56:12:56:17 | fgets output argument | semmle.label | fgets output argument | -| test.cpp:62:10:62:15 | buffer | semmle.label | buffer | -| test.cpp:62:10:62:15 | buffer | semmle.label | buffer | -| test.cpp:63:10:63:13 | data | semmle.label | data | -| test.cpp:63:10:63:13 | data | semmle.label | data | -| test.cpp:64:10:64:16 | dataref | semmle.label | dataref | -| test.cpp:64:10:64:16 | dataref | semmle.label | dataref | -| test.cpp:64:10:64:16 | dataref | semmle.label | dataref | -| test.cpp:65:10:65:14 | data2 | semmle.label | data2 | -| test.cpp:65:10:65:14 | data2 | semmle.label | data2 | -| test.cpp:76:12:76:17 | buffer | semmle.label | buffer | -| test.cpp:76:12:76:17 | buffer | semmle.label | buffer | +| test.cpp:62:10:62:15 | buffer indirection | semmle.label | buffer indirection | +| test.cpp:63:10:63:13 | data indirection | semmle.label | data indirection | +| test.cpp:64:10:64:16 | dataref indirection | semmle.label | dataref indirection | +| test.cpp:65:10:65:14 | data2 indirection | semmle.label | data2 indirection | | test.cpp:76:12:76:17 | fgets output argument | semmle.label | fgets output argument | -| test.cpp:78:10:78:15 | buffer | semmle.label | buffer | -| test.cpp:78:10:78:15 | buffer | semmle.label | buffer | -| test.cpp:98:17:98:22 | buffer | semmle.label | buffer | -| test.cpp:98:17:98:22 | buffer | semmle.label | buffer | +| test.cpp:78:10:78:15 | buffer indirection | semmle.label | buffer indirection | | test.cpp:98:17:98:22 | recv output argument | semmle.label | recv output argument | -| test.cpp:99:15:99:20 | buffer | semmle.label | buffer | -| test.cpp:99:15:99:20 | buffer | semmle.label | buffer | -| test.cpp:106:17:106:22 | buffer | semmle.label | buffer | -| test.cpp:106:17:106:22 | buffer | semmle.label | buffer | +| test.cpp:99:15:99:20 | buffer indirection | semmle.label | buffer indirection | | test.cpp:106:17:106:22 | recv output argument | semmle.label | recv output argument | -| test.cpp:107:15:107:20 | buffer | semmle.label | buffer | -| test.cpp:107:15:107:20 | buffer | semmle.label | buffer | -| test.cpp:113:8:113:12 | call to fgets | semmle.label | call to fgets | -| test.cpp:113:8:113:12 | call to fgets | semmle.label | call to fgets | -| test.cpp:114:9:114:11 | ptr | semmle.label | ptr | -| test.cpp:114:9:114:11 | ptr | semmle.label | ptr | +| test.cpp:107:15:107:20 | buffer indirection | semmle.label | buffer indirection | +| test.cpp:113:8:113:12 | call to fgets indirection | semmle.label | call to fgets indirection | +| test.cpp:114:9:114:11 | ptr indirection | semmle.label | ptr indirection | +subpaths #select -| test.cpp:26:10:26:16 | command | test.cpp:42:18:42:23 | call to getenv | test.cpp:26:10:26:16 | command | The value of this argument may come from $@ and is being passed to system. | test.cpp:42:18:42:23 | call to getenv | call to getenv | -| test.cpp:31:10:31:16 | command | test.cpp:43:18:43:23 | call to getenv | test.cpp:31:10:31:16 | command | The value of this argument may come from $@ and is being passed to system. | test.cpp:43:18:43:23 | call to getenv | call to getenv | -| test.cpp:62:10:62:15 | buffer | test.cpp:56:12:56:17 | buffer | test.cpp:62:10:62:15 | buffer | The value of this argument may come from $@ and is being passed to system. | test.cpp:56:12:56:17 | buffer | buffer | -| test.cpp:63:10:63:13 | data | test.cpp:56:12:56:17 | buffer | test.cpp:63:10:63:13 | data | The value of this argument may come from $@ and is being passed to system. | test.cpp:56:12:56:17 | buffer | buffer | -| test.cpp:64:10:64:16 | dataref | test.cpp:56:12:56:17 | buffer | test.cpp:64:10:64:16 | dataref | The value of this argument may come from $@ and is being passed to system. | test.cpp:56:12:56:17 | buffer | buffer | -| test.cpp:65:10:65:14 | data2 | test.cpp:56:12:56:17 | buffer | test.cpp:65:10:65:14 | data2 | The value of this argument may come from $@ and is being passed to system. | test.cpp:56:12:56:17 | buffer | buffer | -| test.cpp:78:10:78:15 | buffer | test.cpp:76:12:76:17 | buffer | test.cpp:78:10:78:15 | buffer | The value of this argument may come from $@ and is being passed to system. | test.cpp:76:12:76:17 | buffer | buffer | -| test.cpp:99:15:99:20 | buffer | test.cpp:98:17:98:22 | buffer | test.cpp:99:15:99:20 | buffer | The value of this argument may come from $@ and is being passed to LoadLibrary. | test.cpp:98:17:98:22 | buffer | buffer | -| test.cpp:107:15:107:20 | buffer | test.cpp:106:17:106:22 | buffer | test.cpp:107:15:107:20 | buffer | The value of this argument may come from $@ and is being passed to LoadLibrary. | test.cpp:106:17:106:22 | buffer | buffer | -| test.cpp:114:9:114:11 | ptr | test.cpp:113:8:113:12 | call to fgets | test.cpp:114:9:114:11 | ptr | The value of this argument may come from $@ and is being passed to system. | test.cpp:113:8:113:12 | call to fgets | call to fgets | +| test.cpp:26:10:26:16 | command indirection | test.cpp:42:18:42:34 | call to getenv indirection | test.cpp:26:10:26:16 | command indirection | The value of this argument may come from $@ and is being passed to system. | test.cpp:42:18:42:34 | call to getenv indirection | an environment variable | +| test.cpp:31:10:31:16 | command indirection | test.cpp:43:18:43:34 | call to getenv indirection | test.cpp:31:10:31:16 | command indirection | The value of this argument may come from $@ and is being passed to system. | test.cpp:43:18:43:34 | call to getenv indirection | an environment variable | +| test.cpp:62:10:62:15 | buffer indirection | test.cpp:56:12:56:17 | fgets output argument | test.cpp:62:10:62:15 | buffer indirection | The value of this argument may come from $@ and is being passed to system. | test.cpp:56:12:56:17 | fgets output argument | string read by fgets | +| test.cpp:63:10:63:13 | data indirection | test.cpp:56:12:56:17 | fgets output argument | test.cpp:63:10:63:13 | data indirection | The value of this argument may come from $@ and is being passed to system. | test.cpp:56:12:56:17 | fgets output argument | string read by fgets | +| test.cpp:64:10:64:16 | dataref indirection | test.cpp:56:12:56:17 | fgets output argument | test.cpp:64:10:64:16 | dataref indirection | The value of this argument may come from $@ and is being passed to system. | test.cpp:56:12:56:17 | fgets output argument | string read by fgets | +| test.cpp:65:10:65:14 | data2 indirection | test.cpp:56:12:56:17 | fgets output argument | test.cpp:65:10:65:14 | data2 indirection | The value of this argument may come from $@ and is being passed to system. | test.cpp:56:12:56:17 | fgets output argument | string read by fgets | +| test.cpp:78:10:78:15 | buffer indirection | test.cpp:76:12:76:17 | fgets output argument | test.cpp:78:10:78:15 | buffer indirection | The value of this argument may come from $@ and is being passed to system. | test.cpp:76:12:76:17 | fgets output argument | string read by fgets | +| test.cpp:99:15:99:20 | buffer indirection | test.cpp:98:17:98:22 | recv output argument | test.cpp:99:15:99:20 | buffer indirection | The value of this argument may come from $@ and is being passed to LoadLibrary. | test.cpp:98:17:98:22 | recv output argument | buffer read by recv | +| test.cpp:107:15:107:20 | buffer indirection | test.cpp:106:17:106:22 | recv output argument | test.cpp:107:15:107:20 | buffer indirection | The value of this argument may come from $@ and is being passed to LoadLibrary. | test.cpp:106:17:106:22 | recv output argument | buffer read by recv | +| test.cpp:114:9:114:11 | ptr indirection | test.cpp:113:8:113:12 | call to fgets indirection | test.cpp:114:9:114:11 | ptr indirection | The value of this argument may come from $@ and is being passed to system. | test.cpp:113:8:113:12 | call to fgets indirection | string read by fgets | diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-134/semmle/globalVars/UncontrolledFormatStringThroughGlobalVar.expected b/cpp/ql/test/query-tests/Security/CWE/CWE-134/semmle/globalVars/UncontrolledFormatStringThroughGlobalVar.expected deleted file mode 100644 index 6aca673fb4b..00000000000 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-134/semmle/globalVars/UncontrolledFormatStringThroughGlobalVar.expected +++ /dev/null @@ -1,69 +0,0 @@ -edges -| globalVars.c:8:7:8:10 | copy | globalVars.c:27:9:27:12 | copy | -| globalVars.c:8:7:8:10 | copy | globalVars.c:27:9:27:12 | copy | -| globalVars.c:8:7:8:10 | copy | globalVars.c:30:15:30:18 | copy | -| globalVars.c:8:7:8:10 | copy | globalVars.c:30:15:30:18 | copy | -| globalVars.c:8:7:8:10 | copy | globalVars.c:30:15:30:18 | copy | -| globalVars.c:8:7:8:10 | copy | globalVars.c:33:15:33:18 | copy | -| globalVars.c:8:7:8:10 | copy | globalVars.c:35:11:35:14 | copy | -| globalVars.c:9:7:9:11 | copy2 | globalVars.c:38:9:38:13 | copy2 | -| globalVars.c:9:7:9:11 | copy2 | globalVars.c:38:9:38:13 | copy2 | -| globalVars.c:9:7:9:11 | copy2 | globalVars.c:41:15:41:19 | copy2 | -| globalVars.c:9:7:9:11 | copy2 | globalVars.c:41:15:41:19 | copy2 | -| globalVars.c:9:7:9:11 | copy2 | globalVars.c:41:15:41:19 | copy2 | -| globalVars.c:9:7:9:11 | copy2 | globalVars.c:44:15:44:19 | copy2 | -| globalVars.c:9:7:9:11 | copy2 | globalVars.c:50:9:50:13 | copy2 | -| globalVars.c:9:7:9:11 | copy2 | globalVars.c:50:9:50:13 | copy2 | -| globalVars.c:11:22:11:25 | argv | globalVars.c:8:7:8:10 | copy | -| globalVars.c:11:22:11:25 | argv | globalVars.c:12:2:12:15 | ... = ... | -| globalVars.c:12:2:12:15 | ... = ... | globalVars.c:8:7:8:10 | copy | -| globalVars.c:15:21:15:23 | val | globalVars.c:9:7:9:11 | copy2 | -| globalVars.c:15:21:15:23 | val | globalVars.c:16:2:16:12 | ... = ... | -| globalVars.c:16:2:16:12 | ... = ... | globalVars.c:9:7:9:11 | copy2 | -| globalVars.c:24:11:24:14 | argv | globalVars.c:11:22:11:25 | argv | -| globalVars.c:24:11:24:14 | argv | globalVars.c:11:22:11:25 | argv | -| globalVars.c:30:15:30:18 | copy | globalVars.c:30:15:30:18 | copy | -| globalVars.c:30:15:30:18 | copy | globalVars.c:30:15:30:18 | copy | -| globalVars.c:30:15:30:18 | copy | globalVars.c:30:15:30:18 | copy | -| globalVars.c:30:15:30:18 | copy | globalVars.c:35:11:35:14 | copy | -| globalVars.c:33:15:33:18 | copy | globalVars.c:35:11:35:14 | copy | -| globalVars.c:35:11:35:14 | copy | globalVars.c:15:21:15:23 | val | -| globalVars.c:35:11:35:14 | copy | globalVars.c:35:11:35:14 | copy | -| globalVars.c:41:15:41:19 | copy2 | globalVars.c:41:15:41:19 | copy2 | -| globalVars.c:41:15:41:19 | copy2 | globalVars.c:41:15:41:19 | copy2 | -| globalVars.c:41:15:41:19 | copy2 | globalVars.c:41:15:41:19 | copy2 | -| globalVars.c:41:15:41:19 | copy2 | globalVars.c:50:9:50:13 | copy2 | -| globalVars.c:41:15:41:19 | copy2 | globalVars.c:50:9:50:13 | copy2 | -| globalVars.c:44:15:44:19 | copy2 | globalVars.c:50:9:50:13 | copy2 | -| globalVars.c:44:15:44:19 | copy2 | globalVars.c:50:9:50:13 | copy2 | -subpaths -nodes -| globalVars.c:8:7:8:10 | copy | semmle.label | copy | -| globalVars.c:9:7:9:11 | copy2 | semmle.label | copy2 | -| globalVars.c:11:22:11:25 | argv | semmle.label | argv | -| globalVars.c:12:2:12:15 | ... = ... | semmle.label | ... = ... | -| globalVars.c:15:21:15:23 | val | semmle.label | val | -| globalVars.c:16:2:16:12 | ... = ... | semmle.label | ... = ... | -| globalVars.c:24:11:24:14 | argv | semmle.label | argv | -| globalVars.c:24:11:24:14 | argv | semmle.label | argv | -| globalVars.c:27:9:27:12 | copy | semmle.label | copy | -| globalVars.c:27:9:27:12 | copy | semmle.label | copy | -| globalVars.c:30:15:30:18 | copy | semmle.label | copy | -| globalVars.c:30:15:30:18 | copy | semmle.label | copy | -| globalVars.c:30:15:30:18 | copy | semmle.label | copy | -| globalVars.c:33:15:33:18 | copy | semmle.label | copy | -| globalVars.c:35:11:35:14 | copy | semmle.label | copy | -| globalVars.c:38:9:38:13 | copy2 | semmle.label | copy2 | -| globalVars.c:38:9:38:13 | copy2 | semmle.label | copy2 | -| globalVars.c:41:15:41:19 | copy2 | semmle.label | copy2 | -| globalVars.c:41:15:41:19 | copy2 | semmle.label | copy2 | -| globalVars.c:41:15:41:19 | copy2 | semmle.label | copy2 | -| globalVars.c:44:15:44:19 | copy2 | semmle.label | copy2 | -| globalVars.c:50:9:50:13 | copy2 | semmle.label | copy2 | -| globalVars.c:50:9:50:13 | copy2 | semmle.label | copy2 | -#select -| globalVars.c:27:9:27:12 | copy | globalVars.c:24:11:24:14 | argv | globalVars.c:27:9:27:12 | copy | The value of this argument may come from $@ and is being used as a formatting argument to printf(format). | globalVars.c:24:11:24:14 | argv | argv | -| globalVars.c:30:15:30:18 | copy | globalVars.c:24:11:24:14 | argv | globalVars.c:30:15:30:18 | copy | The value of this argument may come from $@ and is being used as a formatting argument to printWrapper(str), which calls printf(format). | globalVars.c:24:11:24:14 | argv | argv | -| globalVars.c:38:9:38:13 | copy2 | globalVars.c:24:11:24:14 | argv | globalVars.c:38:9:38:13 | copy2 | The value of this argument may come from $@ and is being used as a formatting argument to printf(format). | globalVars.c:24:11:24:14 | argv | argv | -| globalVars.c:41:15:41:19 | copy2 | globalVars.c:24:11:24:14 | argv | globalVars.c:41:15:41:19 | copy2 | The value of this argument may come from $@ and is being used as a formatting argument to printWrapper(str), which calls printf(format). | globalVars.c:24:11:24:14 | argv | argv | -| globalVars.c:50:9:50:13 | copy2 | globalVars.c:24:11:24:14 | argv | globalVars.c:50:9:50:13 | copy2 | The value of this argument may come from $@ and is being used as a formatting argument to printf(format). | globalVars.c:24:11:24:14 | argv | argv | diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-134/semmle/globalVars/UncontrolledFormatStringThroughGlobalVar.qlref b/cpp/ql/test/query-tests/Security/CWE/CWE-134/semmle/globalVars/UncontrolledFormatStringThroughGlobalVar.qlref deleted file mode 100644 index eac059de2bb..00000000000 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-134/semmle/globalVars/UncontrolledFormatStringThroughGlobalVar.qlref +++ /dev/null @@ -1 +0,0 @@ -Security/CWE/CWE-134/UncontrolledFormatStringThroughGlobalVar.ql \ No newline at end of file diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-190/SAMATE/ArithmeticTainted.expected b/cpp/ql/test/query-tests/Security/CWE/CWE-190/SAMATE/ArithmeticTainted.expected index b86b85a91eb..d266afbe445 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-190/SAMATE/ArithmeticTainted.expected +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-190/SAMATE/ArithmeticTainted.expected @@ -1,13 +1,8 @@ edges -| examples.cpp:63:26:63:30 | & ... | examples.cpp:66:11:66:14 | data | -| examples.cpp:63:26:63:30 | & ... | examples.cpp:66:11:66:14 | data | | examples.cpp:63:26:63:30 | fscanf output argument | examples.cpp:66:11:66:14 | data | -| examples.cpp:63:26:63:30 | fscanf output argument | examples.cpp:66:11:66:14 | data | -subpaths nodes -| examples.cpp:63:26:63:30 | & ... | semmle.label | & ... | | examples.cpp:63:26:63:30 | fscanf output argument | semmle.label | fscanf output argument | | examples.cpp:66:11:66:14 | data | semmle.label | data | -| examples.cpp:66:11:66:14 | data | semmle.label | data | +subpaths #select -| examples.cpp:66:11:66:14 | data | examples.cpp:63:26:63:30 | & ... | examples.cpp:66:11:66:14 | data | $@ flows to an operand of an arithmetic expression, potentially causing an underflow. | examples.cpp:63:26:63:30 | & ... | User-provided value | +| examples.cpp:66:11:66:14 | data | examples.cpp:63:26:63:30 | fscanf output argument | examples.cpp:66:11:66:14 | data | $@ flows to an operand of an arithmetic expression, potentially causing an underflow. | examples.cpp:63:26:63:30 | fscanf output argument | value read by fscanf | diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-190/SAMATE/IntegerOverflowTainted.expected b/cpp/ql/test/query-tests/Security/CWE/CWE-190/SAMATE/IntegerOverflowTainted.expected index 81a97849431..bd2085e9863 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-190/SAMATE/IntegerOverflowTainted.expected +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-190/SAMATE/IntegerOverflowTainted.expected @@ -1 +1 @@ -| examples.cpp:66:9:66:14 | -- ... | $@ flows an expression which might overflow negatively. | examples.cpp:63:26:63:30 | & ... | User-provided value | +| examples.cpp:66:9:66:14 | -- ... | $@ flows an expression which might overflow negatively. | examples.cpp:63:26:63:30 | fscanf output argument | value read by fscanf | diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-190/semmle/tainted/ArithmeticTainted.expected b/cpp/ql/test/query-tests/Security/CWE/CWE-190/semmle/tainted/ArithmeticTainted.expected index 9b632194f4a..f3edc87450e 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-190/semmle/tainted/ArithmeticTainted.expected +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-190/semmle/tainted/ArithmeticTainted.expected @@ -1,86 +1,59 @@ edges | test2.cpp:12:21:12:21 | v | test2.cpp:14:11:14:11 | v | -| test2.cpp:12:21:12:21 | v | test2.cpp:14:11:14:11 | v | -| test2.cpp:25:22:25:23 | & ... | test2.cpp:27:13:27:13 | v | | test2.cpp:25:22:25:23 | fscanf output argument | test2.cpp:27:13:27:13 | v | | test2.cpp:27:13:27:13 | v | test2.cpp:12:21:12:21 | v | -| test2.cpp:36:9:36:14 | buffer | test2.cpp:39:9:39:11 | num | -| test2.cpp:36:9:36:14 | buffer | test2.cpp:39:9:39:11 | num | -| test2.cpp:36:9:36:14 | buffer | test2.cpp:39:9:39:11 | num | -| test2.cpp:36:9:36:14 | buffer | test2.cpp:39:9:39:11 | num | -| test2.cpp:36:9:36:14 | buffer | test2.cpp:40:3:40:5 | num | -| test2.cpp:36:9:36:14 | buffer | test2.cpp:40:3:40:5 | num | -| test2.cpp:36:9:36:14 | buffer | test2.cpp:40:3:40:5 | num | -| test2.cpp:36:9:36:14 | buffer | test2.cpp:40:3:40:5 | num | -| test2.cpp:36:9:36:14 | fgets output argument | test2.cpp:39:9:39:11 | num | | test2.cpp:36:9:36:14 | fgets output argument | test2.cpp:39:9:39:11 | num | | test2.cpp:36:9:36:14 | fgets output argument | test2.cpp:40:3:40:5 | num | -| test2.cpp:36:9:36:14 | fgets output argument | test2.cpp:40:3:40:5 | num | -| test5.cpp:5:5:5:17 | getTaintedInt indirection | test5.cpp:17:6:17:18 | call to getTaintedInt | +| test3.c:10:27:10:30 | argv indirection | test.c:14:15:14:28 | maxConnections | +| test3.c:10:27:10:30 | argv indirection | test.c:44:7:44:10 | len2 | +| test3.c:10:27:10:30 | argv indirection | test.c:54:7:54:10 | len3 | | test5.cpp:5:5:5:17 | getTaintedInt indirection | test5.cpp:17:6:17:18 | call to getTaintedInt | | test5.cpp:5:5:5:17 | getTaintedInt indirection | test5.cpp:18:6:18:18 | call to getTaintedInt | -| test5.cpp:9:7:9:9 | buf | test5.cpp:5:5:5:17 | getTaintedInt indirection | -| test5.cpp:9:7:9:9 | buf | test5.cpp:5:5:5:17 | getTaintedInt indirection | | test5.cpp:9:7:9:9 | gets output argument | test5.cpp:5:5:5:17 | getTaintedInt indirection | | test5.cpp:18:6:18:18 | call to getTaintedInt | test5.cpp:19:6:19:6 | y | -| test5.cpp:18:6:18:18 | call to getTaintedInt | test5.cpp:19:6:19:6 | y | -| test.c:11:29:11:32 | argv | test.c:14:15:14:28 | maxConnections | -| test.c:11:29:11:32 | argv | test.c:14:15:14:28 | maxConnections | -| test.c:11:29:11:32 | argv | test.c:14:15:14:28 | maxConnections | -| test.c:11:29:11:32 | argv | test.c:14:15:14:28 | maxConnections | -| test.c:41:17:41:20 | argv | test.c:44:7:44:10 | len2 | -| test.c:41:17:41:20 | argv | test.c:44:7:44:10 | len2 | -| test.c:41:17:41:20 | argv | test.c:44:7:44:10 | len2 | -| test.c:41:17:41:20 | argv | test.c:44:7:44:10 | len2 | -| test.c:51:17:51:20 | argv | test.c:54:7:54:10 | len3 | -| test.c:51:17:51:20 | argv | test.c:54:7:54:10 | len3 | -| test.c:51:17:51:20 | argv | test.c:54:7:54:10 | len3 | -| test.c:51:17:51:20 | argv | test.c:54:7:54:10 | len3 | -subpaths +| test.c:10:27:10:30 | argv indirection | test.c:14:15:14:28 | maxConnections | +| test.c:10:27:10:30 | argv indirection | test.c:44:7:44:10 | len2 | +| test.c:10:27:10:30 | argv indirection | test.c:54:7:54:10 | len3 | nodes | test2.cpp:12:21:12:21 | v | semmle.label | v | | test2.cpp:14:11:14:11 | v | semmle.label | v | -| test2.cpp:14:11:14:11 | v | semmle.label | v | -| test2.cpp:25:22:25:23 | & ... | semmle.label | & ... | | test2.cpp:25:22:25:23 | fscanf output argument | semmle.label | fscanf output argument | | test2.cpp:27:13:27:13 | v | semmle.label | v | -| test2.cpp:36:9:36:14 | buffer | semmle.label | buffer | -| test2.cpp:36:9:36:14 | buffer | semmle.label | buffer | | test2.cpp:36:9:36:14 | fgets output argument | semmle.label | fgets output argument | | test2.cpp:39:9:39:11 | num | semmle.label | num | -| test2.cpp:39:9:39:11 | num | semmle.label | num | -| test2.cpp:40:3:40:5 | num | semmle.label | num | | test2.cpp:40:3:40:5 | num | semmle.label | num | +| test3.c:10:27:10:30 | argv indirection | semmle.label | argv indirection | | test5.cpp:5:5:5:17 | getTaintedInt indirection | semmle.label | getTaintedInt indirection | -| test5.cpp:9:7:9:9 | buf | semmle.label | buf | -| test5.cpp:9:7:9:9 | buf | semmle.label | buf | | test5.cpp:9:7:9:9 | gets output argument | semmle.label | gets output argument | | test5.cpp:17:6:17:18 | call to getTaintedInt | semmle.label | call to getTaintedInt | -| test5.cpp:17:6:17:18 | call to getTaintedInt | semmle.label | call to getTaintedInt | | test5.cpp:18:6:18:18 | call to getTaintedInt | semmle.label | call to getTaintedInt | | test5.cpp:19:6:19:6 | y | semmle.label | y | -| test5.cpp:19:6:19:6 | y | semmle.label | y | -| test.c:11:29:11:32 | argv | semmle.label | argv | -| test.c:11:29:11:32 | argv | semmle.label | argv | +| test.c:10:27:10:30 | argv indirection | semmle.label | argv indirection | | test.c:14:15:14:28 | maxConnections | semmle.label | maxConnections | -| test.c:14:15:14:28 | maxConnections | semmle.label | maxConnections | -| test.c:41:17:41:20 | argv | semmle.label | argv | -| test.c:41:17:41:20 | argv | semmle.label | argv | | test.c:44:7:44:10 | len2 | semmle.label | len2 | -| test.c:44:7:44:10 | len2 | semmle.label | len2 | -| test.c:51:17:51:20 | argv | semmle.label | argv | -| test.c:51:17:51:20 | argv | semmle.label | argv | -| test.c:54:7:54:10 | len3 | semmle.label | len3 | | test.c:54:7:54:10 | len3 | semmle.label | len3 | +subpaths #select -| test2.cpp:14:11:14:11 | v | test2.cpp:25:22:25:23 | & ... | test2.cpp:14:11:14:11 | v | $@ flows to an operand of an arithmetic expression, potentially causing an overflow. | test2.cpp:25:22:25:23 | & ... | User-provided value | -| test2.cpp:14:11:14:11 | v | test2.cpp:25:22:25:23 | & ... | test2.cpp:14:11:14:11 | v | $@ flows to an operand of an arithmetic expression, potentially causing an underflow. | test2.cpp:25:22:25:23 | & ... | User-provided value | -| test2.cpp:39:9:39:11 | num | test2.cpp:36:9:36:14 | buffer | test2.cpp:39:9:39:11 | num | $@ flows to an operand of an arithmetic expression, potentially causing an overflow. | test2.cpp:36:9:36:14 | buffer | User-provided value | -| test2.cpp:40:3:40:5 | num | test2.cpp:36:9:36:14 | buffer | test2.cpp:40:3:40:5 | num | $@ flows to an operand of an arithmetic expression, potentially causing an overflow. | test2.cpp:36:9:36:14 | buffer | User-provided value | -| test5.cpp:17:6:17:18 | call to getTaintedInt | test5.cpp:9:7:9:9 | buf | test5.cpp:17:6:17:18 | call to getTaintedInt | $@ flows to an operand of an arithmetic expression, potentially causing an overflow. | test5.cpp:9:7:9:9 | buf | User-provided value | -| test5.cpp:19:6:19:6 | y | test5.cpp:9:7:9:9 | buf | test5.cpp:19:6:19:6 | y | $@ flows to an operand of an arithmetic expression, potentially causing an overflow. | test5.cpp:9:7:9:9 | buf | User-provided value | -| test5.cpp:19:6:19:6 | y | test5.cpp:9:7:9:9 | buf | test5.cpp:19:6:19:6 | y | $@ flows to an operand of an arithmetic expression, potentially causing an underflow. | test5.cpp:9:7:9:9 | buf | User-provided value | -| test.c:14:15:14:28 | maxConnections | test.c:11:29:11:32 | argv | test.c:14:15:14:28 | maxConnections | $@ flows to an operand of an arithmetic expression, potentially causing an overflow. | test.c:11:29:11:32 | argv | User-provided value | -| test.c:14:15:14:28 | maxConnections | test.c:11:29:11:32 | argv | test.c:14:15:14:28 | maxConnections | $@ flows to an operand of an arithmetic expression, potentially causing an underflow. | test.c:11:29:11:32 | argv | User-provided value | -| test.c:44:7:44:10 | len2 | test.c:41:17:41:20 | argv | test.c:44:7:44:10 | len2 | $@ flows to an operand of an arithmetic expression, potentially causing an underflow. | test.c:41:17:41:20 | argv | User-provided value | -| test.c:54:7:54:10 | len3 | test.c:51:17:51:20 | argv | test.c:54:7:54:10 | len3 | $@ flows to an operand of an arithmetic expression, potentially causing an underflow. | test.c:51:17:51:20 | argv | User-provided value | +| test2.cpp:14:11:14:11 | v | test2.cpp:25:22:25:23 | fscanf output argument | test2.cpp:14:11:14:11 | v | $@ flows to an operand of an arithmetic expression, potentially causing an overflow. | test2.cpp:25:22:25:23 | fscanf output argument | value read by fscanf | +| test2.cpp:14:11:14:11 | v | test2.cpp:25:22:25:23 | fscanf output argument | test2.cpp:14:11:14:11 | v | $@ flows to an operand of an arithmetic expression, potentially causing an underflow. | test2.cpp:25:22:25:23 | fscanf output argument | value read by fscanf | +| test2.cpp:39:9:39:11 | num | test2.cpp:36:9:36:14 | fgets output argument | test2.cpp:39:9:39:11 | num | $@ flows to an operand of an arithmetic expression, potentially causing an overflow. | test2.cpp:36:9:36:14 | fgets output argument | string read by fgets | +| test2.cpp:40:3:40:5 | num | test2.cpp:36:9:36:14 | fgets output argument | test2.cpp:40:3:40:5 | num | $@ flows to an operand of an arithmetic expression, potentially causing an overflow. | test2.cpp:36:9:36:14 | fgets output argument | string read by fgets | +| test5.cpp:17:6:17:18 | call to getTaintedInt | test5.cpp:9:7:9:9 | gets output argument | test5.cpp:17:6:17:18 | call to getTaintedInt | $@ flows to an operand of an arithmetic expression, potentially causing an overflow. | test5.cpp:9:7:9:9 | gets output argument | string read by gets | +| test5.cpp:19:6:19:6 | y | test5.cpp:9:7:9:9 | gets output argument | test5.cpp:19:6:19:6 | y | $@ flows to an operand of an arithmetic expression, potentially causing an overflow. | test5.cpp:9:7:9:9 | gets output argument | string read by gets | +| test5.cpp:19:6:19:6 | y | test5.cpp:9:7:9:9 | gets output argument | test5.cpp:19:6:19:6 | y | $@ flows to an operand of an arithmetic expression, potentially causing an underflow. | test5.cpp:9:7:9:9 | gets output argument | string read by gets | +| test.c:14:15:14:28 | maxConnections | test3.c:10:27:10:30 | argv indirection | test.c:14:15:14:28 | maxConnections | $@ flows to an operand of an arithmetic expression, potentially causing an overflow. | test3.c:10:27:10:30 | argv indirection | a command-line argument | +| test.c:14:15:14:28 | maxConnections | test3.c:10:27:10:30 | argv indirection | test.c:14:15:14:28 | maxConnections | $@ flows to an operand of an arithmetic expression, potentially causing an overflow. | test.c:10:27:10:30 | argv indirection | a command-line argument | +| test.c:14:15:14:28 | maxConnections | test3.c:10:27:10:30 | argv indirection | test.c:14:15:14:28 | maxConnections | $@ flows to an operand of an arithmetic expression, potentially causing an underflow. | test3.c:10:27:10:30 | argv indirection | a command-line argument | +| test.c:14:15:14:28 | maxConnections | test3.c:10:27:10:30 | argv indirection | test.c:14:15:14:28 | maxConnections | $@ flows to an operand of an arithmetic expression, potentially causing an underflow. | test.c:10:27:10:30 | argv indirection | a command-line argument | +| test.c:14:15:14:28 | maxConnections | test.c:10:27:10:30 | argv indirection | test.c:14:15:14:28 | maxConnections | $@ flows to an operand of an arithmetic expression, potentially causing an overflow. | test3.c:10:27:10:30 | argv indirection | a command-line argument | +| test.c:14:15:14:28 | maxConnections | test.c:10:27:10:30 | argv indirection | test.c:14:15:14:28 | maxConnections | $@ flows to an operand of an arithmetic expression, potentially causing an overflow. | test.c:10:27:10:30 | argv indirection | a command-line argument | +| test.c:14:15:14:28 | maxConnections | test.c:10:27:10:30 | argv indirection | test.c:14:15:14:28 | maxConnections | $@ flows to an operand of an arithmetic expression, potentially causing an underflow. | test3.c:10:27:10:30 | argv indirection | a command-line argument | +| test.c:14:15:14:28 | maxConnections | test.c:10:27:10:30 | argv indirection | test.c:14:15:14:28 | maxConnections | $@ flows to an operand of an arithmetic expression, potentially causing an underflow. | test.c:10:27:10:30 | argv indirection | a command-line argument | +| test.c:44:7:44:10 | len2 | test3.c:10:27:10:30 | argv indirection | test.c:44:7:44:10 | len2 | $@ flows to an operand of an arithmetic expression, potentially causing an underflow. | test3.c:10:27:10:30 | argv indirection | a command-line argument | +| test.c:44:7:44:10 | len2 | test3.c:10:27:10:30 | argv indirection | test.c:44:7:44:10 | len2 | $@ flows to an operand of an arithmetic expression, potentially causing an underflow. | test.c:10:27:10:30 | argv indirection | a command-line argument | +| test.c:44:7:44:10 | len2 | test.c:10:27:10:30 | argv indirection | test.c:44:7:44:10 | len2 | $@ flows to an operand of an arithmetic expression, potentially causing an underflow. | test3.c:10:27:10:30 | argv indirection | a command-line argument | +| test.c:44:7:44:10 | len2 | test.c:10:27:10:30 | argv indirection | test.c:44:7:44:10 | len2 | $@ flows to an operand of an arithmetic expression, potentially causing an underflow. | test.c:10:27:10:30 | argv indirection | a command-line argument | +| test.c:54:7:54:10 | len3 | test3.c:10:27:10:30 | argv indirection | test.c:54:7:54:10 | len3 | $@ flows to an operand of an arithmetic expression, potentially causing an underflow. | test3.c:10:27:10:30 | argv indirection | a command-line argument | +| test.c:54:7:54:10 | len3 | test3.c:10:27:10:30 | argv indirection | test.c:54:7:54:10 | len3 | $@ flows to an operand of an arithmetic expression, potentially causing an underflow. | test.c:10:27:10:30 | argv indirection | a command-line argument | +| test.c:54:7:54:10 | len3 | test.c:10:27:10:30 | argv indirection | test.c:54:7:54:10 | len3 | $@ flows to an operand of an arithmetic expression, potentially causing an underflow. | test3.c:10:27:10:30 | argv indirection | a command-line argument | +| test.c:54:7:54:10 | len3 | test.c:10:27:10:30 | argv indirection | test.c:54:7:54:10 | len3 | $@ flows to an operand of an arithmetic expression, potentially causing an underflow. | test.c:10:27:10:30 | argv indirection | a command-line argument | diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-190/semmle/tainted/IntegerOverflowTainted.expected b/cpp/ql/test/query-tests/Security/CWE/CWE-190/semmle/tainted/IntegerOverflowTainted.expected index 4b6f14663c0..2f01718f0f4 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-190/semmle/tainted/IntegerOverflowTainted.expected +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-190/semmle/tainted/IntegerOverflowTainted.expected @@ -1,18 +1,23 @@ -| test2.cpp:14:11:14:15 | ... * ... | $@ flows an expression which might overflow. | test2.cpp:25:22:25:23 | & ... | User-provided value | -| test2.cpp:15:11:15:19 | ... * ... | $@ flows an expression which might overflow. | test2.cpp:25:22:25:23 | & ... | User-provided value | -| test2.cpp:16:11:16:21 | ... * ... | $@ flows an expression which might overflow. | test2.cpp:25:22:25:23 | & ... | User-provided value | -| test2.cpp:17:11:17:22 | ... * ... | $@ flows an expression which might overflow. | test2.cpp:25:22:25:23 | & ... | User-provided value | -| test2.cpp:39:9:39:18 | ... + ... | $@ flows an expression which might overflow. | test2.cpp:36:9:36:14 | buffer | User-provided value | -| test2.cpp:40:3:40:13 | ... += ... | $@ flows an expression which might overflow. | test2.cpp:36:9:36:14 | buffer | User-provided value | -| test3.c:12:31:12:34 | * ... | $@ flows an expression which might overflow negatively. | test3.c:11:15:11:18 | argv | User-provided value | -| test3.c:13:16:13:19 | * ... | $@ flows an expression which might overflow negatively. | test3.c:11:15:11:18 | argv | User-provided value | -| test4.cpp:13:17:13:20 | access to array | $@ flows an expression which might overflow negatively. | test4.cpp:9:13:9:16 | argv | User-provided value | -| test5.cpp:10:9:10:15 | call to strtoul | $@ flows an expression which might overflow. | test5.cpp:9:7:9:9 | buf | User-provided value | -| test5.cpp:17:6:17:27 | ... * ... | $@ flows an expression which might overflow. | test5.cpp:9:7:9:9 | buf | User-provided value | -| test5.cpp:19:6:19:13 | ... * ... | $@ flows an expression which might overflow. | test5.cpp:9:7:9:9 | buf | User-provided value | -| test6.cpp:11:15:11:15 | s | $@ flows an expression which might overflow. | test6.cpp:39:23:39:24 | & ... | User-provided value | -| test6.cpp:16:15:16:15 | s | $@ flows an expression which might overflow. | test6.cpp:39:23:39:24 | & ... | User-provided value | -| test6.cpp:30:16:30:16 | s | $@ flows an expression which might overflow. | test6.cpp:39:23:39:24 | & ... | User-provided value | -| test.c:14:15:14:35 | ... * ... | $@ flows an expression which might overflow. | test.c:11:29:11:32 | argv | User-provided value | -| test.c:44:7:44:12 | ... -- | $@ flows an expression which might overflow negatively. | test.c:41:17:41:20 | argv | User-provided value | -| test.c:54:7:54:12 | ... -- | $@ flows an expression which might overflow negatively. | test.c:51:17:51:20 | argv | User-provided value | +| test2.cpp:14:11:14:15 | ... * ... | $@ flows an expression which might overflow. | test2.cpp:25:22:25:23 | fscanf output argument | value read by fscanf | +| test2.cpp:15:11:15:19 | ... * ... | $@ flows an expression which might overflow. | test2.cpp:25:22:25:23 | fscanf output argument | value read by fscanf | +| test2.cpp:16:11:16:21 | ... * ... | $@ flows an expression which might overflow. | test2.cpp:25:22:25:23 | fscanf output argument | value read by fscanf | +| test2.cpp:17:11:17:22 | ... * ... | $@ flows an expression which might overflow. | test2.cpp:25:22:25:23 | fscanf output argument | value read by fscanf | +| test2.cpp:39:9:39:18 | ... + ... | $@ flows an expression which might overflow. | test2.cpp:36:9:36:14 | fgets output argument | string read by fgets | +| test2.cpp:40:3:40:13 | ... += ... | $@ flows an expression which might overflow. | test2.cpp:36:9:36:14 | fgets output argument | string read by fgets | +| test3.c:12:11:12:34 | * ... | $@ flows an expression which might overflow negatively. | test3.c:10:27:10:30 | argv indirection | a command-line argument | +| test3.c:12:11:12:34 | * ... | $@ flows an expression which might overflow negatively. | test.c:10:27:10:30 | argv indirection | a command-line argument | +| test3.c:13:11:13:20 | * ... | $@ flows an expression which might overflow negatively. | test3.c:10:27:10:30 | argv indirection | a command-line argument | +| test3.c:13:11:13:20 | * ... | $@ flows an expression which might overflow negatively. | test.c:10:27:10:30 | argv indirection | a command-line argument | +| test4.cpp:13:7:13:20 | access to array | $@ flows an expression which might overflow negatively. | test4.cpp:8:27:8:30 | argv indirection | a command-line argument | +| test5.cpp:10:9:10:27 | call to strtoul | $@ flows an expression which might overflow. | test5.cpp:9:7:9:9 | gets output argument | string read by gets | +| test5.cpp:17:6:17:27 | ... * ... | $@ flows an expression which might overflow. | test5.cpp:9:7:9:9 | gets output argument | string read by gets | +| test5.cpp:19:6:19:13 | ... * ... | $@ flows an expression which might overflow. | test5.cpp:9:7:9:9 | gets output argument | string read by gets | +| test6.cpp:11:10:11:15 | s | $@ flows an expression which might overflow. | test6.cpp:39:23:39:24 | fscanf output argument | value read by fscanf | +| test6.cpp:16:10:16:15 | s | $@ flows an expression which might overflow. | test6.cpp:39:23:39:24 | fscanf output argument | value read by fscanf | +| test6.cpp:30:11:30:16 | s | $@ flows an expression which might overflow. | test6.cpp:39:23:39:24 | fscanf output argument | value read by fscanf | +| test.c:14:15:14:35 | ... * ... | $@ flows an expression which might overflow. | test3.c:10:27:10:30 | argv indirection | a command-line argument | +| test.c:14:15:14:35 | ... * ... | $@ flows an expression which might overflow. | test.c:10:27:10:30 | argv indirection | a command-line argument | +| test.c:44:7:44:12 | ... -- | $@ flows an expression which might overflow negatively. | test3.c:10:27:10:30 | argv indirection | a command-line argument | +| test.c:44:7:44:12 | ... -- | $@ flows an expression which might overflow negatively. | test.c:10:27:10:30 | argv indirection | a command-line argument | +| test.c:54:7:54:12 | ... -- | $@ flows an expression which might overflow negatively. | test3.c:10:27:10:30 | argv indirection | a command-line argument | +| test.c:54:7:54:12 | ... -- | $@ flows an expression which might overflow negatively. | test.c:10:27:10:30 | argv indirection | a command-line argument | diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-197/SAMATE/IntegerOverflowTainted/IntegerOverflowTainted.expected b/cpp/ql/test/query-tests/Security/CWE/CWE-197/SAMATE/IntegerOverflowTainted/IntegerOverflowTainted.expected index 9965c10070d..cb31529859e 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-197/SAMATE/IntegerOverflowTainted/IntegerOverflowTainted.expected +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-197/SAMATE/IntegerOverflowTainted/IntegerOverflowTainted.expected @@ -1 +1 @@ -| tests.cpp:38:31:38:34 | data | $@ flows an expression which might overflow. | tests.cpp:57:27:57:31 | & ... | User-provided value | +| tests.cpp:38:25:38:34 | data | $@ flows an expression which might overflow. | tests.cpp:57:27:57:31 | fscanf output argument | value read by fscanf | diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/Assets.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/Assets.cs index 7558fd7970f..38db871d1b6 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/Assets.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/Assets.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; using System.IO; using System.Linq; using Newtonsoft.Json.Linq; @@ -14,14 +15,6 @@ namespace Semmle.Extraction.CSharp.DependencyFetching { private readonly ProgressMonitor progressMonitor; - private static readonly string[] netFrameworks = new[] { - "microsoft.aspnetcore.app.ref", - "microsoft.netcore.app.ref", - "microsoft.netframework.referenceassemblies", - "microsoft.windowsdesktop.app.ref", - "netstandard.library.ref" - }; - internal Assets(ProgressMonitor progressMonitor) { this.progressMonitor = progressMonitor; @@ -68,19 +61,19 @@ namespace Semmle.Extraction.CSharp.DependencyFetching /// } /// } /// - /// Returns dependencies - /// RequiredPaths = { + /// Adds the following dependencies + /// Paths: { /// "castle.core/4.4.1/lib/netstandard1.5/Castle.Core.dll", /// "json.net/1.0.33/lib/netstandard2.0/Json.Net.dll" /// } - /// UsedPackages = { + /// Packages: { /// "castle.core", /// "json.net" /// } /// - private DependencyContainer AddPackageDependencies(JObject json, DependencyContainer dependencies) + private void AddPackageDependencies(JObject json, DependencyContainer dependencies) { - // If there are more than one framework we need to pick just one. + // If there is more than one framework we need to pick just one. // To ensure stability we pick one based on the lexicographic order of // the framework names. var references = json @@ -93,7 +86,7 @@ namespace Semmle.Extraction.CSharp.DependencyFetching if (references is null) { progressMonitor.LogDebug("No references found in the targets section in the assets file."); - return dependencies; + return; } // Find all the compile dependencies for each reference and @@ -108,19 +101,83 @@ namespace Semmle.Extraction.CSharp.DependencyFetching return; } - // If this is a .NET framework reference then include everything. - if (netFrameworks.Any(framework => name.StartsWith(framework))) + if (info.Compile is null || !info.Compile.Any()) { - dependencies.Add(name); - } - else - { - info.Compile? - .ForEach(r => dependencies.Add(name, r.Key)); + // If this is a framework reference then include everything. + if (FrameworkPackageNames.AllFrameworks.Any(framework => name.StartsWith(framework))) + { + dependencies.AddFramework(name); + } + return; } + + info.Compile + .ForEach(r => dependencies.Add(name, r.Key)); }); - return dependencies; + return; + } + + /// + /// Add the framework dependencies from the assets file to dependencies. + /// + /// Example: + /// "project": { + // "version": "1.0.0", + // "frameworks": { + // "net7.0": { + // "frameworkReferences": { + // "Microsoft.AspNetCore.App": { + // "privateAssets": "none" + // }, + // "Microsoft.NETCore.App": { + // "privateAssets": "all" + // } + // } + // } + // } + // } + // + /// Adds the following dependencies + /// Paths: { + /// "microsoft.aspnetcore.app.ref", + /// "microsoft.netcore.app.ref" + /// } + /// Packages: { + /// "microsoft.aspnetcore.app.ref", + /// "microsoft.netcore.app.ref" + /// } + /// + private void AddFrameworkDependencies(JObject json, DependencyContainer dependencies) + { + + var frameworks = json + .GetProperty("project")? + .GetProperty("frameworks"); + + if (frameworks is null) + { + progressMonitor.LogDebug("No framework section in assets.json."); + return; + } + + // If there is more than one framework we need to pick just one. + // To ensure stability we pick one based on the lexicographic order of + // the framework names. + var references = frameworks + .Properties()? + .MaxBy(p => p.Name)? + .Value["frameworkReferences"] as JObject; + + if (references is null) + { + progressMonitor.LogDebug("No framework references in assets.json."); + return; + } + + references + .Properties() + .ForEach(f => dependencies.AddFramework($"{f.Name}.Ref".ToLowerInvariant())); } /// @@ -134,6 +191,7 @@ namespace Semmle.Extraction.CSharp.DependencyFetching { var obj = JObject.Parse(json); AddPackageDependencies(obj, dependencies); + AddFrameworkDependencies(obj, dependencies); return true; } catch (Exception e) @@ -143,14 +201,31 @@ namespace Semmle.Extraction.CSharp.DependencyFetching } } + private static bool TryReadAllText(string path, ProgressMonitor progressMonitor, [NotNullWhen(returnValue: true)] out string? content) + { + try + { + content = File.ReadAllText(path); + return true; + } + catch (Exception e) + { + progressMonitor.LogInfo($"Failed to read assets file '{path}': {e.Message}"); + content = null; + return false; + } + } + public static DependencyContainer GetCompilationDependencies(ProgressMonitor progressMonitor, IEnumerable assets) { var parser = new Assets(progressMonitor); var dependencies = new DependencyContainer(); assets.ForEach(asset => { - var json = File.ReadAllText(asset); - parser.TryParse(json, dependencies); + if (TryReadAllText(asset, progressMonitor, out var json)) + { + parser.TryParse(json, dependencies); + } }); return dependencies; } diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependencyContainer.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependencyContainer.cs index 4c0586c7f83..d3858f17fe1 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependencyContainer.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependencyContainer.cs @@ -9,14 +9,19 @@ namespace Semmle.Extraction.CSharp.DependencyFetching /// internal class DependencyContainer { - private readonly List requiredPaths = new(); - private readonly HashSet usedPackages = new(); + /// + /// Paths to dependencies required for compilation. + /// + public List Paths { get; } = new(); /// - /// In most cases paths in asset files point to dll's or the empty _._ file, which - /// is sometimes there to avoid the directory being empty. - /// That is, if the path specifically adds a .dll we use that, otherwise we as a fallback - /// add the entire directory (which should be fine in case of _._ as well). + /// Packages that are used as a part of the required dependencies. + /// + public HashSet Packages { get; } = new(); + + /// + /// If the path specifically adds a .dll we use that, otherwise we as a fallback + /// add the entire directory. /// private static string ParseFilePath(string path) { @@ -32,16 +37,6 @@ namespace Semmle.Extraction.CSharp.DependencyFetching .Split(Path.DirectorySeparatorChar) .First(); - /// - /// Paths to dependencies required for compilation. - /// - public IEnumerable RequiredPaths => requiredPaths; - - /// - /// Packages that are used as a part of the required dependencies. - /// - public HashSet UsedPackages => usedPackages; - /// /// Add a dependency inside a package. /// @@ -50,20 +45,27 @@ namespace Semmle.Extraction.CSharp.DependencyFetching var p = package.Replace('/', Path.DirectorySeparatorChar); var d = dependency.Replace('/', Path.DirectorySeparatorChar); + // In most cases paths in asset files point to dll's or the empty _._ file. + // That is, for _._ we don't need to add anything. + if (Path.GetFileName(d) == "_._") + { + return; + } + var path = Path.Combine(p, ParseFilePath(d)); - requiredPaths.Add(path); - usedPackages.Add(GetPackageName(p)); + Paths.Add(path); + Packages.Add(GetPackageName(p)); } /// - /// Add a dependency to an entire package + /// Add a dependency to an entire framework package. /// - public void Add(string package) + public void AddFramework(string framework) { - var p = package.Replace('/', Path.DirectorySeparatorChar); + var p = framework.Replace('/', Path.DirectorySeparatorChar); - requiredPaths.Add(p); - usedPackages.Add(GetPackageName(p)); + Paths.Add(p); + Packages.Add(GetPackageName(p)); } } } \ No newline at end of file diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependencyManager.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependencyManager.cs index e315b194bd0..9bb78cc8d7c 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependencyManager.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependencyManager.cs @@ -119,7 +119,7 @@ namespace Semmle.Extraction.CSharp.DependencyFetching var dependencies = Assets.GetCompilationDependencies(progressMonitor, assets1.Union(assets2)); var paths = dependencies - .RequiredPaths + .Paths .Select(d => Path.Combine(packageDirectory.DirInfo.FullName, d)) .ToList(); dllPaths.UnionWith(paths); @@ -232,13 +232,7 @@ namespace Semmle.Extraction.CSharp.DependencyFetching { // Multiple dotnet framework packages could be present. // The order of the packages is important, we're adding the first one that is present in the nuget cache. - var packagesInPrioOrder = new string[] - { - "microsoft.netcore.app.ref", // net7.0, ... net5.0, netcoreapp3.1, netcoreapp3.0 - "microsoft.netframework.referenceassemblies.", // net48, ..., net20 - "netstandard.library.ref", // netstandard2.1 - "netstandard.library" // netstandard2.0 - }; + var packagesInPrioOrder = FrameworkPackageNames.NetFrameworks; var frameworkPath = packagesInPrioOrder .Select((s, index) => (Index: index, Path: GetPackageDirectory(s))) @@ -308,7 +302,7 @@ namespace Semmle.Extraction.CSharp.DependencyFetching } // First try to find ASP.NET Core assemblies in the NuGet packages - if (GetPackageDirectory("microsoft.aspnetcore.app.ref") is string aspNetCorePackage) + if (GetPackageDirectory(FrameworkPackageNames.AspNetCoreFramework) is string aspNetCorePackage) { progressMonitor.LogInfo($"Found ASP.NET Core in NuGet packages. Not adding installation directory."); dllPaths.Add(aspNetCorePackage); @@ -322,7 +316,7 @@ namespace Semmle.Extraction.CSharp.DependencyFetching private void AddMicrosoftWindowsDesktopDlls(ISet dllPaths) { - if (GetPackageDirectory("microsoft.windowsdesktop.app.ref") is string windowsDesktopApp) + if (GetPackageDirectory(FrameworkPackageNames.WindowsDesktopFramework) is string windowsDesktopApp) { progressMonitor.LogInfo($"Found Windows Desktop App in NuGet packages."); dllPaths.Add(windowsDesktopApp); @@ -356,7 +350,7 @@ namespace Semmle.Extraction.CSharp.DependencyFetching private void LogAllUnusedPackages(DependencyContainer dependencies) => GetAllPackageDirectories() - .Where(package => !dependencies.UsedPackages.Contains(package)) + .Where(package => !dependencies.Packages.Contains(package)) .ForEach(package => progressMonitor.LogInfo($"Unused package: {package}")); private void GenerateSourceFileFromImplicitUsings() diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNet.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNet.cs index e8493a770db..a2af85a1c48 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNet.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNet.cs @@ -128,7 +128,7 @@ namespace Semmle.Extraction.CSharp.DependencyFetching [GeneratedRegex("Restored\\s+(.+\\.csproj)", RegexOptions.Compiled)] private static partial Regex RestoredProjectRegex(); - [GeneratedRegex("[Assets\\sfile\\shas\\snot\\schanged.\\sSkipping\\sassets\\sfile\\swriting.|Writing\\sassets\\sfile\\sto\\sdisk.]\\sPath:\\s(.*)", RegexOptions.Compiled)] + [GeneratedRegex("[Assets\\sfile\\shas\\snot\\schanged.\\sSkipping\\sassets\\sfile\\swriting.|Writing\\sassets\\sfile\\sto\\sdisk.]\\sPath:\\s(.+)", RegexOptions.Compiled)] private static partial Regex AssetsFileRegex(); } } diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FrameworkPackageNames.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FrameworkPackageNames.cs new file mode 100644 index 00000000000..7b4a076f99f --- /dev/null +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FrameworkPackageNames.cs @@ -0,0 +1,25 @@ +using System.Collections.Generic; +using System.Linq; + +namespace Semmle.Extraction.CSharp.DependencyFetching +{ + internal static class FrameworkPackageNames + { + public static string AspNetCoreFramework { get; } = "microsoft.aspnetcore.app.ref"; + + public static string WindowsDesktopFramework { get; } = "microsoft.windowsdesktop.app.ref"; + + // The order of the packages is important. + public static string[] NetFrameworks { get; } = new string[] + { + "microsoft.netcore.app.ref", // net7.0, ... net5.0, netcoreapp3.1, netcoreapp3.0 + "microsoft.netframework.referenceassemblies.", // net48, ..., net20 + "netstandard.library.ref", // netstandard2.1 + "netstandard.library" // netstandard2.0 + }; + + public static IEnumerable AllFrameworks { get; } = + NetFrameworks + .Union(new string[] { AspNetCoreFramework, WindowsDesktopFramework }); + } +} diff --git a/csharp/extractor/Semmle.Extraction.CSharp/Populators/TypeContainerVisitor.cs b/csharp/extractor/Semmle.Extraction.CSharp/Populators/TypeContainerVisitor.cs index 2bd5a9f4e03..3a2caff6102 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp/Populators/TypeContainerVisitor.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp/Populators/TypeContainerVisitor.cs @@ -89,8 +89,10 @@ namespace Semmle.Extraction.CSharp.Populators SyntaxKind.ModuleKeyword => Entities.AttributeKind.Module, _ => throw new InternalError(node, "Unhandled global target") }; - foreach (var attribute in node.Attributes) + var attributes = node.Attributes; + for (var i = 0; i < attributes.Count; i++) { + var attribute = attributes[i]; if (attributeLookup.Value(attribute) is AttributeData attributeData) { var ae = Entities.Attribute.Create(Cx, attributeData, outputAssembly, kind); diff --git a/csharp/extractor/Semmle.Extraction.Tests/Assets.cs b/csharp/extractor/Semmle.Extraction.Tests/Assets.cs index 1dbd6f9d41c..85e56b6de64 100644 --- a/csharp/extractor/Semmle.Extraction.Tests/Assets.cs +++ b/csharp/extractor/Semmle.Extraction.Tests/Assets.cs @@ -21,49 +21,26 @@ namespace Semmle.Extraction.Tests // Verify Assert.True(success); - Assert.Equal(5, dependencies.RequiredPaths.Count()); - Assert.Equal(4, dependencies.UsedPackages.Count()); + Assert.Equal(6, dependencies.Paths.Count()); + Assert.Equal(5, dependencies.Packages.Count()); - var normalizedPaths = dependencies.RequiredPaths.Select(FixExpectedPathOnWindows); - // Required references + var normalizedPaths = dependencies.Paths.Select(FixExpectedPathOnWindows); + // Used references Assert.Contains("castle.core/4.4.1/lib/netstandard1.5/Castle.Core.dll", normalizedPaths); Assert.Contains("castle.core/4.4.1/lib/netstandard1.5/Castle.Core2.dll", normalizedPaths); Assert.Contains("json.net/1.0.33/lib/netstandard2.0/Json.Net.dll", normalizedPaths); Assert.Contains("microsoft.aspnetcore.cryptography.internal/6.0.8/lib/net6.0/Microsoft.AspNetCore.Cryptography.Internal.dll", normalizedPaths); - Assert.Contains("humanizer.core/2.8.26/lib/netstandard2.0", normalizedPaths); // Used packages - Assert.Contains("castle.core", dependencies.UsedPackages); - Assert.Contains("json.net", dependencies.UsedPackages); - Assert.Contains("microsoft.aspnetcore.cryptography.internal", dependencies.UsedPackages); - Assert.Contains("humanizer.core", dependencies.UsedPackages); + Assert.Contains("castle.core", dependencies.Packages); + Assert.Contains("json.net", dependencies.Packages); + Assert.Contains("microsoft.aspnetcore.cryptography.internal", dependencies.Packages); + // Used frameworks + Assert.Contains("microsoft.netcore.app.ref", dependencies.Packages); + Assert.Contains("microsoft.aspnetcore.app.ref", dependencies.Packages); } [Fact] - public void TestAssets2() - { - // Setup - var assets = new Assets(new ProgressMonitor(new LoggerStub())); - var json = assetsJson2; - var dependencies = new DependencyContainer(); - - // Execute - var success = assets.TryParse(json, dependencies); - - // Verify - Assert.True(success); - Assert.Equal(2, dependencies.RequiredPaths.Count()); - - var normalizedPaths = dependencies.RequiredPaths.Select(FixExpectedPathOnWindows); - // Required references - Assert.Contains("microsoft.netframework.referenceassemblies/1.0.3", normalizedPaths); - Assert.Contains("microsoft.netframework.referenceassemblies.net48/1.0.3", normalizedPaths); - // Used packages - Assert.Contains("microsoft.netframework.referenceassemblies", dependencies.UsedPackages); - Assert.Contains("microsoft.netframework.referenceassemblies.net48", dependencies.UsedPackages); - } - - [Fact] - public void TestAssets3() + public void TestAssetsFailure() { // Setup var assets = new Assets(new ProgressMonitor(new LoggerStub())); @@ -75,9 +52,186 @@ namespace Semmle.Extraction.Tests // Verify Assert.False(success); - Assert.Empty(dependencies.RequiredPaths); + Assert.Empty(dependencies.Paths); } + [Fact] + public void TestAssetsNet70() + { + // Setup + var assets = new Assets(new ProgressMonitor(new LoggerStub())); + var json = assetsNet70; + var dependencies = new DependencyContainer(); + + // Execute + var success = assets.TryParse(json, dependencies); + + // Verify + Assert.True(success); + Assert.Equal(4, dependencies.Paths.Count); + Assert.Equal(4, dependencies.Packages.Count); + + + var normalizedPaths = dependencies.Paths.Select(FixExpectedPathOnWindows); + // Used paths + Assert.Contains("microsoft.netcore.app.ref", normalizedPaths); + Assert.Contains("microsoft.aspnetcore.app.ref", normalizedPaths); + Assert.Contains("newtonsoft.json/12.0.1/lib/netstandard2.0/Newtonsoft.Json.dll", normalizedPaths); + Assert.Contains("newtonsoft.json.bson/1.0.2/lib/netstandard2.0/Newtonsoft.Json.Bson.dll", normalizedPaths); + // Used packages + Assert.Contains("microsoft.netcore.app.ref", dependencies.Packages); + Assert.Contains("microsoft.aspnetcore.app.ref", dependencies.Packages); + Assert.Contains("newtonsoft.json", dependencies.Packages); + Assert.Contains("newtonsoft.json.bson", dependencies.Packages); + + } + + [Fact] + public void TestAssetsNet48() + { + // Setup + var assets = new Assets(new ProgressMonitor(new LoggerStub())); + var json = assetsNet48; + var dependencies = new DependencyContainer(); + + // Execute + var success = assets.TryParse(json, dependencies); + + // Verify + Assert.True(success); + Assert.Equal(3, dependencies.Paths.Count); + Assert.Equal(3, dependencies.Packages.Count); + + var normalizedPaths = dependencies.Paths.Select(FixExpectedPathOnWindows); + // Used references + Assert.Contains("microsoft.netframework.referenceassemblies.net48/1.0.2", normalizedPaths); + Assert.Contains("newtonsoft.json/12.0.1/lib/net45/Newtonsoft.Json.dll", normalizedPaths); + Assert.Contains("newtonsoft.json.bson/1.0.2/lib/net45/Newtonsoft.Json.Bson.dll", normalizedPaths); + // Used packages + Assert.Contains("microsoft.netframework.referenceassemblies.net48", dependencies.Packages); + Assert.Contains("newtonsoft.json", dependencies.Packages); + Assert.Contains("newtonsoft.json.bson", dependencies.Packages); + } + + [Fact] + public void TestAssetsNetstandard21() + { + // Setup + var assets = new Assets(new ProgressMonitor(new LoggerStub())); + var json = assetsNetstandard21; + var dependencies = new DependencyContainer(); + + // Execute + var success = assets.TryParse(json, dependencies); + + // Verify + Assert.True(success); + Assert.Equal(3, dependencies.Paths.Count); + Assert.Equal(3, dependencies.Packages.Count); + + var normalizedPaths = dependencies.Paths.Select(FixExpectedPathOnWindows); + + // Used references + Assert.Contains("netstandard.library.ref", normalizedPaths); + Assert.Contains("newtonsoft.json/12.0.1/lib/netstandard2.0/Newtonsoft.Json.dll", normalizedPaths); + Assert.Contains("newtonsoft.json.bson/1.0.2/lib/netstandard2.0/Newtonsoft.Json.Bson.dll", normalizedPaths); + // Used packages + Assert.Contains("netstandard.library.ref", dependencies.Packages); + Assert.Contains("newtonsoft.json", dependencies.Packages); + Assert.Contains("newtonsoft.json.bson", dependencies.Packages); + } + + [Fact] + public void TestAssetsNetStandard16() + { + // Setup + var assets = new Assets(new ProgressMonitor(new LoggerStub())); + var json = assetsNetstandard16; + var dependencies = new DependencyContainer(); + + // Execute + var success = assets.TryParse(json, dependencies); + + // Verify + Assert.True(success); + Assert.Equal(5, dependencies.Paths.Count); + Assert.Equal(5, dependencies.Packages.Count); + + var normalizedPaths = dependencies.Paths.Select(FixExpectedPathOnWindows); + + // Used references + Assert.Contains("netstandard.library/1.6.1", normalizedPaths); + Assert.Contains("microsoft.csharp/4.3.0/ref/netstandard1.0/Microsoft.CSharp.dll", normalizedPaths); + Assert.Contains("microsoft.win32.primitives/4.3.0/ref/netstandard1.3/Microsoft.Win32.Primitives.dll", normalizedPaths); + Assert.Contains("newtonsoft.json/12.0.1/lib/netstandard1.3/Newtonsoft.Json.dll", normalizedPaths); + Assert.Contains("newtonsoft.json.bson/1.0.2/lib/netstandard1.3/Newtonsoft.Json.Bson.dll", normalizedPaths); + // Used packages + Assert.Contains("netstandard.library", dependencies.Packages); + Assert.Contains("microsoft.csharp", dependencies.Packages); + Assert.Contains("microsoft.win32.primitives", dependencies.Packages); + Assert.Contains("newtonsoft.json", dependencies.Packages); + Assert.Contains("newtonsoft.json.bson", dependencies.Packages); + } + + [Fact] + public void TestAssetsNetcoreapp20() + { + // Setup + var assets = new Assets(new ProgressMonitor(new LoggerStub())); + var json = assetsNetcoreapp20; + var dependencies = new DependencyContainer(); + + // Execute + var success = assets.TryParse(json, dependencies); + + // Verify + Assert.True(success); + Assert.Equal(144, dependencies.Paths.Count); + Assert.Equal(3, dependencies.Packages.Count); + + var normalizedPaths = dependencies.Paths.Select(FixExpectedPathOnWindows); + + // Used references (only some of them) + Assert.Contains("microsoft.netcore.app/2.0.0/ref/netcoreapp2.0/Microsoft.CSharp.dll", normalizedPaths); + Assert.Contains("newtonsoft.json/12.0.1/lib/netstandard2.0/Newtonsoft.Json.dll", normalizedPaths); + Assert.Contains("newtonsoft.json.bson/1.0.2/lib/netstandard2.0/Newtonsoft.Json.Bson.dll", normalizedPaths); + // Used packages + Assert.Contains("microsoft.netcore.app", dependencies.Packages); + Assert.Contains("newtonsoft.json", dependencies.Packages); + Assert.Contains("newtonsoft.json.bson", dependencies.Packages); + } + + [Fact] + public void TestAssetsNetcoreapp31() + { + // Setup + var assets = new Assets(new ProgressMonitor(new LoggerStub())); + var json = assetsNetcoreapp31; + var dependencies = new DependencyContainer(); + + // Execute + var success = assets.TryParse(json, dependencies); + + // Verify + Assert.True(success); + + var normalizedPaths = dependencies.Paths.Select(FixExpectedPathOnWindows); + + // Used paths + Assert.Contains("microsoft.netcore.app.ref", normalizedPaths); + Assert.Contains("microsoft.aspnetcore.app.ref", normalizedPaths); + Assert.Contains("newtonsoft.json/12.0.1/lib/netstandard2.0/Newtonsoft.Json.dll", normalizedPaths); + Assert.Contains("newtonsoft.json.bson/1.0.2/lib/netstandard2.0/Newtonsoft.Json.Bson.dll", normalizedPaths); + // Used packages + Assert.Contains("microsoft.netcore.app.ref", dependencies.Packages); + Assert.Contains("microsoft.aspnetcore.app.ref", dependencies.Packages); + Assert.Contains("newtonsoft.json", dependencies.Packages); + Assert.Contains("newtonsoft.json.bson", dependencies.Packages); + } + + /// + /// This is manually created JSON string with the same structure as the assets file. + /// private readonly string assetsJson1 = """ { "version": 3, @@ -181,25 +335,1326 @@ namespace Semmle.Extraction.Tests } """; - private readonly string assetsJson2 = """ + /// + /// This is part of the content of the assets file that dotnet generates based on the + /// following project file content. + /// + /// + /// + /// net70 + /// enable + /// enable + /// + /// + /// + /// + /// + /// + private readonly string assetsNet70 = """ { - "version": 3, - "targets": { - ".NETFramework,Version=v4.8": { - "Microsoft.NETFramework.ReferenceAssemblies/1.0.3": { - "type": "package", - "dependencies": { - "Microsoft.NETFramework.ReferenceAssemblies.net48": "1.0.3" - } - }, - "Microsoft.NETFramework.ReferenceAssemblies.net48/1.0.3": { - "type": "package", - "build": { - "build/Microsoft.NETFramework.ReferenceAssemblies.net48.targets": {} - } - } + "version": 3, + "targets": { + "net7.0": { + "Newtonsoft.Json/12.0.1": { + "type": "package", + "compile": { + "lib/netstandard2.0/Newtonsoft.Json.dll": { + "related": ".pdb;.xml" + } + }, + "runtime": { + "lib/netstandard2.0/Newtonsoft.Json.dll": { + "related": ".pdb;.xml" + } } + }, + "Newtonsoft.Json.Bson/1.0.2": { + "type": "package", + "dependencies": { + "Newtonsoft.Json": "12.0.1" + }, + "compile": { + "lib/netstandard2.0/Newtonsoft.Json.Bson.dll": { + "related": ".pdb;.xml" + } + }, + "runtime": { + "lib/netstandard2.0/Newtonsoft.Json.Bson.dll": { + "related": ".pdb;.xml" + } + } + } } + }, + "project": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "/Users/michaelnebel/Work/playground/csharpwebapp/csharpwebapp.csproj", + "projectName": "csharpwebapp", + "projectPath": "/Users/michaelnebel/Work/playground/csharpwebapp/csharpwebapp.csproj", + "packagesPath": "/Users/michaelnebel/Work/playground/csharpwebapp/packages", + "outputPath": "/Users/michaelnebel/Work/playground/csharpwebapp/obj/", + "projectStyle": "PackageReference", + "configFilePaths": [ + "/Users/michaelnebel/.nuget/NuGet/NuGet.Config" + ], + "originalTargetFrameworks": [ + "net70" + ], + "sources": { + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net7.0": { + "targetAlias": "net70", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + } + }, + "frameworks": { + "net7.0": { + "targetAlias": "net70", + "dependencies": { + "Newtonsoft.Json.Bson": { + "target": "Package", + "version": "[1.0.2, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "downloadDependencies": [ + { + "name": "Microsoft.AspNetCore.App.Ref", + "version": "[7.0.2, 7.0.2]" + }, + { + "name": "Microsoft.NETCore.App.Host.osx-x64", + "version": "[7.0.2, 7.0.2]" + }, + { + "name": "Microsoft.NETCore.App.Ref", + "version": "[7.0.2, 7.0.2]" + } + ], + "frameworkReferences": { + "Microsoft.AspNetCore.App": { + "privateAssets": "none" + }, + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "/Users/michaelnebel/.dotnet/sdk/7.0.102/RuntimeIdentifierGraph.json" + } + } + } +} +"""; + + /// + /// This is part of the content of the assets file that dotnet generates based on the + /// following project file content. + /// + /// + /// + /// net4.8 + /// enable + /// enable + /// + /// + /// + /// + /// + /// + private readonly string assetsNet48 = """ +{ + "version": 3, + "targets": { + ".NETFramework,Version=v4.8": { + "Microsoft.NETFramework.ReferenceAssemblies/1.0.2": { + "type": "package", + "dependencies": { + "Microsoft.NETFramework.ReferenceAssemblies.net48": "1.0.2" + } + }, + "Microsoft.NETFramework.ReferenceAssemblies.net48/1.0.2": { + "type": "package", + "build": { + "build/Microsoft.NETFramework.ReferenceAssemblies.net48.targets": {} + } + }, + "Newtonsoft.Json/12.0.1": { + "type": "package", + "compile": { + "lib/net45/Newtonsoft.Json.dll": { + "related": ".pdb;.xml" + } + }, + "runtime": { + "lib/net45/Newtonsoft.Json.dll": { + "related": ".pdb;.xml" + } + } + }, + "Newtonsoft.Json.Bson/1.0.2": { + "type": "package", + "dependencies": { + "Newtonsoft.Json": "12.0.1" + }, + "compile": { + "lib/net45/Newtonsoft.Json.Bson.dll": { + "related": ".pdb;.xml" + } + }, + "runtime": { + "lib/net45/Newtonsoft.Json.Bson.dll": { + "related": ".pdb;.xml" + } + } + } + } + }, + "projectFileDependencyGroups": { + ".NETFramework,Version=v4.8": [ + "Microsoft.NETFramework.ReferenceAssemblies >= 1.0.2", + "Newtonsoft.Json.Bson >= 1.0.2" + ] + }, + "packageFolders": { + "/Users/michaelnebel/Work/playground/csharpwebapp/packages": {} + }, + "project": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "/Users/michaelnebel/Work/playground/csharpwebapp/csharpwebapp.csproj", + "projectName": "csharpwebapp", + "projectPath": "/Users/michaelnebel/Work/playground/csharpwebapp/csharpwebapp.csproj", + "packagesPath": "/Users/michaelnebel/Work/playground/csharpwebapp/packages", + "outputPath": "/Users/michaelnebel/Work/playground/csharpwebapp/obj/", + "projectStyle": "PackageReference", + "configFilePaths": [ + "/Users/michaelnebel/.nuget/NuGet/NuGet.Config" + ], + "originalTargetFrameworks": [ + "net4.8" + ], + "sources": { + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net48": { + "targetAlias": "net4.8", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + } + }, + "frameworks": { + "net48": { + "targetAlias": "net4.8", + "dependencies": { + "Microsoft.NETFramework.ReferenceAssemblies": { + "suppressParent": "All", + "target": "Package", + "version": "[1.0.2, )", + "autoReferenced": true + }, + "Newtonsoft.Json.Bson": { + "target": "Package", + "version": "[1.0.2, )" + } + }, + "runtimeIdentifierGraphPath": "/Users/michaelnebel/.dotnet/sdk/7.0.102/RuntimeIdentifierGraph.json" + } + } + } +} +"""; + + /// + /// This is part of the content of the assets file that dotnet generates based on the + /// following project file content. + /// + /// + /// + /// netstandard2.1 + /// enable + /// enable + /// + /// + /// + /// + /// + /// + private readonly string assetsNetstandard21 = """ +{ + "version": 3, + "targets": { + ".NETStandard,Version=v2.1": { + "Newtonsoft.Json/12.0.1": { + "type": "package", + "compile": { + "lib/netstandard2.0/Newtonsoft.Json.dll": { + "related": ".pdb;.xml" + } + }, + "runtime": { + "lib/netstandard2.0/Newtonsoft.Json.dll": { + "related": ".pdb;.xml" + } + } + }, + "Newtonsoft.Json.Bson/1.0.2": { + "type": "package", + "dependencies": { + "Newtonsoft.Json": "12.0.1" + }, + "compile": { + "lib/netstandard2.0/Newtonsoft.Json.Bson.dll": { + "related": ".pdb;.xml" + } + }, + "runtime": { + "lib/netstandard2.0/Newtonsoft.Json.Bson.dll": { + "related": ".pdb;.xml" + } + } + } + } + }, + "projectFileDependencyGroups": { + ".NETStandard,Version=v2.1": [ + "Newtonsoft.Json.Bson >= 1.0.2" + ] + }, + "packageFolders": { + "/Users/michaelnebel/Work/playground/csharpwebapp/packages": {} + }, + "project": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "/Users/michaelnebel/Work/playground/csharpwebapp/csharpwebapp.csproj", + "projectName": "csharpwebapp", + "projectPath": "/Users/michaelnebel/Work/playground/csharpwebapp/csharpwebapp.csproj", + "packagesPath": "/Users/michaelnebel/Work/playground/csharpwebapp/packages", + "outputPath": "/Users/michaelnebel/Work/playground/csharpwebapp/obj/", + "projectStyle": "PackageReference", + "configFilePaths": [ + "/Users/michaelnebel/.nuget/NuGet/NuGet.Config" + ], + "originalTargetFrameworks": [ + "netstandard2.1" + ], + "sources": { + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "netstandard2.1": { + "targetAlias": "netstandard2.1", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + } + }, + "frameworks": { + "netstandard2.1": { + "targetAlias": "netstandard2.1", + "dependencies": { + "Newtonsoft.Json.Bson": { + "target": "Package", + "version": "[1.0.2, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "downloadDependencies": [ + { + "name": "NETStandard.Library.Ref", + "version": "[2.1.0, 2.1.0]" + } + ], + "frameworkReferences": { + "NETStandard.Library": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "/Users/michaelnebel/.dotnet/sdk/7.0.102/RuntimeIdentifierGraph.json" + } + } + } +} +"""; + /// + /// This is part of the content of the assets file that dotnet generates based on the + /// following project file content. + /// + /// + /// + /// netstandard1.6 + /// enable + /// enable + /// + /// + /// + /// + /// + /// + private readonly string assetsNetstandard16 = """ +{ + "version": 3, + "targets": { + ".NETStandard,Version=v1.6": { + "Microsoft.CSharp/4.3.0": { + "type": "package", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Dynamic.Runtime": "4.3.0", + "System.Globalization": "4.3.0", + "System.Linq": "4.3.0", + "System.Linq.Expressions": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0" + }, + "compile": { + "ref/netstandard1.0/Microsoft.CSharp.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/netstandard1.3/Microsoft.CSharp.dll": {} + } + }, + "Microsoft.NETCore.Platforms/1.1.0": { + "type": "package", + "compile": { + "lib/netstandard1.0/_._": {} + }, + "runtime": { + "lib/netstandard1.0/_._": {} + } + }, + "Microsoft.NETCore.Targets/1.1.0": { + "type": "package", + "compile": { + "lib/netstandard1.0/_._": {} + }, + "runtime": { + "lib/netstandard1.0/_._": {} + } + }, + "Microsoft.Win32.Primitives/4.3.0": { + "type": "package", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + }, + "compile": { + "ref/netstandard1.3/Microsoft.Win32.Primitives.dll": { + "related": ".xml" + } + } + }, + "NETStandard.Library/1.6.1": { + "type": "package", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "System.AppContext": "4.3.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Console": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.Compression": "4.3.0", + "System.IO.Compression.ZipFile": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Linq": "4.3.0", + "System.Linq.Expressions": "4.3.0", + "System.Net.Http": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.InteropServices.RuntimeInformation": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Timer": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0", + "System.Xml.XDocument": "4.3.0" + } + }, + "Newtonsoft.Json/12.0.1": { + "type": "package", + "dependencies": { + "Microsoft.CSharp": "4.3.0", + "NETStandard.Library": "1.6.1", + "System.ComponentModel.TypeConverter": "4.3.0", + "System.Runtime.Serialization.Formatters": "4.3.0", + "System.Runtime.Serialization.Primitives": "4.3.0", + "System.Xml.XmlDocument": "4.3.0" + }, + "compile": { + "lib/netstandard1.3/Newtonsoft.Json.dll": { + "related": ".pdb;.xml" + } + }, + "runtime": { + "lib/netstandard1.3/Newtonsoft.Json.dll": { + "related": ".pdb;.xml" + } + } + }, + "Newtonsoft.Json.Bson/1.0.2": { + "type": "package", + "dependencies": { + "NETStandard.Library": "1.6.1", + "Newtonsoft.Json": "12.0.1" + }, + "compile": { + "lib/netstandard1.3/Newtonsoft.Json.Bson.dll": { + "related": ".pdb;.xml" + } + }, + "runtime": { + "lib/netstandard1.3/Newtonsoft.Json.Bson.dll": { + "related": ".pdb;.xml" + } + } + } + } + }, + "projectFileDependencyGroups": { + ".NETStandard,Version=v1.6": [ + "NETStandard.Library >= 1.6.1", + "Newtonsoft.Json.Bson >= 1.0.2" + ] + }, + "packageFolders": { + "/Users/michaelnebel/Work/playground/csharpwebapp/packages": {} + }, + "project": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "/Users/michaelnebel/Work/playground/csharpwebapp/csharpwebapp.csproj", + "projectName": "csharpwebapp", + "projectPath": "/Users/michaelnebel/Work/playground/csharpwebapp/csharpwebapp.csproj", + "packagesPath": "/Users/michaelnebel/Work/playground/csharpwebapp/packages", + "outputPath": "/Users/michaelnebel/Work/playground/csharpwebapp/obj/", + "projectStyle": "PackageReference", + "configFilePaths": [ + "/Users/michaelnebel/.nuget/NuGet/NuGet.Config" + ], + "originalTargetFrameworks": [ + "netstandard1.6" + ], + "sources": { + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "netstandard1.6": { + "targetAlias": "netstandard1.6", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + } + }, + "frameworks": { + "netstandard1.6": { + "targetAlias": "netstandard1.6", + "dependencies": { + "NETStandard.Library": { + "target": "Package", + "version": "[1.6.1, )", + "autoReferenced": true + }, + "Newtonsoft.Json.Bson": { + "target": "Package", + "version": "[1.0.2, )" + } + }, + "runtimeIdentifierGraphPath": "/Users/michaelnebel/.dotnet/sdk/7.0.102/RuntimeIdentifierGraph.json" + } + } + } +} +"""; + + /// + /// This is part of the content of the assets file that dotnet generates based on the + /// following project file content. + /// + /// + /// + /// netcoreapp2.0 + /// enable + /// enable + /// + /// + /// + /// + /// + /// + private readonly string assetsNetcoreapp20 = """ +{ + "version": 3, + "targets": { + ".NETCoreApp,Version=v2.0": { + "Microsoft.NETCore.App/2.0.0": { + "type": "package", + "dependencies": { + "Microsoft.NETCore.DotNetHostPolicy": "2.0.0", + "Microsoft.NETCore.Platforms": "2.0.0", + "NETStandard.Library": "2.0.0" + }, + "compile": { + "ref/netcoreapp2.0/Microsoft.CSharp.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/Microsoft.VisualBasic.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/Microsoft.Win32.Primitives.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.AppContext.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Buffers.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Collections.Concurrent.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Collections.Immutable.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Collections.NonGeneric.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Collections.Specialized.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Collections.dll": { + "related": ".Concurrent.xml;.Immutable.xml;.NonGeneric.xml;.Specialized.xml;.xml" + }, + "ref/netcoreapp2.0/System.ComponentModel.Annotations.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.ComponentModel.Composition.dll": {}, + "ref/netcoreapp2.0/System.ComponentModel.DataAnnotations.dll": {}, + "ref/netcoreapp2.0/System.ComponentModel.EventBasedAsync.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.ComponentModel.Primitives.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.ComponentModel.TypeConverter.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.ComponentModel.dll": { + "related": ".Annotations.xml;.EventBasedAsync.xml;.Primitives.xml;.TypeConverter.xml;.xml" + }, + "ref/netcoreapp2.0/System.Configuration.dll": {}, + "ref/netcoreapp2.0/System.Console.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Core.dll": {}, + "ref/netcoreapp2.0/System.Data.Common.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Data.dll": { + "related": ".Common.xml" + }, + "ref/netcoreapp2.0/System.Diagnostics.Contracts.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Diagnostics.Debug.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Diagnostics.DiagnosticSource.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Diagnostics.FileVersionInfo.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Diagnostics.Process.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Diagnostics.StackTrace.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Diagnostics.TextWriterTraceListener.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Diagnostics.Tools.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Diagnostics.TraceSource.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Diagnostics.Tracing.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Drawing.Primitives.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Drawing.dll": { + "related": ".Primitives.xml" + }, + "ref/netcoreapp2.0/System.Dynamic.Runtime.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Globalization.Calendars.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Globalization.Extensions.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Globalization.dll": { + "related": ".Calendars.xml;.Extensions.xml;.xml" + }, + "ref/netcoreapp2.0/System.IO.Compression.FileSystem.dll": {}, + "ref/netcoreapp2.0/System.IO.Compression.ZipFile.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.IO.Compression.dll": { + "related": ".xml;.ZipFile.xml" + }, + "ref/netcoreapp2.0/System.IO.FileSystem.DriveInfo.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.IO.FileSystem.Primitives.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.IO.FileSystem.Watcher.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.IO.FileSystem.dll": { + "related": ".DriveInfo.xml;.Primitives.xml;.Watcher.xml;.xml" + }, + "ref/netcoreapp2.0/System.IO.IsolatedStorage.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.IO.MemoryMappedFiles.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.IO.Pipes.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.IO.UnmanagedMemoryStream.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.IO.dll": { + "related": ".Compression.xml;.Compression.ZipFile.xml;.FileSystem.DriveInfo.xml;.FileSystem.Primitives.xml;.FileSystem.Watcher.xml;.FileSystem.xml;.IsolatedStorage.xml;.MemoryMappedFiles.xml;.Pipes.xml;.UnmanagedMemoryStream.xml;.xml" + }, + "ref/netcoreapp2.0/System.Linq.Expressions.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Linq.Parallel.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Linq.Queryable.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Linq.dll": { + "related": ".Expressions.xml;.Parallel.xml;.Queryable.xml;.xml" + }, + "ref/netcoreapp2.0/System.Net.Http.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Net.HttpListener.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Net.Mail.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Net.NameResolution.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Net.NetworkInformation.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Net.Ping.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Net.Primitives.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Net.Requests.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Net.Security.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Net.ServicePoint.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Net.Sockets.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Net.WebClient.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Net.WebHeaderCollection.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Net.WebProxy.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Net.WebSockets.Client.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Net.WebSockets.dll": { + "related": ".Client.xml;.xml" + }, + "ref/netcoreapp2.0/System.Net.dll": { + "related": ".Http.xml;.HttpListener.xml;.Mail.xml;.NameResolution.xml;.NetworkInformation.xml;.Ping.xml;.Primitives.xml;.Requests.xml;.Security.xml;.ServicePoint.xml;.Sockets.xml;.WebClient.xml;.WebHeaderCollection.xml;.WebProxy.xml;.WebSockets.Client.xml;.WebSockets.xml" + }, + "ref/netcoreapp2.0/System.Numerics.Vectors.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Numerics.dll": { + "related": ".Vectors.xml" + }, + "ref/netcoreapp2.0/System.ObjectModel.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Reflection.DispatchProxy.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Reflection.Emit.ILGeneration.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Reflection.Emit.Lightweight.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Reflection.Emit.dll": { + "related": ".ILGeneration.xml;.Lightweight.xml;.xml" + }, + "ref/netcoreapp2.0/System.Reflection.Extensions.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Reflection.Metadata.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Reflection.Primitives.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Reflection.TypeExtensions.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Reflection.dll": { + "related": ".DispatchProxy.xml;.Emit.ILGeneration.xml;.Emit.Lightweight.xml;.Emit.xml;.Extensions.xml;.Metadata.xml;.Primitives.xml;.TypeExtensions.xml;.xml" + }, + "ref/netcoreapp2.0/System.Resources.Reader.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Resources.ResourceManager.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Resources.Writer.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Runtime.CompilerServices.VisualC.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Runtime.Extensions.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Runtime.Handles.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Runtime.InteropServices.RuntimeInformation.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Runtime.InteropServices.WindowsRuntime.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Runtime.InteropServices.dll": { + "related": ".RuntimeInformation.xml;.WindowsRuntime.xml;.xml" + }, + "ref/netcoreapp2.0/System.Runtime.Loader.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Runtime.Numerics.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Runtime.Serialization.Formatters.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Runtime.Serialization.Json.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Runtime.Serialization.Primitives.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Runtime.Serialization.Xml.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Runtime.Serialization.dll": { + "related": ".Formatters.xml;.Json.xml;.Primitives.xml;.Xml.xml" + }, + "ref/netcoreapp2.0/System.Runtime.dll": { + "related": ".CompilerServices.VisualC.xml;.Extensions.xml;.Handles.xml;.InteropServices.RuntimeInformation.xml;.InteropServices.WindowsRuntime.xml;.InteropServices.xml;.Loader.xml;.Numerics.xml;.Serialization.Formatters.xml;.Serialization.Json.xml;.Serialization.Primitives.xml;.Serialization.Xml.xml;.xml" + }, + "ref/netcoreapp2.0/System.Security.Claims.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Security.Cryptography.Algorithms.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Security.Cryptography.Csp.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Security.Cryptography.Encoding.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Security.Cryptography.Primitives.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Security.Cryptography.X509Certificates.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Security.Principal.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Security.SecureString.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Security.dll": { + "related": ".Claims.xml;.Cryptography.Algorithms.xml;.Cryptography.Csp.xml;.Cryptography.Encoding.xml;.Cryptography.Primitives.xml;.Cryptography.X509Certificates.xml;.Principal.xml;.SecureString.xml" + }, + "ref/netcoreapp2.0/System.ServiceModel.Web.dll": {}, + "ref/netcoreapp2.0/System.ServiceProcess.dll": {}, + "ref/netcoreapp2.0/System.Text.Encoding.Extensions.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Text.Encoding.dll": { + "related": ".Extensions.xml;.xml" + }, + "ref/netcoreapp2.0/System.Text.RegularExpressions.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Threading.Overlapped.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Threading.Tasks.Dataflow.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Threading.Tasks.Extensions.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Threading.Tasks.Parallel.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Threading.Tasks.dll": { + "related": ".Dataflow.xml;.Extensions.xml;.Parallel.xml;.xml" + }, + "ref/netcoreapp2.0/System.Threading.Thread.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Threading.ThreadPool.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Threading.Timer.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Threading.dll": { + "related": ".Overlapped.xml;.Tasks.Dataflow.xml;.Tasks.Extensions.xml;.Tasks.Parallel.xml;.Tasks.xml;.Thread.xml;.ThreadPool.xml;.Timer.xml;.xml" + }, + "ref/netcoreapp2.0/System.Transactions.Local.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Transactions.dll": { + "related": ".Local.xml" + }, + "ref/netcoreapp2.0/System.ValueTuple.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Web.HttpUtility.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Web.dll": { + "related": ".HttpUtility.xml" + }, + "ref/netcoreapp2.0/System.Windows.dll": {}, + "ref/netcoreapp2.0/System.Xml.Linq.dll": {}, + "ref/netcoreapp2.0/System.Xml.ReaderWriter.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Xml.Serialization.dll": {}, + "ref/netcoreapp2.0/System.Xml.XDocument.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Xml.XPath.XDocument.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Xml.XPath.dll": { + "related": ".XDocument.xml;.xml" + }, + "ref/netcoreapp2.0/System.Xml.XmlDocument.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Xml.XmlSerializer.dll": { + "related": ".xml" + }, + "ref/netcoreapp2.0/System.Xml.dll": { + "related": ".ReaderWriter.xml;.XDocument.xml;.XmlDocument.xml;.XmlSerializer.xml;.XPath.XDocument.xml;.XPath.xml" + }, + "ref/netcoreapp2.0/System.dll": { + "related": ".AppContext.xml;.Buffers.xml;.Collections.Concurrent.xml;.Collections.Immutable.xml;.Collections.NonGeneric.xml;.Collections.Specialized.xml;.Collections.xml;.ComponentModel.Annotations.xml;.ComponentModel.EventBasedAsync.xml;.ComponentModel.Primitives.xml;.ComponentModel.TypeConverter.xml;.ComponentModel.xml;.Console.xml;.Data.Common.xml;.Diagnostics.Contracts.xml;.Diagnostics.Debug.xml;.Diagnostics.DiagnosticSource.xml;.Diagnostics.FileVersionInfo.xml;.Diagnostics.Process.xml;.Diagnostics.StackTrace.xml;.Diagnostics.TextWriterTraceListener.xml;.Diagnostics.Tools.xml;.Diagnostics.TraceSource.xml;.Diagnostics.Tracing.xml;.Drawing.Primitives.xml;.Dynamic.Runtime.xml;.Globalization.Calendars.xml;.Globalization.Extensions.xml;.Globalization.xml;.IO.Compression.xml;.IO.Compression.ZipFile.xml;.IO.FileSystem.DriveInfo.xml;.IO.FileSystem.Primitives.xml;.IO.FileSystem.Watcher.xml;.IO.FileSystem.xml;.IO.IsolatedStorage.xml;.IO.MemoryMappedFiles.xml;.IO.Pipes.xml;.IO.UnmanagedMemoryStream.xml;.IO.xml;.Linq.Expressions.xml;.Linq.Parallel.xml;.Linq.Queryable.xml;.Linq.xml;.Net.Http.xml;.Net.HttpListener.xml;.Net.Mail.xml;.Net.NameResolution.xml;.Net.NetworkInformation.xml;.Net.Ping.xml;.Net.Primitives.xml;.Net.Requests.xml;.Net.Security.xml;.Net.ServicePoint.xml;.Net.Sockets.xml;.Net.WebClient.xml;.Net.WebHeaderCollection.xml;.Net.WebProxy.xml;.Net.WebSockets.Client.xml;.Net.WebSockets.xml;.Numerics.Vectors.xml;.ObjectModel.xml;.Reflection.DispatchProxy.xml;.Reflection.Emit.ILGeneration.xml;.Reflection.Emit.Lightweight.xml;.Reflection.Emit.xml;.Reflection.Extensions.xml;.Reflection.Metadata.xml;.Reflection.Primitives.xml;.Reflection.TypeExtensions.xml;.Reflection.xml;.Resources.Reader.xml;.Resources.ResourceManager.xml;.Resources.Writer.xml;.Runtime.CompilerServices.VisualC.xml;.Runtime.Extensions.xml;.Runtime.Handles.xml;.Runtime.InteropServices.RuntimeInformation.xml;.Runtime.InteropServices.WindowsRuntime.xml;.Runtime.InteropServices.xml;.Runtime.Loader.xml;.Runtime.Numerics.xml;.Runtime.Serialization.Formatters.xml;.Runtime.Serialization.Json.xml;.Runtime.Serialization.Primitives.xml;.Runtime.Serialization.Xml.xml;.Runtime.xml;.Security.Claims.xml;.Security.Cryptography.Algorithms.xml;.Security.Cryptography.Csp.xml;.Security.Cryptography.Encoding.xml;.Security.Cryptography.Primitives.xml;.Security.Cryptography.X509Certificates.xml;.Security.Principal.xml;.Security.SecureString.xml;.Text.Encoding.Extensions.xml;.Text.Encoding.xml;.Text.RegularExpressions.xml;.Threading.Overlapped.xml;.Threading.Tasks.Dataflow.xml;.Threading.Tasks.Extensions.xml;.Threading.Tasks.Parallel.xml;.Threading.Tasks.xml;.Threading.Thread.xml;.Threading.ThreadPool.xml;.Threading.Timer.xml;.Threading.xml;.Transactions.Local.xml;.ValueTuple.xml;.Web.HttpUtility.xml;.Xml.ReaderWriter.xml;.Xml.XDocument.xml;.Xml.XmlDocument.xml;.Xml.XmlSerializer.xml;.Xml.XPath.XDocument.xml;.Xml.XPath.xml" + }, + "ref/netcoreapp2.0/WindowsBase.dll": {}, + "ref/netcoreapp2.0/mscorlib.dll": {}, + "ref/netcoreapp2.0/netstandard.dll": {} + }, + "build": { + "build/netcoreapp2.0/Microsoft.NETCore.App.props": {}, + "build/netcoreapp2.0/Microsoft.NETCore.App.targets": {} + } + }, + "Microsoft.NETCore.DotNetAppHost/2.0.0": { + "type": "package" + }, + "Microsoft.NETCore.DotNetHostPolicy/2.0.0": { + "type": "package", + "dependencies": { + "Microsoft.NETCore.DotNetHostResolver": "2.0.0" + } + }, + "Microsoft.NETCore.DotNetHostResolver/2.0.0": { + "type": "package", + "dependencies": { + "Microsoft.NETCore.DotNetAppHost": "2.0.0" + } + }, + "Microsoft.NETCore.Platforms/2.0.0": { + "type": "package", + "compile": { + "lib/netstandard1.0/_._": {} + }, + "runtime": { + "lib/netstandard1.0/_._": {} + } + }, + "NETStandard.Library/2.0.0": { + "type": "package", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0" + }, + "compile": { + "lib/netstandard1.0/_._": {} + }, + "runtime": { + "lib/netstandard1.0/_._": {} + }, + "build": { + "build/netstandard2.0/NETStandard.Library.targets": {} + } + }, + "Newtonsoft.Json/12.0.1": { + "type": "package", + "compile": { + "lib/netstandard2.0/Newtonsoft.Json.dll": { + "related": ".pdb;.xml" + } + }, + "runtime": { + "lib/netstandard2.0/Newtonsoft.Json.dll": { + "related": ".pdb;.xml" + } + } + }, + "Newtonsoft.Json.Bson/1.0.2": { + "type": "package", + "dependencies": { + "Newtonsoft.Json": "12.0.1" + }, + "compile": { + "lib/netstandard2.0/Newtonsoft.Json.Bson.dll": { + "related": ".pdb;.xml" + } + }, + "runtime": { + "lib/netstandard2.0/Newtonsoft.Json.Bson.dll": { + "related": ".pdb;.xml" + } + } + } + } + }, + "projectFileDependencyGroups": { + ".NETCoreApp,Version=v2.0": [ + "Microsoft.NETCore.App >= 2.0.0", + "Newtonsoft.Json.Bson >= 1.0.2" + ] + }, + "packageFolders": { + "/Users/michaelnebel/Work/playground/csharpwebapp/packages": {} + }, + "project": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "/Users/michaelnebel/Work/playground/csharpwebapp/csharpwebapp.csproj", + "projectName": "csharpwebapp", + "projectPath": "/Users/michaelnebel/Work/playground/csharpwebapp/csharpwebapp.csproj", + "packagesPath": "/Users/michaelnebel/Work/playground/csharpwebapp/packages", + "outputPath": "/Users/michaelnebel/Work/playground/csharpwebapp/obj/", + "projectStyle": "PackageReference", + "configFilePaths": [ + "/Users/michaelnebel/.nuget/NuGet/NuGet.Config" + ], + "originalTargetFrameworks": [ + "netcoreapp2.0" + ], + "sources": { + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "netcoreapp2.0": { + "targetAlias": "netcoreapp2.0", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + } + }, + "frameworks": { + "netcoreapp2.0": { + "targetAlias": "netcoreapp2.0", + "dependencies": { + "Microsoft.NETCore.App": { + "suppressParent": "All", + "target": "Package", + "version": "[2.0.0, )", + "autoReferenced": true + }, + "Newtonsoft.Json.Bson": { + "target": "Package", + "version": "[1.0.2, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "runtimeIdentifierGraphPath": "/Users/michaelnebel/.dotnet/sdk/7.0.102/RuntimeIdentifierGraph.json" + } + } + } +} +"""; + + /// + /// This is part of the content of the assets file that dotnet generates based on the + /// following project file content. + /// + /// + /// + /// netcoreapp3.1 + /// enable + /// enable + /// + /// + /// + /// + /// + /// + private readonly string assetsNetcoreapp31 = """ +{ + "version": 3, + "targets": { + ".NETCoreApp,Version=v3.1": { + "Newtonsoft.Json/12.0.1": { + "type": "package", + "compile": { + "lib/netstandard2.0/Newtonsoft.Json.dll": { + "related": ".pdb;.xml" + } + }, + "runtime": { + "lib/netstandard2.0/Newtonsoft.Json.dll": { + "related": ".pdb;.xml" + } + } + }, + "Newtonsoft.Json.Bson/1.0.2": { + "type": "package", + "dependencies": { + "Newtonsoft.Json": "12.0.1" + }, + "compile": { + "lib/netstandard2.0/Newtonsoft.Json.Bson.dll": { + "related": ".pdb;.xml" + } + }, + "runtime": { + "lib/netstandard2.0/Newtonsoft.Json.Bson.dll": { + "related": ".pdb;.xml" + } + } + } + } + }, + "projectFileDependencyGroups": { + ".NETCoreApp,Version=v3.1": [ + "Newtonsoft.Json.Bson >= 1.0.2" + ] + }, + "packageFolders": { + "/Users/michaelnebel/Work/playground/csharpwebapp/packages": {} + }, + "project": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "/Users/michaelnebel/Work/playground/csharpwebapp/csharpwebapp.csproj", + "projectName": "csharpwebapp", + "projectPath": "/Users/michaelnebel/Work/playground/csharpwebapp/csharpwebapp.csproj", + "packagesPath": "/Users/michaelnebel/Work/playground/csharpwebapp/packages", + "outputPath": "/Users/michaelnebel/Work/playground/csharpwebapp/obj/", + "projectStyle": "PackageReference", + "configFilePaths": [ + "/Users/michaelnebel/.nuget/NuGet/NuGet.Config" + ], + "originalTargetFrameworks": [ + "netcoreapp3.1" + ], + "sources": { + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "netcoreapp3.1": { + "targetAlias": "netcoreapp3.1", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + } + }, + "frameworks": { + "netcoreapp3.1": { + "targetAlias": "netcoreapp3.1", + "dependencies": { + "Newtonsoft.Json.Bson": { + "target": "Package", + "version": "[1.0.2, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "downloadDependencies": [ + { + "name": "Microsoft.AspNetCore.App.Ref", + "version": "[3.1.10, 3.1.10]" + }, + { + "name": "Microsoft.NETCore.App.Host.osx-x64", + "version": "[3.1.32, 3.1.32]" + }, + { + "name": "Microsoft.NETCore.App.Ref", + "version": "[3.1.0, 3.1.0]" + } + ], + "frameworkReferences": { + "Microsoft.AspNetCore.App": { + "privateAssets": "none" + }, + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "/Users/michaelnebel/.dotnet/sdk/7.0.102/RuntimeIdentifierGraph.json" + } + } + } } """; } diff --git a/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md b/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md index 8e37908e0fc..e9d0229bf18 100644 --- a/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md +++ b/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.7.3 + +No user-facing changes. + ## 1.7.2 No user-facing changes. diff --git a/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.7.3.md b/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.7.3.md new file mode 100644 index 00000000000..a629082e215 --- /dev/null +++ b/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.7.3.md @@ -0,0 +1,3 @@ +## 1.7.3 + +No user-facing changes. diff --git a/csharp/ql/campaigns/Solorigate/lib/codeql-pack.release.yml b/csharp/ql/campaigns/Solorigate/lib/codeql-pack.release.yml index 39bbba86c19..9f9661b1e77 100644 --- a/csharp/ql/campaigns/Solorigate/lib/codeql-pack.release.yml +++ b/csharp/ql/campaigns/Solorigate/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.7.2 +lastReleaseVersion: 1.7.3 diff --git a/csharp/ql/campaigns/Solorigate/lib/qlpack.yml b/csharp/ql/campaigns/Solorigate/lib/qlpack.yml index 2adbcb7101e..5d2515728d1 100644 --- a/csharp/ql/campaigns/Solorigate/lib/qlpack.yml +++ b/csharp/ql/campaigns/Solorigate/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-solorigate-all -version: 1.7.3-dev +version: 1.7.4-dev groups: - csharp - solorigate diff --git a/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md b/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md index 8e37908e0fc..e9d0229bf18 100644 --- a/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md +++ b/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.7.3 + +No user-facing changes. + ## 1.7.2 No user-facing changes. diff --git a/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.7.3.md b/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.7.3.md new file mode 100644 index 00000000000..a629082e215 --- /dev/null +++ b/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.7.3.md @@ -0,0 +1,3 @@ +## 1.7.3 + +No user-facing changes. diff --git a/csharp/ql/campaigns/Solorigate/src/codeql-pack.release.yml b/csharp/ql/campaigns/Solorigate/src/codeql-pack.release.yml index 39bbba86c19..9f9661b1e77 100644 --- a/csharp/ql/campaigns/Solorigate/src/codeql-pack.release.yml +++ b/csharp/ql/campaigns/Solorigate/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.7.2 +lastReleaseVersion: 1.7.3 diff --git a/csharp/ql/campaigns/Solorigate/src/qlpack.yml b/csharp/ql/campaigns/Solorigate/src/qlpack.yml index 2b213c24246..0f973ee2b36 100644 --- a/csharp/ql/campaigns/Solorigate/src/qlpack.yml +++ b/csharp/ql/campaigns/Solorigate/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-solorigate-queries -version: 1.7.3-dev +version: 1.7.4-dev groups: - csharp - solorigate diff --git a/csharp/ql/integration-tests/all-platforms/dotnet_pack/test.py b/csharp/ql/integration-tests/all-platforms/dotnet_pack/test.py index b91e73ef11c..258f5f3b764 100644 --- a/csharp/ql/integration-tests/all-platforms/dotnet_pack/test.py +++ b/csharp/ql/integration-tests/all-platforms/dotnet_pack/test.py @@ -2,10 +2,10 @@ import os from create_database_utils import * from diagnostics_test_utils import * -run_codeql_database_create(['dotnet pack'], db=None, lang="csharp") +run_codeql_database_create(['dotnet pack -o nugetpackage'], db=None, lang="csharp") ## Check that the NuGet package is created. -if not os.path.isfile("bin/Debug/dotnet_pack.1.0.0.nupkg"): +if not os.path.isfile("nugetpackage/dotnet_pack.1.0.0.nupkg"): raise Exception("The NuGet package was not created.") check_diagnostics() diff --git a/csharp/ql/integration-tests/posix-only/dotnet_test_mstest/dotnet_test_mstest.csproj b/csharp/ql/integration-tests/posix-only/dotnet_test_mstest/dotnet_test_mstest.csproj index 95c7586e04e..c6d0c87e9db 100644 --- a/csharp/ql/integration-tests/posix-only/dotnet_test_mstest/dotnet_test_mstest.csproj +++ b/csharp/ql/integration-tests/posix-only/dotnet_test_mstest/dotnet_test_mstest.csproj @@ -7,6 +7,7 @@ false Exe + false diff --git a/csharp/ql/lib/CHANGELOG.md b/csharp/ql/lib/CHANGELOG.md index 71fbec9d4fe..5109822d6b3 100644 --- a/csharp/ql/lib/CHANGELOG.md +++ b/csharp/ql/lib/CHANGELOG.md @@ -1,3 +1,49 @@ +## 0.8.3 + +### Minor Analysis Improvements + +* The predicate `UnboundGeneric::getName` now prints the number of type parameters as a `` `N`` suffix, instead of a `<,...,>` suffix. For example, the unbound generic type +`System.Collections.Generic.IList` is printed as ``IList`1`` instead of `IList<>`. +* The predicates `hasQualifiedName`, `getQualifiedName`, and `getQualifiedNameWithTypes` have been deprecated, and are instead replaced by `hasFullyQualifiedName`, `getFullyQualifiedName`, and `getFullyQualifiedNameWithTypes`, respectively. The new predicates use the same format for unbound generic types as mentioned above. +* These changes also affect models-as-data rows that refer to a field or a property belonging to a generic type. For example, instead of writing +```yml +extensions: + - addsTo: + pack: codeql/csharp-all + extensible: summaryModel + data: + - ["System.Collections.Generic", "Dictionary", False, "Add", "(System.Collections.Generic.KeyValuePair)", "", "Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Key]", "Argument[this].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key]", "value", "manual"] +``` +one now writes +```yml +extensions: + - addsTo: + pack: codeql/csharp-all + extensible: summaryModel + data: + - ["System.Collections.Generic", "Dictionary", False, "Add", "(System.Collections.Generic.KeyValuePair)", "", "Argument[0].Property[System.Collections.Generic.KeyValuePair`2.Key]", "Argument[this].Element.Property[System.Collections.Generic.KeyValuePair`2.Key]", "value", "manual"] +``` +* The models-as-data format for types and methods with type parameters has been changed to include the names of the type parameters. For example, instead of writing +```yml +extensions: + - addsTo: + pack: codeql/csharp-all + extensible: summaryModel + data: + - ["System.Collections.Generic", "IList<>", True, "Insert", "(System.Int32,T)", "", "Argument[1]", "Argument[this].Element", "value", "manual"] + - ["System.Linq", "Enumerable", False, "Select<,>", "(System.Collections.Generic.IEnumerable,System.Func)", "", "Argument[0].Element", "Argument[1].Parameter[0]", "value", "manual"] +``` +one now writes +```yml +extensions: + - addsTo: + pack: codeql/csharp-all + extensible: summaryModel + data: + - ["System.Collections.Generic", "IList", True, "Insert", "(System.Int32,T)", "", "Argument[1]", "Argument[this].Element", "value", "manual"] + - ["System.Linq", "Enumerable", False, "Select", "(System.Collections.Generic.IEnumerable,System.Func)", "", "Argument[0].Element", "Argument[1].Parameter[0]", "value", "manual"] +``` + ## 0.8.2 No user-facing changes. diff --git a/csharp/ql/lib/change-notes/2023-11-09-mad-generics.md b/csharp/ql/lib/change-notes/2023-11-09-mad-generics.md deleted file mode 100644 index 9b81727ea21..00000000000 --- a/csharp/ql/lib/change-notes/2023-11-09-mad-generics.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -category: minorAnalysis ---- - -* The models-as-data format for types and methods with type parameters has been changed to include the names of the type parameters. For example, instead of writing -```yml -extensions: - - addsTo: - pack: codeql/csharp-all - extensible: summaryModel - data: - - ["System.Collections.Generic", "IList<>", True, "Insert", "(System.Int32,T)", "", "Argument[1]", "Argument[this].Element", "value", "manual"] - - ["System.Linq", "Enumerable", False, "Select<,>", "(System.Collections.Generic.IEnumerable,System.Func)", "", "Argument[0].Element", "Argument[1].Parameter[0]", "value", "manual"] -``` -one now writes -```yml -extensions: - - addsTo: - pack: codeql/csharp-all - extensible: summaryModel - data: - - ["System.Collections.Generic", "IList", True, "Insert", "(System.Int32,T)", "", "Argument[1]", "Argument[this].Element", "value", "manual"] - - ["System.Linq", "Enumerable", False, "Select", "(System.Collections.Generic.IEnumerable,System.Func)", "", "Argument[0].Element", "Argument[1].Parameter[0]", "value", "manual"] -``` diff --git a/csharp/ql/lib/change-notes/2023-11-10-unbound-generics-fqn.md b/csharp/ql/lib/change-notes/released/0.8.3.md similarity index 56% rename from csharp/ql/lib/change-notes/2023-11-10-unbound-generics-fqn.md rename to csharp/ql/lib/change-notes/released/0.8.3.md index 99003b4e5d1..3e0478aae24 100644 --- a/csharp/ql/lib/change-notes/2023-11-10-unbound-generics-fqn.md +++ b/csharp/ql/lib/change-notes/released/0.8.3.md @@ -1,6 +1,6 @@ ---- -category: minorAnalysis ---- +## 0.8.3 + +### Minor Analysis Improvements * The predicate `UnboundGeneric::getName` now prints the number of type parameters as a `` `N`` suffix, instead of a `<,...,>` suffix. For example, the unbound generic type `System.Collections.Generic.IList` is printed as ``IList`1`` instead of `IList<>`. @@ -23,3 +23,23 @@ extensions: data: - ["System.Collections.Generic", "Dictionary", False, "Add", "(System.Collections.Generic.KeyValuePair)", "", "Argument[0].Property[System.Collections.Generic.KeyValuePair`2.Key]", "Argument[this].Element.Property[System.Collections.Generic.KeyValuePair`2.Key]", "value", "manual"] ``` +* The models-as-data format for types and methods with type parameters has been changed to include the names of the type parameters. For example, instead of writing +```yml +extensions: + - addsTo: + pack: codeql/csharp-all + extensible: summaryModel + data: + - ["System.Collections.Generic", "IList<>", True, "Insert", "(System.Int32,T)", "", "Argument[1]", "Argument[this].Element", "value", "manual"] + - ["System.Linq", "Enumerable", False, "Select<,>", "(System.Collections.Generic.IEnumerable,System.Func)", "", "Argument[0].Element", "Argument[1].Parameter[0]", "value", "manual"] +``` +one now writes +```yml +extensions: + - addsTo: + pack: codeql/csharp-all + extensible: summaryModel + data: + - ["System.Collections.Generic", "IList", True, "Insert", "(System.Int32,T)", "", "Argument[1]", "Argument[this].Element", "value", "manual"] + - ["System.Linq", "Enumerable", False, "Select", "(System.Collections.Generic.IEnumerable,System.Func)", "", "Argument[0].Element", "Argument[1].Parameter[0]", "value", "manual"] +``` diff --git a/csharp/ql/lib/codeql-pack.release.yml b/csharp/ql/lib/codeql-pack.release.yml index 404110129dc..b6e46394f37 100644 --- a/csharp/ql/lib/codeql-pack.release.yml +++ b/csharp/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.8.2 +lastReleaseVersion: 0.8.3 diff --git a/csharp/ql/lib/qlpack.yml b/csharp/ql/lib/qlpack.yml index 574de8bf003..efbec3140c1 100644 --- a/csharp/ql/lib/qlpack.yml +++ b/csharp/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-all -version: 0.8.3-dev +version: 0.8.4-dev groups: csharp dbscheme: semmlecode.csharp.dbscheme extractor: csharp diff --git a/csharp/ql/lib/semmle/code/cil/internal/SsaImpl.qll b/csharp/ql/lib/semmle/code/cil/internal/SsaImpl.qll index 2f8fde205fd..3aafaa00baa 100644 --- a/csharp/ql/lib/semmle/code/cil/internal/SsaImpl.qll +++ b/csharp/ql/lib/semmle/code/cil/internal/SsaImpl.qll @@ -1,7 +1,7 @@ private import cil private import codeql.ssa.Ssa as SsaImplCommon -private module SsaInput implements SsaImplCommon::InputSig { +private module SsaInput implements SsaImplCommon::InputSig { class BasicBlock = CIL::BasicBlock; BasicBlock getImmediateBasicBlockDominator(BasicBlock bb) { result = bb.getImmediateDominator() } @@ -29,7 +29,7 @@ private module SsaInput implements SsaImplCommon::InputSig { } } -import SsaImplCommon::Make +import SsaImplCommon::Make cached private module Cached { diff --git a/csharp/ql/lib/semmle/code/csharp/controlflow/internal/PreSsa.qll b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/PreSsa.qll index 2c61592778a..42d9c21102a 100644 --- a/csharp/ql/lib/semmle/code/csharp/controlflow/internal/PreSsa.qll +++ b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/PreSsa.qll @@ -36,7 +36,7 @@ module PreSsa { scopeFirst(c, bb) } - module SsaInput implements SsaImplCommon::InputSig { + module SsaInput implements SsaImplCommon::InputSig { class BasicBlock = PreBasicBlocks::PreBasicBlock; BasicBlock getImmediateBasicBlockDominator(BasicBlock bb) { result.immediatelyDominates(bb) } @@ -137,7 +137,7 @@ module PreSsa { } } - private module SsaImpl = SsaImplCommon::Make; + private module SsaImpl = SsaImplCommon::Make; class Definition extends SsaImpl::Definition { final AssignableRead getARead() { diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/BaseSSA.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/BaseSSA.qll index cb737200a02..0933559347e 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/BaseSSA.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/BaseSSA.qll @@ -24,7 +24,7 @@ module BaseSsa { ) } - private module SsaInput implements SsaImplCommon::InputSig { + private module SsaInput implements SsaImplCommon::InputSig { class BasicBlock = ControlFlow::BasicBlock; BasicBlock getImmediateBasicBlockDominator(BasicBlock bb) { @@ -60,7 +60,7 @@ module BaseSsa { } } - private module SsaImpl = SsaImplCommon::Make; + private module SsaImpl = SsaImplCommon::Make; class Definition extends SsaImpl::Definition { final AssignableRead getARead() { diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/SsaImpl.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/SsaImpl.qll index 596ddde0f55..cf7bb8b83c2 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/SsaImpl.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/SsaImpl.qll @@ -6,7 +6,7 @@ import csharp private import codeql.ssa.Ssa as SsaImplCommon private import AssignableDefinitions -private module SsaInput implements SsaImplCommon::InputSig { +private module SsaInput implements SsaImplCommon::InputSig { class BasicBlock = ControlFlow::BasicBlock; BasicBlock getImmediateBasicBlockDominator(BasicBlock bb) { result = bb.getImmediateDominator() } @@ -49,7 +49,7 @@ private module SsaInput implements SsaImplCommon::InputSig { } } -private import SsaImplCommon::Make as Impl +private import SsaImplCommon::Make as Impl class Definition = Impl::Definition; diff --git a/csharp/ql/lib/semmle/code/csharp/security/dataflow/flowsinks/ExternalLocationSink.qll b/csharp/ql/lib/semmle/code/csharp/security/dataflow/flowsinks/ExternalLocationSink.qll index 03f8bd42715..abd1ad92733 100644 --- a/csharp/ql/lib/semmle/code/csharp/security/dataflow/flowsinks/ExternalLocationSink.qll +++ b/csharp/ql/lib/semmle/code/csharp/security/dataflow/flowsinks/ExternalLocationSink.qll @@ -27,8 +27,9 @@ private class ExternalModelSink extends ExternalLocationSink { */ class LogMessageSink extends ExternalLocationSink { LogMessageSink() { - this.getExpr() = any(LoggerType i).getAMethod().getACall().getAnArgument() - or + this.getExpr() = any(LoggerType i).getAMethod().getACall().getAnArgument() or + this.getExpr() = + any(MethodCall call | call.getQualifier().getType() instanceof LoggerType).getAnArgument() or this.getExpr() = any(ExtensionMethodCall call | call.getTarget().(ExtensionMethod).getExtendedType() instanceof LoggerType diff --git a/csharp/ql/src/CHANGELOG.md b/csharp/ql/src/CHANGELOG.md index 7246cba39cb..6cc567b98de 100644 --- a/csharp/ql/src/CHANGELOG.md +++ b/csharp/ql/src/CHANGELOG.md @@ -1,3 +1,9 @@ +## 0.8.3 + +### Minor Analysis Improvements + +* CIL extraction is now disabled by default. It is still possible to turn on CIL extraction by setting the `cil` extractor option to `true` or by setting the environment variable `$CODEQL_EXTRACTOR_CSHARP_OPTION_CIL` to `true`. This is the first step towards sun-setting the CIL extractor entirely. + ## 0.8.2 No user-facing changes. diff --git a/csharp/ql/src/Security Features/InsecureRandomness.qhelp b/csharp/ql/src/Security Features/InsecureRandomness.qhelp index b0fe5a5513e..6f9634643ec 100644 --- a/csharp/ql/src/Security Features/InsecureRandomness.qhelp +++ b/csharp/ql/src/Security Features/InsecureRandomness.qhelp @@ -29,11 +29,6 @@ number generator. Random is not cryptographically secure, and shoul security contexts. For contexts which are not security sensitive, Random may be preferable as it has a more convenient interface, and is likely to be faster.

    -

    -For the specific use-case of generating passwords, consider -System.Web.Security.Membership.GeneratePassword, which provides a cryptographically -secure method of generating random passwords. -

    @@ -54,10 +49,7 @@ purpose. In this case, it is much harder to predict the generated integers.

    In the final example, the password is generated using the Membership.GeneratePassword -library method, which uses a cryptographically secure random number generator to generate a random -series of characters. This method should be preferred when generating passwords, if possible, as it -avoids potential pitfalls when converting the output of a random number generator (usually an int or -a byte) to a series of permitted characters. +library method, which generates a password with a bias, therefore should be avoided.

    diff --git a/csharp/ql/src/change-notes/2023-10-24-disable-cil.md b/csharp/ql/src/change-notes/released/0.8.3.md similarity index 74% rename from csharp/ql/src/change-notes/2023-10-24-disable-cil.md rename to csharp/ql/src/change-notes/released/0.8.3.md index e66d70c8698..e0798a993c4 100644 --- a/csharp/ql/src/change-notes/2023-10-24-disable-cil.md +++ b/csharp/ql/src/change-notes/released/0.8.3.md @@ -1,4 +1,5 @@ ---- -category: minorAnalysis ---- -* CIL extraction is now disabled by default. It is still possible to turn on CIL extraction by setting the `cil` extractor option to `true` or by setting the environment variable `$CODEQL_EXTRACTOR_CSHARP_OPTION_CIL` to `true`. This is the first step towards sun-setting the CIL extractor entirely. \ No newline at end of file +## 0.8.3 + +### Minor Analysis Improvements + +* CIL extraction is now disabled by default. It is still possible to turn on CIL extraction by setting the `cil` extractor option to `true` or by setting the environment variable `$CODEQL_EXTRACTOR_CSHARP_OPTION_CIL` to `true`. This is the first step towards sun-setting the CIL extractor entirely. diff --git a/csharp/ql/src/codeql-pack.release.yml b/csharp/ql/src/codeql-pack.release.yml index 404110129dc..b6e46394f37 100644 --- a/csharp/ql/src/codeql-pack.release.yml +++ b/csharp/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.8.2 +lastReleaseVersion: 0.8.3 diff --git a/csharp/ql/src/qlpack.yml b/csharp/ql/src/qlpack.yml index 667ca875601..28eb9007dc0 100644 --- a/csharp/ql/src/qlpack.yml +++ b/csharp/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-queries -version: 0.8.3-dev +version: 0.8.4-dev groups: - csharp - queries diff --git a/csharp/ql/test/library-tests/standalone/assemblyattribute/attr.expected b/csharp/ql/test/library-tests/standalone/assemblyattribute/attr.expected new file mode 100644 index 00000000000..a8e2f7d8aeb --- /dev/null +++ b/csharp/ql/test/library-tests/standalone/assemblyattribute/attr.expected @@ -0,0 +1,2 @@ +| standalone.cs:3:12:3:29 | [assembly: Attribute1(...)] | +| standalone.cs:9:2:9:11 | [Attribute1(...)] | diff --git a/csharp/ql/test/library-tests/standalone/assemblyattribute/attr.ql b/csharp/ql/test/library-tests/standalone/assemblyattribute/attr.ql new file mode 100644 index 00000000000..f1f82ed8f78 --- /dev/null +++ b/csharp/ql/test/library-tests/standalone/assemblyattribute/attr.ql @@ -0,0 +1,5 @@ +import csharp + +from Attribute a +where a.getType().getName() = "Attribute1Attribute" +select a diff --git a/csharp/ql/test/library-tests/standalone/assemblyattribute/options b/csharp/ql/test/library-tests/standalone/assemblyattribute/options new file mode 100644 index 00000000000..7ba3811b2af --- /dev/null +++ b/csharp/ql/test/library-tests/standalone/assemblyattribute/options @@ -0,0 +1 @@ +semmle-extractor-options: --standalone diff --git a/csharp/ql/test/library-tests/standalone/assemblyattribute/standalone.cs b/csharp/ql/test/library-tests/standalone/assemblyattribute/standalone.cs new file mode 100644 index 00000000000..a03550d040e --- /dev/null +++ b/csharp/ql/test/library-tests/standalone/assemblyattribute/standalone.cs @@ -0,0 +1,12 @@ +using System; + +[assembly: global::Attribute1] + +class Attribute1Attribute : Attribute +{ +} + +[Attribute1] +class A +{ +} diff --git a/csharp/ql/test/library-tests/standalone/externalLocationSink/externalLocationSink.expected b/csharp/ql/test/library-tests/standalone/externalLocationSink/externalLocationSink.expected new file mode 100644 index 00000000000..8c4346f7832 --- /dev/null +++ b/csharp/ql/test/library-tests/standalone/externalLocationSink/externalLocationSink.expected @@ -0,0 +1,8 @@ +#select +| standalone.cs:20:20:20:20 | access to parameter s | standalone.cs:20:20:20:20 | access to parameter s | +| standalone.cs:25:28:25:32 | "abc" | standalone.cs:25:28:25:32 | "abc" | +compilationErrors +| standalone.cs:16:12:16:18 | CS0104: 'ILogger' is an ambiguous reference between 'A.ILogger' and 'B.ILogger' | +methodCalls +| standalone.cs:20:9:20:21 | call to method | +| standalone.cs:25:9:25:33 | call to method | diff --git a/csharp/ql/test/library-tests/standalone/externalLocationSink/externalLocationSink.ql b/csharp/ql/test/library-tests/standalone/externalLocationSink/externalLocationSink.ql new file mode 100644 index 00000000000..3ffef6704dd --- /dev/null +++ b/csharp/ql/test/library-tests/standalone/externalLocationSink/externalLocationSink.ql @@ -0,0 +1,10 @@ +import semmle.code.csharp.security.dataflow.flowsinks.ExternalLocationSink +import semmle.code.csharp.commons.Diagnostics + +from ExternalLocationSink sink +where sink.getLocation().getFile().fromSource() +select sink, sink.getExpr() + +query predicate compilationErrors(CompilerError e) { any() } + +query predicate methodCalls(MethodCall m) { any() } diff --git a/csharp/ql/test/library-tests/standalone/externalLocationSink/options b/csharp/ql/test/library-tests/standalone/externalLocationSink/options new file mode 100644 index 00000000000..7ba3811b2af --- /dev/null +++ b/csharp/ql/test/library-tests/standalone/externalLocationSink/options @@ -0,0 +1 @@ +semmle-extractor-options: --standalone diff --git a/csharp/ql/test/library-tests/standalone/externalLocationSink/standalone.cs b/csharp/ql/test/library-tests/standalone/externalLocationSink/standalone.cs new file mode 100644 index 00000000000..13d54e2c80a --- /dev/null +++ b/csharp/ql/test/library-tests/standalone/externalLocationSink/standalone.cs @@ -0,0 +1,27 @@ +using A; +using B; + +namespace A +{ + public interface ILogger { } +} + +namespace B +{ + public interface ILogger { } +} + +public class C +{ + public ILogger logger; + + private void M(string s) + { + logger.Log(s); + } + + private static void Main() + { + new C().logger.Log("abc"); + } +} \ No newline at end of file diff --git a/docs/codeql/codeql-for-visual-studio-code/analyzing-your-projects.rst b/docs/codeql/codeql-for-visual-studio-code/analyzing-your-projects.rst index e69f82e4138..62d48c6fbd8 100644 --- a/docs/codeql/codeql-for-visual-studio-code/analyzing-your-projects.rst +++ b/docs/codeql/codeql-for-visual-studio-code/analyzing-your-projects.rst @@ -42,14 +42,47 @@ Downloading a database from GitHub .. include:: ../reusables/download-github-database.rst +.. _filtering-databases-and-queries-by-language: + +Filtering databases and queries by language +------------------------------------------- + +Optionally, to see databases containing a specific language and queries written for that language, you can apply a language filter using the language selector. + +#. To see available language filters, in the sidebar, click the **Language** title bar. +#. Hover over the language filter you would like to apply, then click **Select**. + + .. image:: ../images/codeql-for-visual-studio-code/choose-language-filter.png + :width: 350 + :alt: Screenshot of the language selector. The "Select" button for a language filter is outlined in dark orange. + +Creating a custom query +------------------------ + +You can generate a query template for a specific language from the queries panel, then write your own code to quickly create a custom query. + +#. Optionally, to create a custom query in an existing directory, in the sidebar, click the **Queries** title bar to expand the queries panel, then select the desired directory. +#. In the sidebar, hover over the **Queries** title bar, then click the **Create query** icon. + + .. image:: ../images/codeql-for-visual-studio-code/create-query-icon.png + :width: 350 + :alt: Screenshot of the queries panel. The "Create query" icon is outlined in dark orange. + +#. In the Command Palette, select the target language for your query. If you've chosen not to create your custom query in an existing directory, selecting a language will autogenerate a directory labeled ``codeql-custom-queries-``, where ```` is the name of the selected language. A query template labeled ``example.ql`` will then be added to the existing or autogenerated directory. +#. In the template, write your custom query, then save the file. Once your query is finished, you can run it from the queries panel. + Running a query ------------------------ The `CodeQL repository `__ on GitHub contains lots of example queries. -If you have that folder (or a different CodeQL pack) available in your workspace, you can access existing queries under ``/ql/src/``, for example ``java/ql/src/Likely Bugs``. +You can access any existing queries in your workspace through the queries panel. -#. Open a query (``.ql``) file. It is displayed in the editor, with IntelliSense features such as syntax highlighting and autocomplete suggestions. -#. Right-click in the query window and select **CodeQL: Run Query on Selected Database**. (Alternatively, run the command from the Command Palette.) +#. In the sidebar, to expand the queries panel, click the **Queries** title bar. +#. To run a query against the selected database, hover over the desired query, then click the **Run local query** icon. + + .. image:: ../images/codeql-for-visual-studio-code/run-local-query-icon.png + :width: 350 + :alt: Screenshot of the mouse pointer hovering over a query in the queries panel. The "Run local query" icon is outlined in dark orange. The CodeQL extension runs the query on the current database and reports progress in the bottom right corner of the application. When the results are ready, they're displayed in the Results view. @@ -61,6 +94,23 @@ For more information, see ":doc:`Troubleshooting CodeQL for Visual Studio Code < Running multiple queries -------------------------- +You can quickly run multiple queries against the database you've selected using the queries panel or a single command. + +Running all queries in a directory +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +You can easily run every query in a directory using the queries panel. + +#. In the sidebar, to expand the queries panel, click the **Queries** title bar. +#. Hover over the desired directory of queries, then click the **Run local queries** icon. + + .. image:: ../images/codeql-for-visual-studio-code/run-local-queries-icon.png + :width: 350 + :alt: Screenshot of the mouse pointer hovering over a directory of queries in the queries panel. The "Run local queries" icon is outlined in dark orange. + +Running a selection of queries +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + You can run multiple queries with a single command. #. Go to the File Explorer. @@ -122,6 +172,7 @@ To see the queries that you have run in the current session, open the Query Hist The Query History contains information including the date and time when the query was run, the name of the query, the database on which it was run, and how long it took to run the query. To customize the information that is displayed, right-click an entry and select **Rename**. +You can also filter the Query History view by language using the language selector. For more information, see ":ref:`Filtering databases and queries by language `." Click an entry to display the corresponding results in the Query Results view, and double-click to display the query itself in the editor (or right-click and select **View Query**). diff --git a/docs/codeql/codeql-for-visual-studio-code/using-the-codeql-model-editor.rst b/docs/codeql/codeql-for-visual-studio-code/using-the-codeql-model-editor.rst index 95bdb926c32..9e1450bee70 100644 --- a/docs/codeql/codeql-for-visual-studio-code/using-the-codeql-model-editor.rst +++ b/docs/codeql/codeql-for-visual-studio-code/using-the-codeql-model-editor.rst @@ -119,8 +119,8 @@ Testing CodeQL model packs You can test any CodeQL model packs you create in VS Code by toggling the "use model packs" setting on and off. This method works for both databases and for variant analysis repositories. -- To run queries on a CodeQL database with any model packs that are stored within the ``.github/codeql/extensions`` directory of the workspace, update your ``settings.json`` file with: ``"codeQL.runningQueries.useModelPacks": all,`` -- To run queries on a CodeQL database without using model packs, update your ``settings.json`` file with: ``"codeQL.runningQueries.useModelPacks": none,`` +- To run queries on a CodeQL database with any model packs that are stored within the ``.github/codeql/extensions`` directory of the workspace, update your ``settings.json`` file with: ``"codeQL.runningQueries.useExtensionPacks": "all",`` +- To run queries on a CodeQL database without using model packs, update your ``settings.json`` file with: ``"codeQL.runningQueries.useExtensionPacks": "none",`` If your model is working well, you should see a difference in the results of the two different runs. If you don't see any differences in results, you may need to introduce a known bug to verify that the model behaves as expected. diff --git a/docs/codeql/images/codeql-for-visual-studio-code/choose-language-filter.png b/docs/codeql/images/codeql-for-visual-studio-code/choose-language-filter.png new file mode 100644 index 00000000000..8f26d5f5724 Binary files /dev/null and b/docs/codeql/images/codeql-for-visual-studio-code/choose-language-filter.png differ diff --git a/docs/codeql/images/codeql-for-visual-studio-code/create-query-icon.png b/docs/codeql/images/codeql-for-visual-studio-code/create-query-icon.png new file mode 100644 index 00000000000..eadb948522c Binary files /dev/null and b/docs/codeql/images/codeql-for-visual-studio-code/create-query-icon.png differ diff --git a/docs/codeql/images/codeql-for-visual-studio-code/run-local-queries-icon.png b/docs/codeql/images/codeql-for-visual-studio-code/run-local-queries-icon.png new file mode 100644 index 00000000000..e797c35bb92 Binary files /dev/null and b/docs/codeql/images/codeql-for-visual-studio-code/run-local-queries-icon.png differ diff --git a/docs/codeql/images/codeql-for-visual-studio-code/run-local-query-icon.png b/docs/codeql/images/codeql-for-visual-studio-code/run-local-query-icon.png new file mode 100644 index 00000000000..dc89f88d0e4 Binary files /dev/null and b/docs/codeql/images/codeql-for-visual-studio-code/run-local-query-icon.png differ diff --git a/docs/codeql/reusables/supported-versions-compilers.rst b/docs/codeql/reusables/supported-versions-compilers.rst index 135687e983c..c7dbe7aacd4 100644 --- a/docs/codeql/reusables/supported-versions-compilers.rst +++ b/docs/codeql/reusables/supported-versions-compilers.rst @@ -25,7 +25,7 @@ Python [8]_,"2.7, 3.5, 3.6, 3.7, 3.8, 3.9, 3.10, 3.11",Not applicable,``.py`` Ruby [9]_,"up to 3.2",Not applicable,"``.rb``, ``.erb``, ``.gemspec``, ``Gemfile``" Swift [10]_,"Swift 5.4-5.8.1","Swift compiler","``.swift``" - TypeScript [11]_,"2.6-5.2",Standard TypeScript compiler,"``.ts``, ``.tsx``, ``.mts``, ``.cts``" + TypeScript [11]_,"2.6-5.3",Standard TypeScript compiler,"``.ts``, ``.tsx``, ``.mts``, ``.cts``" .. container:: footnote-group diff --git a/go/ql/consistency-queries/CHANGELOG.md b/go/ql/consistency-queries/CHANGELOG.md index 59b60bad0f3..7668a5ba39d 100644 --- a/go/ql/consistency-queries/CHANGELOG.md +++ b/go/ql/consistency-queries/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.0.2 + +No user-facing changes. + ## 0.0.1 No user-facing changes. diff --git a/go/ql/consistency-queries/change-notes/released/0.0.2.md b/go/ql/consistency-queries/change-notes/released/0.0.2.md new file mode 100644 index 00000000000..5ab250998ed --- /dev/null +++ b/go/ql/consistency-queries/change-notes/released/0.0.2.md @@ -0,0 +1,3 @@ +## 0.0.2 + +No user-facing changes. diff --git a/go/ql/consistency-queries/codeql-pack.release.yml b/go/ql/consistency-queries/codeql-pack.release.yml index c6933410b71..55dc06fbd76 100644 --- a/go/ql/consistency-queries/codeql-pack.release.yml +++ b/go/ql/consistency-queries/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.0.1 +lastReleaseVersion: 0.0.2 diff --git a/go/ql/consistency-queries/qlpack.yml b/go/ql/consistency-queries/qlpack.yml index 2b0a52a185e..20d0348972b 100644 --- a/go/ql/consistency-queries/qlpack.yml +++ b/go/ql/consistency-queries/qlpack.yml @@ -1,5 +1,5 @@ name: codeql-go-consistency-queries -version: 0.0.2-dev +version: 0.0.3-dev groups: - go - queries diff --git a/go/ql/lib/CHANGELOG.md b/go/ql/lib/CHANGELOG.md index 62d802b584a..1ca530f5c03 100644 --- a/go/ql/lib/CHANGELOG.md +++ b/go/ql/lib/CHANGELOG.md @@ -1,3 +1,13 @@ +## 0.7.3 + +### Minor Analysis Improvements + +* Added the [gin cors](https://github.com/gin-contrib/cors) library to the CorsMisconfiguration.ql query + +### Bug Fixes + +* A bug has been fixed that meant that value flow through an array was not tracked correctly in some circumstances. Taint flow was tracked correctly. + ## 0.7.2 ### Minor Analysis Improvements diff --git a/go/ql/lib/change-notes/2023-10-31-add-gin-cors-framework.md b/go/ql/lib/change-notes/2023-10-31-add-gin-cors-framework.md deleted file mode 100644 index de6a186f762..00000000000 --- a/go/ql/lib/change-notes/2023-10-31-add-gin-cors-framework.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* Added the [gin cors](https://github.com/gin-contrib/cors) library to the CorsMisconfiguration.ql query \ No newline at end of file diff --git a/go/ql/lib/change-notes/2023-11-15-bug-fix-value-flow-in-slice-expression.md b/go/ql/lib/change-notes/2023-11-15-bug-fix-value-flow-in-slice-expression.md new file mode 100644 index 00000000000..c5b717ad262 --- /dev/null +++ b/go/ql/lib/change-notes/2023-11-15-bug-fix-value-flow-in-slice-expression.md @@ -0,0 +1,4 @@ +--- +category: fix +--- +* A bug has been fixed that meant that value flow through a slice expression was not tracked correctly. Taint flow was tracked correctly. diff --git a/go/ql/lib/change-notes/released/0.7.3.md b/go/ql/lib/change-notes/released/0.7.3.md new file mode 100644 index 00000000000..f8c0a1045b0 --- /dev/null +++ b/go/ql/lib/change-notes/released/0.7.3.md @@ -0,0 +1,9 @@ +## 0.7.3 + +### Minor Analysis Improvements + +* Added the [gin cors](https://github.com/gin-contrib/cors) library to the CorsMisconfiguration.ql query + +### Bug Fixes + +* A bug has been fixed that meant that value flow through an array was not tracked correctly in some circumstances. Taint flow was tracked correctly. diff --git a/go/ql/lib/codeql-pack.release.yml b/go/ql/lib/codeql-pack.release.yml index fee171e9685..a4ea9c8de17 100644 --- a/go/ql/lib/codeql-pack.release.yml +++ b/go/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.7.2 +lastReleaseVersion: 0.7.3 diff --git a/go/ql/lib/qlpack.yml b/go/ql/lib/qlpack.yml index 8069dc5d797..6ef6b38a894 100644 --- a/go/ql/lib/qlpack.yml +++ b/go/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/go-all -version: 0.7.3-dev +version: 0.7.4-dev groups: go dbscheme: go.dbscheme extractor: go diff --git a/go/ql/lib/semmle/go/Expr.qll b/go/ql/lib/semmle/go/Expr.qll index 90f838c2174..66d79f1d8f4 100644 --- a/go/ql/lib/semmle/go/Expr.qll +++ b/go/ql/lib/semmle/go/Expr.qll @@ -724,16 +724,19 @@ class GenericTypeInstantiationExpr extends Expr { * ```go * a[1:3] * a[1:3:5] + * a[1:] + * a[:3] + * a[:] * ``` */ class SliceExpr extends @sliceexpr, Expr { /** Gets the base of this slice expression. */ Expr getBase() { result = this.getChildExpr(0) } - /** Gets the lower bound of this slice expression. */ + /** Gets the lower bound of this slice expression, if any. */ Expr getLow() { result = this.getChildExpr(1) } - /** Gets the upper bound of this slice expression. */ + /** Gets the upper bound of this slice expression, if any. */ Expr getHigh() { result = this.getChildExpr(2) } /** Gets the maximum of this slice expression, if any. */ diff --git a/go/ql/lib/semmle/go/dataflow/internal/ContainerFlow.qll b/go/ql/lib/semmle/go/dataflow/internal/ContainerFlow.qll index ae352ec71bd..ad985e2c5b5 100644 --- a/go/ql/lib/semmle/go/dataflow/internal/ContainerFlow.qll +++ b/go/ql/lib/semmle/go/dataflow/internal/ContainerFlow.qll @@ -21,9 +21,16 @@ predicate containerStoreStep(Node node1, Node node2, Content c) { node2.getType() instanceof SliceType ) and ( - exists(Write w | w.writesElement(node2, _, node1)) + exists(Write w | w.writesElement(node2.(PostUpdateNode).getPreUpdateNode(), _, node1)) or node1 = node2.(ImplicitVarargsSlice).getCallNode().getAnImplicitVarargsArgument() + or + // To model data flow from array elements of the base of a `SliceNode` to + // the `SliceNode` itself, we consider there to be a read step with array + // content from the base to the corresponding `SliceElementNode` and then + // a store step with array content from the `SliceelementNode` to the + // `SliceNode` itself. + node2 = node1.(SliceElementNode).getSliceNode() ) ) or @@ -57,6 +64,13 @@ predicate containerReadStep(Node node1, Node node2, Content c) { ) or node2.(RangeElementNode).getBase() = node1 + or + // To model data flow from array elements of the base of a `SliceNode` to + // the `SliceNode` itself, we consider there to be a read step with array + // content from the base to the corresponding `SliceElementNode` and then + // a store step with array content from the `SliceelementNode` to the + // `SliceNode` itself. + node2.(SliceElementNode).getSliceNode().getBase() = node1 ) or c instanceof CollectionContent and diff --git a/go/ql/lib/semmle/go/dataflow/internal/DataFlowNodes.qll b/go/ql/lib/semmle/go/dataflow/internal/DataFlowNodes.qll index 188832803dd..5a3c589197e 100644 --- a/go/ql/lib/semmle/go/dataflow/internal/DataFlowNodes.qll +++ b/go/ql/lib/semmle/go/dataflow/internal/DataFlowNodes.qll @@ -11,6 +11,7 @@ private newtype TNode = MkSsaNode(SsaDefinition ssa) or MkGlobalFunctionNode(Function f) or MkImplicitVarargsSlice(CallExpr c) { c.hasImplicitVarargs() } or + MkSliceElementNode(SliceExpr se) or MkFlowSummaryNode(FlowSummaryImpl::Private::SummaryNode sn) /** Nodes intended for only use inside the data-flow libraries. */ @@ -998,6 +999,37 @@ module Public { Node getMax() { result = DataFlow::instructionNode(insn.getMax()) } } + /** + * A data-flow node which exists solely to model the value flow from array + * elements of the base of a `SliceNode` to array elements of the `SliceNode` + * itself. + */ + class SliceElementNode extends Node, MkSliceElementNode { + IR::SliceInstruction si; + + SliceElementNode() { this = MkSliceElementNode(si.getExpr()) } + + override ControlFlow::Root getRoot() { result = this.getSliceNode().getRoot() } + + override Type getType() { + result = si.getResultType().(ArrayType).getElementType() or + result = si.getResultType().(SliceType).getElementType() + } + + override string getNodeKind() { result = "slice element node" } + + override string toString() { result = "slice element node" } + + override predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + si.hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) + } + + /** Gets the `SliceNode` which this node relates to. */ + SliceNode getSliceNode() { result = DataFlow::instructionNode(si) } + } + /** * A data-flow node corresponding to an expression with a binary operator. */ diff --git a/go/ql/src/CHANGELOG.md b/go/ql/src/CHANGELOG.md index 9770cc59b48..6d494f4218c 100644 --- a/go/ql/src/CHANGELOG.md +++ b/go/ql/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.7.3 + +No user-facing changes. + ## 0.7.2 ### Minor Analysis Improvements diff --git a/go/ql/src/change-notes/released/0.7.3.md b/go/ql/src/change-notes/released/0.7.3.md new file mode 100644 index 00000000000..f58593b24f2 --- /dev/null +++ b/go/ql/src/change-notes/released/0.7.3.md @@ -0,0 +1,3 @@ +## 0.7.3 + +No user-facing changes. diff --git a/go/ql/src/codeql-pack.release.yml b/go/ql/src/codeql-pack.release.yml index fee171e9685..a4ea9c8de17 100644 --- a/go/ql/src/codeql-pack.release.yml +++ b/go/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.7.2 +lastReleaseVersion: 0.7.3 diff --git a/go/ql/src/qlpack.yml b/go/ql/src/qlpack.yml index 44d31df731b..a34d8db2fcb 100644 --- a/go/ql/src/qlpack.yml +++ b/go/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/go-queries -version: 0.7.3-dev +version: 0.7.4-dev groups: - go - queries diff --git a/go/ql/test/library-tests/semmle/go/dataflow/ArrayConversion/main.go b/go/ql/test/library-tests/semmle/go/dataflow/ArrayConversion/main.go index 6665fe7d2c1..8cc9a8f054b 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/ArrayConversion/main.go +++ b/go/ql/test/library-tests/semmle/go/dataflow/ArrayConversion/main.go @@ -4,7 +4,7 @@ func source() string { return "untrusted data" } -func sink(string) { +func sink(any) { } func sliceToArray(p []string) [1]string { @@ -15,11 +15,15 @@ func main() { // Test the new slice->array conversion permitted in Go 1.20 var a [4]string a[0] = source() - alias := sliceToArray(a[:]) - sink(alias[0]) // $ hasTaintFlow="index expression" + alias := [2]string(a[:]) + sink(alias[0]) // $ hasValueFlow="index expression" + sink(alias[1]) // $ SPURIOUS: hasValueFlow="index expression" // we don't distinguish different elements of arrays or slices + sink(alias) // $ hasTaintFlow="alias" // Compare with the standard dataflow support for arrays var b [4]string b[0] = source() - sink(b[0]) // $ hasTaintFlow="index expression" + sink(b[0]) // $ hasValueFlow="index expression" + sink(b[1]) // $ SPURIOUS: hasValueFlow="index expression" // we don't distinguish different elements of arrays or slices + sink(b) // $ hasTaintFlow="b" } diff --git a/java/ql/test/kotlin/library-tests/controlflow/dominance/dominanceBad.expected b/go/ql/test/library-tests/semmle/go/dataflow/SliceExpressions/Flows.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/controlflow/dominance/dominanceBad.expected rename to go/ql/test/library-tests/semmle/go/dataflow/SliceExpressions/Flows.expected diff --git a/go/ql/test/library-tests/semmle/go/dataflow/SliceExpressions/Flows.ql b/go/ql/test/library-tests/semmle/go/dataflow/SliceExpressions/Flows.ql new file mode 100644 index 00000000000..1b27b27d6dc --- /dev/null +++ b/go/ql/test/library-tests/semmle/go/dataflow/SliceExpressions/Flows.ql @@ -0,0 +1,3 @@ +import go +import TestUtilities.InlineFlowTest +import DefaultFlowTest diff --git a/go/ql/test/library-tests/semmle/go/dataflow/SliceExpressions/main.go b/go/ql/test/library-tests/semmle/go/dataflow/SliceExpressions/main.go new file mode 100644 index 00000000000..4fff6d1ce50 --- /dev/null +++ b/go/ql/test/library-tests/semmle/go/dataflow/SliceExpressions/main.go @@ -0,0 +1,45 @@ +package main + +func source() string { + return "untrusted data" +} + +func sink(any) { +} + +func main() { +} + +// Value flow with array content through slice expressions + +func arrayBase(base [4]string) { + base[1] = source() + slice := base[1:4] + sink(slice[0]) // $ hasValueFlow="index expression" + sink(slice[1]) // $ SPURIOUS: hasValueFlow="index expression" // we don't distinguish different elements of arrays or slices + sink(slice) // $ hasTaintFlow="slice" +} + +func arrayPointerBase(base *[4]string) { + base[1] = source() + slice := base[1:4] + sink(slice[0]) // $ hasValueFlow="index expression" + sink(slice[1]) // $ SPURIOUS: hasValueFlow="index expression" // we don't distinguish different elements of arrays or slices + sink(slice) // $ hasTaintFlow="slice" +} + +func sliceBase(base []string) { + base[1] = source() + slice := base[1:4] + sink(slice[0]) // $ hasValueFlow="index expression" + sink(slice[1]) // $ SPURIOUS: hasValueFlow="index expression" // we don't distinguish different elements of arrays or slices + sink(slice) // $ hasTaintFlow="slice" +} + +func slicePointerBase(base *[]string) { + (*base)[1] = source() + slice := (*base)[1:4] + sink(slice[0]) // $ hasValueFlow="index expression" + sink(slice[1]) // $ SPURIOUS: hasValueFlow="index expression" // we don't distinguish different elements of arrays or slices + sink(slice) // $ hasTaintFlow="slice" +} diff --git a/go/ql/test/library-tests/semmle/go/frameworks/Beego/ReflectedXss.expected b/go/ql/test/library-tests/semmle/go/frameworks/Beego/ReflectedXss.expected index 5fbcfcdc4f2..3c14fdfadeb 100644 --- a/go/ql/test/library-tests/semmle/go/frameworks/Beego/ReflectedXss.expected +++ b/go/ql/test/library-tests/semmle/go/frameworks/Beego/ReflectedXss.expected @@ -47,6 +47,7 @@ edges | test.go:246:15:246:36 | call to GetString | test.go:249:21:249:29 | untrusted | | test.go:259:23:259:44 | call to GetCookie | test.go:259:16:259:45 | type conversion | | test.go:270:62:270:83 | call to GetCookie | test.go:270:55:270:84 | type conversion | +| test.go:275:2:275:40 | ... := ...[0] | test.go:278:21:278:28 | index expression | | test.go:275:2:275:40 | ... := ...[0] | test.go:283:44:283:60 | selection of Filename | | test.go:275:2:275:40 | ... := ...[0] | test.go:284:38:284:49 | genericFiles | | test.go:275:2:275:40 | ... := ...[0] | test.go:285:37:285:48 | genericFiles | @@ -61,6 +62,8 @@ edges | test.go:275:2:275:40 | ... := ...[0] | test.go:301:39:301:50 | genericFiles | | test.go:275:2:275:40 | ... := ...[0] | test.go:302:40:302:51 | genericFiles | | test.go:275:2:275:40 | ... := ...[0] | test.go:303:39:303:50 | genericFiles | +| test.go:276:2:276:13 | definition of genericFiles [array] | test.go:297:51:297:62 | genericFiles [array] | +| test.go:278:21:278:28 | index expression | test.go:276:2:276:13 | definition of genericFiles [array] | | test.go:283:44:283:60 | selection of Filename | test.go:283:21:283:61 | call to GetDisplayString | | test.go:284:21:284:53 | call to SliceChunk | test.go:284:21:284:92 | selection of Filename | | test.go:284:38:284:49 | genericFiles | test.go:284:21:284:53 | call to SliceChunk | @@ -77,6 +80,7 @@ edges | test.go:296:21:296:61 | call to SliceMerge | test.go:296:21:296:97 | selection of Filename | | test.go:296:49:296:60 | genericFiles | test.go:296:21:296:61 | call to SliceMerge | | test.go:297:21:297:66 | call to SlicePad | test.go:297:21:297:102 | selection of Filename | +| test.go:297:51:297:62 | genericFiles [array] | test.go:297:51:297:65 | index expression | | test.go:297:51:297:65 | index expression | test.go:297:21:297:66 | call to SlicePad | | test.go:298:21:298:66 | call to SlicePad | test.go:298:21:298:102 | selection of Filename | | test.go:298:36:298:47 | genericFiles | test.go:298:21:298:66 | call to SlicePad | @@ -177,6 +181,8 @@ nodes | test.go:270:55:270:84 | type conversion | semmle.label | type conversion | | test.go:270:62:270:83 | call to GetCookie | semmle.label | call to GetCookie | | test.go:275:2:275:40 | ... := ...[0] | semmle.label | ... := ...[0] | +| test.go:276:2:276:13 | definition of genericFiles [array] | semmle.label | definition of genericFiles [array] | +| test.go:278:21:278:28 | index expression | semmle.label | index expression | | test.go:283:21:283:61 | call to GetDisplayString | semmle.label | call to GetDisplayString | | test.go:283:44:283:60 | selection of Filename | semmle.label | selection of Filename | | test.go:284:21:284:53 | call to SliceChunk | semmle.label | call to SliceChunk | @@ -202,6 +208,7 @@ nodes | test.go:296:49:296:60 | genericFiles | semmle.label | genericFiles | | test.go:297:21:297:66 | call to SlicePad | semmle.label | call to SlicePad | | test.go:297:21:297:102 | selection of Filename | semmle.label | selection of Filename | +| test.go:297:51:297:62 | genericFiles [array] | semmle.label | genericFiles [array] | | test.go:297:51:297:65 | index expression | semmle.label | index expression | | test.go:298:21:298:66 | call to SlicePad | semmle.label | call to SlicePad | | test.go:298:21:298:102 | selection of Filename | semmle.label | selection of Filename | diff --git a/go/ql/test/query-tests/Security/CWE-078/CommandInjection.expected b/go/ql/test/query-tests/Security/CWE-078/CommandInjection.expected index 19c94698899..01f6d0a17f6 100644 --- a/go/ql/test/query-tests/Security/CWE-078/CommandInjection.expected +++ b/go/ql/test/query-tests/Security/CWE-078/CommandInjection.expected @@ -10,11 +10,17 @@ edges | GitSubcommands.go:10:13:10:27 | call to Query | GitSubcommands.go:15:35:15:41 | tainted | | GitSubcommands.go:10:13:10:27 | call to Query | GitSubcommands.go:16:36:16:42 | tainted | | SanitizingDoubleDash.go:9:13:9:19 | selection of URL | SanitizingDoubleDash.go:9:13:9:27 | call to Query | +| SanitizingDoubleDash.go:9:13:9:27 | call to Query | SanitizingDoubleDash.go:13:25:13:31 | tainted | | SanitizingDoubleDash.go:9:13:9:27 | call to Query | SanitizingDoubleDash.go:14:23:14:33 | slice expression | | SanitizingDoubleDash.go:9:13:9:27 | call to Query | SanitizingDoubleDash.go:39:31:39:37 | tainted | | SanitizingDoubleDash.go:9:13:9:27 | call to Query | SanitizingDoubleDash.go:53:21:53:28 | arrayLit | | SanitizingDoubleDash.go:9:13:9:27 | call to Query | SanitizingDoubleDash.go:68:31:68:37 | tainted | | SanitizingDoubleDash.go:9:13:9:27 | call to Query | SanitizingDoubleDash.go:80:23:80:29 | tainted | +| SanitizingDoubleDash.go:13:15:13:32 | array literal [array] | SanitizingDoubleDash.go:14:23:14:30 | arrayLit [array] | +| SanitizingDoubleDash.go:13:25:13:31 | tainted | SanitizingDoubleDash.go:13:15:13:32 | array literal [array] | +| SanitizingDoubleDash.go:14:23:14:30 | arrayLit [array] | SanitizingDoubleDash.go:14:23:14:33 | slice element node | +| SanitizingDoubleDash.go:14:23:14:33 | slice element node | SanitizingDoubleDash.go:14:23:14:33 | slice expression [array] | +| SanitizingDoubleDash.go:14:23:14:33 | slice expression [array] | SanitizingDoubleDash.go:14:23:14:33 | slice expression | | SanitizingDoubleDash.go:39:14:39:44 | call to append | SanitizingDoubleDash.go:40:23:40:30 | arrayLit | | SanitizingDoubleDash.go:39:31:39:37 | tainted | SanitizingDoubleDash.go:39:14:39:44 | call to append | | SanitizingDoubleDash.go:53:14:53:35 | call to append | SanitizingDoubleDash.go:54:23:54:30 | arrayLit | @@ -24,7 +30,9 @@ edges | SanitizingDoubleDash.go:69:14:69:35 | call to append | SanitizingDoubleDash.go:70:23:70:30 | arrayLit | | SanitizingDoubleDash.go:69:21:69:28 | arrayLit | SanitizingDoubleDash.go:69:14:69:35 | call to append | | SanitizingDoubleDash.go:92:13:92:19 | selection of URL | SanitizingDoubleDash.go:92:13:92:27 | call to Query | +| SanitizingDoubleDash.go:92:13:92:27 | call to Query | SanitizingDoubleDash.go:95:25:95:31 | tainted | | SanitizingDoubleDash.go:92:13:92:27 | call to Query | SanitizingDoubleDash.go:96:24:96:34 | slice expression | +| SanitizingDoubleDash.go:92:13:92:27 | call to Query | SanitizingDoubleDash.go:100:31:100:37 | tainted | | SanitizingDoubleDash.go:92:13:92:27 | call to Query | SanitizingDoubleDash.go:101:24:101:34 | slice expression | | SanitizingDoubleDash.go:92:13:92:27 | call to Query | SanitizingDoubleDash.go:105:30:105:36 | tainted | | SanitizingDoubleDash.go:92:13:92:27 | call to Query | SanitizingDoubleDash.go:106:24:106:31 | arrayLit | @@ -36,6 +44,16 @@ edges | SanitizingDoubleDash.go:92:13:92:27 | call to Query | SanitizingDoubleDash.go:142:31:142:37 | tainted | | SanitizingDoubleDash.go:92:13:92:27 | call to Query | SanitizingDoubleDash.go:148:30:148:36 | tainted | | SanitizingDoubleDash.go:92:13:92:27 | call to Query | SanitizingDoubleDash.go:152:24:152:30 | tainted | +| SanitizingDoubleDash.go:95:15:95:32 | array literal [array] | SanitizingDoubleDash.go:96:24:96:31 | arrayLit [array] | +| SanitizingDoubleDash.go:95:25:95:31 | tainted | SanitizingDoubleDash.go:95:15:95:32 | array literal [array] | +| SanitizingDoubleDash.go:96:24:96:31 | arrayLit [array] | SanitizingDoubleDash.go:96:24:96:34 | slice element node | +| SanitizingDoubleDash.go:96:24:96:34 | slice element node | SanitizingDoubleDash.go:96:24:96:34 | slice expression [array] | +| SanitizingDoubleDash.go:96:24:96:34 | slice expression [array] | SanitizingDoubleDash.go:96:24:96:34 | slice expression | +| SanitizingDoubleDash.go:100:15:100:38 | array literal [array] | SanitizingDoubleDash.go:101:24:101:31 | arrayLit [array] | +| SanitizingDoubleDash.go:100:31:100:37 | tainted | SanitizingDoubleDash.go:100:15:100:38 | array literal [array] | +| SanitizingDoubleDash.go:101:24:101:31 | arrayLit [array] | SanitizingDoubleDash.go:101:24:101:34 | slice element node | +| SanitizingDoubleDash.go:101:24:101:34 | slice element node | SanitizingDoubleDash.go:101:24:101:34 | slice expression [array] | +| SanitizingDoubleDash.go:101:24:101:34 | slice expression [array] | SanitizingDoubleDash.go:101:24:101:34 | slice expression | | SanitizingDoubleDash.go:105:15:105:37 | slice literal [array] | SanitizingDoubleDash.go:106:24:106:31 | arrayLit | | SanitizingDoubleDash.go:105:30:105:36 | tainted | SanitizingDoubleDash.go:105:15:105:37 | slice literal [array] | | SanitizingDoubleDash.go:111:14:111:44 | call to append | SanitizingDoubleDash.go:112:24:112:31 | arrayLit | @@ -68,7 +86,12 @@ nodes | GitSubcommands.go:16:36:16:42 | tainted | semmle.label | tainted | | SanitizingDoubleDash.go:9:13:9:19 | selection of URL | semmle.label | selection of URL | | SanitizingDoubleDash.go:9:13:9:27 | call to Query | semmle.label | call to Query | +| SanitizingDoubleDash.go:13:15:13:32 | array literal [array] | semmle.label | array literal [array] | +| SanitizingDoubleDash.go:13:25:13:31 | tainted | semmle.label | tainted | +| SanitizingDoubleDash.go:14:23:14:30 | arrayLit [array] | semmle.label | arrayLit [array] | +| SanitizingDoubleDash.go:14:23:14:33 | slice element node | semmle.label | slice element node | | SanitizingDoubleDash.go:14:23:14:33 | slice expression | semmle.label | slice expression | +| SanitizingDoubleDash.go:14:23:14:33 | slice expression [array] | semmle.label | slice expression [array] | | SanitizingDoubleDash.go:39:14:39:44 | call to append | semmle.label | call to append | | SanitizingDoubleDash.go:39:31:39:37 | tainted | semmle.label | tainted | | SanitizingDoubleDash.go:40:23:40:30 | arrayLit | semmle.label | arrayLit | @@ -83,8 +106,18 @@ nodes | SanitizingDoubleDash.go:80:23:80:29 | tainted | semmle.label | tainted | | SanitizingDoubleDash.go:92:13:92:19 | selection of URL | semmle.label | selection of URL | | SanitizingDoubleDash.go:92:13:92:27 | call to Query | semmle.label | call to Query | +| SanitizingDoubleDash.go:95:15:95:32 | array literal [array] | semmle.label | array literal [array] | +| SanitizingDoubleDash.go:95:25:95:31 | tainted | semmle.label | tainted | +| SanitizingDoubleDash.go:96:24:96:31 | arrayLit [array] | semmle.label | arrayLit [array] | +| SanitizingDoubleDash.go:96:24:96:34 | slice element node | semmle.label | slice element node | | SanitizingDoubleDash.go:96:24:96:34 | slice expression | semmle.label | slice expression | +| SanitizingDoubleDash.go:96:24:96:34 | slice expression [array] | semmle.label | slice expression [array] | +| SanitizingDoubleDash.go:100:15:100:38 | array literal [array] | semmle.label | array literal [array] | +| SanitizingDoubleDash.go:100:31:100:37 | tainted | semmle.label | tainted | +| SanitizingDoubleDash.go:101:24:101:31 | arrayLit [array] | semmle.label | arrayLit [array] | +| SanitizingDoubleDash.go:101:24:101:34 | slice element node | semmle.label | slice element node | | SanitizingDoubleDash.go:101:24:101:34 | slice expression | semmle.label | slice expression | +| SanitizingDoubleDash.go:101:24:101:34 | slice expression [array] | semmle.label | slice expression [array] | | SanitizingDoubleDash.go:105:15:105:37 | slice literal [array] | semmle.label | slice literal [array] | | SanitizingDoubleDash.go:105:30:105:36 | tainted | semmle.label | tainted | | SanitizingDoubleDash.go:106:24:106:31 | arrayLit | semmle.label | arrayLit | diff --git a/java/kotlin-extractor/build.py b/java/kotlin-extractor/build.py index 752a436218f..61b6a403398 100755 --- a/java/kotlin-extractor/build.py +++ b/java/kotlin-extractor/build.py @@ -87,16 +87,20 @@ def write_arg_file(arg_file, args): raise Exception('Single quote in argument: ' + arg) f.write("'" + arg.replace('\\', '/') + "'\n") -def compile_to_dir(build_dir, srcs, language_version, classpath, java_classpath, output): +def compile_to_dir(build_dir, srcs, version, classpath, java_classpath, output): # Use kotlinc to compile .kt files: kotlin_arg_file = build_dir + '/kotlin.args' - kotlin_args = ['-Werror', - '-opt-in=kotlin.RequiresOptIn', - '-opt-in=org.jetbrains.kotlin.ir.symbols.IrSymbolInternals', - '-d', output, + opt_in_args = ['-opt-in=kotlin.RequiresOptIn'] + if version.lessThan(kotlin_plugin_versions.Version(2, 0, 0, "")): + opt_in_args.append('-opt-in=org.jetbrains.kotlin.ir.symbols.IrSymbolInternals') + else: + opt_in_args.append('-opt-in=org.jetbrains.kotlin.ir.symbols.UnsafeDuringIrConstructionAPI') + kotlin_args = ['-Werror'] \ + + opt_in_args \ + + ['-d', output, '-module-name', 'codeql-kotlin-extractor', '-Xsuppress-version-warnings', - '-language-version', language_version, + '-language-version', version.toLanguageVersionString(), '-no-reflect', '-no-stdlib', '-jvm-target', '1.8', '-classpath', classpath] + srcs @@ -116,14 +120,14 @@ def compile_to_dir(build_dir, srcs, language_version, classpath, java_classpath, run_process([javac, '@' + java_arg_file]) -def compile_to_jar(build_dir, tmp_src_dir, srcs, language_version, classpath, java_classpath, output): +def compile_to_jar(build_dir, tmp_src_dir, srcs, version, classpath, java_classpath, output): class_dir = build_dir + '/classes' if os.path.exists(class_dir): shutil.rmtree(class_dir) os.makedirs(class_dir) - compile_to_dir(build_dir, srcs, language_version, classpath, java_classpath, class_dir) + compile_to_dir(build_dir, srcs, version, classpath, java_classpath, class_dir) run_process(['jar', 'cf', output, '-C', class_dir, '.', @@ -161,7 +165,7 @@ def transform_to_embeddable(srcs): f.write(content) -def compile(jars, java_jars, dependency_folder, transform_to_embeddable, output, build_dir, current_version): +def compile(jars, java_jars, dependency_folder, transform_to_embeddable, output, build_dir, version_str): classpath = bases_to_classpath(dependency_folder, jars) java_classpath = bases_to_classpath(dependency_folder, java_jars) @@ -179,23 +183,16 @@ def compile(jars, java_jars, dependency_folder, transform_to_embeddable, output, with open(resource_dir + '/extractor.name', 'w') as f: f.write(output) - parsed_current_version = kotlin_plugin_versions.version_string_to_tuple( - current_version) + version = kotlin_plugin_versions.version_string_to_version(version_str) - for version in kotlin_plugin_versions.many_versions: - parsed_version = kotlin_plugin_versions.version_string_to_tuple( - version) - if parsed_version[0] < parsed_current_version[0] or \ - (parsed_version[0] == parsed_current_version[0] and parsed_version[1] < parsed_current_version[1]) or \ - (parsed_version[0] == parsed_current_version[0] and parsed_version[1] == parsed_current_version[1] and parsed_version[2] <= parsed_current_version[2]): + for a_version in kotlin_plugin_versions.many_versions_versions_asc: + if a_version.lessThanOrEqual(version): d = tmp_src_dir + '/main/kotlin/utils/versions/v_' + \ - version.replace('.', '_') + a_version.toString().replace('.', '_') if os.path.exists(d): # copy and overwrite files from the version folder to the include folder shutil.copytree(d, include_version_folder, dirs_exist_ok=True) - language_version = str(parsed_current_version[0]) + '.' + str(parsed_current_version[1]) - # remove all version folders: shutil.rmtree(tmp_src_dir + '/main/kotlin/utils/versions') @@ -203,7 +200,7 @@ def compile(jars, java_jars, dependency_folder, transform_to_embeddable, output, transform_to_embeddable(srcs) - compile_to_jar(build_dir, tmp_src_dir, srcs, language_version, classpath, java_classpath, output) + compile_to_jar(build_dir, tmp_src_dir, srcs, version, classpath, java_classpath, output) shutil.rmtree(tmp_src_dir) diff --git a/java/kotlin-extractor/kotlin_plugin_versions.py b/java/kotlin-extractor/kotlin_plugin_versions.py index 1cf8a9cb0d8..ea671562e34 100755 --- a/java/kotlin-extractor/kotlin_plugin_versions.py +++ b/java/kotlin-extractor/kotlin_plugin_versions.py @@ -14,19 +14,43 @@ def is_windows(): return True return False -def version_tuple_to_string(version): - return f'{version[0]}.{version[1]}.{version[2]}{version[3]}' +class Version: + def __init__(self, major, minor, patch, tag): + self.major = major + self.minor = minor + self.patch = patch + self.tag = tag -def version_string_to_tuple(version): + def toTupleWithTag(self): + return [self.major, self.minor, self.patch, self.tag] + + def toTupleNoTag(self): + return [self.major, self.minor, self.patch] + + def lessThan(self, other): + return self.toTupleNoTag() < other.toTupleNoTag() + + def lessThanOrEqual(self, other): + return self.toTupleNoTag() <= other.toTupleNoTag() + + def toString(self): + return f'{self.major}.{self.minor}.{self.patch}{self.tag}' + + def toLanguageVersionString(self): + return f'{self.major}.{self.minor}' + +def version_string_to_version(version): m = re.match(r'([0-9]+)\.([0-9]+)\.([0-9]+)(.*)', version) - return tuple([int(m.group(i)) for i in range(1, 4)] + [m.group(4)]) + return Version(int(m.group(1)), int(m.group(2)), int(m.group(3)), m.group(4)) # Version number used by CI. ci_version = '1.9.0' -many_versions = [ '1.5.0', '1.5.10', '1.5.20', '1.5.30', '1.6.0', '1.6.20', '1.7.0', '1.7.20', '1.8.0', '1.9.0-Beta', '1.9.20-Beta' ] +many_versions = [ '1.5.0', '1.5.10', '1.5.20', '1.5.30', '1.6.0', '1.6.20', '1.7.0', '1.7.20', '1.8.0', '1.9.0-Beta', '1.9.20-Beta', '2.0.0-Beta1' ] -many_versions_tuples = [version_string_to_tuple(v) for v in many_versions] +many_versions_versions = [version_string_to_version(v) for v in many_versions] +many_versions_versions_asc = sorted(many_versions_versions, key = lambda v: v.toTupleWithTag()) +many_versions_versions_desc = reversed(many_versions_versions_asc) class KotlincNotFoundException(Exception): pass @@ -37,16 +61,14 @@ def get_single_version(fakeVersionOutput = None): if kotlinc is None: raise KotlincNotFoundException() versionOutput = subprocess.run([kotlinc, '-version'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True).stderr if fakeVersionOutput is None else fakeVersionOutput - m = re.match(r'.* kotlinc-jvm ([0-9]+\.[0-9]+\.[0-9]+-?[a-zA-Z]*) .*', versionOutput) + m = re.match(r'.* kotlinc-jvm ([0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z][a-zA-Z0-9]*)?) .*', versionOutput) if m is None: raise Exception('Cannot detect version of kotlinc (got ' + str(versionOutput) + ')') - current_version = version_string_to_tuple(m.group(1)) + current_version = version_string_to_version(m.group(1)) - many_versions_tuples.sort(reverse = True) - - for version in many_versions_tuples: - if version[0:3] <= current_version[0:3]: - return version_tuple_to_string(version) + for version in many_versions_versions_desc: + if version.lessThanOrEqual(current_version): + return version.toString() raise Exception(f'No suitable kotlinc version found for {current_version} (got {versionOutput}; know about {str(many_versions)})') diff --git a/java/kotlin-extractor/src/main/kotlin/KotlinFileExtractor.kt b/java/kotlin-extractor/src/main/kotlin/KotlinFileExtractor.kt index 0bfccb5637e..3458ec20244 100644 --- a/java/kotlin-extractor/src/main/kotlin/KotlinFileExtractor.kt +++ b/java/kotlin-extractor/src/main/kotlin/KotlinFileExtractor.kt @@ -80,6 +80,7 @@ open class KotlinFileExtractor( globalExtensionState: KotlinExtractorGlobalState, ): KotlinUsesExtractor(logger, tw, dependencyCollector, externalClassExtractor, primitiveTypeMapping, pluginContext, globalExtensionState) { + val usesK2 = usesK2(pluginContext) val metaAnnotationSupport = MetaAnnotationSupport(logger, pluginContext, this) private inline fun with(kind: String, element: IrElement, f: () -> T): T { @@ -166,22 +167,26 @@ open class KotlinFileExtractor( else -> false } + private fun FunctionDescriptor.tryIsHiddenToOvercomeSignatureClash(d: IrFunction): Boolean { + try { + return this.isHiddenToOvercomeSignatureClash + } + catch (e: NotImplementedError) { + // `org.jetbrains.kotlin.ir.descriptors.IrBasedClassConstructorDescriptor.isHiddenToOvercomeSignatureClash` throws the exception + // TODO: We need a replacement for this for Kotlin 2 + if (!usesK2) { + logger.warnElement("Couldn't query if element is fake, deciding it's not.", d, e) + } + return false + } + } + @OptIn(ObsoleteDescriptorBasedAPI::class) private fun isFake(d: IrDeclarationWithVisibility): Boolean { val hasFakeVisibility = d.visibility.let { it is DelegatedDescriptorVisibility && it.delegate == Visibilities.InvisibleFake } || d.isFakeOverride if (hasFakeVisibility && !isJavaBinaryObjectMethodRedeclaration(d)) return true - try { - if ((d as? IrFunction)?.descriptor?.isHiddenToOvercomeSignatureClash == true) { - return true - } - } - catch (e: NotImplementedError) { - // `org.jetbrains.kotlin.ir.descriptors.IrBasedClassConstructorDescriptor.isHiddenToOvercomeSignatureClash` throws the exception - logger.warnElement("Couldn't query if element is fake, deciding it's not.", d, e) - return false - } - return false + return (d as? IrFunction)?.descriptor?.tryIsHiddenToOvercomeSignatureClash(d) == true } private fun shouldExtractDecl(declaration: IrDeclaration, extractPrivateMembers: Boolean) = @@ -2457,8 +2462,12 @@ open class KotlinFileExtractor( val fn = getFunctionsByFqName(pluginContext, functionPkg, functionName) .firstOrNull { fnSymbol -> - fnSymbol.owner.parentClassOrNull?.fqNameWhenAvailable?.asString() == type && - fnSymbol.owner.valueParameters.map { it.type.classFqName?.asString() }.toTypedArray() contentEquals parameterTypes + val owner = fnSymbol.owner + (owner.parentClassOrNull?.fqNameWhenAvailable?.asString() == type + || + (owner.parent is IrExternalPackageFragment && getFileClassFqName(owner)?.asString() == type)) + && + owner.valueParameters.map { it.type.classFqName?.asString() }.toTypedArray() contentEquals parameterTypes }?.owner if (fn != null) { diff --git a/java/kotlin-extractor/src/main/kotlin/utils/versions/v_1_9_255-SNAPSHOT/IrSymbolInternals.kt b/java/kotlin-extractor/src/main/kotlin/utils/versions/v_2.0.0-Beta1/IrSymbolInternals.kt similarity index 100% rename from java/kotlin-extractor/src/main/kotlin/utils/versions/v_1_9_255-SNAPSHOT/IrSymbolInternals.kt rename to java/kotlin-extractor/src/main/kotlin/utils/versions/v_2.0.0-Beta1/IrSymbolInternals.kt diff --git a/java/kotlin-extractor/src/main/kotlin/utils/versions/v_1_9_255-SNAPSHOT/JavaBinarySourceElement.kt b/java/kotlin-extractor/src/main/kotlin/utils/versions/v_2.0.0-Beta1/JavaBinarySourceElement.kt similarity index 100% rename from java/kotlin-extractor/src/main/kotlin/utils/versions/v_1_9_255-SNAPSHOT/JavaBinarySourceElement.kt rename to java/kotlin-extractor/src/main/kotlin/utils/versions/v_2.0.0-Beta1/JavaBinarySourceElement.kt diff --git a/java/ql/automodel/publish.sh b/java/ql/automodel/publish.sh index b13570c950f..e1362d967f8 100755 --- a/java/ql/automodel/publish.sh +++ b/java/ql/automodel/publish.sh @@ -1,6 +1,9 @@ #!/bin/sh set -e +# Before running this, make sure there is an SSO-enabled token with package:write +# permissions to codeql supplied via the GITHUB_TOKEN environment variable + AUTOMODEL_ROOT="$(readlink -f "$(dirname $0)")" WORKSPACE_ROOT="$AUTOMODEL_ROOT/../../.." GRPS="automodel,-test" diff --git a/java/ql/automodel/src/AutomodelAlertSinkUtil.qll b/java/ql/automodel/src/AutomodelAlertSinkUtil.qll index 47a53956656..f32d46c71d6 100644 --- a/java/ql/automodel/src/AutomodelAlertSinkUtil.qll +++ b/java/ql/automodel/src/AutomodelAlertSinkUtil.qll @@ -90,7 +90,7 @@ class PotentialSinkModelExpr extends Expr { string package, string type, boolean subtypes, string name, string signature, string input ) { exists(Call call, Callable callable, int argIdx | - call.getCallee() = callable and + call.getCallee().getSourceDeclaration() = callable and ( this = call.getArgument(argIdx) or diff --git a/java/ql/automodel/src/AutomodelApplicationModeCharacteristics.qll b/java/ql/automodel/src/AutomodelApplicationModeCharacteristics.qll index f8f2c8aaf58..a1a8094b7a6 100644 --- a/java/ql/automodel/src/AutomodelApplicationModeCharacteristics.qll +++ b/java/ql/automodel/src/AutomodelApplicationModeCharacteristics.qll @@ -30,7 +30,9 @@ newtype TApplicationModeEndpoint = arg.asExpr() = argExpr and call = argExpr.getCall() and not argExpr.isVararg() ) } or - TInstanceArgument(Call call, DataFlow::Node arg) { arg = DataFlow::getInstanceArgument(call) } or + TInstanceArgument(Call call, DataFlow::Node arg) { + arg = DataFlow::getInstanceArgument(call) and not call instanceof ConstructorCall + } or TImplicitVarargsArray(Call call, DataFlow::Node arg, int idx) { exists(Argument argExpr | arg.asExpr() = argExpr and @@ -98,7 +100,7 @@ class ExplicitArgument extends ApplicationModeEndpoint, TExplicitArgument { ExplicitArgument() { this = TExplicitArgument(call, arg) } - override Callable getCallable() { result = call.getCallee() } + override Callable getCallable() { result = call.getCallee().getSourceDeclaration() } override Call getCall() { result = call } @@ -121,7 +123,7 @@ class InstanceArgument extends ApplicationModeEndpoint, TInstanceArgument { InstanceArgument() { this = TInstanceArgument(call, arg) } - override Callable getCallable() { result = call.getCallee() } + override Callable getCallable() { result = call.getCallee().getSourceDeclaration() } override Call getCall() { result = call } @@ -152,7 +154,7 @@ class ImplicitVarargsArray extends ApplicationModeEndpoint, TImplicitVarargsArra ImplicitVarargsArray() { this = TImplicitVarargsArray(call, vararg, idx) } - override Callable getCallable() { result = call.getCallee() } + override Callable getCallable() { result = call.getCallee().getSourceDeclaration() } override Call getCall() { result = call } @@ -176,7 +178,7 @@ class MethodReturnValue extends ApplicationModeEndpoint, TMethodReturnValue { MethodReturnValue() { this = TMethodReturnValue(call) } - override Callable getCallable() { result = call.getCallee() } + override Callable getCallable() { result = call.getCallee().getSourceDeclaration() } override Call getCall() { result = call } @@ -206,7 +208,7 @@ class OverriddenParameter extends ApplicationModeEndpoint, TOverriddenParameter // candidate model will be about the overridden method, not the overriding // method. This is a more general model, that also applies to other // subclasses of the overridden class. - result = overriddenMethod + result = overriddenMethod.getSourceDeclaration() } override Call getCall() { none() } @@ -333,6 +335,9 @@ private module ApplicationModeGetCallable implements AutomodelSharedGetCallable: /** * Returns the API callable being modeled. + * + * We usually want to use `.getSourceDeclaration()` instead of just 'the' callable, + * because the source declaration callable has erased generic type parameters. */ Callable getCallable(Endpoint e) { result = e.getCall().getCallee() } } diff --git a/java/ql/automodel/src/AutomodelEndpointTypes.qll b/java/ql/automodel/src/AutomodelEndpointTypes.qll index e7eaed15541..8b08722abe2 100644 --- a/java/ql/automodel/src/AutomodelEndpointTypes.qll +++ b/java/ql/automodel/src/AutomodelEndpointTypes.qll @@ -18,6 +18,8 @@ abstract class EndpointType extends string { * Gets the name of the sink/source kind for this endpoint type as used in models-as-data. * * See https://github.com/github/codeql/blob/44213f0144fdd54bb679ca48d68b28dcf820f7a8/java/ql/lib/semmle/code/java/dataflow/ExternalFlow.qll#LL353C11-L357C31 + * for sink types, and https://github.com/github/codeql/blob/44213f0144fdd54bb679ca48d68b28dcf820f7a8/java/ql/lib/semmle/code/java/dataflow/ExternalFlow.qll#L365 + * for source types. */ final string getKind() { result = this } } diff --git a/java/ql/automodel/src/AutomodelFrameworkModeCharacteristics.qll b/java/ql/automodel/src/AutomodelFrameworkModeCharacteristics.qll index 222c9344339..038d0f27ff5 100644 --- a/java/ql/automodel/src/AutomodelFrameworkModeCharacteristics.qll +++ b/java/ql/automodel/src/AutomodelFrameworkModeCharacteristics.qll @@ -25,7 +25,7 @@ newtype JavaRelatedLocationType = newtype TFrameworkModeEndpoint = TExplicitParameter(Parameter p) or - TQualifier(Callable c) or + TQualifier(Callable c) { not c instanceof Constructor } or TReturnValue(Callable c) or TOverridableParameter(Method m, Parameter p) { p.getCallable() = m and diff --git a/java/ql/automodel/src/AutomodelSharedCharacteristics.qll b/java/ql/automodel/src/AutomodelSharedCharacteristics.qll index 992d9c08332..3704845fe17 100644 --- a/java/ql/automodel/src/AutomodelSharedCharacteristics.qll +++ b/java/ql/automodel/src/AutomodelSharedCharacteristics.qll @@ -63,12 +63,12 @@ signature module CandidateSig { predicate isSink(Endpoint e, string kind, string provenance); /** - * Holds if `e` is a sink with the label `kind`, and provenance `provenance`. + * Holds if `e` is a source with the label `kind`, and provenance `provenance`. */ predicate isSource(Endpoint e, string kind, string provenance); /** - * Holds if `e` is not a sink of any kind. + * Holds if `e` is not a source or sink of any kind. */ predicate isNeutral(Endpoint e); diff --git a/java/ql/automodel/src/CHANGELOG.md b/java/ql/automodel/src/CHANGELOG.md index 88b3b77ee45..e1c0a6ed461 100644 --- a/java/ql/automodel/src/CHANGELOG.md +++ b/java/ql/automodel/src/CHANGELOG.md @@ -1,7 +1,10 @@ -## 0.0.7 +## 0.0.8 No user-facing changes. +## 0.0.7 + +Support for extracting source candidates. ## 0.0.6 No user-facing changes. diff --git a/java/ql/automodel/src/change-notes/released/0.0.7.md b/java/ql/automodel/src/change-notes/released/0.0.7.md index 84da6f18c42..098fada6105 100644 --- a/java/ql/automodel/src/change-notes/released/0.0.7.md +++ b/java/ql/automodel/src/change-notes/released/0.0.7.md @@ -1,3 +1,3 @@ ## 0.0.7 -No user-facing changes. +Support for extracting source candidates. \ No newline at end of file diff --git a/java/ql/automodel/src/change-notes/released/0.0.8.md b/java/ql/automodel/src/change-notes/released/0.0.8.md new file mode 100644 index 00000000000..6af2d954c09 --- /dev/null +++ b/java/ql/automodel/src/change-notes/released/0.0.8.md @@ -0,0 +1,3 @@ +## 0.0.8 + +No user-facing changes. diff --git a/java/ql/automodel/src/codeql-pack.release.yml b/java/ql/automodel/src/codeql-pack.release.yml index a2a5484910b..58fdc6b45de 100644 --- a/java/ql/automodel/src/codeql-pack.release.yml +++ b/java/ql/automodel/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.0.7 +lastReleaseVersion: 0.0.8 diff --git a/java/ql/automodel/src/qlpack.yml b/java/ql/automodel/src/qlpack.yml index 23b4a9e7e32..9b84f8ce097 100644 --- a/java/ql/automodel/src/qlpack.yml +++ b/java/ql/automodel/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/java-automodel-queries -version: 0.0.8-dev +version: 0.0.9-dev groups: - java - automodel diff --git a/java/ql/automodel/test/AutomodelApplicationModeExtraction/AutomodelApplicationModeExtractCandidates.expected b/java/ql/automodel/test/AutomodelApplicationModeExtraction/AutomodelApplicationModeExtractCandidates.expected index b3de04f0551..a7be708f9da 100644 --- a/java/ql/automodel/test/AutomodelApplicationModeExtraction/AutomodelApplicationModeExtractCandidates.expected +++ b/java/ql/automodel/test/AutomodelApplicationModeExtraction/AutomodelApplicationModeExtractCandidates.expected @@ -1,13 +1,13 @@ | PluginImpl.java:5:27:5:37 | name | Related locations: $@, $@, $@.\nmetadata: $@, $@, $@, $@, $@, $@, $@, $@, $@, $@. | PluginImpl.java:5:27:5:37 | name | CallContext | hudson/Plugin.java:5:5:5:31 | /** Configure method doc */ | MethodDoc | hudson/Plugin.java:3:1:3:17 | /** Plugin doc */ | ClassDoc | file://hudson:1:1:1:1 | hudson | package | file://Plugin:1:1:1:1 | Plugin | type | file://true:1:1:1:1 | true | subtypes | file://configure:1:1:1:1 | configure | name | file://(String,String):1:1:1:1 | (String,String) | signature | file://:1:1:1:1 | | input | file://Parameter[0]:1:1:1:1 | Parameter[0] | output | file://false:1:1:1:1 | false | isVarargsArray | file://:1:1:1:1 | | alreadyAiModeled | file://sourceModel:1:1:1:1 | sourceModel | extensibleType | | PluginImpl.java:5:40:5:51 | value | Related locations: $@, $@, $@.\nmetadata: $@, $@, $@, $@, $@, $@, $@, $@, $@, $@. | PluginImpl.java:5:40:5:51 | value | CallContext | hudson/Plugin.java:5:5:5:31 | /** Configure method doc */ | MethodDoc | hudson/Plugin.java:3:1:3:17 | /** Plugin doc */ | ClassDoc | file://hudson:1:1:1:1 | hudson | package | file://Plugin:1:1:1:1 | Plugin | type | file://true:1:1:1:1 | true | subtypes | file://configure:1:1:1:1 | configure | name | file://(String,String):1:1:1:1 | (String,String) | signature | file://:1:1:1:1 | | input | file://Parameter[1]:1:1:1:1 | Parameter[1] | output | file://false:1:1:1:1 | false | isVarargsArray | file://:1:1:1:1 | | alreadyAiModeled | file://sourceModel:1:1:1:1 | sourceModel | extensibleType | -| Test.java:18:3:18:11 | reference | Related locations: $@, $@, $@.\nmetadata: $@, $@, $@, $@, $@, $@, $@, $@, $@, $@. | Test.java:18:3:18:24 | set(...) | CallContext | Test.java:18:3:18:11 | reference | MethodDoc | Test.java:18:3:18:11 | reference | ClassDoc | file://java.util.concurrent.atomic:1:1:1:1 | java.util.concurrent.atomic | package | file://AtomicReference:1:1:1:1 | AtomicReference | type | file://false:1:1:1:1 | false | subtypes | file://set:1:1:1:1 | set | name | file://(String):1:1:1:1 | (String) | signature | file://Argument[this]:1:1:1:1 | Argument[this] | input | file://:1:1:1:1 | | output | file://false:1:1:1:1 | false | isVarargsArray | file://:1:1:1:1 | | alreadyAiModeled | file://sinkModel:1:1:1:1 | sinkModel | extensibleType | -| Test.java:23:3:23:10 | supplier | Related locations: $@, $@, $@.\nmetadata: $@, $@, $@, $@, $@, $@, $@, $@, $@, $@. | Test.java:23:3:23:16 | get(...) | CallContext | Test.java:23:3:23:10 | supplier | MethodDoc | Test.java:23:3:23:10 | supplier | ClassDoc | file://java.util.function:1:1:1:1 | java.util.function | package | file://Supplier:1:1:1:1 | Supplier | type | file://true:1:1:1:1 | true | subtypes | file://get:1:1:1:1 | get | name | file://():1:1:1:1 | () | signature | file://Argument[this]:1:1:1:1 | Argument[this] | input | file://:1:1:1:1 | | output | file://false:1:1:1:1 | false | isVarargsArray | file://:1:1:1:1 | | alreadyAiModeled | file://sinkModel:1:1:1:1 | sinkModel | extensibleType | -| Test.java:23:3:23:16 | get(...) | Related locations: $@, $@, $@.\nmetadata: $@, $@, $@, $@, $@, $@, $@, $@, $@, $@. | Test.java:23:3:23:16 | get(...) | CallContext | Test.java:23:3:23:16 | get(...) | MethodDoc | Test.java:23:3:23:16 | get(...) | ClassDoc | file://java.util.function:1:1:1:1 | java.util.function | package | file://Supplier:1:1:1:1 | Supplier | type | file://true:1:1:1:1 | true | subtypes | file://get:1:1:1:1 | get | name | file://():1:1:1:1 | () | signature | file://:1:1:1:1 | | input | file://ReturnValue:1:1:1:1 | ReturnValue | output | file://false:1:1:1:1 | false | isVarargsArray | file://:1:1:1:1 | | alreadyAiModeled | file://sourceModel:1:1:1:1 | sourceModel | extensibleType | -| Test.java:27:3:31:3 | copy(...) | Related locations: $@, $@, $@.\nmetadata: $@, $@, $@, $@, $@, $@, $@, $@, $@, $@. | Test.java:27:3:31:3 | copy(...) | CallContext | Test.java:27:3:31:3 | copy(...) | MethodDoc | Test.java:27:3:31:3 | copy(...) | ClassDoc | file://java.nio.file:1:1:1:1 | java.nio.file | package | file://Files:1:1:1:1 | Files | type | file://false:1:1:1:1 | false | subtypes | file://copy:1:1:1:1 | copy | name | file://(Path,Path,CopyOption[]):1:1:1:1 | (Path,Path,CopyOption[]) | signature | file://:1:1:1:1 | | input | file://ReturnValue:1:1:1:1 | ReturnValue | output | file://false:1:1:1:1 | false | isVarargsArray | file://:1:1:1:1 | | alreadyAiModeled | file://sourceModel:1:1:1:1 | sourceModel | extensibleType | -| Test.java:35:10:37:3 | newInputStream(...) | Related locations: $@, $@, $@.\nmetadata: $@, $@, $@, $@, $@, $@, $@, $@, $@, $@. | Test.java:35:10:37:3 | newInputStream(...) | CallContext | Test.java:35:10:37:3 | newInputStream(...) | MethodDoc | Test.java:35:10:37:3 | newInputStream(...) | ClassDoc | file://java.nio.file:1:1:1:1 | java.nio.file | package | file://Files:1:1:1:1 | Files | type | file://false:1:1:1:1 | false | subtypes | file://newInputStream:1:1:1:1 | newInputStream | name | file://(Path,OpenOption[]):1:1:1:1 | (Path,OpenOption[]) | signature | file://:1:1:1:1 | | input | file://ReturnValue:1:1:1:1 | ReturnValue | output | file://false:1:1:1:1 | false | isVarargsArray | file://:1:1:1:1 | | alreadyAiModeled | file://sourceModel:1:1:1:1 | sourceModel | extensibleType | -| Test.java:36:4:36:11 | openPath | Related locations: $@, $@, $@.\nmetadata: $@, $@, $@, $@, $@, $@, $@, $@, $@, $@. | Test.java:35:10:37:3 | newInputStream(...) | CallContext | Test.java:36:4:36:11 | openPath | MethodDoc | Test.java:36:4:36:11 | openPath | ClassDoc | file://java.nio.file:1:1:1:1 | java.nio.file | package | file://Files:1:1:1:1 | Files | type | file://false:1:1:1:1 | false | subtypes | file://newInputStream:1:1:1:1 | newInputStream | name | file://(Path,OpenOption[]):1:1:1:1 | (Path,OpenOption[]) | signature | file://Argument[0]:1:1:1:1 | Argument[0] | input | file://:1:1:1:1 | | output | file://false:1:1:1:1 | false | isVarargsArray | file://ai-manual:1:1:1:1 | ai-manual | alreadyAiModeled | file://sinkModel:1:1:1:1 | sinkModel | extensibleType | -| Test.java:42:4:42:22 | get(...) | Related locations: $@, $@, $@.\nmetadata: $@, $@, $@, $@, $@, $@, $@, $@, $@, $@. | Test.java:42:4:42:22 | get(...) | CallContext | Test.java:42:4:42:22 | get(...) | MethodDoc | Test.java:42:4:42:22 | get(...) | ClassDoc | file://java.nio.file:1:1:1:1 | java.nio.file | package | file://Paths:1:1:1:1 | Paths | type | file://false:1:1:1:1 | false | subtypes | file://get:1:1:1:1 | get | name | file://(String,String[]):1:1:1:1 | (String,String[]) | signature | file://:1:1:1:1 | | input | file://ReturnValue:1:1:1:1 | ReturnValue | output | file://false:1:1:1:1 | false | isVarargsArray | file://:1:1:1:1 | | alreadyAiModeled | file://sourceModel:1:1:1:1 | sourceModel | extensibleType | -| Test.java:53:3:58:3 | walk(...) | Related locations: $@, $@, $@.\nmetadata: $@, $@, $@, $@, $@, $@, $@, $@, $@, $@. | Test.java:53:3:58:3 | walk(...) | CallContext | Test.java:53:3:58:3 | walk(...) | MethodDoc | Test.java:53:3:58:3 | walk(...) | ClassDoc | file://java.nio.file:1:1:1:1 | java.nio.file | package | file://Files:1:1:1:1 | Files | type | file://false:1:1:1:1 | false | subtypes | file://walk:1:1:1:1 | walk | name | file://(Path,FileVisitOption[]):1:1:1:1 | (Path,FileVisitOption[]) | signature | file://:1:1:1:1 | | input | file://ReturnValue:1:1:1:1 | ReturnValue | output | file://false:1:1:1:1 | false | isVarargsArray | file://:1:1:1:1 | | alreadyAiModeled | file://sourceModel:1:1:1:1 | sourceModel | extensibleType | -| Test.java:55:4:55:4 | o | Related locations: $@, $@, $@.\nmetadata: $@, $@, $@, $@, $@, $@, $@, $@, $@, $@. | Test.java:53:3:58:3 | walk(...) | CallContext | Test.java:53:3:58:3 | walk(...) | MethodDoc | Test.java:53:3:58:3 | walk(...) | ClassDoc | file://java.nio.file:1:1:1:1 | java.nio.file | package | file://Files:1:1:1:1 | Files | type | file://false:1:1:1:1 | false | subtypes | file://walk:1:1:1:1 | walk | name | file://(Path,FileVisitOption[]):1:1:1:1 | (Path,FileVisitOption[]) | signature | file://Argument[1]:1:1:1:1 | Argument[1] | input | file://:1:1:1:1 | | output | file://true:1:1:1:1 | true | isVarargsArray | file://:1:1:1:1 | | alreadyAiModeled | file://sinkModel:1:1:1:1 | sinkModel | extensibleType | -| Test.java:62:3:62:3 | c | Related locations: $@, $@, $@.\nmetadata: $@, $@, $@, $@, $@, $@, $@, $@, $@, $@. | Test.java:62:3:62:20 | getInputStream(...) | CallContext | Test.java:62:3:62:3 | c | MethodDoc | Test.java:62:3:62:3 | c | ClassDoc | file://java.net:1:1:1:1 | java.net | package | file://URLConnection:1:1:1:1 | URLConnection | type | file://true:1:1:1:1 | true | subtypes | file://getInputStream:1:1:1:1 | getInputStream | name | file://():1:1:1:1 | () | signature | file://Argument[this]:1:1:1:1 | Argument[this] | input | file://:1:1:1:1 | | output | file://false:1:1:1:1 | false | isVarargsArray | file://:1:1:1:1 | | alreadyAiModeled | file://sinkModel:1:1:1:1 | sinkModel | extensibleType | -| Test.java:67:30:67:47 | writer | Related locations: $@, $@, $@.\nmetadata: $@, $@, $@, $@, $@, $@, $@, $@, $@, $@. | Test.java:67:30:67:47 | writer | CallContext | Test.java:67:30:67:47 | writer | MethodDoc | Test.java:67:30:67:47 | writer | ClassDoc | file://java.lang:1:1:1:1 | java.lang | package | file://Throwable:1:1:1:1 | Throwable | type | file://true:1:1:1:1 | true | subtypes | file://printStackTrace:1:1:1:1 | printStackTrace | name | file://(PrintWriter):1:1:1:1 | (PrintWriter) | signature | file://:1:1:1:1 | | input | file://Parameter[0]:1:1:1:1 | Parameter[0] | output | file://false:1:1:1:1 | false | isVarargsArray | file://:1:1:1:1 | | alreadyAiModeled | file://sourceModel:1:1:1:1 | sourceModel | extensibleType | +| Test.java:19:3:19:11 | reference | Related locations: $@, $@, $@.\nmetadata: $@, $@, $@, $@, $@, $@, $@, $@, $@, $@. | Test.java:19:3:19:24 | set(...) | CallContext | Test.java:19:3:19:11 | reference | MethodDoc | Test.java:19:3:19:11 | reference | ClassDoc | file://java.util.concurrent.atomic:1:1:1:1 | java.util.concurrent.atomic | package | file://AtomicReference:1:1:1:1 | AtomicReference | type | file://false:1:1:1:1 | false | subtypes | file://set:1:1:1:1 | set | name | file://(Object):1:1:1:1 | (Object) | signature | file://Argument[this]:1:1:1:1 | Argument[this] | input | file://:1:1:1:1 | | output | file://false:1:1:1:1 | false | isVarargsArray | file://:1:1:1:1 | | alreadyAiModeled | file://sinkModel:1:1:1:1 | sinkModel | extensibleType | +| Test.java:24:3:24:10 | supplier | Related locations: $@, $@, $@.\nmetadata: $@, $@, $@, $@, $@, $@, $@, $@, $@, $@. | Test.java:24:3:24:16 | get(...) | CallContext | Test.java:24:3:24:10 | supplier | MethodDoc | Test.java:24:3:24:10 | supplier | ClassDoc | file://java.util.function:1:1:1:1 | java.util.function | package | file://Supplier:1:1:1:1 | Supplier | type | file://true:1:1:1:1 | true | subtypes | file://get:1:1:1:1 | get | name | file://():1:1:1:1 | () | signature | file://Argument[this]:1:1:1:1 | Argument[this] | input | file://:1:1:1:1 | | output | file://false:1:1:1:1 | false | isVarargsArray | file://:1:1:1:1 | | alreadyAiModeled | file://sinkModel:1:1:1:1 | sinkModel | extensibleType | +| Test.java:24:3:24:16 | get(...) | Related locations: $@, $@, $@.\nmetadata: $@, $@, $@, $@, $@, $@, $@, $@, $@, $@. | Test.java:24:3:24:16 | get(...) | CallContext | Test.java:24:3:24:16 | get(...) | MethodDoc | Test.java:24:3:24:16 | get(...) | ClassDoc | file://java.util.function:1:1:1:1 | java.util.function | package | file://Supplier:1:1:1:1 | Supplier | type | file://true:1:1:1:1 | true | subtypes | file://get:1:1:1:1 | get | name | file://():1:1:1:1 | () | signature | file://:1:1:1:1 | | input | file://ReturnValue:1:1:1:1 | ReturnValue | output | file://false:1:1:1:1 | false | isVarargsArray | file://:1:1:1:1 | | alreadyAiModeled | file://sourceModel:1:1:1:1 | sourceModel | extensibleType | +| Test.java:28:3:32:3 | copy(...) | Related locations: $@, $@, $@.\nmetadata: $@, $@, $@, $@, $@, $@, $@, $@, $@, $@. | Test.java:28:3:32:3 | copy(...) | CallContext | Test.java:28:3:32:3 | copy(...) | MethodDoc | Test.java:28:3:32:3 | copy(...) | ClassDoc | file://java.nio.file:1:1:1:1 | java.nio.file | package | file://Files:1:1:1:1 | Files | type | file://false:1:1:1:1 | false | subtypes | file://copy:1:1:1:1 | copy | name | file://(Path,Path,CopyOption[]):1:1:1:1 | (Path,Path,CopyOption[]) | signature | file://:1:1:1:1 | | input | file://ReturnValue:1:1:1:1 | ReturnValue | output | file://false:1:1:1:1 | false | isVarargsArray | file://:1:1:1:1 | | alreadyAiModeled | file://sourceModel:1:1:1:1 | sourceModel | extensibleType | +| Test.java:36:10:38:3 | newInputStream(...) | Related locations: $@, $@, $@.\nmetadata: $@, $@, $@, $@, $@, $@, $@, $@, $@, $@. | Test.java:36:10:38:3 | newInputStream(...) | CallContext | Test.java:36:10:38:3 | newInputStream(...) | MethodDoc | Test.java:36:10:38:3 | newInputStream(...) | ClassDoc | file://java.nio.file:1:1:1:1 | java.nio.file | package | file://Files:1:1:1:1 | Files | type | file://false:1:1:1:1 | false | subtypes | file://newInputStream:1:1:1:1 | newInputStream | name | file://(Path,OpenOption[]):1:1:1:1 | (Path,OpenOption[]) | signature | file://:1:1:1:1 | | input | file://ReturnValue:1:1:1:1 | ReturnValue | output | file://false:1:1:1:1 | false | isVarargsArray | file://:1:1:1:1 | | alreadyAiModeled | file://sourceModel:1:1:1:1 | sourceModel | extensibleType | +| Test.java:37:4:37:11 | openPath | Related locations: $@, $@, $@.\nmetadata: $@, $@, $@, $@, $@, $@, $@, $@, $@, $@. | Test.java:36:10:38:3 | newInputStream(...) | CallContext | Test.java:37:4:37:11 | openPath | MethodDoc | Test.java:37:4:37:11 | openPath | ClassDoc | file://java.nio.file:1:1:1:1 | java.nio.file | package | file://Files:1:1:1:1 | Files | type | file://false:1:1:1:1 | false | subtypes | file://newInputStream:1:1:1:1 | newInputStream | name | file://(Path,OpenOption[]):1:1:1:1 | (Path,OpenOption[]) | signature | file://Argument[0]:1:1:1:1 | Argument[0] | input | file://:1:1:1:1 | | output | file://false:1:1:1:1 | false | isVarargsArray | file://ai-manual:1:1:1:1 | ai-manual | alreadyAiModeled | file://sinkModel:1:1:1:1 | sinkModel | extensibleType | +| Test.java:43:4:43:22 | get(...) | Related locations: $@, $@, $@.\nmetadata: $@, $@, $@, $@, $@, $@, $@, $@, $@, $@. | Test.java:43:4:43:22 | get(...) | CallContext | Test.java:43:4:43:22 | get(...) | MethodDoc | Test.java:43:4:43:22 | get(...) | ClassDoc | file://java.nio.file:1:1:1:1 | java.nio.file | package | file://Paths:1:1:1:1 | Paths | type | file://false:1:1:1:1 | false | subtypes | file://get:1:1:1:1 | get | name | file://(String,String[]):1:1:1:1 | (String,String[]) | signature | file://:1:1:1:1 | | input | file://ReturnValue:1:1:1:1 | ReturnValue | output | file://false:1:1:1:1 | false | isVarargsArray | file://:1:1:1:1 | | alreadyAiModeled | file://sourceModel:1:1:1:1 | sourceModel | extensibleType | +| Test.java:54:3:59:3 | walk(...) | Related locations: $@, $@, $@.\nmetadata: $@, $@, $@, $@, $@, $@, $@, $@, $@, $@. | Test.java:54:3:59:3 | walk(...) | CallContext | Test.java:54:3:59:3 | walk(...) | MethodDoc | Test.java:54:3:59:3 | walk(...) | ClassDoc | file://java.nio.file:1:1:1:1 | java.nio.file | package | file://Files:1:1:1:1 | Files | type | file://false:1:1:1:1 | false | subtypes | file://walk:1:1:1:1 | walk | name | file://(Path,FileVisitOption[]):1:1:1:1 | (Path,FileVisitOption[]) | signature | file://:1:1:1:1 | | input | file://ReturnValue:1:1:1:1 | ReturnValue | output | file://false:1:1:1:1 | false | isVarargsArray | file://:1:1:1:1 | | alreadyAiModeled | file://sourceModel:1:1:1:1 | sourceModel | extensibleType | +| Test.java:56:4:56:4 | o | Related locations: $@, $@, $@.\nmetadata: $@, $@, $@, $@, $@, $@, $@, $@, $@, $@. | Test.java:54:3:59:3 | walk(...) | CallContext | Test.java:54:3:59:3 | walk(...) | MethodDoc | Test.java:54:3:59:3 | walk(...) | ClassDoc | file://java.nio.file:1:1:1:1 | java.nio.file | package | file://Files:1:1:1:1 | Files | type | file://false:1:1:1:1 | false | subtypes | file://walk:1:1:1:1 | walk | name | file://(Path,FileVisitOption[]):1:1:1:1 | (Path,FileVisitOption[]) | signature | file://Argument[1]:1:1:1:1 | Argument[1] | input | file://:1:1:1:1 | | output | file://true:1:1:1:1 | true | isVarargsArray | file://:1:1:1:1 | | alreadyAiModeled | file://sinkModel:1:1:1:1 | sinkModel | extensibleType | +| Test.java:63:3:63:3 | c | Related locations: $@, $@, $@.\nmetadata: $@, $@, $@, $@, $@, $@, $@, $@, $@, $@. | Test.java:63:3:63:20 | getInputStream(...) | CallContext | Test.java:63:3:63:3 | c | MethodDoc | Test.java:63:3:63:3 | c | ClassDoc | file://java.net:1:1:1:1 | java.net | package | file://URLConnection:1:1:1:1 | URLConnection | type | file://true:1:1:1:1 | true | subtypes | file://getInputStream:1:1:1:1 | getInputStream | name | file://():1:1:1:1 | () | signature | file://Argument[this]:1:1:1:1 | Argument[this] | input | file://:1:1:1:1 | | output | file://false:1:1:1:1 | false | isVarargsArray | file://:1:1:1:1 | | alreadyAiModeled | file://sinkModel:1:1:1:1 | sinkModel | extensibleType | +| Test.java:68:30:68:47 | writer | Related locations: $@, $@, $@.\nmetadata: $@, $@, $@, $@, $@, $@, $@, $@, $@, $@. | Test.java:68:30:68:47 | writer | CallContext | Test.java:68:30:68:47 | writer | MethodDoc | Test.java:68:30:68:47 | writer | ClassDoc | file://java.lang:1:1:1:1 | java.lang | package | file://Throwable:1:1:1:1 | Throwable | type | file://true:1:1:1:1 | true | subtypes | file://printStackTrace:1:1:1:1 | printStackTrace | name | file://(PrintWriter):1:1:1:1 | (PrintWriter) | signature | file://:1:1:1:1 | | input | file://Parameter[0]:1:1:1:1 | Parameter[0] | output | file://false:1:1:1:1 | false | isVarargsArray | file://:1:1:1:1 | | alreadyAiModeled | file://sourceModel:1:1:1:1 | sourceModel | extensibleType | diff --git a/java/ql/automodel/test/AutomodelApplicationModeExtraction/AutomodelApplicationModeExtractNegativeExamples.expected b/java/ql/automodel/test/AutomodelApplicationModeExtraction/AutomodelApplicationModeExtractNegativeExamples.expected index 092551af317..91f33b6fb05 100644 --- a/java/ql/automodel/test/AutomodelApplicationModeExtraction/AutomodelApplicationModeExtractNegativeExamples.expected +++ b/java/ql/automodel/test/AutomodelApplicationModeExtraction/AutomodelApplicationModeExtractNegativeExamples.expected @@ -1,4 +1,3 @@ -| Test.java:47:10:49:3 | compareTo(...) | known sanitizer\nrelated locations: $@, $@, $@.\nmetadata: $@, $@, $@, $@, $@, $@, $@, $@, $@. | Test.java:47:10:49:3 | compareTo(...) | CallContext | Test.java:47:10:49:3 | compareTo(...) | MethodDoc | Test.java:47:10:49:3 | compareTo(...) | ClassDoc | file://java.io:1:1:1:1 | java.io | package | file://File:1:1:1:1 | File | type | file://true:1:1:1:1 | true | subtypes | file://compareTo:1:1:1:1 | compareTo | name | file://(File):1:1:1:1 | (File) | signature | file://:1:1:1:1 | | input | file://ReturnValue:1:1:1:1 | ReturnValue | output | file://false:1:1:1:1 | false | isVarargsArray | file://sourceModel:1:1:1:1 | sourceModel | extensibleType | -| Test.java:48:4:48:5 | f2 | known non-sink\nrelated locations: $@, $@, $@.\nmetadata: $@, $@, $@, $@, $@, $@, $@, $@, $@. | Test.java:47:10:49:3 | compareTo(...) | CallContext | Test.java:48:4:48:5 | f2 | MethodDoc | Test.java:48:4:48:5 | f2 | ClassDoc | file://java.io:1:1:1:1 | java.io | package | file://File:1:1:1:1 | File | type | file://true:1:1:1:1 | true | subtypes | file://compareTo:1:1:1:1 | compareTo | name | file://(File):1:1:1:1 | (File) | signature | file://Argument[0]:1:1:1:1 | Argument[0] | input | file://:1:1:1:1 | | output | file://false:1:1:1:1 | false | isVarargsArray | file://sinkModel:1:1:1:1 | sinkModel | extensibleType | -| Test.java:54:4:54:4 | p | taint step\nrelated locations: $@, $@, $@.\nmetadata: $@, $@, $@, $@, $@, $@, $@, $@, $@. | Test.java:53:3:58:3 | walk(...) | CallContext | Test.java:54:4:54:4 | p | MethodDoc | Test.java:54:4:54:4 | p | ClassDoc | file://java.nio.file:1:1:1:1 | java.nio.file | package | file://Files:1:1:1:1 | Files | type | file://false:1:1:1:1 | false | subtypes | file://walk:1:1:1:1 | walk | name | file://(Path,FileVisitOption[]):1:1:1:1 | (Path,FileVisitOption[]) | signature | file://Argument[0]:1:1:1:1 | Argument[0] | input | file://:1:1:1:1 | | output | file://false:1:1:1:1 | false | isVarargsArray | file://sinkModel:1:1:1:1 | sinkModel | extensibleType | -| Test.java:66:7:66:18 | this | exception\nrelated locations: $@, $@, $@.\nmetadata: $@, $@, $@, $@, $@, $@, $@, $@, $@. | Test.java:66:7:66:18 | super(...) | CallContext | Test.java:66:7:66:18 | super(...) | MethodDoc | Test.java:66:7:66:18 | super(...) | ClassDoc | file://java.lang:1:1:1:1 | java.lang | package | file://Exception:1:1:1:1 | Exception | type | file://true:1:1:1:1 | true | subtypes | file://Exception:1:1:1:1 | Exception | name | file://():1:1:1:1 | () | signature | file://Argument[this]:1:1:1:1 | Argument[this] | input | file://:1:1:1:1 | | output | file://false:1:1:1:1 | false | isVarargsArray | file://sinkModel:1:1:1:1 | sinkModel | extensibleType | +| Test.java:48:10:50:3 | compareTo(...) | known sanitizer\nrelated locations: $@, $@, $@.\nmetadata: $@, $@, $@, $@, $@, $@, $@, $@, $@. | Test.java:48:10:50:3 | compareTo(...) | CallContext | Test.java:48:10:50:3 | compareTo(...) | MethodDoc | Test.java:48:10:50:3 | compareTo(...) | ClassDoc | file://java.io:1:1:1:1 | java.io | package | file://File:1:1:1:1 | File | type | file://true:1:1:1:1 | true | subtypes | file://compareTo:1:1:1:1 | compareTo | name | file://(File):1:1:1:1 | (File) | signature | file://:1:1:1:1 | | input | file://ReturnValue:1:1:1:1 | ReturnValue | output | file://false:1:1:1:1 | false | isVarargsArray | file://sourceModel:1:1:1:1 | sourceModel | extensibleType | +| Test.java:49:4:49:5 | f2 | known non-sink\nrelated locations: $@, $@, $@.\nmetadata: $@, $@, $@, $@, $@, $@, $@, $@, $@. | Test.java:48:10:50:3 | compareTo(...) | CallContext | Test.java:49:4:49:5 | f2 | MethodDoc | Test.java:49:4:49:5 | f2 | ClassDoc | file://java.io:1:1:1:1 | java.io | package | file://File:1:1:1:1 | File | type | file://true:1:1:1:1 | true | subtypes | file://compareTo:1:1:1:1 | compareTo | name | file://(File):1:1:1:1 | (File) | signature | file://Argument[0]:1:1:1:1 | Argument[0] | input | file://:1:1:1:1 | | output | file://false:1:1:1:1 | false | isVarargsArray | file://sinkModel:1:1:1:1 | sinkModel | extensibleType | +| Test.java:55:4:55:4 | p | taint step\nrelated locations: $@, $@, $@.\nmetadata: $@, $@, $@, $@, $@, $@, $@, $@, $@. | Test.java:54:3:59:3 | walk(...) | CallContext | Test.java:55:4:55:4 | p | MethodDoc | Test.java:55:4:55:4 | p | ClassDoc | file://java.nio.file:1:1:1:1 | java.nio.file | package | file://Files:1:1:1:1 | Files | type | file://false:1:1:1:1 | false | subtypes | file://walk:1:1:1:1 | walk | name | file://(Path,FileVisitOption[]):1:1:1:1 | (Path,FileVisitOption[]) | signature | file://Argument[0]:1:1:1:1 | Argument[0] | input | file://:1:1:1:1 | | output | file://false:1:1:1:1 | false | isVarargsArray | file://sinkModel:1:1:1:1 | sinkModel | extensibleType | diff --git a/java/ql/automodel/test/AutomodelApplicationModeExtraction/AutomodelApplicationModeExtractPositiveExamples.expected b/java/ql/automodel/test/AutomodelApplicationModeExtraction/AutomodelApplicationModeExtractPositiveExamples.expected index 3419e5c0c8d..60db0852024 100644 --- a/java/ql/automodel/test/AutomodelApplicationModeExtraction/AutomodelApplicationModeExtractPositiveExamples.expected +++ b/java/ql/automodel/test/AutomodelApplicationModeExtraction/AutomodelApplicationModeExtractPositiveExamples.expected @@ -1,4 +1,4 @@ -| Test.java:28:4:28:9 | source | path-injection\nrelated locations: $@, $@, $@.\nmetadata: $@, $@, $@, $@, $@, $@, $@, $@, $@. | Test.java:27:3:31:3 | copy(...) | CallContext | Test.java:28:4:28:9 | source | MethodDoc | Test.java:28:4:28:9 | source | ClassDoc | file://java.nio.file:1:1:1:1 | java.nio.file | package | file://Files:1:1:1:1 | Files | type | file://false:1:1:1:1 | false | subtypes | file://copy:1:1:1:1 | copy | name | file://(Path,Path,CopyOption[]):1:1:1:1 | (Path,Path,CopyOption[]) | signature | file://Argument[0]:1:1:1:1 | Argument[0] | input | file://:1:1:1:1 | | output | file://false:1:1:1:1 | false | isVarargsArray | file://sinkModel:1:1:1:1 | sinkModel | extensibleType | -| Test.java:29:4:29:9 | target | path-injection\nrelated locations: $@, $@, $@.\nmetadata: $@, $@, $@, $@, $@, $@, $@, $@, $@. | Test.java:27:3:31:3 | copy(...) | CallContext | Test.java:29:4:29:9 | target | MethodDoc | Test.java:29:4:29:9 | target | ClassDoc | file://java.nio.file:1:1:1:1 | java.nio.file | package | file://Files:1:1:1:1 | Files | type | file://false:1:1:1:1 | false | subtypes | file://copy:1:1:1:1 | copy | name | file://(Path,Path,CopyOption[]):1:1:1:1 | (Path,Path,CopyOption[]) | signature | file://Argument[1]:1:1:1:1 | Argument[1] | input | file://:1:1:1:1 | | output | file://false:1:1:1:1 | false | isVarargsArray | file://sinkModel:1:1:1:1 | sinkModel | extensibleType | -| Test.java:36:4:36:11 | openPath | path-injection\nrelated locations: $@, $@, $@.\nmetadata: $@, $@, $@, $@, $@, $@, $@, $@, $@. | Test.java:35:10:37:3 | newInputStream(...) | CallContext | Test.java:36:4:36:11 | openPath | MethodDoc | Test.java:36:4:36:11 | openPath | ClassDoc | file://java.nio.file:1:1:1:1 | java.nio.file | package | file://Files:1:1:1:1 | Files | type | file://false:1:1:1:1 | false | subtypes | file://newInputStream:1:1:1:1 | newInputStream | name | file://(Path,OpenOption[]):1:1:1:1 | (Path,OpenOption[]) | signature | file://Argument[0]:1:1:1:1 | Argument[0] | input | file://:1:1:1:1 | | output | file://false:1:1:1:1 | false | isVarargsArray | file://sinkModel:1:1:1:1 | sinkModel | extensibleType | -| Test.java:62:3:62:20 | getInputStream(...) | remote\nrelated locations: $@, $@, $@.\nmetadata: $@, $@, $@, $@, $@, $@, $@, $@, $@. | Test.java:62:3:62:20 | getInputStream(...) | CallContext | Test.java:62:3:62:20 | getInputStream(...) | MethodDoc | Test.java:62:3:62:20 | getInputStream(...) | ClassDoc | file://java.net:1:1:1:1 | java.net | package | file://URLConnection:1:1:1:1 | URLConnection | type | file://true:1:1:1:1 | true | subtypes | file://getInputStream:1:1:1:1 | getInputStream | name | file://():1:1:1:1 | () | signature | file://:1:1:1:1 | | input | file://ReturnValue:1:1:1:1 | ReturnValue | output | file://false:1:1:1:1 | false | isVarargsArray | file://sourceModel:1:1:1:1 | sourceModel | extensibleType | +| Test.java:29:4:29:9 | source | path-injection\nrelated locations: $@, $@, $@.\nmetadata: $@, $@, $@, $@, $@, $@, $@, $@, $@. | Test.java:28:3:32:3 | copy(...) | CallContext | Test.java:29:4:29:9 | source | MethodDoc | Test.java:29:4:29:9 | source | ClassDoc | file://java.nio.file:1:1:1:1 | java.nio.file | package | file://Files:1:1:1:1 | Files | type | file://false:1:1:1:1 | false | subtypes | file://copy:1:1:1:1 | copy | name | file://(Path,Path,CopyOption[]):1:1:1:1 | (Path,Path,CopyOption[]) | signature | file://Argument[0]:1:1:1:1 | Argument[0] | input | file://:1:1:1:1 | | output | file://false:1:1:1:1 | false | isVarargsArray | file://sinkModel:1:1:1:1 | sinkModel | extensibleType | +| Test.java:30:4:30:9 | target | path-injection\nrelated locations: $@, $@, $@.\nmetadata: $@, $@, $@, $@, $@, $@, $@, $@, $@. | Test.java:28:3:32:3 | copy(...) | CallContext | Test.java:30:4:30:9 | target | MethodDoc | Test.java:30:4:30:9 | target | ClassDoc | file://java.nio.file:1:1:1:1 | java.nio.file | package | file://Files:1:1:1:1 | Files | type | file://false:1:1:1:1 | false | subtypes | file://copy:1:1:1:1 | copy | name | file://(Path,Path,CopyOption[]):1:1:1:1 | (Path,Path,CopyOption[]) | signature | file://Argument[1]:1:1:1:1 | Argument[1] | input | file://:1:1:1:1 | | output | file://false:1:1:1:1 | false | isVarargsArray | file://sinkModel:1:1:1:1 | sinkModel | extensibleType | +| Test.java:37:4:37:11 | openPath | path-injection\nrelated locations: $@, $@, $@.\nmetadata: $@, $@, $@, $@, $@, $@, $@, $@, $@. | Test.java:36:10:38:3 | newInputStream(...) | CallContext | Test.java:37:4:37:11 | openPath | MethodDoc | Test.java:37:4:37:11 | openPath | ClassDoc | file://java.nio.file:1:1:1:1 | java.nio.file | package | file://Files:1:1:1:1 | Files | type | file://false:1:1:1:1 | false | subtypes | file://newInputStream:1:1:1:1 | newInputStream | name | file://(Path,OpenOption[]):1:1:1:1 | (Path,OpenOption[]) | signature | file://Argument[0]:1:1:1:1 | Argument[0] | input | file://:1:1:1:1 | | output | file://false:1:1:1:1 | false | isVarargsArray | file://sinkModel:1:1:1:1 | sinkModel | extensibleType | +| Test.java:63:3:63:20 | getInputStream(...) | remote\nrelated locations: $@, $@, $@.\nmetadata: $@, $@, $@, $@, $@, $@, $@, $@, $@. | Test.java:63:3:63:20 | getInputStream(...) | CallContext | Test.java:63:3:63:20 | getInputStream(...) | MethodDoc | Test.java:63:3:63:20 | getInputStream(...) | ClassDoc | file://java.net:1:1:1:1 | java.net | package | file://URLConnection:1:1:1:1 | URLConnection | type | file://true:1:1:1:1 | true | subtypes | file://getInputStream:1:1:1:1 | getInputStream | name | file://():1:1:1:1 | () | signature | file://:1:1:1:1 | | input | file://ReturnValue:1:1:1:1 | ReturnValue | output | file://false:1:1:1:1 | false | isVarargsArray | file://sourceModel:1:1:1:1 | sourceModel | extensibleType | diff --git a/java/ql/automodel/test/AutomodelApplicationModeExtraction/Test.java b/java/ql/automodel/test/AutomodelApplicationModeExtraction/Test.java index 0bfb83ad520..3851a689969 100644 --- a/java/ql/automodel/test/AutomodelApplicationModeExtraction/Test.java +++ b/java/ql/automodel/test/AutomodelApplicationModeExtraction/Test.java @@ -11,6 +11,7 @@ import java.util.function.Supplier; import java.io.File; import java.nio.file.FileVisitOption; import java.net.URLConnection; +import java.util.concurrent.FutureTask; class Test { public static void main(String[] args) throws Exception { @@ -67,4 +68,15 @@ class OverrideTest extends Exception { public void printStackTrace(PrintWriter writer) { // writer is a source candidate because it overrides an existing method return; } + +} + +class TaskUtils { + public FutureTask getTask() { + FutureTask ft = new FutureTask(() -> { + // ^-- no sink candidate for the `this` qualifier of a constructor + return 42; + }); + return ft; + } } diff --git a/java/ql/automodel/test/AutomodelFrameworkModeExtraction/AutomodelFrameworkModeExtractCandidates.expected b/java/ql/automodel/test/AutomodelFrameworkModeExtraction/AutomodelFrameworkModeExtractCandidates.expected index 2bb9b2edb25..fc3debce039 100644 --- a/java/ql/automodel/test/AutomodelFrameworkModeExtraction/AutomodelFrameworkModeExtractCandidates.expected +++ b/java/ql/automodel/test/AutomodelFrameworkModeExtraction/AutomodelFrameworkModeExtractCandidates.expected @@ -10,6 +10,8 @@ | com/github/codeql/test/PublicClass.java:13:18:13:31 | nonPublicStuff | Related locations: $@, $@.\nmetadata: $@, $@, $@, $@, $@, $@, $@, $@, $@, $@. | com/github/codeql/test/PublicClass.java:13:18:13:31 | nonPublicStuff | MethodDoc | com/github/codeql/test/PublicClass.java:13:18:13:31 | nonPublicStuff | ClassDoc | file://com.github.codeql.test:1:1:1:1 | com.github.codeql.test | package | file://PublicClass:1:1:1:1 | PublicClass | type | file://true:1:1:1:1 | true | subtypes | file://nonPublicStuff:1:1:1:1 | nonPublicStuff | name | file://(String):1:1:1:1 | (String) | signature | file://Argument[this]:1:1:1:1 | Argument[this] | input | file://:1:1:1:1 | | output | file://this:1:1:1:1 | this | parameterName | file://:1:1:1:1 | | alreadyAiModeled | file://sinkModel:1:1:1:1 | sinkModel | extensibleType | | com/github/codeql/test/PublicClass.java:13:33:13:42 | arg | Related locations: $@, $@.\nmetadata: $@, $@, $@, $@, $@, $@, $@, $@, $@, $@. | com/github/codeql/test/PublicClass.java:13:33:13:42 | arg | MethodDoc | com/github/codeql/test/PublicClass.java:13:33:13:42 | arg | ClassDoc | file://com.github.codeql.test:1:1:1:1 | com.github.codeql.test | package | file://PublicClass:1:1:1:1 | PublicClass | type | file://true:1:1:1:1 | true | subtypes | file://nonPublicStuff:1:1:1:1 | nonPublicStuff | name | file://(String):1:1:1:1 | (String) | signature | file://:1:1:1:1 | | input | file://Parameter[0]:1:1:1:1 | Parameter[0] | output | file://arg:1:1:1:1 | arg | parameterName | file://:1:1:1:1 | | alreadyAiModeled | file://sourceModel:1:1:1:1 | sourceModel | extensibleType | | com/github/codeql/test/PublicClass.java:13:33:13:42 | arg | Related locations: $@, $@.\nmetadata: $@, $@, $@, $@, $@, $@, $@, $@, $@, $@. | com/github/codeql/test/PublicClass.java:13:33:13:42 | arg | MethodDoc | com/github/codeql/test/PublicClass.java:13:33:13:42 | arg | ClassDoc | file://com.github.codeql.test:1:1:1:1 | com.github.codeql.test | package | file://PublicClass:1:1:1:1 | PublicClass | type | file://true:1:1:1:1 | true | subtypes | file://nonPublicStuff:1:1:1:1 | nonPublicStuff | name | file://(String):1:1:1:1 | (String) | signature | file://Argument[0]:1:1:1:1 | Argument[0] | input | file://:1:1:1:1 | | output | file://arg:1:1:1:1 | arg | parameterName | file://:1:1:1:1 | | alreadyAiModeled | file://sinkModel:1:1:1:1 | sinkModel | extensibleType | +| com/github/codeql/test/PublicClass.java:22:10:22:20 | PublicClass | Related locations: $@, $@.\nmetadata: $@, $@, $@, $@, $@, $@, $@, $@, $@, $@. | com/github/codeql/test/PublicClass.java:22:10:22:20 | PublicClass | MethodDoc | com/github/codeql/test/PublicClass.java:22:10:22:20 | PublicClass | ClassDoc | file://com.github.codeql.test:1:1:1:1 | com.github.codeql.test | package | file://PublicClass:1:1:1:1 | PublicClass | type | file://true:1:1:1:1 | true | subtypes | file://PublicClass:1:1:1:1 | PublicClass | name | file://(Object):1:1:1:1 | (Object) | signature | file://:1:1:1:1 | | input | file://ReturnValue:1:1:1:1 | ReturnValue | output | file://:1:1:1:1 | | parameterName | file://:1:1:1:1 | | alreadyAiModeled | file://sourceModel:1:1:1:1 | sourceModel | extensibleType | +| com/github/codeql/test/PublicClass.java:22:22:22:33 | input | Related locations: $@, $@.\nmetadata: $@, $@, $@, $@, $@, $@, $@, $@, $@, $@. | com/github/codeql/test/PublicClass.java:22:22:22:33 | input | MethodDoc | com/github/codeql/test/PublicClass.java:22:22:22:33 | input | ClassDoc | file://com.github.codeql.test:1:1:1:1 | com.github.codeql.test | package | file://PublicClass:1:1:1:1 | PublicClass | type | file://true:1:1:1:1 | true | subtypes | file://PublicClass:1:1:1:1 | PublicClass | name | file://(Object):1:1:1:1 | (Object) | signature | file://Argument[0]:1:1:1:1 | Argument[0] | input | file://:1:1:1:1 | | output | file://input:1:1:1:1 | input | parameterName | file://:1:1:1:1 | | alreadyAiModeled | file://sinkModel:1:1:1:1 | sinkModel | extensibleType | | com/github/codeql/test/PublicInterface.java:4:17:4:21 | stuff | Related locations: $@, $@.\nmetadata: $@, $@, $@, $@, $@, $@, $@, $@, $@, $@. | com/github/codeql/test/PublicInterface.java:4:17:4:21 | stuff | MethodDoc | com/github/codeql/test/PublicInterface.java:4:17:4:21 | stuff | ClassDoc | file://com.github.codeql.test:1:1:1:1 | com.github.codeql.test | package | file://PublicInterface:1:1:1:1 | PublicInterface | type | file://true:1:1:1:1 | true | subtypes | file://stuff:1:1:1:1 | stuff | name | file://(String):1:1:1:1 | (String) | signature | file://:1:1:1:1 | | input | file://Parameter[this]:1:1:1:1 | Parameter[this] | output | file://this:1:1:1:1 | this | parameterName | file://:1:1:1:1 | | alreadyAiModeled | file://sourceModel:1:1:1:1 | sourceModel | extensibleType | | com/github/codeql/test/PublicInterface.java:4:17:4:21 | stuff | Related locations: $@, $@.\nmetadata: $@, $@, $@, $@, $@, $@, $@, $@, $@, $@. | com/github/codeql/test/PublicInterface.java:4:17:4:21 | stuff | MethodDoc | com/github/codeql/test/PublicInterface.java:4:17:4:21 | stuff | ClassDoc | file://com.github.codeql.test:1:1:1:1 | com.github.codeql.test | package | file://PublicInterface:1:1:1:1 | PublicInterface | type | file://true:1:1:1:1 | true | subtypes | file://stuff:1:1:1:1 | stuff | name | file://(String):1:1:1:1 | (String) | signature | file://:1:1:1:1 | | input | file://ReturnValue:1:1:1:1 | ReturnValue | output | file://:1:1:1:1 | | parameterName | file://:1:1:1:1 | | alreadyAiModeled | file://sourceModel:1:1:1:1 | sourceModel | extensibleType | | com/github/codeql/test/PublicInterface.java:4:17:4:21 | stuff | Related locations: $@, $@.\nmetadata: $@, $@, $@, $@, $@, $@, $@, $@, $@, $@. | com/github/codeql/test/PublicInterface.java:4:17:4:21 | stuff | MethodDoc | com/github/codeql/test/PublicInterface.java:4:17:4:21 | stuff | ClassDoc | file://com.github.codeql.test:1:1:1:1 | com.github.codeql.test | package | file://PublicInterface:1:1:1:1 | PublicInterface | type | file://true:1:1:1:1 | true | subtypes | file://stuff:1:1:1:1 | stuff | name | file://(String):1:1:1:1 | (String) | signature | file://Argument[this]:1:1:1:1 | Argument[this] | input | file://:1:1:1:1 | | output | file://this:1:1:1:1 | this | parameterName | file://:1:1:1:1 | | alreadyAiModeled | file://sinkModel:1:1:1:1 | sinkModel | extensibleType | diff --git a/java/ql/automodel/test/AutomodelFrameworkModeExtraction/com/github/codeql/test/PublicClass.java b/java/ql/automodel/test/AutomodelFrameworkModeExtraction/com/github/codeql/test/PublicClass.java index 49613d6d361..cb009cc8afc 100644 --- a/java/ql/automodel/test/AutomodelFrameworkModeExtraction/com/github/codeql/test/PublicClass.java +++ b/java/ql/automodel/test/AutomodelFrameworkModeExtraction/com/github/codeql/test/PublicClass.java @@ -18,4 +18,8 @@ public class PublicClass { void packagePrivateStuff(String arg) { System.out.println(arg); } + + public PublicClass(Object input) { + // the `this` qualifier is not a candidate + } } diff --git a/java/ql/lib/CHANGELOG.md b/java/ql/lib/CHANGELOG.md index 0bfe85bbcf6..ddff6b835a0 100644 --- a/java/ql/lib/CHANGELOG.md +++ b/java/ql/lib/CHANGELOG.md @@ -1,3 +1,13 @@ +## 0.8.3 + +### Deprecated APIs + +* In `SensitiveApi.qll`, `javaApiCallablePasswordParam`, `javaApiCallableUsernameParam`, `javaApiCallableCryptoKeyParam`, and `otherApiCallableCredentialParam` predicates have been deprecated. They have been replaced with a new class `CredentialsSinkNode` and its child classes `PasswordSink`, `UsernameSink`, and `CryptoKeySink`. The predicates have been changed to using the new classes, so there may be minor changes in results relying on these predicates. + +### Minor Analysis Improvements + +* The types `java.util.SequencedCollection`, `SequencedSet` and `SequencedMap`, as well as the related `Collections.unmodifiableSequenced*` methods are now modelled. This means alerts may be raised relating to data flow through these types and methods. + ## 0.8.2 ### Minor Analysis Improvements diff --git a/java/ql/lib/change-notes/2023-11-06-jdk21-models.md b/java/ql/lib/change-notes/2023-11-06-jdk21-models.md deleted file mode 100644 index ac3d6b1ff96..00000000000 --- a/java/ql/lib/change-notes/2023-11-06-jdk21-models.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* The types `java.util.SequencedCollection`, `SequencedSet` and `SequencedMap`, as well as the related `Collections.unmodifiableSequenced*` methods are now modelled. This means alerts may be raised relating to data flow through these types and methods. diff --git a/java/ql/lib/change-notes/2023-10-04-deprecated-sensitiveapi-predicates.md b/java/ql/lib/change-notes/released/0.8.3.md similarity index 59% rename from java/ql/lib/change-notes/2023-10-04-deprecated-sensitiveapi-predicates.md rename to java/ql/lib/change-notes/released/0.8.3.md index c847b42237d..4231d35958e 100644 --- a/java/ql/lib/change-notes/2023-10-04-deprecated-sensitiveapi-predicates.md +++ b/java/ql/lib/change-notes/released/0.8.3.md @@ -1,4 +1,9 @@ ---- -category: deprecated ---- +## 0.8.3 + +### Deprecated APIs + * In `SensitiveApi.qll`, `javaApiCallablePasswordParam`, `javaApiCallableUsernameParam`, `javaApiCallableCryptoKeyParam`, and `otherApiCallableCredentialParam` predicates have been deprecated. They have been replaced with a new class `CredentialsSinkNode` and its child classes `PasswordSink`, `UsernameSink`, and `CryptoKeySink`. The predicates have been changed to using the new classes, so there may be minor changes in results relying on these predicates. + +### Minor Analysis Improvements + +* The types `java.util.SequencedCollection`, `SequencedSet` and `SequencedMap`, as well as the related `Collections.unmodifiableSequenced*` methods are now modelled. This means alerts may be raised relating to data flow through these types and methods. diff --git a/java/ql/lib/codeql-pack.release.yml b/java/ql/lib/codeql-pack.release.yml index 404110129dc..b6e46394f37 100644 --- a/java/ql/lib/codeql-pack.release.yml +++ b/java/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.8.2 +lastReleaseVersion: 0.8.3 diff --git a/java/ql/lib/qlpack.yml b/java/ql/lib/qlpack.yml index d081d963060..311ca78d386 100644 --- a/java/ql/lib/qlpack.yml +++ b/java/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/java-all -version: 0.8.3-dev +version: 0.8.4-dev groups: java dbscheme: config/semmlecode.dbscheme extractor: java diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowPrivate.qll b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowPrivate.qll index 01ba8cfd26a..79e507dd598 100644 --- a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowPrivate.qll +++ b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowPrivate.qll @@ -61,11 +61,9 @@ private predicate closureFlowStep(Expr e1, Expr e2) { ) } -private module CaptureInput implements VariableCapture::InputSig { +private module CaptureInput implements VariableCapture::InputSig { private import java as J - class Location = J::Location; - class BasicBlock instanceof J::BasicBlock { string toString() { result = super.toString() } @@ -146,7 +144,7 @@ class CapturedVariable = CaptureInput::CapturedVariable; class CapturedParameter = CaptureInput::CapturedParameter; -module CaptureFlow = VariableCapture::Flow; +module CaptureFlow = VariableCapture::Flow; private CaptureFlow::ClosureNode asClosureNode(Node n) { result = n.(CaptureNode).getSynthesizedCaptureNode() diff --git a/java/ql/src/CHANGELOG.md b/java/ql/src/CHANGELOG.md index 264532fc787..c5df8405eaf 100644 --- a/java/ql/src/CHANGELOG.md +++ b/java/ql/src/CHANGELOG.md @@ -1,3 +1,9 @@ +## 0.8.3 + +### Minor Analysis Improvements + +* The query `java/unsafe-deserialization` has been improved to detect insecure calls to `ObjectMessage.getObject` in JMS. + ## 0.8.2 ### Minor Analysis Improvements diff --git a/java/ql/src/Security/CWE/CWE-022/TaintedPath.java b/java/ql/src/Security/CWE/CWE-022/TaintedPath.java index 339640ccc32..1fad061d0ba 100644 --- a/java/ql/src/Security/CWE/CWE-022/TaintedPath.java +++ b/java/ql/src/Security/CWE/CWE-022/TaintedPath.java @@ -2,23 +2,11 @@ public void sendUserFile(Socket sock, String user) { BufferedReader filenameReader = new BufferedReader( new InputStreamReader(sock.getInputStream(), "UTF-8")); String filename = filenameReader.readLine(); - // BAD: read from a file using a path controlled by the user - BufferedReader fileReader = new BufferedReader( - new FileReader("/home/" + user + "/" + filename)); + // BAD: read from a file without checking its path + BufferedReader fileReader = new BufferedReader(new FileReader(filename)); String fileLine = fileReader.readLine(); while(fileLine != null) { sock.getOutputStream().write(fileLine.getBytes()); fileLine = fileReader.readLine(); } } - -public void sendUserFileFixed(Socket sock, String user) { - // ... - - // GOOD: remove all dots and directory delimiters from the filename before using - String filename = filenameReader.readLine().replaceAll("\\.", "").replaceAll("/", ""); - BufferedReader fileReader = new BufferedReader( - new FileReader("/home/" + user + "/" + filename)); - - // ... -} diff --git a/java/ql/src/Security/CWE/CWE-022/TaintedPath.qhelp b/java/ql/src/Security/CWE/CWE-022/TaintedPath.qhelp index b32d3c65039..a68bdad3441 100644 --- a/java/ql/src/Security/CWE/CWE-022/TaintedPath.qhelp +++ b/java/ql/src/Security/CWE/CWE-022/TaintedPath.qhelp @@ -8,32 +8,44 @@ can result in sensitive information being revealed or deleted, or an attacker be behavior by modifying unexpected files.

    Paths that are naively constructed from data controlled by a user may contain unexpected special characters, -such as "..". Such a path may potentially point to any directory on the file system.

    +such as "..". Such a path may potentially point anywhere on the file system.

    -

    Validate user input before using it to construct a file path. Ideally, follow these rules:

    +

    Validate user input before using it to construct a file path.

    -
      -
    • Do not allow more than a single "." character.
    • -
    • Do not allow directory separators such as "/" or "\" (depending on the file system).
    • -
    • Do not rely on simply replacing problematic sequences such as "../". For example, after applying this filter to -".../...//" the resulting string would still be "../".
    • -
    • Ideally use a whitelist of known good patterns.
    • -
    +

    The choice of validation depends on whether you want to allow the user to specify complex paths with +multiple components that may span multiple folders, or only simple filenames without a path component.

    + +

    In the former case, a common strategy is to make sure that the constructed file path is contained within +a safe root folder, for example by checking that the path starts with the root folder. Additionally, +you need to ensure that the path does not contain any ".." components, since otherwise +even a path that starts with the root folder could be used to access files outside the root folder.

    + +

    In the latter case, if you want to ensure that the user input is interpreted as a simple filename without +a path component, you can remove all path separators ("/" or "\") and all ".." sequences from the input +before using it to construct a file path. Note that it is not sufficient to only remove "../" sequences: +for example, applying this filter to ".../...//" would still result in the string "../".

    + +

    Finally, the simplest (but most restrictive) option is to use an allow list of safe patterns and make sure that +the user input matches one of these patterns.

    -

    In this example, a file name is read from a java.net.Socket and then used to access a file in the -user's home directory and send it back over the socket. However, a malicious user could enter a file name which contains special -characters. For example, the string "../../etc/passwd" will result in the code reading the file located at -"/home/[user]/../../etc/passwd", which is the system's password file. This file would then be sent back to the user, -giving them access to all the system's passwords.

    +

    In this example, a file name is read from a java.net.Socket and then used to access a file +and send it back over the socket. However, a malicious user could enter a file name anywhere on the file system, +such as "/etc/passwd".

    +

    Simply checking that the path is under a trusted location (such as a known public folder) is not enough, +however, since the path could contain relative components such as "..". To fix this, check that it does +not contain ".." and starts with the public folder.

    + + +
    diff --git a/java/ql/src/Security/CWE/CWE-022/TaintedPathGood.java b/java/ql/src/Security/CWE/CWE-022/TaintedPathGood.java new file mode 100644 index 00000000000..37e8be7486c --- /dev/null +++ b/java/ql/src/Security/CWE/CWE-022/TaintedPathGood.java @@ -0,0 +1,14 @@ +public void sendUserFileGood(Socket sock, String user) { + BufferedReader filenameReader = new BufferedReader( + new InputStreamReader(sock.getInputStream(), "UTF-8")); + String filename = filenameReader.readLine(); + // GOOD: ensure that the file is in a designated folder in the user's home directory + if (!filename.contains("..") && filename.startsWith("/home/" + user + "/public/")) { + BufferedReader fileReader = new BufferedReader(new FileReader(filename)); + String fileLine = fileReader.readLine(); + while(fileLine != null) { + sock.getOutputStream().write(fileLine.getBytes()); + fileLine = fileReader.readLine(); + } + } +} diff --git a/java/ql/src/change-notes/2023-10-26-jms-unsafe-deserialization.md b/java/ql/src/change-notes/released/0.8.3.md similarity index 73% rename from java/ql/src/change-notes/2023-10-26-jms-unsafe-deserialization.md rename to java/ql/src/change-notes/released/0.8.3.md index 9ea3fbd866b..b24c81b3708 100644 --- a/java/ql/src/change-notes/2023-10-26-jms-unsafe-deserialization.md +++ b/java/ql/src/change-notes/released/0.8.3.md @@ -1,4 +1,5 @@ ---- -category: minorAnalysis ---- +## 0.8.3 + +### Minor Analysis Improvements + * The query `java/unsafe-deserialization` has been improved to detect insecure calls to `ObjectMessage.getObject` in JMS. diff --git a/java/ql/src/codeql-pack.release.yml b/java/ql/src/codeql-pack.release.yml index 404110129dc..b6e46394f37 100644 --- a/java/ql/src/codeql-pack.release.yml +++ b/java/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.8.2 +lastReleaseVersion: 0.8.3 diff --git a/java/ql/src/qlpack.yml b/java/ql/src/qlpack.yml index 9a8ff49eefd..342a7b86be8 100644 --- a/java/ql/src/qlpack.yml +++ b/java/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/java-queries -version: 0.8.3-dev +version: 0.8.4-dev groups: - java - queries diff --git a/java/ql/test-kotlin1/TestUtilities/InlineExpectationsTest.qll b/java/ql/test-kotlin1/TestUtilities/InlineExpectationsTest.qll new file mode 100644 index 00000000000..44306864a97 --- /dev/null +++ b/java/ql/test-kotlin1/TestUtilities/InlineExpectationsTest.qll @@ -0,0 +1,8 @@ +/** + * Inline expectation tests for Java. + * See `shared/util/codeql/util/test/InlineExpectationsTest.qll` + */ + +private import codeql.util.test.InlineExpectationsTest +private import internal.InlineExpectationsTestImpl +import Make diff --git a/java/ql/test-kotlin1/TestUtilities/InlineFlowTest.qll b/java/ql/test-kotlin1/TestUtilities/InlineFlowTest.qll new file mode 100644 index 00000000000..d815f302638 --- /dev/null +++ b/java/ql/test-kotlin1/TestUtilities/InlineFlowTest.qll @@ -0,0 +1,33 @@ +/** + * Inline flow tests for Java. + * See `shared/util/codeql/dataflow/test/InlineFlowTest.qll` + */ + +import java +import semmle.code.java.dataflow.DataFlow +private import codeql.dataflow.test.InlineFlowTest +private import semmle.code.java.dataflow.internal.DataFlowImplSpecific +private import semmle.code.java.dataflow.internal.TaintTrackingImplSpecific +private import internal.InlineExpectationsTestImpl + +private module FlowTestImpl implements InputSig { + predicate defaultSource(DataFlow::Node source) { + source.asExpr().(MethodCall).getMethod().getName() = ["source", "taint"] + } + + predicate defaultSink(DataFlow::Node sink) { + exists(MethodCall ma | ma.getMethod().hasName("sink") | sink.asExpr() = ma.getAnArgument()) + } + + private string getSourceArgString(DataFlow::Node src) { + defaultSource(src) and + src.asExpr().(MethodCall).getAnArgument().(StringLiteral).getValue() = result + } + + string getArgString(DataFlow::Node src, DataFlow::Node sink) { + (if exists(getSourceArgString(src)) then result = getSourceArgString(src) else result = "") and + exists(sink) + } +} + +import InlineFlowTestMake diff --git a/java/ql/test-kotlin1/TestUtilities/internal/InlineExpectationsTestImpl.qll b/java/ql/test-kotlin1/TestUtilities/internal/InlineExpectationsTestImpl.qll new file mode 100644 index 00000000000..cd62fdb757e --- /dev/null +++ b/java/ql/test-kotlin1/TestUtilities/internal/InlineExpectationsTestImpl.qll @@ -0,0 +1,35 @@ +private import java as J +private import codeql.util.test.InlineExpectationsTest + +module Impl implements InlineExpectationsTestSig { + /** + * A class representing line comments in Java, which is simply Javadoc restricted + * to EOL comments, with an extra accessor used by the InlineExpectations core code + */ + abstract class ExpectationComment extends J::Top { + /** Gets the contents of the given comment, _without_ the preceding comment marker (`//`). */ + abstract string getContents(); + } + + private class JavadocExpectationComment extends J::Javadoc, ExpectationComment { + JavadocExpectationComment() { isEolComment(this) } + + override string getContents() { result = this.getChild(0).toString() } + } + + private class KtExpectationComment extends J::KtComment, ExpectationComment { + KtExpectationComment() { this.isEolComment() } + + override string getContents() { result = this.getText().suffix(2).trim() } + } + + private class XmlExpectationComment extends ExpectationComment instanceof J::XmlComment { + override string getContents() { result = super.getText().trim() } + + override Location getLocation() { result = J::XmlComment.super.getLocation() } + + override string toString() { result = J::XmlComment.super.toString() } + } + + class Location = J::Location; +} diff --git a/java/ql/test/kotlin/library-tests/.gitignore b/java/ql/test-kotlin1/library-tests/.gitignore similarity index 100% rename from java/ql/test/kotlin/library-tests/.gitignore rename to java/ql/test-kotlin1/library-tests/.gitignore diff --git a/java/ql/test/kotlin/library-tests/GeneratedFiles/Generated.expected b/java/ql/test-kotlin1/library-tests/GeneratedFiles/Generated.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/GeneratedFiles/Generated.expected rename to java/ql/test-kotlin1/library-tests/GeneratedFiles/Generated.expected diff --git a/java/ql/test/kotlin/library-tests/GeneratedFiles/Generated.kt b/java/ql/test-kotlin1/library-tests/GeneratedFiles/Generated.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/GeneratedFiles/Generated.kt rename to java/ql/test-kotlin1/library-tests/GeneratedFiles/Generated.kt diff --git a/java/ql/test/kotlin/library-tests/GeneratedFiles/Generated.ql b/java/ql/test-kotlin1/library-tests/GeneratedFiles/Generated.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/GeneratedFiles/Generated.ql rename to java/ql/test-kotlin1/library-tests/GeneratedFiles/Generated.ql diff --git a/java/ql/test/kotlin/library-tests/GeneratedFiles/NonGenerated.kt b/java/ql/test-kotlin1/library-tests/GeneratedFiles/NonGenerated.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/GeneratedFiles/NonGenerated.kt rename to java/ql/test-kotlin1/library-tests/GeneratedFiles/NonGenerated.kt diff --git a/java/ql/test/kotlin/library-tests/android_function_return_types/returnTypes.expected b/java/ql/test-kotlin1/library-tests/android_function_return_types/returnTypes.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/android_function_return_types/returnTypes.expected rename to java/ql/test-kotlin1/library-tests/android_function_return_types/returnTypes.expected diff --git a/java/ql/test/kotlin/library-tests/android_function_return_types/returnTypes.ql b/java/ql/test-kotlin1/library-tests/android_function_return_types/returnTypes.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/android_function_return_types/returnTypes.ql rename to java/ql/test-kotlin1/library-tests/android_function_return_types/returnTypes.ql diff --git a/java/ql/test/kotlin/library-tests/android_function_return_types/test.kt b/java/ql/test-kotlin1/library-tests/android_function_return_types/test.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/android_function_return_types/test.kt rename to java/ql/test-kotlin1/library-tests/android_function_return_types/test.kt diff --git a/java/ql/test/kotlin/library-tests/annotation-accessor-result-type/PrintAst.expected b/java/ql/test-kotlin1/library-tests/annotation-accessor-result-type/PrintAst.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/annotation-accessor-result-type/PrintAst.expected rename to java/ql/test-kotlin1/library-tests/annotation-accessor-result-type/PrintAst.expected diff --git a/java/ql/test/kotlin/library-tests/annotation-accessor-result-type/PrintAst.qlref b/java/ql/test-kotlin1/library-tests/annotation-accessor-result-type/PrintAst.qlref similarity index 100% rename from java/ql/test/kotlin/library-tests/annotation-accessor-result-type/PrintAst.qlref rename to java/ql/test-kotlin1/library-tests/annotation-accessor-result-type/PrintAst.qlref diff --git a/java/ql/test/kotlin/library-tests/annotation-accessor-result-type/test.expected b/java/ql/test-kotlin1/library-tests/annotation-accessor-result-type/test.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/annotation-accessor-result-type/test.expected rename to java/ql/test-kotlin1/library-tests/annotation-accessor-result-type/test.expected diff --git a/java/ql/test/kotlin/library-tests/annotation-accessor-result-type/test.kt b/java/ql/test-kotlin1/library-tests/annotation-accessor-result-type/test.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/annotation-accessor-result-type/test.kt rename to java/ql/test-kotlin1/library-tests/annotation-accessor-result-type/test.kt diff --git a/java/ql/test/kotlin/library-tests/annotation-accessor-result-type/test.ql b/java/ql/test-kotlin1/library-tests/annotation-accessor-result-type/test.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/annotation-accessor-result-type/test.ql rename to java/ql/test-kotlin1/library-tests/annotation-accessor-result-type/test.ql diff --git a/java/ql/test/kotlin/library-tests/annotation_classes/Annot0j.java b/java/ql/test-kotlin1/library-tests/annotation_classes/Annot0j.java similarity index 100% rename from java/ql/test/kotlin/library-tests/annotation_classes/Annot0j.java rename to java/ql/test-kotlin1/library-tests/annotation_classes/Annot0j.java diff --git a/java/ql/test/kotlin/library-tests/annotation_classes/Annot1j.java b/java/ql/test-kotlin1/library-tests/annotation_classes/Annot1j.java similarity index 100% rename from java/ql/test/kotlin/library-tests/annotation_classes/Annot1j.java rename to java/ql/test-kotlin1/library-tests/annotation_classes/Annot1j.java diff --git a/java/ql/test/kotlin/library-tests/annotation_classes/PrintAst.expected b/java/ql/test-kotlin1/library-tests/annotation_classes/PrintAst.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/annotation_classes/PrintAst.expected rename to java/ql/test-kotlin1/library-tests/annotation_classes/PrintAst.expected diff --git a/java/ql/test/kotlin/library-tests/annotation_classes/PrintAst.qlref b/java/ql/test-kotlin1/library-tests/annotation_classes/PrintAst.qlref similarity index 100% rename from java/ql/test/kotlin/library-tests/annotation_classes/PrintAst.qlref rename to java/ql/test-kotlin1/library-tests/annotation_classes/PrintAst.qlref diff --git a/java/ql/test/kotlin/library-tests/annotation_classes/classes.expected b/java/ql/test-kotlin1/library-tests/annotation_classes/classes.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/annotation_classes/classes.expected rename to java/ql/test-kotlin1/library-tests/annotation_classes/classes.expected diff --git a/java/ql/test/kotlin/library-tests/annotation_classes/classes.ql b/java/ql/test-kotlin1/library-tests/annotation_classes/classes.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/annotation_classes/classes.ql rename to java/ql/test-kotlin1/library-tests/annotation_classes/classes.ql diff --git a/java/ql/test/kotlin/library-tests/annotation_classes/def.kt b/java/ql/test-kotlin1/library-tests/annotation_classes/def.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/annotation_classes/def.kt rename to java/ql/test-kotlin1/library-tests/annotation_classes/def.kt diff --git a/java/ql/test/kotlin/library-tests/annotation_classes/use.java b/java/ql/test-kotlin1/library-tests/annotation_classes/use.java similarity index 100% rename from java/ql/test/kotlin/library-tests/annotation_classes/use.java rename to java/ql/test-kotlin1/library-tests/annotation_classes/use.java diff --git a/java/ql/test/kotlin/library-tests/annotations/jvmName/Test.java b/java/ql/test-kotlin1/library-tests/annotations/jvmName/Test.java similarity index 100% rename from java/ql/test/kotlin/library-tests/annotations/jvmName/Test.java rename to java/ql/test-kotlin1/library-tests/annotations/jvmName/Test.java diff --git a/java/ql/test/kotlin/library-tests/annotations/jvmName/test.expected b/java/ql/test-kotlin1/library-tests/annotations/jvmName/test.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/annotations/jvmName/test.expected rename to java/ql/test-kotlin1/library-tests/annotations/jvmName/test.expected diff --git a/java/ql/test/kotlin/library-tests/annotations/jvmName/test.kt b/java/ql/test-kotlin1/library-tests/annotations/jvmName/test.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/annotations/jvmName/test.kt rename to java/ql/test-kotlin1/library-tests/annotations/jvmName/test.kt diff --git a/java/ql/test/kotlin/library-tests/annotations/jvmName/test.ql b/java/ql/test-kotlin1/library-tests/annotations/jvmName/test.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/annotations/jvmName/test.ql rename to java/ql/test-kotlin1/library-tests/annotations/jvmName/test.ql diff --git a/java/ql/test/kotlin/library-tests/arrays-with-variances/User.java b/java/ql/test-kotlin1/library-tests/arrays-with-variances/User.java similarity index 100% rename from java/ql/test/kotlin/library-tests/arrays-with-variances/User.java rename to java/ql/test-kotlin1/library-tests/arrays-with-variances/User.java diff --git a/java/ql/test/kotlin/library-tests/arrays-with-variances/takesArrayList.kt b/java/ql/test-kotlin1/library-tests/arrays-with-variances/takesArrayList.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/arrays-with-variances/takesArrayList.kt rename to java/ql/test-kotlin1/library-tests/arrays-with-variances/takesArrayList.kt diff --git a/java/ql/test/kotlin/library-tests/arrays-with-variances/test.expected b/java/ql/test-kotlin1/library-tests/arrays-with-variances/test.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/arrays-with-variances/test.expected rename to java/ql/test-kotlin1/library-tests/arrays-with-variances/test.expected diff --git a/java/ql/test/kotlin/library-tests/arrays-with-variances/test.ql b/java/ql/test-kotlin1/library-tests/arrays-with-variances/test.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/arrays-with-variances/test.ql rename to java/ql/test-kotlin1/library-tests/arrays-with-variances/test.ql diff --git a/java/ql/test/kotlin/library-tests/arrays/arrayAccesses.expected b/java/ql/test-kotlin1/library-tests/arrays/arrayAccesses.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/arrays/arrayAccesses.expected rename to java/ql/test-kotlin1/library-tests/arrays/arrayAccesses.expected diff --git a/java/ql/test/kotlin/library-tests/arrays/arrayAccesses.ql b/java/ql/test-kotlin1/library-tests/arrays/arrayAccesses.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/arrays/arrayAccesses.ql rename to java/ql/test-kotlin1/library-tests/arrays/arrayAccesses.ql diff --git a/java/ql/test/kotlin/library-tests/arrays/arrayCreations.expected b/java/ql/test-kotlin1/library-tests/arrays/arrayCreations.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/arrays/arrayCreations.expected rename to java/ql/test-kotlin1/library-tests/arrays/arrayCreations.expected diff --git a/java/ql/test/kotlin/library-tests/arrays/arrayCreations.kt b/java/ql/test-kotlin1/library-tests/arrays/arrayCreations.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/arrays/arrayCreations.kt rename to java/ql/test-kotlin1/library-tests/arrays/arrayCreations.kt diff --git a/java/ql/test/kotlin/library-tests/arrays/arrayCreations.ql b/java/ql/test-kotlin1/library-tests/arrays/arrayCreations.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/arrays/arrayCreations.ql rename to java/ql/test-kotlin1/library-tests/arrays/arrayCreations.ql diff --git a/java/ql/test/kotlin/library-tests/arrays/arrayGetsSets.kt b/java/ql/test-kotlin1/library-tests/arrays/arrayGetsSets.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/arrays/arrayGetsSets.kt rename to java/ql/test-kotlin1/library-tests/arrays/arrayGetsSets.kt diff --git a/java/ql/test/kotlin/library-tests/arrays/arrayIterators.expected b/java/ql/test-kotlin1/library-tests/arrays/arrayIterators.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/arrays/arrayIterators.expected rename to java/ql/test-kotlin1/library-tests/arrays/arrayIterators.expected diff --git a/java/ql/test/kotlin/library-tests/arrays/arrayIterators.kt b/java/ql/test-kotlin1/library-tests/arrays/arrayIterators.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/arrays/arrayIterators.kt rename to java/ql/test-kotlin1/library-tests/arrays/arrayIterators.kt diff --git a/java/ql/test/kotlin/library-tests/arrays/arrayIterators.ql b/java/ql/test-kotlin1/library-tests/arrays/arrayIterators.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/arrays/arrayIterators.ql rename to java/ql/test-kotlin1/library-tests/arrays/arrayIterators.ql diff --git a/java/ql/test/kotlin/library-tests/arrays/assignExprs.expected b/java/ql/test-kotlin1/library-tests/arrays/assignExprs.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/arrays/assignExprs.expected rename to java/ql/test-kotlin1/library-tests/arrays/assignExprs.expected diff --git a/java/ql/test/kotlin/library-tests/arrays/assignExprs.ql b/java/ql/test-kotlin1/library-tests/arrays/assignExprs.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/arrays/assignExprs.ql rename to java/ql/test-kotlin1/library-tests/arrays/assignExprs.ql diff --git a/java/ql/test/kotlin/library-tests/arrays/primitiveArrays.kt b/java/ql/test-kotlin1/library-tests/arrays/primitiveArrays.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/arrays/primitiveArrays.kt rename to java/ql/test-kotlin1/library-tests/arrays/primitiveArrays.kt diff --git a/java/ql/test/kotlin/library-tests/arrays/test.expected b/java/ql/test-kotlin1/library-tests/arrays/test.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/arrays/test.expected rename to java/ql/test-kotlin1/library-tests/arrays/test.expected diff --git a/java/ql/test/kotlin/library-tests/arrays/test.ql b/java/ql/test-kotlin1/library-tests/arrays/test.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/arrays/test.ql rename to java/ql/test-kotlin1/library-tests/arrays/test.ql diff --git a/java/ql/test/kotlin/library-tests/call-int-to-char/test.expected b/java/ql/test-kotlin1/library-tests/call-int-to-char/test.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/call-int-to-char/test.expected rename to java/ql/test-kotlin1/library-tests/call-int-to-char/test.expected diff --git a/java/ql/test/kotlin/library-tests/call-int-to-char/test.kt b/java/ql/test-kotlin1/library-tests/call-int-to-char/test.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/call-int-to-char/test.kt rename to java/ql/test-kotlin1/library-tests/call-int-to-char/test.kt diff --git a/java/ql/test/kotlin/library-tests/call-int-to-char/test.ql b/java/ql/test-kotlin1/library-tests/call-int-to-char/test.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/call-int-to-char/test.ql rename to java/ql/test-kotlin1/library-tests/call-int-to-char/test.ql diff --git a/java/ql/test/kotlin/library-tests/clashing-extension-fields/test.expected b/java/ql/test-kotlin1/library-tests/clashing-extension-fields/test.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/clashing-extension-fields/test.expected rename to java/ql/test-kotlin1/library-tests/clashing-extension-fields/test.expected diff --git a/java/ql/test/kotlin/library-tests/clashing-extension-fields/test.kt b/java/ql/test-kotlin1/library-tests/clashing-extension-fields/test.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/clashing-extension-fields/test.kt rename to java/ql/test-kotlin1/library-tests/clashing-extension-fields/test.kt diff --git a/java/ql/test/kotlin/library-tests/clashing-extension-fields/test.ql b/java/ql/test-kotlin1/library-tests/clashing-extension-fields/test.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/clashing-extension-fields/test.ql rename to java/ql/test-kotlin1/library-tests/clashing-extension-fields/test.ql diff --git a/java/ql/test/kotlin/library-tests/classes/PrintAst.expected b/java/ql/test-kotlin1/library-tests/classes/PrintAst.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/classes/PrintAst.expected rename to java/ql/test-kotlin1/library-tests/classes/PrintAst.expected diff --git a/java/ql/test/kotlin/library-tests/classes/PrintAst.qlref b/java/ql/test-kotlin1/library-tests/classes/PrintAst.qlref similarity index 100% rename from java/ql/test/kotlin/library-tests/classes/PrintAst.qlref rename to java/ql/test-kotlin1/library-tests/classes/PrintAst.qlref diff --git a/java/ql/test/kotlin/library-tests/classes/anonymousClasses.expected b/java/ql/test-kotlin1/library-tests/classes/anonymousClasses.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/classes/anonymousClasses.expected rename to java/ql/test-kotlin1/library-tests/classes/anonymousClasses.expected diff --git a/java/ql/test/kotlin/library-tests/classes/anonymousClasses.ql b/java/ql/test-kotlin1/library-tests/classes/anonymousClasses.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/classes/anonymousClasses.ql rename to java/ql/test-kotlin1/library-tests/classes/anonymousClasses.ql diff --git a/java/ql/test/kotlin/library-tests/classes/classes.expected b/java/ql/test-kotlin1/library-tests/classes/classes.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/classes/classes.expected rename to java/ql/test-kotlin1/library-tests/classes/classes.expected diff --git a/java/ql/test/kotlin/library-tests/classes/classes.kt b/java/ql/test-kotlin1/library-tests/classes/classes.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/classes/classes.kt rename to java/ql/test-kotlin1/library-tests/classes/classes.kt diff --git a/java/ql/test/kotlin/library-tests/classes/classes.ql b/java/ql/test-kotlin1/library-tests/classes/classes.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/classes/classes.ql rename to java/ql/test-kotlin1/library-tests/classes/classes.ql diff --git a/java/ql/test/kotlin/library-tests/classes/ctorCalls.expected b/java/ql/test-kotlin1/library-tests/classes/ctorCalls.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/classes/ctorCalls.expected rename to java/ql/test-kotlin1/library-tests/classes/ctorCalls.expected diff --git a/java/ql/test/kotlin/library-tests/classes/ctorCalls.ql b/java/ql/test-kotlin1/library-tests/classes/ctorCalls.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/classes/ctorCalls.ql rename to java/ql/test-kotlin1/library-tests/classes/ctorCalls.ql diff --git a/java/ql/test/kotlin/library-tests/classes/genericExprTypes.expected b/java/ql/test-kotlin1/library-tests/classes/genericExprTypes.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/classes/genericExprTypes.expected rename to java/ql/test-kotlin1/library-tests/classes/genericExprTypes.expected diff --git a/java/ql/test/kotlin/library-tests/classes/genericExprTypes.ql b/java/ql/test-kotlin1/library-tests/classes/genericExprTypes.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/classes/genericExprTypes.ql rename to java/ql/test-kotlin1/library-tests/classes/genericExprTypes.ql diff --git a/java/ql/test/kotlin/library-tests/classes/generic_anonymous.kt b/java/ql/test-kotlin1/library-tests/classes/generic_anonymous.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/classes/generic_anonymous.kt rename to java/ql/test-kotlin1/library-tests/classes/generic_anonymous.kt diff --git a/java/ql/test/kotlin/library-tests/classes/interfaces.expected b/java/ql/test-kotlin1/library-tests/classes/interfaces.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/classes/interfaces.expected rename to java/ql/test-kotlin1/library-tests/classes/interfaces.expected diff --git a/java/ql/test/kotlin/library-tests/classes/interfaces.ql b/java/ql/test-kotlin1/library-tests/classes/interfaces.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/classes/interfaces.ql rename to java/ql/test-kotlin1/library-tests/classes/interfaces.ql diff --git a/java/ql/test/kotlin/library-tests/classes/localClass.expected b/java/ql/test-kotlin1/library-tests/classes/localClass.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/classes/localClass.expected rename to java/ql/test-kotlin1/library-tests/classes/localClass.expected diff --git a/java/ql/test/kotlin/library-tests/classes/localClass.ql b/java/ql/test-kotlin1/library-tests/classes/localClass.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/classes/localClass.ql rename to java/ql/test-kotlin1/library-tests/classes/localClass.ql diff --git a/java/ql/test/kotlin/library-tests/classes/localClassField.kt b/java/ql/test-kotlin1/library-tests/classes/localClassField.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/classes/localClassField.kt rename to java/ql/test-kotlin1/library-tests/classes/localClassField.kt diff --git a/java/ql/test/kotlin/library-tests/classes/local_anonymous.expected b/java/ql/test-kotlin1/library-tests/classes/local_anonymous.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/classes/local_anonymous.expected rename to java/ql/test-kotlin1/library-tests/classes/local_anonymous.expected diff --git a/java/ql/test/kotlin/library-tests/classes/local_anonymous.kt b/java/ql/test-kotlin1/library-tests/classes/local_anonymous.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/classes/local_anonymous.kt rename to java/ql/test-kotlin1/library-tests/classes/local_anonymous.kt diff --git a/java/ql/test/kotlin/library-tests/classes/local_anonymous.ql b/java/ql/test-kotlin1/library-tests/classes/local_anonymous.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/classes/local_anonymous.ql rename to java/ql/test-kotlin1/library-tests/classes/local_anonymous.ql diff --git a/java/ql/test/kotlin/library-tests/classes/paramTypes.expected b/java/ql/test-kotlin1/library-tests/classes/paramTypes.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/classes/paramTypes.expected rename to java/ql/test-kotlin1/library-tests/classes/paramTypes.expected diff --git a/java/ql/test/kotlin/library-tests/classes/paramTypes.ql b/java/ql/test-kotlin1/library-tests/classes/paramTypes.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/classes/paramTypes.ql rename to java/ql/test-kotlin1/library-tests/classes/paramTypes.ql diff --git a/java/ql/test/kotlin/library-tests/classes/superChain.kt b/java/ql/test-kotlin1/library-tests/classes/superChain.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/classes/superChain.kt rename to java/ql/test-kotlin1/library-tests/classes/superChain.kt diff --git a/java/ql/test/kotlin/library-tests/classes/superTypes.expected b/java/ql/test-kotlin1/library-tests/classes/superTypes.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/classes/superTypes.expected rename to java/ql/test-kotlin1/library-tests/classes/superTypes.expected diff --git a/java/ql/test/kotlin/library-tests/classes/superTypes.ql b/java/ql/test-kotlin1/library-tests/classes/superTypes.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/classes/superTypes.ql rename to java/ql/test-kotlin1/library-tests/classes/superTypes.ql diff --git a/java/ql/test/kotlin/library-tests/collection-literals/PrintAst.expected b/java/ql/test-kotlin1/library-tests/collection-literals/PrintAst.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/collection-literals/PrintAst.expected rename to java/ql/test-kotlin1/library-tests/collection-literals/PrintAst.expected diff --git a/java/ql/test/kotlin/library-tests/collection-literals/PrintAst.qlref b/java/ql/test-kotlin1/library-tests/collection-literals/PrintAst.qlref similarity index 100% rename from java/ql/test/kotlin/library-tests/collection-literals/PrintAst.qlref rename to java/ql/test-kotlin1/library-tests/collection-literals/PrintAst.qlref diff --git a/java/ql/test/kotlin/library-tests/collection-literals/test.kt b/java/ql/test-kotlin1/library-tests/collection-literals/test.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/collection-literals/test.kt rename to java/ql/test-kotlin1/library-tests/collection-literals/test.kt diff --git a/java/ql/test/kotlin/library-tests/comments/comments.expected b/java/ql/test-kotlin1/library-tests/comments/comments.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/comments/comments.expected rename to java/ql/test-kotlin1/library-tests/comments/comments.expected diff --git a/java/ql/test/kotlin/library-tests/comments/comments.kt b/java/ql/test-kotlin1/library-tests/comments/comments.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/comments/comments.kt rename to java/ql/test-kotlin1/library-tests/comments/comments.kt diff --git a/java/ql/test/kotlin/library-tests/comments/comments.ql b/java/ql/test-kotlin1/library-tests/comments/comments.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/comments/comments.ql rename to java/ql/test-kotlin1/library-tests/comments/comments.ql diff --git a/java/ql/test/kotlin/library-tests/companion_objects/accesses.expected b/java/ql/test-kotlin1/library-tests/companion_objects/accesses.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/companion_objects/accesses.expected rename to java/ql/test-kotlin1/library-tests/companion_objects/accesses.expected diff --git a/java/ql/test/kotlin/library-tests/companion_objects/accesses.ql b/java/ql/test-kotlin1/library-tests/companion_objects/accesses.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/companion_objects/accesses.ql rename to java/ql/test-kotlin1/library-tests/companion_objects/accesses.ql diff --git a/java/ql/test/kotlin/library-tests/companion_objects/companion_objects.expected b/java/ql/test-kotlin1/library-tests/companion_objects/companion_objects.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/companion_objects/companion_objects.expected rename to java/ql/test-kotlin1/library-tests/companion_objects/companion_objects.expected diff --git a/java/ql/test/kotlin/library-tests/companion_objects/companion_objects.kt b/java/ql/test-kotlin1/library-tests/companion_objects/companion_objects.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/companion_objects/companion_objects.kt rename to java/ql/test-kotlin1/library-tests/companion_objects/companion_objects.kt diff --git a/java/ql/test/kotlin/library-tests/companion_objects/companion_objects.ql b/java/ql/test-kotlin1/library-tests/companion_objects/companion_objects.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/companion_objects/companion_objects.ql rename to java/ql/test-kotlin1/library-tests/companion_objects/companion_objects.ql diff --git a/java/ql/test/kotlin/library-tests/companion_objects/method_accesses.expected b/java/ql/test-kotlin1/library-tests/companion_objects/method_accesses.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/companion_objects/method_accesses.expected rename to java/ql/test-kotlin1/library-tests/companion_objects/method_accesses.expected diff --git a/java/ql/test/kotlin/library-tests/companion_objects/method_accesses.ql b/java/ql/test-kotlin1/library-tests/companion_objects/method_accesses.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/companion_objects/method_accesses.ql rename to java/ql/test-kotlin1/library-tests/companion_objects/method_accesses.ql diff --git a/java/ql/test/kotlin/library-tests/compilation-units/cus.expected b/java/ql/test-kotlin1/library-tests/compilation-units/cus.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/compilation-units/cus.expected rename to java/ql/test-kotlin1/library-tests/compilation-units/cus.expected diff --git a/java/ql/test/kotlin/library-tests/compilation-units/cus.ql b/java/ql/test-kotlin1/library-tests/compilation-units/cus.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/compilation-units/cus.ql rename to java/ql/test-kotlin1/library-tests/compilation-units/cus.ql diff --git a/java/ql/test/kotlin/library-tests/compilation-units/test.kt b/java/ql/test-kotlin1/library-tests/compilation-units/test.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/compilation-units/test.kt rename to java/ql/test-kotlin1/library-tests/compilation-units/test.kt diff --git a/java/ql/test/kotlin/library-tests/controlflow/basic/Test.kt b/java/ql/test-kotlin1/library-tests/controlflow/basic/Test.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/controlflow/basic/Test.kt rename to java/ql/test-kotlin1/library-tests/controlflow/basic/Test.kt diff --git a/java/ql/test/kotlin/library-tests/controlflow/basic/bbStmts.expected b/java/ql/test-kotlin1/library-tests/controlflow/basic/bbStmts.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/controlflow/basic/bbStmts.expected rename to java/ql/test-kotlin1/library-tests/controlflow/basic/bbStmts.expected diff --git a/java/ql/test/kotlin/library-tests/controlflow/basic/bbStmts.ql b/java/ql/test-kotlin1/library-tests/controlflow/basic/bbStmts.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/controlflow/basic/bbStmts.ql rename to java/ql/test-kotlin1/library-tests/controlflow/basic/bbStmts.ql diff --git a/java/ql/test/kotlin/library-tests/controlflow/basic/bbStrictDominance.expected b/java/ql/test-kotlin1/library-tests/controlflow/basic/bbStrictDominance.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/controlflow/basic/bbStrictDominance.expected rename to java/ql/test-kotlin1/library-tests/controlflow/basic/bbStrictDominance.expected diff --git a/java/ql/test/kotlin/library-tests/controlflow/basic/bbStrictDominance.ql b/java/ql/test-kotlin1/library-tests/controlflow/basic/bbStrictDominance.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/controlflow/basic/bbStrictDominance.ql rename to java/ql/test-kotlin1/library-tests/controlflow/basic/bbStrictDominance.ql diff --git a/java/ql/test/kotlin/library-tests/controlflow/basic/bbSuccessor.expected b/java/ql/test-kotlin1/library-tests/controlflow/basic/bbSuccessor.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/controlflow/basic/bbSuccessor.expected rename to java/ql/test-kotlin1/library-tests/controlflow/basic/bbSuccessor.expected diff --git a/java/ql/test/kotlin/library-tests/controlflow/basic/bbSuccessor.ql b/java/ql/test-kotlin1/library-tests/controlflow/basic/bbSuccessor.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/controlflow/basic/bbSuccessor.ql rename to java/ql/test-kotlin1/library-tests/controlflow/basic/bbSuccessor.ql diff --git a/java/ql/test/kotlin/library-tests/controlflow/basic/getASuccessor.expected b/java/ql/test-kotlin1/library-tests/controlflow/basic/getASuccessor.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/controlflow/basic/getASuccessor.expected rename to java/ql/test-kotlin1/library-tests/controlflow/basic/getASuccessor.expected diff --git a/java/ql/test/kotlin/library-tests/controlflow/basic/getASuccessor.ql b/java/ql/test-kotlin1/library-tests/controlflow/basic/getASuccessor.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/controlflow/basic/getASuccessor.ql rename to java/ql/test-kotlin1/library-tests/controlflow/basic/getASuccessor.ql diff --git a/java/ql/test/kotlin/library-tests/controlflow/basic/strictDominance.expected b/java/ql/test-kotlin1/library-tests/controlflow/basic/strictDominance.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/controlflow/basic/strictDominance.expected rename to java/ql/test-kotlin1/library-tests/controlflow/basic/strictDominance.expected diff --git a/java/ql/test/kotlin/library-tests/controlflow/basic/strictDominance.ql b/java/ql/test-kotlin1/library-tests/controlflow/basic/strictDominance.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/controlflow/basic/strictDominance.ql rename to java/ql/test-kotlin1/library-tests/controlflow/basic/strictDominance.ql diff --git a/java/ql/test/kotlin/library-tests/controlflow/basic/strictPostDominance.expected b/java/ql/test-kotlin1/library-tests/controlflow/basic/strictPostDominance.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/controlflow/basic/strictPostDominance.expected rename to java/ql/test-kotlin1/library-tests/controlflow/basic/strictPostDominance.expected diff --git a/java/ql/test/kotlin/library-tests/controlflow/basic/strictPostDominance.ql b/java/ql/test-kotlin1/library-tests/controlflow/basic/strictPostDominance.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/controlflow/basic/strictPostDominance.ql rename to java/ql/test-kotlin1/library-tests/controlflow/basic/strictPostDominance.ql diff --git a/java/ql/test/kotlin/library-tests/controlflow/dominance/Test.kt b/java/ql/test-kotlin1/library-tests/controlflow/dominance/Test.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/controlflow/dominance/Test.kt rename to java/ql/test-kotlin1/library-tests/controlflow/dominance/Test.kt diff --git a/java/ql/test/kotlin/library-tests/controlflow/dominance/Test2.kt b/java/ql/test-kotlin1/library-tests/controlflow/dominance/Test2.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/controlflow/dominance/Test2.kt rename to java/ql/test-kotlin1/library-tests/controlflow/dominance/Test2.kt diff --git a/java/ql/test/kotlin/library-tests/controlflow/dominance/dominanceWrong.expected b/java/ql/test-kotlin1/library-tests/controlflow/dominance/dominanceBad.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/controlflow/dominance/dominanceWrong.expected rename to java/ql/test-kotlin1/library-tests/controlflow/dominance/dominanceBad.expected diff --git a/java/ql/test/kotlin/library-tests/controlflow/dominance/dominanceBad.ql b/java/ql/test-kotlin1/library-tests/controlflow/dominance/dominanceBad.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/controlflow/dominance/dominanceBad.ql rename to java/ql/test-kotlin1/library-tests/controlflow/dominance/dominanceBad.ql diff --git a/java/ql/test/kotlin/library-tests/controlflow/dominance/dominatedByStart.expected b/java/ql/test-kotlin1/library-tests/controlflow/dominance/dominanceWrong.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/controlflow/dominance/dominatedByStart.expected rename to java/ql/test-kotlin1/library-tests/controlflow/dominance/dominanceWrong.expected diff --git a/java/ql/test/kotlin/library-tests/controlflow/dominance/dominanceWrong.ql b/java/ql/test-kotlin1/library-tests/controlflow/dominance/dominanceWrong.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/controlflow/dominance/dominanceWrong.ql rename to java/ql/test-kotlin1/library-tests/controlflow/dominance/dominanceWrong.ql diff --git a/java/ql/test/kotlin/library-tests/controlflow/dominance/dominatorExists.expected b/java/ql/test-kotlin1/library-tests/controlflow/dominance/dominatedByStart.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/controlflow/dominance/dominatorExists.expected rename to java/ql/test-kotlin1/library-tests/controlflow/dominance/dominatedByStart.expected diff --git a/java/ql/test/kotlin/library-tests/controlflow/dominance/dominatedByStart.ql b/java/ql/test-kotlin1/library-tests/controlflow/dominance/dominatedByStart.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/controlflow/dominance/dominatedByStart.ql rename to java/ql/test-kotlin1/library-tests/controlflow/dominance/dominatedByStart.ql diff --git a/java/ql/test/kotlin/library-tests/controlflow/dominance/dominator.expected b/java/ql/test-kotlin1/library-tests/controlflow/dominance/dominator.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/controlflow/dominance/dominator.expected rename to java/ql/test-kotlin1/library-tests/controlflow/dominance/dominator.expected diff --git a/java/ql/test/kotlin/library-tests/controlflow/dominance/dominator.ql b/java/ql/test-kotlin1/library-tests/controlflow/dominance/dominator.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/controlflow/dominance/dominator.ql rename to java/ql/test-kotlin1/library-tests/controlflow/dominance/dominator.ql diff --git a/java/ql/test/kotlin/library-tests/controlflow/dominance/dominatorUnique.expected b/java/ql/test-kotlin1/library-tests/controlflow/dominance/dominatorExists.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/controlflow/dominance/dominatorUnique.expected rename to java/ql/test-kotlin1/library-tests/controlflow/dominance/dominatorExists.expected diff --git a/java/ql/test/kotlin/library-tests/controlflow/dominance/dominatorExists.ql b/java/ql/test-kotlin1/library-tests/controlflow/dominance/dominatorExists.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/controlflow/dominance/dominatorExists.ql rename to java/ql/test-kotlin1/library-tests/controlflow/dominance/dominatorExists.ql diff --git a/java/ql/test/kotlin/library-tests/controlflow/plot/nodeGraph.expected b/java/ql/test-kotlin1/library-tests/controlflow/dominance/dominatorUnique.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/controlflow/plot/nodeGraph.expected rename to java/ql/test-kotlin1/library-tests/controlflow/dominance/dominatorUnique.expected diff --git a/java/ql/test/kotlin/library-tests/controlflow/dominance/dominatorUnique.ql b/java/ql/test-kotlin1/library-tests/controlflow/dominance/dominatorUnique.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/controlflow/dominance/dominatorUnique.ql rename to java/ql/test-kotlin1/library-tests/controlflow/dominance/dominatorUnique.ql diff --git a/java/ql/test/kotlin/library-tests/controlflow/paths/A.kt b/java/ql/test-kotlin1/library-tests/controlflow/paths/A.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/controlflow/paths/A.kt rename to java/ql/test-kotlin1/library-tests/controlflow/paths/A.kt diff --git a/java/ql/test/kotlin/library-tests/controlflow/paths/paths.expected b/java/ql/test-kotlin1/library-tests/controlflow/paths/paths.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/controlflow/paths/paths.expected rename to java/ql/test-kotlin1/library-tests/controlflow/paths/paths.expected diff --git a/java/ql/test/kotlin/library-tests/controlflow/paths/paths.ql b/java/ql/test-kotlin1/library-tests/controlflow/paths/paths.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/controlflow/paths/paths.ql rename to java/ql/test-kotlin1/library-tests/controlflow/paths/paths.ql diff --git a/java/ql/test/kotlin/library-tests/controlflow/plot/.gitignore b/java/ql/test-kotlin1/library-tests/controlflow/plot/.gitignore similarity index 100% rename from java/ql/test/kotlin/library-tests/controlflow/plot/.gitignore rename to java/ql/test-kotlin1/library-tests/controlflow/plot/.gitignore diff --git a/java/ql/test/kotlin/library-tests/declaration-stack/test.expected b/java/ql/test-kotlin1/library-tests/controlflow/plot/nodeGraph.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/declaration-stack/test.expected rename to java/ql/test-kotlin1/library-tests/controlflow/plot/nodeGraph.expected diff --git a/java/ql/test/kotlin/library-tests/controlflow/plot/nodeGraph.ql b/java/ql/test-kotlin1/library-tests/controlflow/plot/nodeGraph.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/controlflow/plot/nodeGraph.ql rename to java/ql/test-kotlin1/library-tests/controlflow/plot/nodeGraph.ql diff --git a/java/ql/test/kotlin/library-tests/controlflow/plot/plot.sh b/java/ql/test-kotlin1/library-tests/controlflow/plot/plot.sh similarity index 100% rename from java/ql/test/kotlin/library-tests/controlflow/plot/plot.sh rename to java/ql/test-kotlin1/library-tests/controlflow/plot/plot.sh diff --git a/java/ql/test/kotlin/library-tests/coroutines/coroutine_user.kt b/java/ql/test-kotlin1/library-tests/coroutines/coroutine_user.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/coroutines/coroutine_user.kt rename to java/ql/test-kotlin1/library-tests/coroutines/coroutine_user.kt diff --git a/java/ql/test/kotlin/library-tests/coroutines/test.expected b/java/ql/test-kotlin1/library-tests/coroutines/test.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/coroutines/test.expected rename to java/ql/test-kotlin1/library-tests/coroutines/test.expected diff --git a/java/ql/test/kotlin/library-tests/coroutines/test.ql b/java/ql/test-kotlin1/library-tests/coroutines/test.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/coroutines/test.ql rename to java/ql/test-kotlin1/library-tests/coroutines/test.ql diff --git a/java/ql/test/kotlin/library-tests/data-classes/PrintAst.expected b/java/ql/test-kotlin1/library-tests/data-classes/PrintAst.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/data-classes/PrintAst.expected rename to java/ql/test-kotlin1/library-tests/data-classes/PrintAst.expected diff --git a/java/ql/test/kotlin/library-tests/data-classes/PrintAst.qlref b/java/ql/test-kotlin1/library-tests/data-classes/PrintAst.qlref similarity index 100% rename from java/ql/test/kotlin/library-tests/data-classes/PrintAst.qlref rename to java/ql/test-kotlin1/library-tests/data-classes/PrintAst.qlref diff --git a/java/ql/test/kotlin/library-tests/data-classes/callees.expected b/java/ql/test-kotlin1/library-tests/data-classes/callees.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/data-classes/callees.expected rename to java/ql/test-kotlin1/library-tests/data-classes/callees.expected diff --git a/java/ql/test/kotlin/library-tests/data-classes/callees.ql b/java/ql/test-kotlin1/library-tests/data-classes/callees.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/data-classes/callees.ql rename to java/ql/test-kotlin1/library-tests/data-classes/callees.ql diff --git a/java/ql/test/kotlin/library-tests/data-classes/data_classes.expected b/java/ql/test-kotlin1/library-tests/data-classes/data_classes.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/data-classes/data_classes.expected rename to java/ql/test-kotlin1/library-tests/data-classes/data_classes.expected diff --git a/java/ql/test/kotlin/library-tests/data-classes/data_classes.ql b/java/ql/test-kotlin1/library-tests/data-classes/data_classes.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/data-classes/data_classes.ql rename to java/ql/test-kotlin1/library-tests/data-classes/data_classes.ql diff --git a/java/ql/test/kotlin/library-tests/data-classes/dc.kt b/java/ql/test-kotlin1/library-tests/data-classes/dc.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/data-classes/dc.kt rename to java/ql/test-kotlin1/library-tests/data-classes/dc.kt diff --git a/java/ql/test/kotlin/library-tests/dataflow/extensionMethod/test.expected b/java/ql/test-kotlin1/library-tests/dataflow/extensionMethod/test.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/dataflow/extensionMethod/test.expected rename to java/ql/test-kotlin1/library-tests/dataflow/extensionMethod/test.expected diff --git a/java/ql/test/kotlin/library-tests/dataflow/extensionMethod/test.kt b/java/ql/test-kotlin1/library-tests/dataflow/extensionMethod/test.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/dataflow/extensionMethod/test.kt rename to java/ql/test-kotlin1/library-tests/dataflow/extensionMethod/test.kt diff --git a/java/ql/test/kotlin/library-tests/dataflow/extensionMethod/test.ql b/java/ql/test-kotlin1/library-tests/dataflow/extensionMethod/test.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/dataflow/extensionMethod/test.ql rename to java/ql/test-kotlin1/library-tests/dataflow/extensionMethod/test.ql diff --git a/java/ql/test/kotlin/library-tests/dataflow/foreach/C1.java b/java/ql/test-kotlin1/library-tests/dataflow/foreach/C1.java similarity index 100% rename from java/ql/test/kotlin/library-tests/dataflow/foreach/C1.java rename to java/ql/test-kotlin1/library-tests/dataflow/foreach/C1.java diff --git a/java/ql/test/kotlin/library-tests/dataflow/foreach/C2.kt b/java/ql/test-kotlin1/library-tests/dataflow/foreach/C2.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/dataflow/foreach/C2.kt rename to java/ql/test-kotlin1/library-tests/dataflow/foreach/C2.kt diff --git a/java/ql/test/kotlin/library-tests/dataflow/foreach/test.expected b/java/ql/test-kotlin1/library-tests/dataflow/foreach/test.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/dataflow/foreach/test.expected rename to java/ql/test-kotlin1/library-tests/dataflow/foreach/test.expected diff --git a/java/ql/test/kotlin/library-tests/dataflow/foreach/test.ql b/java/ql/test-kotlin1/library-tests/dataflow/foreach/test.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/dataflow/foreach/test.ql rename to java/ql/test-kotlin1/library-tests/dataflow/foreach/test.ql diff --git a/java/ql/test/kotlin/library-tests/dataflow/func/coroutine_async_await.kt b/java/ql/test-kotlin1/library-tests/dataflow/func/coroutine_async_await.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/dataflow/func/coroutine_async_await.kt rename to java/ql/test-kotlin1/library-tests/dataflow/func/coroutine_async_await.kt diff --git a/java/ql/test/kotlin/library-tests/dataflow/func/functionReference.kt b/java/ql/test-kotlin1/library-tests/dataflow/func/functionReference.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/dataflow/func/functionReference.kt rename to java/ql/test-kotlin1/library-tests/dataflow/func/functionReference.kt diff --git a/java/ql/test/kotlin/library-tests/dataflow/func/kotlinx_coroutines_stubs.kt b/java/ql/test-kotlin1/library-tests/dataflow/func/kotlinx_coroutines_stubs.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/dataflow/func/kotlinx_coroutines_stubs.kt rename to java/ql/test-kotlin1/library-tests/dataflow/func/kotlinx_coroutines_stubs.kt diff --git a/java/ql/test/kotlin/library-tests/dataflow/func/lambda.kt b/java/ql/test-kotlin1/library-tests/dataflow/func/lambda.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/dataflow/func/lambda.kt rename to java/ql/test-kotlin1/library-tests/dataflow/func/lambda.kt diff --git a/java/ql/test/kotlin/library-tests/dataflow/func/localFunction.kt b/java/ql/test-kotlin1/library-tests/dataflow/func/localFunction.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/dataflow/func/localFunction.kt rename to java/ql/test-kotlin1/library-tests/dataflow/func/localFunction.kt diff --git a/java/ql/test/kotlin/library-tests/dataflow/func/samConversion.kt b/java/ql/test-kotlin1/library-tests/dataflow/func/samConversion.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/dataflow/func/samConversion.kt rename to java/ql/test-kotlin1/library-tests/dataflow/func/samConversion.kt diff --git a/java/ql/test/kotlin/library-tests/dataflow/func/test.expected b/java/ql/test-kotlin1/library-tests/dataflow/func/test.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/dataflow/func/test.expected rename to java/ql/test-kotlin1/library-tests/dataflow/func/test.expected diff --git a/java/ql/test/kotlin/library-tests/dataflow/func/test.ql b/java/ql/test-kotlin1/library-tests/dataflow/func/test.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/dataflow/func/test.ql rename to java/ql/test-kotlin1/library-tests/dataflow/func/test.ql diff --git a/java/ql/test/kotlin/library-tests/dataflow/func/util.kt b/java/ql/test-kotlin1/library-tests/dataflow/func/util.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/dataflow/func/util.kt rename to java/ql/test-kotlin1/library-tests/dataflow/func/util.kt diff --git a/java/ql/test/kotlin/library-tests/dataflow/notnullexpr/NotNullExpr.kt b/java/ql/test-kotlin1/library-tests/dataflow/notnullexpr/NotNullExpr.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/dataflow/notnullexpr/NotNullExpr.kt rename to java/ql/test-kotlin1/library-tests/dataflow/notnullexpr/NotNullExpr.kt diff --git a/java/ql/test/kotlin/library-tests/dataflow/notnullexpr/test.expected b/java/ql/test-kotlin1/library-tests/dataflow/notnullexpr/test.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/dataflow/notnullexpr/test.expected rename to java/ql/test-kotlin1/library-tests/dataflow/notnullexpr/test.expected diff --git a/java/ql/test/kotlin/library-tests/dataflow/notnullexpr/test.ext.yml b/java/ql/test-kotlin1/library-tests/dataflow/notnullexpr/test.ext.yml similarity index 100% rename from java/ql/test/kotlin/library-tests/dataflow/notnullexpr/test.ext.yml rename to java/ql/test-kotlin1/library-tests/dataflow/notnullexpr/test.ext.yml diff --git a/java/ql/test/kotlin/library-tests/dataflow/notnullexpr/test.ql b/java/ql/test-kotlin1/library-tests/dataflow/notnullexpr/test.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/dataflow/notnullexpr/test.ql rename to java/ql/test-kotlin1/library-tests/dataflow/notnullexpr/test.ql diff --git a/java/ql/test/kotlin/library-tests/dataflow/stmtexpr/StmtExpr.kt b/java/ql/test-kotlin1/library-tests/dataflow/stmtexpr/StmtExpr.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/dataflow/stmtexpr/StmtExpr.kt rename to java/ql/test-kotlin1/library-tests/dataflow/stmtexpr/StmtExpr.kt diff --git a/java/ql/test/kotlin/library-tests/dataflow/stmtexpr/test.expected b/java/ql/test-kotlin1/library-tests/dataflow/stmtexpr/test.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/dataflow/stmtexpr/test.expected rename to java/ql/test-kotlin1/library-tests/dataflow/stmtexpr/test.expected diff --git a/java/ql/test/kotlin/library-tests/dataflow/stmtexpr/test.ql b/java/ql/test-kotlin1/library-tests/dataflow/stmtexpr/test.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/dataflow/stmtexpr/test.ql rename to java/ql/test-kotlin1/library-tests/dataflow/stmtexpr/test.ql diff --git a/java/ql/test/kotlin/library-tests/dataflow/summaries/apply.expected b/java/ql/test-kotlin1/library-tests/dataflow/summaries/apply.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/dataflow/summaries/apply.expected rename to java/ql/test-kotlin1/library-tests/dataflow/summaries/apply.expected diff --git a/java/ql/test/kotlin/library-tests/dataflow/summaries/apply.kt b/java/ql/test-kotlin1/library-tests/dataflow/summaries/apply.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/dataflow/summaries/apply.kt rename to java/ql/test-kotlin1/library-tests/dataflow/summaries/apply.kt diff --git a/java/ql/test/kotlin/library-tests/dataflow/summaries/apply.ql b/java/ql/test-kotlin1/library-tests/dataflow/summaries/apply.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/dataflow/summaries/apply.ql rename to java/ql/test-kotlin1/library-tests/dataflow/summaries/apply.ql diff --git a/java/ql/test/kotlin/library-tests/dataflow/summaries/list.kt b/java/ql/test-kotlin1/library-tests/dataflow/summaries/list.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/dataflow/summaries/list.kt rename to java/ql/test-kotlin1/library-tests/dataflow/summaries/list.kt diff --git a/java/ql/test/kotlin/library-tests/dataflow/summaries/test.expected b/java/ql/test-kotlin1/library-tests/dataflow/summaries/test.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/dataflow/summaries/test.expected rename to java/ql/test-kotlin1/library-tests/dataflow/summaries/test.expected diff --git a/java/ql/test/kotlin/library-tests/dataflow/summaries/test.kt b/java/ql/test-kotlin1/library-tests/dataflow/summaries/test.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/dataflow/summaries/test.kt rename to java/ql/test-kotlin1/library-tests/dataflow/summaries/test.kt diff --git a/java/ql/test/kotlin/library-tests/dataflow/summaries/test.ql b/java/ql/test-kotlin1/library-tests/dataflow/summaries/test.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/dataflow/summaries/test.ql rename to java/ql/test-kotlin1/library-tests/dataflow/summaries/test.ql diff --git a/java/ql/test/kotlin/library-tests/dataflow/summaries/use.kt b/java/ql/test-kotlin1/library-tests/dataflow/summaries/use.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/dataflow/summaries/use.kt rename to java/ql/test-kotlin1/library-tests/dataflow/summaries/use.kt diff --git a/java/ql/test/kotlin/library-tests/dataflow/summaries/with.kt b/java/ql/test-kotlin1/library-tests/dataflow/summaries/with.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/dataflow/summaries/with.kt rename to java/ql/test-kotlin1/library-tests/dataflow/summaries/with.kt diff --git a/java/ql/test/kotlin/library-tests/dataflow/taint/StringTemplate.kt b/java/ql/test-kotlin1/library-tests/dataflow/taint/StringTemplate.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/dataflow/taint/StringTemplate.kt rename to java/ql/test-kotlin1/library-tests/dataflow/taint/StringTemplate.kt diff --git a/java/ql/test/kotlin/library-tests/dataflow/taint/test.expected b/java/ql/test-kotlin1/library-tests/dataflow/taint/test.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/dataflow/taint/test.expected rename to java/ql/test-kotlin1/library-tests/dataflow/taint/test.expected diff --git a/java/ql/test/kotlin/library-tests/dataflow/taint/test.ql b/java/ql/test-kotlin1/library-tests/dataflow/taint/test.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/dataflow/taint/test.ql rename to java/ql/test-kotlin1/library-tests/dataflow/taint/test.ql diff --git a/java/ql/test/kotlin/library-tests/dataflow/whenexpr/WhenExpr.kt b/java/ql/test-kotlin1/library-tests/dataflow/whenexpr/WhenExpr.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/dataflow/whenexpr/WhenExpr.kt rename to java/ql/test-kotlin1/library-tests/dataflow/whenexpr/WhenExpr.kt diff --git a/java/ql/test/kotlin/library-tests/dataflow/whenexpr/test.expected b/java/ql/test-kotlin1/library-tests/dataflow/whenexpr/test.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/dataflow/whenexpr/test.expected rename to java/ql/test-kotlin1/library-tests/dataflow/whenexpr/test.expected diff --git a/java/ql/test/kotlin/library-tests/dataflow/whenexpr/test.ext.yml b/java/ql/test-kotlin1/library-tests/dataflow/whenexpr/test.ext.yml similarity index 100% rename from java/ql/test/kotlin/library-tests/dataflow/whenexpr/test.ext.yml rename to java/ql/test-kotlin1/library-tests/dataflow/whenexpr/test.ext.yml diff --git a/java/ql/test/kotlin/library-tests/dataflow/whenexpr/test.ql b/java/ql/test-kotlin1/library-tests/dataflow/whenexpr/test.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/dataflow/whenexpr/test.ql rename to java/ql/test-kotlin1/library-tests/dataflow/whenexpr/test.ql diff --git a/java/ql/test/kotlin/library-tests/declaration-stack/Test.kt b/java/ql/test-kotlin1/library-tests/declaration-stack/Test.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/declaration-stack/Test.kt rename to java/ql/test-kotlin1/library-tests/declaration-stack/Test.kt diff --git a/java/ql/test/kotlin/library-tests/for-array-iterators/test.expected b/java/ql/test-kotlin1/library-tests/declaration-stack/test.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/for-array-iterators/test.expected rename to java/ql/test-kotlin1/library-tests/declaration-stack/test.expected diff --git a/java/ql/test/kotlin/library-tests/declaration-stack/test.ql b/java/ql/test-kotlin1/library-tests/declaration-stack/test.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/declaration-stack/test.ql rename to java/ql/test-kotlin1/library-tests/declaration-stack/test.ql diff --git a/java/ql/test/kotlin/library-tests/empty/Empty.kt b/java/ql/test-kotlin1/library-tests/empty/Empty.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/empty/Empty.kt rename to java/ql/test-kotlin1/library-tests/empty/Empty.kt diff --git a/java/ql/test/kotlin/library-tests/empty/elements.expected b/java/ql/test-kotlin1/library-tests/empty/elements.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/empty/elements.expected rename to java/ql/test-kotlin1/library-tests/empty/elements.expected diff --git a/java/ql/test/kotlin/library-tests/empty/elements.ql b/java/ql/test-kotlin1/library-tests/empty/elements.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/empty/elements.ql rename to java/ql/test-kotlin1/library-tests/empty/elements.ql diff --git a/java/ql/test/kotlin/library-tests/enum/enumUser.kt b/java/ql/test-kotlin1/library-tests/enum/enumUser.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/enum/enumUser.kt rename to java/ql/test-kotlin1/library-tests/enum/enumUser.kt diff --git a/java/ql/test/kotlin/library-tests/enum/test.expected b/java/ql/test-kotlin1/library-tests/enum/test.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/enum/test.expected rename to java/ql/test-kotlin1/library-tests/enum/test.expected diff --git a/java/ql/test/kotlin/library-tests/enum/test.ql b/java/ql/test-kotlin1/library-tests/enum/test.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/enum/test.ql rename to java/ql/test-kotlin1/library-tests/enum/test.ql diff --git a/java/ql/test/kotlin/library-tests/exprs/PrintAst.expected b/java/ql/test-kotlin1/library-tests/exprs/PrintAst.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/exprs/PrintAst.expected rename to java/ql/test-kotlin1/library-tests/exprs/PrintAst.expected diff --git a/java/ql/test/kotlin/library-tests/exprs/PrintAst.qlref b/java/ql/test-kotlin1/library-tests/exprs/PrintAst.qlref similarity index 100% rename from java/ql/test/kotlin/library-tests/exprs/PrintAst.qlref rename to java/ql/test-kotlin1/library-tests/exprs/PrintAst.qlref diff --git a/java/ql/test/kotlin/library-tests/exprs/binop.expected b/java/ql/test-kotlin1/library-tests/exprs/binop.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/exprs/binop.expected rename to java/ql/test-kotlin1/library-tests/exprs/binop.expected diff --git a/java/ql/test/kotlin/library-tests/exprs/binop.ql b/java/ql/test-kotlin1/library-tests/exprs/binop.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/exprs/binop.ql rename to java/ql/test-kotlin1/library-tests/exprs/binop.ql diff --git a/java/ql/test/kotlin/library-tests/exprs/delegatedProperties.expected b/java/ql/test-kotlin1/library-tests/exprs/delegatedProperties.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/exprs/delegatedProperties.expected rename to java/ql/test-kotlin1/library-tests/exprs/delegatedProperties.expected diff --git a/java/ql/test/kotlin/library-tests/exprs/delegatedProperties.kt b/java/ql/test-kotlin1/library-tests/exprs/delegatedProperties.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/exprs/delegatedProperties.kt rename to java/ql/test-kotlin1/library-tests/exprs/delegatedProperties.kt diff --git a/java/ql/test/kotlin/library-tests/exprs/delegatedProperties.ql b/java/ql/test-kotlin1/library-tests/exprs/delegatedProperties.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/exprs/delegatedProperties.ql rename to java/ql/test-kotlin1/library-tests/exprs/delegatedProperties.ql diff --git a/java/ql/test/kotlin/library-tests/exprs/exprs.expected b/java/ql/test-kotlin1/library-tests/exprs/exprs.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/exprs/exprs.expected rename to java/ql/test-kotlin1/library-tests/exprs/exprs.expected diff --git a/java/ql/test/kotlin/library-tests/exprs/exprs.kt b/java/ql/test-kotlin1/library-tests/exprs/exprs.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/exprs/exprs.kt rename to java/ql/test-kotlin1/library-tests/exprs/exprs.kt diff --git a/java/ql/test/kotlin/library-tests/exprs/exprs.ql b/java/ql/test-kotlin1/library-tests/exprs/exprs.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/exprs/exprs.ql rename to java/ql/test-kotlin1/library-tests/exprs/exprs.ql diff --git a/java/ql/test/kotlin/library-tests/exprs/funcExprs.expected b/java/ql/test-kotlin1/library-tests/exprs/funcExprs.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/exprs/funcExprs.expected rename to java/ql/test-kotlin1/library-tests/exprs/funcExprs.expected diff --git a/java/ql/test/kotlin/library-tests/exprs/funcExprs.kt b/java/ql/test-kotlin1/library-tests/exprs/funcExprs.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/exprs/funcExprs.kt rename to java/ql/test-kotlin1/library-tests/exprs/funcExprs.kt diff --git a/java/ql/test/kotlin/library-tests/exprs/funcExprs.ql b/java/ql/test-kotlin1/library-tests/exprs/funcExprs.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/exprs/funcExprs.ql rename to java/ql/test-kotlin1/library-tests/exprs/funcExprs.ql diff --git a/java/ql/test/kotlin/library-tests/exprs/kFunctionInvoke.kt b/java/ql/test-kotlin1/library-tests/exprs/kFunctionInvoke.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/exprs/kFunctionInvoke.kt rename to java/ql/test-kotlin1/library-tests/exprs/kFunctionInvoke.kt diff --git a/java/ql/test/kotlin/library-tests/exprs/localFunctionCalls.kt b/java/ql/test-kotlin1/library-tests/exprs/localFunctionCalls.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/exprs/localFunctionCalls.kt rename to java/ql/test-kotlin1/library-tests/exprs/localFunctionCalls.kt diff --git a/java/ql/test/kotlin/library-tests/exprs/samConversion.kt b/java/ql/test-kotlin1/library-tests/exprs/samConversion.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/exprs/samConversion.kt rename to java/ql/test-kotlin1/library-tests/exprs/samConversion.kt diff --git a/java/ql/test/kotlin/library-tests/exprs/unaryOp.expected b/java/ql/test-kotlin1/library-tests/exprs/unaryOp.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/exprs/unaryOp.expected rename to java/ql/test-kotlin1/library-tests/exprs/unaryOp.expected diff --git a/java/ql/test/kotlin/library-tests/exprs/unaryOp.ql b/java/ql/test-kotlin1/library-tests/exprs/unaryOp.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/exprs/unaryOp.ql rename to java/ql/test-kotlin1/library-tests/exprs/unaryOp.ql diff --git a/java/ql/test/kotlin/library-tests/exprs/whenExpr.kt b/java/ql/test-kotlin1/library-tests/exprs/whenExpr.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/exprs/whenExpr.kt rename to java/ql/test-kotlin1/library-tests/exprs/whenExpr.kt diff --git a/java/ql/test/kotlin/library-tests/exprs_typeaccess/A.kt b/java/ql/test-kotlin1/library-tests/exprs_typeaccess/A.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/exprs_typeaccess/A.kt rename to java/ql/test-kotlin1/library-tests/exprs_typeaccess/A.kt diff --git a/java/ql/test/kotlin/library-tests/exprs_typeaccess/B.java b/java/ql/test-kotlin1/library-tests/exprs_typeaccess/B.java similarity index 100% rename from java/ql/test/kotlin/library-tests/exprs_typeaccess/B.java rename to java/ql/test-kotlin1/library-tests/exprs_typeaccess/B.java diff --git a/java/ql/test/kotlin/library-tests/exprs_typeaccess/PrintAst.expected b/java/ql/test-kotlin1/library-tests/exprs_typeaccess/PrintAst.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/exprs_typeaccess/PrintAst.expected rename to java/ql/test-kotlin1/library-tests/exprs_typeaccess/PrintAst.expected diff --git a/java/ql/test/kotlin/library-tests/exprs_typeaccess/PrintAst.qlref b/java/ql/test-kotlin1/library-tests/exprs_typeaccess/PrintAst.qlref similarity index 100% rename from java/ql/test/kotlin/library-tests/exprs_typeaccess/PrintAst.qlref rename to java/ql/test-kotlin1/library-tests/exprs_typeaccess/PrintAst.qlref diff --git a/java/ql/test/kotlin/library-tests/extensions/A.java b/java/ql/test-kotlin1/library-tests/extensions/A.java similarity index 100% rename from java/ql/test/kotlin/library-tests/extensions/A.java rename to java/ql/test-kotlin1/library-tests/extensions/A.java diff --git a/java/ql/test/kotlin/library-tests/extensions/extensions.kt b/java/ql/test-kotlin1/library-tests/extensions/extensions.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/extensions/extensions.kt rename to java/ql/test-kotlin1/library-tests/extensions/extensions.kt diff --git a/java/ql/test/kotlin/library-tests/extensions/methodaccesses.expected b/java/ql/test-kotlin1/library-tests/extensions/methodaccesses.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/extensions/methodaccesses.expected rename to java/ql/test-kotlin1/library-tests/extensions/methodaccesses.expected diff --git a/java/ql/test/kotlin/library-tests/extensions/methodaccesses.ql b/java/ql/test-kotlin1/library-tests/extensions/methodaccesses.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/extensions/methodaccesses.ql rename to java/ql/test-kotlin1/library-tests/extensions/methodaccesses.ql diff --git a/java/ql/test/kotlin/library-tests/extensions/methods.expected b/java/ql/test-kotlin1/library-tests/extensions/methods.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/extensions/methods.expected rename to java/ql/test-kotlin1/library-tests/extensions/methods.expected diff --git a/java/ql/test/kotlin/library-tests/extensions/methods.ql b/java/ql/test-kotlin1/library-tests/extensions/methods.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/extensions/methods.ql rename to java/ql/test-kotlin1/library-tests/extensions/methods.ql diff --git a/java/ql/test/kotlin/library-tests/extensions/parameters.expected b/java/ql/test-kotlin1/library-tests/extensions/parameters.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/extensions/parameters.expected rename to java/ql/test-kotlin1/library-tests/extensions/parameters.expected diff --git a/java/ql/test/kotlin/library-tests/extensions/parameters.ql b/java/ql/test-kotlin1/library-tests/extensions/parameters.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/extensions/parameters.ql rename to java/ql/test-kotlin1/library-tests/extensions/parameters.ql diff --git a/java/ql/test/kotlin/library-tests/extensions_recursion/element.expected b/java/ql/test-kotlin1/library-tests/extensions_recursion/element.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/extensions_recursion/element.expected rename to java/ql/test-kotlin1/library-tests/extensions_recursion/element.expected diff --git a/java/ql/test/kotlin/library-tests/extensions_recursion/element.ql b/java/ql/test-kotlin1/library-tests/extensions_recursion/element.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/extensions_recursion/element.ql rename to java/ql/test-kotlin1/library-tests/extensions_recursion/element.ql diff --git a/java/ql/test/kotlin/library-tests/extensions_recursion/test.kt b/java/ql/test-kotlin1/library-tests/extensions_recursion/test.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/extensions_recursion/test.kt rename to java/ql/test-kotlin1/library-tests/extensions_recursion/test.kt diff --git a/java/ql/test/kotlin/library-tests/fake_overrides/all_java/A.java b/java/ql/test-kotlin1/library-tests/fake_overrides/all_java/A.java similarity index 100% rename from java/ql/test/kotlin/library-tests/fake_overrides/all_java/A.java rename to java/ql/test-kotlin1/library-tests/fake_overrides/all_java/A.java diff --git a/java/ql/test/kotlin/library-tests/fake_overrides/all_java/call.expected b/java/ql/test-kotlin1/library-tests/fake_overrides/all_java/call.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/fake_overrides/all_java/call.expected rename to java/ql/test-kotlin1/library-tests/fake_overrides/all_java/call.expected diff --git a/java/ql/test/kotlin/library-tests/fake_overrides/all_java/call.ql b/java/ql/test-kotlin1/library-tests/fake_overrides/all_java/call.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/fake_overrides/all_java/call.ql rename to java/ql/test-kotlin1/library-tests/fake_overrides/all_java/call.ql diff --git a/java/ql/test/kotlin/library-tests/fake_overrides/all_kotlin/A.kt b/java/ql/test-kotlin1/library-tests/fake_overrides/all_kotlin/A.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/fake_overrides/all_kotlin/A.kt rename to java/ql/test-kotlin1/library-tests/fake_overrides/all_kotlin/A.kt diff --git a/java/ql/test/kotlin/library-tests/fake_overrides/all_kotlin/call.expected b/java/ql/test-kotlin1/library-tests/fake_overrides/all_kotlin/call.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/fake_overrides/all_kotlin/call.expected rename to java/ql/test-kotlin1/library-tests/fake_overrides/all_kotlin/call.expected diff --git a/java/ql/test/kotlin/library-tests/fake_overrides/all_kotlin/call.ql b/java/ql/test-kotlin1/library-tests/fake_overrides/all_kotlin/call.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/fake_overrides/all_kotlin/call.ql rename to java/ql/test-kotlin1/library-tests/fake_overrides/all_kotlin/call.ql diff --git a/java/ql/test/kotlin/library-tests/fake_overrides/kotlin_calling_java/A.kt b/java/ql/test-kotlin1/library-tests/fake_overrides/kotlin_calling_java/A.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/fake_overrides/kotlin_calling_java/A.kt rename to java/ql/test-kotlin1/library-tests/fake_overrides/kotlin_calling_java/A.kt diff --git a/java/ql/test/kotlin/library-tests/fake_overrides/kotlin_calling_java/OB.java b/java/ql/test-kotlin1/library-tests/fake_overrides/kotlin_calling_java/OB.java similarity index 100% rename from java/ql/test/kotlin/library-tests/fake_overrides/kotlin_calling_java/OB.java rename to java/ql/test-kotlin1/library-tests/fake_overrides/kotlin_calling_java/OB.java diff --git a/java/ql/test/kotlin/library-tests/fake_overrides/kotlin_calling_java/call.expected b/java/ql/test-kotlin1/library-tests/fake_overrides/kotlin_calling_java/call.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/fake_overrides/kotlin_calling_java/call.expected rename to java/ql/test-kotlin1/library-tests/fake_overrides/kotlin_calling_java/call.expected diff --git a/java/ql/test/kotlin/library-tests/fake_overrides/kotlin_calling_java/call.ql b/java/ql/test-kotlin1/library-tests/fake_overrides/kotlin_calling_java/call.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/fake_overrides/kotlin_calling_java/call.ql rename to java/ql/test-kotlin1/library-tests/fake_overrides/kotlin_calling_java/call.ql diff --git a/java/ql/test/kotlin/library-tests/field-initializer-flow/test.expected b/java/ql/test-kotlin1/library-tests/field-initializer-flow/test.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/field-initializer-flow/test.expected rename to java/ql/test-kotlin1/library-tests/field-initializer-flow/test.expected diff --git a/java/ql/test/kotlin/library-tests/field-initializer-flow/test.kt b/java/ql/test-kotlin1/library-tests/field-initializer-flow/test.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/field-initializer-flow/test.kt rename to java/ql/test-kotlin1/library-tests/field-initializer-flow/test.kt diff --git a/java/ql/test/kotlin/library-tests/field-initializer-flow/test.ql b/java/ql/test-kotlin1/library-tests/field-initializer-flow/test.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/field-initializer-flow/test.ql rename to java/ql/test-kotlin1/library-tests/field-initializer-flow/test.ql diff --git a/java/ql/test/kotlin/library-tests/files/otherfile.kt b/java/ql/test-kotlin1/library-tests/files/otherfile.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/files/otherfile.kt rename to java/ql/test-kotlin1/library-tests/files/otherfile.kt diff --git a/java/ql/test/kotlin/library-tests/files/test.expected b/java/ql/test-kotlin1/library-tests/files/test.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/files/test.expected rename to java/ql/test-kotlin1/library-tests/files/test.expected diff --git a/java/ql/test/kotlin/library-tests/files/test.kt b/java/ql/test-kotlin1/library-tests/files/test.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/files/test.kt rename to java/ql/test-kotlin1/library-tests/files/test.kt diff --git a/java/ql/test/kotlin/library-tests/files/test.ql b/java/ql/test-kotlin1/library-tests/files/test.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/files/test.ql rename to java/ql/test-kotlin1/library-tests/files/test.ql diff --git a/java/ql/test/kotlin/library-tests/operator-overloads/test.expected b/java/ql/test-kotlin1/library-tests/for-array-iterators/test.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/operator-overloads/test.expected rename to java/ql/test-kotlin1/library-tests/for-array-iterators/test.expected diff --git a/java/ql/test/kotlin/library-tests/for-array-iterators/test.kt b/java/ql/test-kotlin1/library-tests/for-array-iterators/test.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/for-array-iterators/test.kt rename to java/ql/test-kotlin1/library-tests/for-array-iterators/test.kt diff --git a/java/ql/test/kotlin/library-tests/for-array-iterators/test.ql b/java/ql/test-kotlin1/library-tests/for-array-iterators/test.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/for-array-iterators/test.ql rename to java/ql/test-kotlin1/library-tests/for-array-iterators/test.ql diff --git a/java/ql/test/kotlin/library-tests/function-n/test.expected b/java/ql/test-kotlin1/library-tests/function-n/test.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/function-n/test.expected rename to java/ql/test-kotlin1/library-tests/function-n/test.expected diff --git a/java/ql/test/kotlin/library-tests/function-n/test.kt b/java/ql/test-kotlin1/library-tests/function-n/test.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/function-n/test.kt rename to java/ql/test-kotlin1/library-tests/function-n/test.kt diff --git a/java/ql/test/kotlin/library-tests/function-n/test.ql b/java/ql/test-kotlin1/library-tests/function-n/test.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/function-n/test.ql rename to java/ql/test-kotlin1/library-tests/function-n/test.ql diff --git a/java/ql/test/kotlin/library-tests/generic-inner-classes/KotlinUser.kt b/java/ql/test-kotlin1/library-tests/generic-inner-classes/KotlinUser.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/generic-inner-classes/KotlinUser.kt rename to java/ql/test-kotlin1/library-tests/generic-inner-classes/KotlinUser.kt diff --git a/java/ql/test/kotlin/library-tests/generic-inner-classes/OuterGeneric.kt b/java/ql/test-kotlin1/library-tests/generic-inner-classes/OuterGeneric.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/generic-inner-classes/OuterGeneric.kt rename to java/ql/test-kotlin1/library-tests/generic-inner-classes/OuterGeneric.kt diff --git a/java/ql/test/kotlin/library-tests/generic-inner-classes/OuterNotGeneric.kt b/java/ql/test-kotlin1/library-tests/generic-inner-classes/OuterNotGeneric.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/generic-inner-classes/OuterNotGeneric.kt rename to java/ql/test-kotlin1/library-tests/generic-inner-classes/OuterNotGeneric.kt diff --git a/java/ql/test/kotlin/library-tests/generic-inner-classes/test.expected b/java/ql/test-kotlin1/library-tests/generic-inner-classes/test.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/generic-inner-classes/test.expected rename to java/ql/test-kotlin1/library-tests/generic-inner-classes/test.expected diff --git a/java/ql/test/kotlin/library-tests/generic-inner-classes/test.ql b/java/ql/test-kotlin1/library-tests/generic-inner-classes/test.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/generic-inner-classes/test.ql rename to java/ql/test-kotlin1/library-tests/generic-inner-classes/test.ql diff --git a/java/ql/test/kotlin/library-tests/generic-instance-methods/Test.java b/java/ql/test-kotlin1/library-tests/generic-instance-methods/Test.java similarity index 100% rename from java/ql/test/kotlin/library-tests/generic-instance-methods/Test.java rename to java/ql/test-kotlin1/library-tests/generic-instance-methods/Test.java diff --git a/java/ql/test/kotlin/library-tests/generic-instance-methods/test.expected b/java/ql/test-kotlin1/library-tests/generic-instance-methods/test.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/generic-instance-methods/test.expected rename to java/ql/test-kotlin1/library-tests/generic-instance-methods/test.expected diff --git a/java/ql/test/kotlin/library-tests/generic-instance-methods/test.kt b/java/ql/test-kotlin1/library-tests/generic-instance-methods/test.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/generic-instance-methods/test.kt rename to java/ql/test-kotlin1/library-tests/generic-instance-methods/test.kt diff --git a/java/ql/test/kotlin/library-tests/generic-instance-methods/test.ql b/java/ql/test-kotlin1/library-tests/generic-instance-methods/test.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/generic-instance-methods/test.ql rename to java/ql/test-kotlin1/library-tests/generic-instance-methods/test.ql diff --git a/java/ql/test/kotlin/library-tests/generic-methods/ClassWithParams.kt b/java/ql/test-kotlin1/library-tests/generic-methods/ClassWithParams.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/generic-methods/ClassWithParams.kt rename to java/ql/test-kotlin1/library-tests/generic-methods/ClassWithParams.kt diff --git a/java/ql/test/kotlin/library-tests/generic-methods/ClassWithoutParams.kt b/java/ql/test-kotlin1/library-tests/generic-methods/ClassWithoutParams.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/generic-methods/ClassWithoutParams.kt rename to java/ql/test-kotlin1/library-tests/generic-methods/ClassWithoutParams.kt diff --git a/java/ql/test/kotlin/library-tests/generic-methods/kttest.kt b/java/ql/test-kotlin1/library-tests/generic-methods/kttest.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/generic-methods/kttest.kt rename to java/ql/test-kotlin1/library-tests/generic-methods/kttest.kt diff --git a/java/ql/test/kotlin/library-tests/generic-methods/test.expected b/java/ql/test-kotlin1/library-tests/generic-methods/test.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/generic-methods/test.expected rename to java/ql/test-kotlin1/library-tests/generic-methods/test.expected diff --git a/java/ql/test/kotlin/library-tests/generic-methods/test.ql b/java/ql/test-kotlin1/library-tests/generic-methods/test.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/generic-methods/test.ql rename to java/ql/test-kotlin1/library-tests/generic-methods/test.ql diff --git a/java/ql/test/kotlin/library-tests/generic-selective-extraction/Test.java b/java/ql/test-kotlin1/library-tests/generic-selective-extraction/Test.java similarity index 100% rename from java/ql/test/kotlin/library-tests/generic-selective-extraction/Test.java rename to java/ql/test-kotlin1/library-tests/generic-selective-extraction/Test.java diff --git a/java/ql/test/kotlin/library-tests/generic-selective-extraction/Test.kt b/java/ql/test-kotlin1/library-tests/generic-selective-extraction/Test.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/generic-selective-extraction/Test.kt rename to java/ql/test-kotlin1/library-tests/generic-selective-extraction/Test.kt diff --git a/java/ql/test/kotlin/library-tests/generic-selective-extraction/test.expected b/java/ql/test-kotlin1/library-tests/generic-selective-extraction/test.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/generic-selective-extraction/test.expected rename to java/ql/test-kotlin1/library-tests/generic-selective-extraction/test.expected diff --git a/java/ql/test/kotlin/library-tests/generic-selective-extraction/test.ql b/java/ql/test-kotlin1/library-tests/generic-selective-extraction/test.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/generic-selective-extraction/test.ql rename to java/ql/test-kotlin1/library-tests/generic-selective-extraction/test.ql diff --git a/java/ql/test/kotlin/library-tests/generic-type-bounds/test.expected b/java/ql/test-kotlin1/library-tests/generic-type-bounds/test.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/generic-type-bounds/test.expected rename to java/ql/test-kotlin1/library-tests/generic-type-bounds/test.expected diff --git a/java/ql/test/kotlin/library-tests/generic-type-bounds/test.kt b/java/ql/test-kotlin1/library-tests/generic-type-bounds/test.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/generic-type-bounds/test.kt rename to java/ql/test-kotlin1/library-tests/generic-type-bounds/test.kt diff --git a/java/ql/test/kotlin/library-tests/generic-type-bounds/test.ql b/java/ql/test-kotlin1/library-tests/generic-type-bounds/test.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/generic-type-bounds/test.ql rename to java/ql/test-kotlin1/library-tests/generic-type-bounds/test.ql diff --git a/java/ql/test/kotlin/library-tests/generics-location/A.java b/java/ql/test-kotlin1/library-tests/generics-location/A.java similarity index 100% rename from java/ql/test/kotlin/library-tests/generics-location/A.java rename to java/ql/test-kotlin1/library-tests/generics-location/A.java diff --git a/java/ql/test/kotlin/library-tests/generics-location/generics.kt b/java/ql/test-kotlin1/library-tests/generics-location/generics.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/generics-location/generics.kt rename to java/ql/test-kotlin1/library-tests/generics-location/generics.kt diff --git a/java/ql/test/kotlin/library-tests/generics-location/locations.expected b/java/ql/test-kotlin1/library-tests/generics-location/locations.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/generics-location/locations.expected rename to java/ql/test-kotlin1/library-tests/generics-location/locations.expected diff --git a/java/ql/test/kotlin/library-tests/generics-location/locations.ql b/java/ql/test-kotlin1/library-tests/generics-location/locations.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/generics-location/locations.ql rename to java/ql/test-kotlin1/library-tests/generics-location/locations.ql diff --git a/java/ql/test/kotlin/library-tests/generics/PrintAst.expected b/java/ql/test-kotlin1/library-tests/generics/PrintAst.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/generics/PrintAst.expected rename to java/ql/test-kotlin1/library-tests/generics/PrintAst.expected diff --git a/java/ql/test/kotlin/library-tests/generics/PrintAst.qlref b/java/ql/test-kotlin1/library-tests/generics/PrintAst.qlref similarity index 100% rename from java/ql/test/kotlin/library-tests/generics/PrintAst.qlref rename to java/ql/test-kotlin1/library-tests/generics/PrintAst.qlref diff --git a/java/ql/test/kotlin/library-tests/generics/generics.expected b/java/ql/test-kotlin1/library-tests/generics/generics.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/generics/generics.expected rename to java/ql/test-kotlin1/library-tests/generics/generics.expected diff --git a/java/ql/test/kotlin/library-tests/generics/generics.kt b/java/ql/test-kotlin1/library-tests/generics/generics.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/generics/generics.kt rename to java/ql/test-kotlin1/library-tests/generics/generics.kt diff --git a/java/ql/test/kotlin/library-tests/generics/generics.ql b/java/ql/test-kotlin1/library-tests/generics/generics.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/generics/generics.ql rename to java/ql/test-kotlin1/library-tests/generics/generics.ql diff --git a/java/ql/test/kotlin/library-tests/inherited-callee/Test.java b/java/ql/test-kotlin1/library-tests/inherited-callee/Test.java similarity index 100% rename from java/ql/test/kotlin/library-tests/inherited-callee/Test.java rename to java/ql/test-kotlin1/library-tests/inherited-callee/Test.java diff --git a/java/ql/test/kotlin/library-tests/inherited-callee/Test.kt b/java/ql/test-kotlin1/library-tests/inherited-callee/Test.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/inherited-callee/Test.kt rename to java/ql/test-kotlin1/library-tests/inherited-callee/Test.kt diff --git a/java/ql/test/kotlin/library-tests/inherited-callee/test.expected b/java/ql/test-kotlin1/library-tests/inherited-callee/test.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/inherited-callee/test.expected rename to java/ql/test-kotlin1/library-tests/inherited-callee/test.expected diff --git a/java/ql/test/kotlin/library-tests/inherited-callee/test.ql b/java/ql/test-kotlin1/library-tests/inherited-callee/test.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/inherited-callee/test.ql rename to java/ql/test-kotlin1/library-tests/inherited-callee/test.ql diff --git a/java/ql/test/kotlin/library-tests/inherited-collection-implementation/Test.java b/java/ql/test-kotlin1/library-tests/inherited-collection-implementation/Test.java similarity index 100% rename from java/ql/test/kotlin/library-tests/inherited-collection-implementation/Test.java rename to java/ql/test-kotlin1/library-tests/inherited-collection-implementation/Test.java diff --git a/java/ql/test/kotlin/library-tests/inherited-collection-implementation/test.expected b/java/ql/test-kotlin1/library-tests/inherited-collection-implementation/test.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/inherited-collection-implementation/test.expected rename to java/ql/test-kotlin1/library-tests/inherited-collection-implementation/test.expected diff --git a/java/ql/test/kotlin/library-tests/inherited-collection-implementation/test.ql b/java/ql/test-kotlin1/library-tests/inherited-collection-implementation/test.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/inherited-collection-implementation/test.ql rename to java/ql/test-kotlin1/library-tests/inherited-collection-implementation/test.ql diff --git a/java/ql/test/kotlin/library-tests/inherited-collection-implementation/user.kt b/java/ql/test-kotlin1/library-tests/inherited-collection-implementation/user.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/inherited-collection-implementation/user.kt rename to java/ql/test-kotlin1/library-tests/inherited-collection-implementation/user.kt diff --git a/java/ql/test/kotlin/library-tests/inherited-default-value/test.expected b/java/ql/test-kotlin1/library-tests/inherited-default-value/test.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/inherited-default-value/test.expected rename to java/ql/test-kotlin1/library-tests/inherited-default-value/test.expected diff --git a/java/ql/test/kotlin/library-tests/inherited-default-value/test.kt b/java/ql/test-kotlin1/library-tests/inherited-default-value/test.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/inherited-default-value/test.kt rename to java/ql/test-kotlin1/library-tests/inherited-default-value/test.kt diff --git a/java/ql/test/kotlin/library-tests/inherited-default-value/test.ql b/java/ql/test-kotlin1/library-tests/inherited-default-value/test.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/inherited-default-value/test.ql rename to java/ql/test-kotlin1/library-tests/inherited-default-value/test.ql diff --git a/java/ql/test/kotlin/library-tests/inherited-single-abstract-method/test.expected b/java/ql/test-kotlin1/library-tests/inherited-single-abstract-method/test.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/inherited-single-abstract-method/test.expected rename to java/ql/test-kotlin1/library-tests/inherited-single-abstract-method/test.expected diff --git a/java/ql/test/kotlin/library-tests/inherited-single-abstract-method/test.kt b/java/ql/test-kotlin1/library-tests/inherited-single-abstract-method/test.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/inherited-single-abstract-method/test.kt rename to java/ql/test-kotlin1/library-tests/inherited-single-abstract-method/test.kt diff --git a/java/ql/test/kotlin/library-tests/inherited-single-abstract-method/test.ql b/java/ql/test-kotlin1/library-tests/inherited-single-abstract-method/test.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/inherited-single-abstract-method/test.ql rename to java/ql/test-kotlin1/library-tests/inherited-single-abstract-method/test.ql diff --git a/java/ql/test/kotlin/library-tests/inheritence-substitution/test.expected b/java/ql/test-kotlin1/library-tests/inheritence-substitution/test.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/inheritence-substitution/test.expected rename to java/ql/test-kotlin1/library-tests/inheritence-substitution/test.expected diff --git a/java/ql/test/kotlin/library-tests/inheritence-substitution/test.kt b/java/ql/test-kotlin1/library-tests/inheritence-substitution/test.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/inheritence-substitution/test.kt rename to java/ql/test-kotlin1/library-tests/inheritence-substitution/test.kt diff --git a/java/ql/test/kotlin/library-tests/inheritence-substitution/test.ql b/java/ql/test-kotlin1/library-tests/inheritence-substitution/test.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/inheritence-substitution/test.ql rename to java/ql/test-kotlin1/library-tests/inheritence-substitution/test.ql diff --git a/java/ql/test/kotlin/library-tests/instances/TestClassA.kt b/java/ql/test-kotlin1/library-tests/instances/TestClassA.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/instances/TestClassA.kt rename to java/ql/test-kotlin1/library-tests/instances/TestClassA.kt diff --git a/java/ql/test/kotlin/library-tests/instances/TestClassAUser.kt b/java/ql/test-kotlin1/library-tests/instances/TestClassAUser.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/instances/TestClassAUser.kt rename to java/ql/test-kotlin1/library-tests/instances/TestClassAUser.kt diff --git a/java/ql/test/kotlin/library-tests/instances/classes.expected b/java/ql/test-kotlin1/library-tests/instances/classes.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/instances/classes.expected rename to java/ql/test-kotlin1/library-tests/instances/classes.expected diff --git a/java/ql/test/kotlin/library-tests/instances/classes.ql b/java/ql/test-kotlin1/library-tests/instances/classes.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/instances/classes.ql rename to java/ql/test-kotlin1/library-tests/instances/classes.ql diff --git a/java/ql/test/kotlin/library-tests/interface-delegate/intfDelegate.kt b/java/ql/test-kotlin1/library-tests/interface-delegate/intfDelegate.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/interface-delegate/intfDelegate.kt rename to java/ql/test-kotlin1/library-tests/interface-delegate/intfDelegate.kt diff --git a/java/ql/test/kotlin/library-tests/interface-delegate/test.expected b/java/ql/test-kotlin1/library-tests/interface-delegate/test.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/interface-delegate/test.expected rename to java/ql/test-kotlin1/library-tests/interface-delegate/test.expected diff --git a/java/ql/test/kotlin/library-tests/interface-delegate/test.ql b/java/ql/test-kotlin1/library-tests/interface-delegate/test.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/interface-delegate/test.ql rename to java/ql/test-kotlin1/library-tests/interface-delegate/test.ql diff --git a/java/ql/test/kotlin/library-tests/internal-constructor-called-from-java/User.java b/java/ql/test-kotlin1/library-tests/internal-constructor-called-from-java/User.java similarity index 100% rename from java/ql/test/kotlin/library-tests/internal-constructor-called-from-java/User.java rename to java/ql/test-kotlin1/library-tests/internal-constructor-called-from-java/User.java diff --git a/java/ql/test/kotlin/library-tests/internal-constructor-called-from-java/test.expected b/java/ql/test-kotlin1/library-tests/internal-constructor-called-from-java/test.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/internal-constructor-called-from-java/test.expected rename to java/ql/test-kotlin1/library-tests/internal-constructor-called-from-java/test.expected diff --git a/java/ql/test/kotlin/library-tests/internal-constructor-called-from-java/test.kt b/java/ql/test-kotlin1/library-tests/internal-constructor-called-from-java/test.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/internal-constructor-called-from-java/test.kt rename to java/ql/test-kotlin1/library-tests/internal-constructor-called-from-java/test.kt diff --git a/java/ql/test/kotlin/library-tests/internal-constructor-called-from-java/test.ql b/java/ql/test-kotlin1/library-tests/internal-constructor-called-from-java/test.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/internal-constructor-called-from-java/test.ql rename to java/ql/test-kotlin1/library-tests/internal-constructor-called-from-java/test.ql diff --git a/java/ql/test/kotlin/library-tests/internal-public-alias/User.java b/java/ql/test-kotlin1/library-tests/internal-public-alias/User.java similarity index 100% rename from java/ql/test/kotlin/library-tests/internal-public-alias/User.java rename to java/ql/test-kotlin1/library-tests/internal-public-alias/User.java diff --git a/java/ql/test/kotlin/library-tests/internal-public-alias/test.expected b/java/ql/test-kotlin1/library-tests/internal-public-alias/test.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/internal-public-alias/test.expected rename to java/ql/test-kotlin1/library-tests/internal-public-alias/test.expected diff --git a/java/ql/test/kotlin/library-tests/internal-public-alias/test.kt b/java/ql/test-kotlin1/library-tests/internal-public-alias/test.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/internal-public-alias/test.kt rename to java/ql/test-kotlin1/library-tests/internal-public-alias/test.kt diff --git a/java/ql/test/kotlin/library-tests/internal-public-alias/test.ql b/java/ql/test-kotlin1/library-tests/internal-public-alias/test.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/internal-public-alias/test.ql rename to java/ql/test-kotlin1/library-tests/internal-public-alias/test.ql diff --git a/java/ql/test/kotlin/library-tests/java-kotlin-collection-type-generic-methods/Test.java b/java/ql/test-kotlin1/library-tests/java-kotlin-collection-type-generic-methods/Test.java similarity index 100% rename from java/ql/test/kotlin/library-tests/java-kotlin-collection-type-generic-methods/Test.java rename to java/ql/test-kotlin1/library-tests/java-kotlin-collection-type-generic-methods/Test.java diff --git a/java/ql/test/kotlin/library-tests/java-kotlin-collection-type-generic-methods/test.expected b/java/ql/test-kotlin1/library-tests/java-kotlin-collection-type-generic-methods/test.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/java-kotlin-collection-type-generic-methods/test.expected rename to java/ql/test-kotlin1/library-tests/java-kotlin-collection-type-generic-methods/test.expected diff --git a/java/ql/test/kotlin/library-tests/java-kotlin-collection-type-generic-methods/test.kt b/java/ql/test-kotlin1/library-tests/java-kotlin-collection-type-generic-methods/test.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/java-kotlin-collection-type-generic-methods/test.kt rename to java/ql/test-kotlin1/library-tests/java-kotlin-collection-type-generic-methods/test.kt diff --git a/java/ql/test/kotlin/library-tests/java-kotlin-collection-type-generic-methods/test.ql b/java/ql/test-kotlin1/library-tests/java-kotlin-collection-type-generic-methods/test.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/java-kotlin-collection-type-generic-methods/test.ql rename to java/ql/test-kotlin1/library-tests/java-kotlin-collection-type-generic-methods/test.ql diff --git a/java/ql/test/kotlin/library-tests/java-lang-number-conversions/Test.java b/java/ql/test-kotlin1/library-tests/java-lang-number-conversions/Test.java similarity index 100% rename from java/ql/test/kotlin/library-tests/java-lang-number-conversions/Test.java rename to java/ql/test-kotlin1/library-tests/java-lang-number-conversions/Test.java diff --git a/java/ql/test/kotlin/library-tests/java-lang-number-conversions/test.expected b/java/ql/test-kotlin1/library-tests/java-lang-number-conversions/test.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/java-lang-number-conversions/test.expected rename to java/ql/test-kotlin1/library-tests/java-lang-number-conversions/test.expected diff --git a/java/ql/test/kotlin/library-tests/java-lang-number-conversions/test.kt b/java/ql/test-kotlin1/library-tests/java-lang-number-conversions/test.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/java-lang-number-conversions/test.kt rename to java/ql/test-kotlin1/library-tests/java-lang-number-conversions/test.kt diff --git a/java/ql/test/kotlin/library-tests/java-lang-number-conversions/test.ql b/java/ql/test-kotlin1/library-tests/java-lang-number-conversions/test.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/java-lang-number-conversions/test.ql rename to java/ql/test-kotlin1/library-tests/java-lang-number-conversions/test.ql diff --git a/java/ql/test/kotlin/library-tests/java-list-kotlin-user/MyList.java b/java/ql/test-kotlin1/library-tests/java-list-kotlin-user/MyList.java similarity index 100% rename from java/ql/test/kotlin/library-tests/java-list-kotlin-user/MyList.java rename to java/ql/test-kotlin1/library-tests/java-list-kotlin-user/MyList.java diff --git a/java/ql/test/kotlin/library-tests/java-list-kotlin-user/test.expected b/java/ql/test-kotlin1/library-tests/java-list-kotlin-user/test.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/java-list-kotlin-user/test.expected rename to java/ql/test-kotlin1/library-tests/java-list-kotlin-user/test.expected diff --git a/java/ql/test/kotlin/library-tests/java-list-kotlin-user/test.kt b/java/ql/test-kotlin1/library-tests/java-list-kotlin-user/test.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/java-list-kotlin-user/test.kt rename to java/ql/test-kotlin1/library-tests/java-list-kotlin-user/test.kt diff --git a/java/ql/test/kotlin/library-tests/java-list-kotlin-user/test.ql b/java/ql/test-kotlin1/library-tests/java-list-kotlin-user/test.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/java-list-kotlin-user/test.ql rename to java/ql/test-kotlin1/library-tests/java-list-kotlin-user/test.ql diff --git a/java/ql/test/kotlin/library-tests/java-map-methods/PrintAst.expected b/java/ql/test-kotlin1/library-tests/java-map-methods/PrintAst.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/java-map-methods/PrintAst.expected rename to java/ql/test-kotlin1/library-tests/java-map-methods/PrintAst.expected diff --git a/java/ql/test/kotlin/library-tests/java-map-methods/PrintAst.qlref b/java/ql/test-kotlin1/library-tests/java-map-methods/PrintAst.qlref similarity index 100% rename from java/ql/test/kotlin/library-tests/java-map-methods/PrintAst.qlref rename to java/ql/test-kotlin1/library-tests/java-map-methods/PrintAst.qlref diff --git a/java/ql/test/kotlin/library-tests/java-map-methods/test.expected b/java/ql/test-kotlin1/library-tests/java-map-methods/test.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/java-map-methods/test.expected rename to java/ql/test-kotlin1/library-tests/java-map-methods/test.expected diff --git a/java/ql/test/kotlin/library-tests/java-map-methods/test.kt b/java/ql/test-kotlin1/library-tests/java-map-methods/test.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/java-map-methods/test.kt rename to java/ql/test-kotlin1/library-tests/java-map-methods/test.kt diff --git a/java/ql/test/kotlin/library-tests/java-map-methods/test.ql b/java/ql/test-kotlin1/library-tests/java-map-methods/test.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/java-map-methods/test.ql rename to java/ql/test-kotlin1/library-tests/java-map-methods/test.ql diff --git a/java/ql/test/kotlin/library-tests/java_and_kotlin/Continuation.java b/java/ql/test-kotlin1/library-tests/java_and_kotlin/Continuation.java similarity index 100% rename from java/ql/test/kotlin/library-tests/java_and_kotlin/Continuation.java rename to java/ql/test-kotlin1/library-tests/java_and_kotlin/Continuation.java diff --git a/java/ql/test/kotlin/library-tests/java_and_kotlin/Java.java b/java/ql/test-kotlin1/library-tests/java_and_kotlin/Java.java similarity index 100% rename from java/ql/test/kotlin/library-tests/java_and_kotlin/Java.java rename to java/ql/test-kotlin1/library-tests/java_and_kotlin/Java.java diff --git a/java/ql/test/kotlin/library-tests/java_and_kotlin/Kotlin.kt b/java/ql/test-kotlin1/library-tests/java_and_kotlin/Kotlin.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/java_and_kotlin/Kotlin.kt rename to java/ql/test-kotlin1/library-tests/java_and_kotlin/Kotlin.kt diff --git a/java/ql/test/kotlin/library-tests/java_and_kotlin/test.expected b/java/ql/test-kotlin1/library-tests/java_and_kotlin/test.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/java_and_kotlin/test.expected rename to java/ql/test-kotlin1/library-tests/java_and_kotlin/test.expected diff --git a/java/ql/test/kotlin/library-tests/java_and_kotlin/test.ql b/java/ql/test-kotlin1/library-tests/java_and_kotlin/test.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/java_and_kotlin/test.ql rename to java/ql/test-kotlin1/library-tests/java_and_kotlin/test.ql diff --git a/java/ql/test/kotlin/library-tests/java_and_kotlin_generics/java/test.expected b/java/ql/test-kotlin1/library-tests/java_and_kotlin_generics/java/test.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/java_and_kotlin_generics/java/test.expected rename to java/ql/test-kotlin1/library-tests/java_and_kotlin_generics/java/test.expected diff --git a/java/ql/test/kotlin/library-tests/java_and_kotlin_generics/java/test.ql b/java/ql/test-kotlin1/library-tests/java_and_kotlin_generics/java/test.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/java_and_kotlin_generics/java/test.ql rename to java/ql/test-kotlin1/library-tests/java_and_kotlin_generics/java/test.ql diff --git a/java/ql/test/kotlin/library-tests/java_and_kotlin_generics/java/x.java b/java/ql/test-kotlin1/library-tests/java_and_kotlin_generics/java/x.java similarity index 100% rename from java/ql/test/kotlin/library-tests/java_and_kotlin_generics/java/x.java rename to java/ql/test-kotlin1/library-tests/java_and_kotlin_generics/java/x.java diff --git a/java/ql/test/kotlin/library-tests/java_and_kotlin_generics/kotlin/test.expected b/java/ql/test-kotlin1/library-tests/java_and_kotlin_generics/kotlin/test.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/java_and_kotlin_generics/kotlin/test.expected rename to java/ql/test-kotlin1/library-tests/java_and_kotlin_generics/kotlin/test.expected diff --git a/java/ql/test/kotlin/library-tests/java_and_kotlin_generics/kotlin/test.ql b/java/ql/test-kotlin1/library-tests/java_and_kotlin_generics/kotlin/test.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/java_and_kotlin_generics/kotlin/test.ql rename to java/ql/test-kotlin1/library-tests/java_and_kotlin_generics/kotlin/test.ql diff --git a/java/ql/test/kotlin/library-tests/java_and_kotlin_generics/kotlin/x.kt b/java/ql/test-kotlin1/library-tests/java_and_kotlin_generics/kotlin/x.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/java_and_kotlin_generics/kotlin/x.kt rename to java/ql/test-kotlin1/library-tests/java_and_kotlin_generics/kotlin/x.kt diff --git a/java/ql/test/kotlin/library-tests/java_and_kotlin_internal/Java.java b/java/ql/test-kotlin1/library-tests/java_and_kotlin_internal/Java.java similarity index 100% rename from java/ql/test/kotlin/library-tests/java_and_kotlin_internal/Java.java rename to java/ql/test-kotlin1/library-tests/java_and_kotlin_internal/Java.java diff --git a/java/ql/test/kotlin/library-tests/java_and_kotlin_internal/Kotlin.kt b/java/ql/test-kotlin1/library-tests/java_and_kotlin_internal/Kotlin.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/java_and_kotlin_internal/Kotlin.kt rename to java/ql/test-kotlin1/library-tests/java_and_kotlin_internal/Kotlin.kt diff --git a/java/ql/test/kotlin/library-tests/java_and_kotlin_internal/visibility.expected b/java/ql/test-kotlin1/library-tests/java_and_kotlin_internal/visibility.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/java_and_kotlin_internal/visibility.expected rename to java/ql/test-kotlin1/library-tests/java_and_kotlin_internal/visibility.expected diff --git a/java/ql/test/kotlin/library-tests/java_and_kotlin_internal/visibility.ql b/java/ql/test-kotlin1/library-tests/java_and_kotlin_internal/visibility.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/java_and_kotlin_internal/visibility.ql rename to java/ql/test-kotlin1/library-tests/java_and_kotlin_internal/visibility.ql diff --git a/java/ql/test/kotlin/library-tests/java_properties/PrintAst.expected b/java/ql/test-kotlin1/library-tests/java_properties/PrintAst.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/java_properties/PrintAst.expected rename to java/ql/test-kotlin1/library-tests/java_properties/PrintAst.expected diff --git a/java/ql/test/kotlin/library-tests/java_properties/PrintAst.qlref b/java/ql/test-kotlin1/library-tests/java_properties/PrintAst.qlref similarity index 100% rename from java/ql/test/kotlin/library-tests/java_properties/PrintAst.qlref rename to java/ql/test-kotlin1/library-tests/java_properties/PrintAst.qlref diff --git a/java/ql/test/kotlin/library-tests/java_properties/Prop.java b/java/ql/test-kotlin1/library-tests/java_properties/Prop.java similarity index 100% rename from java/ql/test/kotlin/library-tests/java_properties/Prop.java rename to java/ql/test-kotlin1/library-tests/java_properties/Prop.java diff --git a/java/ql/test/kotlin/library-tests/java_properties/Use.kt b/java/ql/test-kotlin1/library-tests/java_properties/Use.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/java_properties/Use.kt rename to java/ql/test-kotlin1/library-tests/java_properties/Use.kt diff --git a/java/ql/test/kotlin/library-tests/jvmoverloads-annotation/PrintAst.expected b/java/ql/test-kotlin1/library-tests/jvmoverloads-annotation/PrintAst.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/jvmoverloads-annotation/PrintAst.expected rename to java/ql/test-kotlin1/library-tests/jvmoverloads-annotation/PrintAst.expected diff --git a/java/ql/test/kotlin/library-tests/jvmoverloads-annotation/PrintAst.qlref b/java/ql/test-kotlin1/library-tests/jvmoverloads-annotation/PrintAst.qlref similarity index 100% rename from java/ql/test/kotlin/library-tests/jvmoverloads-annotation/PrintAst.qlref rename to java/ql/test-kotlin1/library-tests/jvmoverloads-annotation/PrintAst.qlref diff --git a/java/ql/test/kotlin/library-tests/jvmoverloads-annotation/test.expected b/java/ql/test-kotlin1/library-tests/jvmoverloads-annotation/test.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/jvmoverloads-annotation/test.expected rename to java/ql/test-kotlin1/library-tests/jvmoverloads-annotation/test.expected diff --git a/java/ql/test/kotlin/library-tests/jvmoverloads-annotation/test.kt b/java/ql/test-kotlin1/library-tests/jvmoverloads-annotation/test.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/jvmoverloads-annotation/test.kt rename to java/ql/test-kotlin1/library-tests/jvmoverloads-annotation/test.kt diff --git a/java/ql/test/kotlin/library-tests/jvmoverloads-annotation/test.ql b/java/ql/test-kotlin1/library-tests/jvmoverloads-annotation/test.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/jvmoverloads-annotation/test.ql rename to java/ql/test-kotlin1/library-tests/jvmoverloads-annotation/test.ql diff --git a/java/ql/test/kotlin/library-tests/jvmoverloads_flow/User.java b/java/ql/test-kotlin1/library-tests/jvmoverloads_flow/User.java similarity index 100% rename from java/ql/test/kotlin/library-tests/jvmoverloads_flow/User.java rename to java/ql/test-kotlin1/library-tests/jvmoverloads_flow/User.java diff --git a/java/ql/test/kotlin/library-tests/jvmoverloads_flow/test.expected b/java/ql/test-kotlin1/library-tests/jvmoverloads_flow/test.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/jvmoverloads_flow/test.expected rename to java/ql/test-kotlin1/library-tests/jvmoverloads_flow/test.expected diff --git a/java/ql/test/kotlin/library-tests/jvmoverloads_flow/test.kt b/java/ql/test-kotlin1/library-tests/jvmoverloads_flow/test.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/jvmoverloads_flow/test.kt rename to java/ql/test-kotlin1/library-tests/jvmoverloads_flow/test.kt diff --git a/java/ql/test/kotlin/library-tests/jvmoverloads_flow/test.ql b/java/ql/test-kotlin1/library-tests/jvmoverloads_flow/test.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/jvmoverloads_flow/test.ql rename to java/ql/test-kotlin1/library-tests/jvmoverloads_flow/test.ql diff --git a/java/ql/test/kotlin/library-tests/jvmoverloads_generics/User.java b/java/ql/test-kotlin1/library-tests/jvmoverloads_generics/User.java similarity index 100% rename from java/ql/test/kotlin/library-tests/jvmoverloads_generics/User.java rename to java/ql/test-kotlin1/library-tests/jvmoverloads_generics/User.java diff --git a/java/ql/test/kotlin/library-tests/jvmoverloads_generics/test.expected b/java/ql/test-kotlin1/library-tests/jvmoverloads_generics/test.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/jvmoverloads_generics/test.expected rename to java/ql/test-kotlin1/library-tests/jvmoverloads_generics/test.expected diff --git a/java/ql/test/kotlin/library-tests/jvmoverloads_generics/test.kt b/java/ql/test-kotlin1/library-tests/jvmoverloads_generics/test.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/jvmoverloads_generics/test.kt rename to java/ql/test-kotlin1/library-tests/jvmoverloads_generics/test.kt diff --git a/java/ql/test/kotlin/library-tests/jvmoverloads_generics/test.ql b/java/ql/test-kotlin1/library-tests/jvmoverloads_generics/test.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/jvmoverloads_generics/test.ql rename to java/ql/test-kotlin1/library-tests/jvmoverloads_generics/test.ql diff --git a/java/ql/test/kotlin/library-tests/jvmstatic-annotation/JavaUser.java b/java/ql/test-kotlin1/library-tests/jvmstatic-annotation/JavaUser.java similarity index 100% rename from java/ql/test/kotlin/library-tests/jvmstatic-annotation/JavaUser.java rename to java/ql/test-kotlin1/library-tests/jvmstatic-annotation/JavaUser.java diff --git a/java/ql/test/kotlin/library-tests/jvmstatic-annotation/PrintAst.expected b/java/ql/test-kotlin1/library-tests/jvmstatic-annotation/PrintAst.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/jvmstatic-annotation/PrintAst.expected rename to java/ql/test-kotlin1/library-tests/jvmstatic-annotation/PrintAst.expected diff --git a/java/ql/test/kotlin/library-tests/jvmstatic-annotation/PrintAst.qlref b/java/ql/test-kotlin1/library-tests/jvmstatic-annotation/PrintAst.qlref similarity index 100% rename from java/ql/test/kotlin/library-tests/jvmstatic-annotation/PrintAst.qlref rename to java/ql/test-kotlin1/library-tests/jvmstatic-annotation/PrintAst.qlref diff --git a/java/ql/test/kotlin/library-tests/jvmstatic-annotation/test.expected b/java/ql/test-kotlin1/library-tests/jvmstatic-annotation/test.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/jvmstatic-annotation/test.expected rename to java/ql/test-kotlin1/library-tests/jvmstatic-annotation/test.expected diff --git a/java/ql/test/kotlin/library-tests/jvmstatic-annotation/test.kt b/java/ql/test-kotlin1/library-tests/jvmstatic-annotation/test.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/jvmstatic-annotation/test.kt rename to java/ql/test-kotlin1/library-tests/jvmstatic-annotation/test.kt diff --git a/java/ql/test/kotlin/library-tests/jvmstatic-annotation/test.ql b/java/ql/test-kotlin1/library-tests/jvmstatic-annotation/test.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/jvmstatic-annotation/test.ql rename to java/ql/test-kotlin1/library-tests/jvmstatic-annotation/test.ql diff --git a/java/ql/test/kotlin/library-tests/kotlin-java-map-entries/C.java b/java/ql/test-kotlin1/library-tests/kotlin-java-map-entries/C.java similarity index 100% rename from java/ql/test/kotlin/library-tests/kotlin-java-map-entries/C.java rename to java/ql/test-kotlin1/library-tests/kotlin-java-map-entries/C.java diff --git a/java/ql/test/kotlin/library-tests/kotlin-java-map-entries/b.kt b/java/ql/test-kotlin1/library-tests/kotlin-java-map-entries/b.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/kotlin-java-map-entries/b.kt rename to java/ql/test-kotlin1/library-tests/kotlin-java-map-entries/b.kt diff --git a/java/ql/test/kotlin/library-tests/kotlin-java-map-entries/test.expected b/java/ql/test-kotlin1/library-tests/kotlin-java-map-entries/test.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/kotlin-java-map-entries/test.expected rename to java/ql/test-kotlin1/library-tests/kotlin-java-map-entries/test.expected diff --git a/java/ql/test/kotlin/library-tests/kotlin-java-map-entries/test.ql b/java/ql/test-kotlin1/library-tests/kotlin-java-map-entries/test.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/kotlin-java-map-entries/test.ql rename to java/ql/test-kotlin1/library-tests/kotlin-java-map-entries/test.ql diff --git a/java/ql/test/kotlin/library-tests/lateinit/PrintAst.expected b/java/ql/test-kotlin1/library-tests/lateinit/PrintAst.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/lateinit/PrintAst.expected rename to java/ql/test-kotlin1/library-tests/lateinit/PrintAst.expected diff --git a/java/ql/test/kotlin/library-tests/lateinit/PrintAst.qlref b/java/ql/test-kotlin1/library-tests/lateinit/PrintAst.qlref similarity index 100% rename from java/ql/test/kotlin/library-tests/lateinit/PrintAst.qlref rename to java/ql/test-kotlin1/library-tests/lateinit/PrintAst.qlref diff --git a/java/ql/test/kotlin/library-tests/lateinit/test.expected b/java/ql/test-kotlin1/library-tests/lateinit/test.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/lateinit/test.expected rename to java/ql/test-kotlin1/library-tests/lateinit/test.expected diff --git a/java/ql/test/kotlin/library-tests/lateinit/test.kt b/java/ql/test-kotlin1/library-tests/lateinit/test.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/lateinit/test.kt rename to java/ql/test-kotlin1/library-tests/lateinit/test.kt diff --git a/java/ql/test/kotlin/library-tests/lateinit/test.ql b/java/ql/test-kotlin1/library-tests/lateinit/test.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/lateinit/test.ql rename to java/ql/test-kotlin1/library-tests/lateinit/test.ql diff --git a/java/ql/test/kotlin/library-tests/lazy-val-multiple-constructors/test.expected b/java/ql/test-kotlin1/library-tests/lazy-val-multiple-constructors/test.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/lazy-val-multiple-constructors/test.expected rename to java/ql/test-kotlin1/library-tests/lazy-val-multiple-constructors/test.expected diff --git a/java/ql/test/kotlin/library-tests/lazy-val-multiple-constructors/test.kt b/java/ql/test-kotlin1/library-tests/lazy-val-multiple-constructors/test.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/lazy-val-multiple-constructors/test.kt rename to java/ql/test-kotlin1/library-tests/lazy-val-multiple-constructors/test.kt diff --git a/java/ql/test/kotlin/library-tests/lazy-val-multiple-constructors/test.ql b/java/ql/test-kotlin1/library-tests/lazy-val-multiple-constructors/test.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/lazy-val-multiple-constructors/test.ql rename to java/ql/test-kotlin1/library-tests/lazy-val-multiple-constructors/test.ql diff --git a/java/ql/test/kotlin/library-tests/literals/literals.expected b/java/ql/test-kotlin1/library-tests/literals/literals.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/literals/literals.expected rename to java/ql/test-kotlin1/library-tests/literals/literals.expected diff --git a/java/ql/test/kotlin/library-tests/literals/literals.kt b/java/ql/test-kotlin1/library-tests/literals/literals.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/literals/literals.kt rename to java/ql/test-kotlin1/library-tests/literals/literals.kt diff --git a/java/ql/test/kotlin/library-tests/literals/literals.ql b/java/ql/test-kotlin1/library-tests/literals/literals.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/literals/literals.ql rename to java/ql/test-kotlin1/library-tests/literals/literals.ql diff --git a/java/ql/test/kotlin/library-tests/maps-iterator-overloads/test.expected b/java/ql/test-kotlin1/library-tests/maps-iterator-overloads/test.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/maps-iterator-overloads/test.expected rename to java/ql/test-kotlin1/library-tests/maps-iterator-overloads/test.expected diff --git a/java/ql/test/kotlin/library-tests/maps-iterator-overloads/test.kt b/java/ql/test-kotlin1/library-tests/maps-iterator-overloads/test.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/maps-iterator-overloads/test.kt rename to java/ql/test-kotlin1/library-tests/maps-iterator-overloads/test.kt diff --git a/java/ql/test/kotlin/library-tests/maps-iterator-overloads/test.ql b/java/ql/test-kotlin1/library-tests/maps-iterator-overloads/test.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/maps-iterator-overloads/test.ql rename to java/ql/test-kotlin1/library-tests/maps-iterator-overloads/test.ql diff --git a/java/ql/test/kotlin/library-tests/methods-mixed-java-and-kotlin/A.java b/java/ql/test-kotlin1/library-tests/methods-mixed-java-and-kotlin/A.java similarity index 100% rename from java/ql/test/kotlin/library-tests/methods-mixed-java-and-kotlin/A.java rename to java/ql/test-kotlin1/library-tests/methods-mixed-java-and-kotlin/A.java diff --git a/java/ql/test/kotlin/library-tests/methods-mixed-java-and-kotlin/B.java b/java/ql/test-kotlin1/library-tests/methods-mixed-java-and-kotlin/B.java similarity index 100% rename from java/ql/test/kotlin/library-tests/methods-mixed-java-and-kotlin/B.java rename to java/ql/test-kotlin1/library-tests/methods-mixed-java-and-kotlin/B.java diff --git a/java/ql/test/kotlin/library-tests/methods-mixed-java-and-kotlin/W.kt b/java/ql/test-kotlin1/library-tests/methods-mixed-java-and-kotlin/W.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/methods-mixed-java-and-kotlin/W.kt rename to java/ql/test-kotlin1/library-tests/methods-mixed-java-and-kotlin/W.kt diff --git a/java/ql/test/kotlin/library-tests/methods-mixed-java-and-kotlin/test.expected b/java/ql/test-kotlin1/library-tests/methods-mixed-java-and-kotlin/test.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/methods-mixed-java-and-kotlin/test.expected rename to java/ql/test-kotlin1/library-tests/methods-mixed-java-and-kotlin/test.expected diff --git a/java/ql/test/kotlin/library-tests/methods-mixed-java-and-kotlin/test.ql b/java/ql/test-kotlin1/library-tests/methods-mixed-java-and-kotlin/test.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/methods-mixed-java-and-kotlin/test.ql rename to java/ql/test-kotlin1/library-tests/methods-mixed-java-and-kotlin/test.ql diff --git a/java/ql/test/kotlin/library-tests/methods/clinit.expected b/java/ql/test-kotlin1/library-tests/methods/clinit.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/methods/clinit.expected rename to java/ql/test-kotlin1/library-tests/methods/clinit.expected diff --git a/java/ql/test/kotlin/library-tests/methods/clinit.kt b/java/ql/test-kotlin1/library-tests/methods/clinit.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/methods/clinit.kt rename to java/ql/test-kotlin1/library-tests/methods/clinit.kt diff --git a/java/ql/test/kotlin/library-tests/methods/clinit.ql b/java/ql/test-kotlin1/library-tests/methods/clinit.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/methods/clinit.ql rename to java/ql/test-kotlin1/library-tests/methods/clinit.ql diff --git a/java/ql/test/kotlin/library-tests/methods/dataClass.kt b/java/ql/test-kotlin1/library-tests/methods/dataClass.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/methods/dataClass.kt rename to java/ql/test-kotlin1/library-tests/methods/dataClass.kt diff --git a/java/ql/test/kotlin/library-tests/methods/delegates.kt b/java/ql/test-kotlin1/library-tests/methods/delegates.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/methods/delegates.kt rename to java/ql/test-kotlin1/library-tests/methods/delegates.kt diff --git a/java/ql/test/kotlin/library-tests/methods/diagnostics.expected b/java/ql/test-kotlin1/library-tests/methods/diagnostics.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/methods/diagnostics.expected rename to java/ql/test-kotlin1/library-tests/methods/diagnostics.expected diff --git a/java/ql/test/kotlin/library-tests/methods/diagnostics.ql b/java/ql/test-kotlin1/library-tests/methods/diagnostics.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/methods/diagnostics.ql rename to java/ql/test-kotlin1/library-tests/methods/diagnostics.ql diff --git a/java/ql/test/kotlin/library-tests/methods/enumClass.kt b/java/ql/test-kotlin1/library-tests/methods/enumClass.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/methods/enumClass.kt rename to java/ql/test-kotlin1/library-tests/methods/enumClass.kt diff --git a/java/ql/test/kotlin/library-tests/methods/exprs.expected b/java/ql/test-kotlin1/library-tests/methods/exprs.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/methods/exprs.expected rename to java/ql/test-kotlin1/library-tests/methods/exprs.expected diff --git a/java/ql/test/kotlin/library-tests/methods/exprs.ql b/java/ql/test-kotlin1/library-tests/methods/exprs.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/methods/exprs.ql rename to java/ql/test-kotlin1/library-tests/methods/exprs.ql diff --git a/java/ql/test/kotlin/library-tests/methods/methods.expected b/java/ql/test-kotlin1/library-tests/methods/methods.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/methods/methods.expected rename to java/ql/test-kotlin1/library-tests/methods/methods.expected diff --git a/java/ql/test/kotlin/library-tests/methods/methods.kt b/java/ql/test-kotlin1/library-tests/methods/methods.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/methods/methods.kt rename to java/ql/test-kotlin1/library-tests/methods/methods.kt diff --git a/java/ql/test/kotlin/library-tests/methods/methods.ql b/java/ql/test-kotlin1/library-tests/methods/methods.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/methods/methods.ql rename to java/ql/test-kotlin1/library-tests/methods/methods.ql diff --git a/java/ql/test/kotlin/library-tests/methods/methods2.kt b/java/ql/test-kotlin1/library-tests/methods/methods2.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/methods/methods2.kt rename to java/ql/test-kotlin1/library-tests/methods/methods2.kt diff --git a/java/ql/test/kotlin/library-tests/methods/methods3.kt b/java/ql/test-kotlin1/library-tests/methods/methods3.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/methods/methods3.kt rename to java/ql/test-kotlin1/library-tests/methods/methods3.kt diff --git a/java/ql/test/kotlin/library-tests/methods/methods4.kt b/java/ql/test-kotlin1/library-tests/methods/methods4.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/methods/methods4.kt rename to java/ql/test-kotlin1/library-tests/methods/methods4.kt diff --git a/java/ql/test/kotlin/library-tests/methods/methods5.kt b/java/ql/test-kotlin1/library-tests/methods/methods5.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/methods/methods5.kt rename to java/ql/test-kotlin1/library-tests/methods/methods5.kt diff --git a/java/ql/test/kotlin/library-tests/methods/methods6.kt b/java/ql/test-kotlin1/library-tests/methods/methods6.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/methods/methods6.kt rename to java/ql/test-kotlin1/library-tests/methods/methods6.kt diff --git a/java/ql/test/kotlin/library-tests/methods/parameters.expected b/java/ql/test-kotlin1/library-tests/methods/parameters.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/methods/parameters.expected rename to java/ql/test-kotlin1/library-tests/methods/parameters.expected diff --git a/java/ql/test/kotlin/library-tests/methods/parameters.ql b/java/ql/test-kotlin1/library-tests/methods/parameters.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/methods/parameters.ql rename to java/ql/test-kotlin1/library-tests/methods/parameters.ql diff --git a/java/ql/test/kotlin/library-tests/ministdlib/MiniStdLib.kt b/java/ql/test-kotlin1/library-tests/ministdlib/MiniStdLib.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/ministdlib/MiniStdLib.kt rename to java/ql/test-kotlin1/library-tests/ministdlib/MiniStdLib.kt diff --git a/java/ql/test/kotlin/library-tests/ministdlib/MyClass.kt b/java/ql/test-kotlin1/library-tests/ministdlib/MyClass.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/ministdlib/MyClass.kt rename to java/ql/test-kotlin1/library-tests/ministdlib/MyClass.kt diff --git a/java/ql/test/kotlin/library-tests/ministdlib/classes.expected b/java/ql/test-kotlin1/library-tests/ministdlib/classes.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/ministdlib/classes.expected rename to java/ql/test-kotlin1/library-tests/ministdlib/classes.expected diff --git a/java/ql/test/kotlin/library-tests/ministdlib/classes.ql b/java/ql/test-kotlin1/library-tests/ministdlib/classes.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/ministdlib/classes.ql rename to java/ql/test-kotlin1/library-tests/ministdlib/classes.ql diff --git a/java/ql/test/kotlin/library-tests/ministdlib/options b/java/ql/test-kotlin1/library-tests/ministdlib/options similarity index 100% rename from java/ql/test/kotlin/library-tests/ministdlib/options rename to java/ql/test-kotlin1/library-tests/ministdlib/options diff --git a/java/ql/test/kotlin/library-tests/mixed-java-and-kotlin/Q.java b/java/ql/test-kotlin1/library-tests/mixed-java-and-kotlin/Q.java similarity index 100% rename from java/ql/test/kotlin/library-tests/mixed-java-and-kotlin/Q.java rename to java/ql/test-kotlin1/library-tests/mixed-java-and-kotlin/Q.java diff --git a/java/ql/test/kotlin/library-tests/mixed-java-and-kotlin/W.kt b/java/ql/test-kotlin1/library-tests/mixed-java-and-kotlin/W.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/mixed-java-and-kotlin/W.kt rename to java/ql/test-kotlin1/library-tests/mixed-java-and-kotlin/W.kt diff --git a/java/ql/test/kotlin/library-tests/mixed-java-and-kotlin/test.expected b/java/ql/test-kotlin1/library-tests/mixed-java-and-kotlin/test.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/mixed-java-and-kotlin/test.expected rename to java/ql/test-kotlin1/library-tests/mixed-java-and-kotlin/test.expected diff --git a/java/ql/test/kotlin/library-tests/mixed-java-and-kotlin/test.ql b/java/ql/test-kotlin1/library-tests/mixed-java-and-kotlin/test.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/mixed-java-and-kotlin/test.ql rename to java/ql/test-kotlin1/library-tests/mixed-java-and-kotlin/test.ql diff --git a/java/ql/test/kotlin/library-tests/modifiers/modifiers.expected b/java/ql/test-kotlin1/library-tests/modifiers/modifiers.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/modifiers/modifiers.expected rename to java/ql/test-kotlin1/library-tests/modifiers/modifiers.expected diff --git a/java/ql/test/kotlin/library-tests/modifiers/modifiers.kt b/java/ql/test-kotlin1/library-tests/modifiers/modifiers.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/modifiers/modifiers.kt rename to java/ql/test-kotlin1/library-tests/modifiers/modifiers.kt diff --git a/java/ql/test/kotlin/library-tests/modifiers/modifiers.ql b/java/ql/test-kotlin1/library-tests/modifiers/modifiers.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/modifiers/modifiers.ql rename to java/ql/test-kotlin1/library-tests/modifiers/modifiers.ql diff --git a/java/ql/test/kotlin/library-tests/multiple_extensions/calls.expected b/java/ql/test-kotlin1/library-tests/multiple_extensions/calls.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/multiple_extensions/calls.expected rename to java/ql/test-kotlin1/library-tests/multiple_extensions/calls.expected diff --git a/java/ql/test/kotlin/library-tests/multiple_extensions/calls.ql b/java/ql/test-kotlin1/library-tests/multiple_extensions/calls.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/multiple_extensions/calls.ql rename to java/ql/test-kotlin1/library-tests/multiple_extensions/calls.ql diff --git a/java/ql/test/kotlin/library-tests/multiple_extensions/test.kt b/java/ql/test-kotlin1/library-tests/multiple_extensions/test.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/multiple_extensions/test.kt rename to java/ql/test-kotlin1/library-tests/multiple_extensions/test.kt diff --git a/java/ql/test/kotlin/library-tests/multiple_files/classes.expected b/java/ql/test-kotlin1/library-tests/multiple_files/classes.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/multiple_files/classes.expected rename to java/ql/test-kotlin1/library-tests/multiple_files/classes.expected diff --git a/java/ql/test/kotlin/library-tests/multiple_files/classes.ql b/java/ql/test-kotlin1/library-tests/multiple_files/classes.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/multiple_files/classes.ql rename to java/ql/test-kotlin1/library-tests/multiple_files/classes.ql diff --git a/java/ql/test/kotlin/library-tests/multiple_files/file1.kt b/java/ql/test-kotlin1/library-tests/multiple_files/file1.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/multiple_files/file1.kt rename to java/ql/test-kotlin1/library-tests/multiple_files/file1.kt diff --git a/java/ql/test/kotlin/library-tests/multiple_files/file2.kt b/java/ql/test-kotlin1/library-tests/multiple_files/file2.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/multiple_files/file2.kt rename to java/ql/test-kotlin1/library-tests/multiple_files/file2.kt diff --git a/java/ql/test/kotlin/library-tests/multiple_files/file3.kt b/java/ql/test-kotlin1/library-tests/multiple_files/file3.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/multiple_files/file3.kt rename to java/ql/test-kotlin1/library-tests/multiple_files/file3.kt diff --git a/java/ql/test/kotlin/library-tests/multiple_files/file4.kt b/java/ql/test-kotlin1/library-tests/multiple_files/file4.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/multiple_files/file4.kt rename to java/ql/test-kotlin1/library-tests/multiple_files/file4.kt diff --git a/java/ql/test/kotlin/library-tests/multiple_files/method_accesses.expected b/java/ql/test-kotlin1/library-tests/multiple_files/method_accesses.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/multiple_files/method_accesses.expected rename to java/ql/test-kotlin1/library-tests/multiple_files/method_accesses.expected diff --git a/java/ql/test/kotlin/library-tests/multiple_files/method_accesses.ql b/java/ql/test-kotlin1/library-tests/multiple_files/method_accesses.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/multiple_files/method_accesses.ql rename to java/ql/test-kotlin1/library-tests/multiple_files/method_accesses.ql diff --git a/java/ql/test/kotlin/library-tests/multiple_files/methods.expected b/java/ql/test-kotlin1/library-tests/multiple_files/methods.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/multiple_files/methods.expected rename to java/ql/test-kotlin1/library-tests/multiple_files/methods.expected diff --git a/java/ql/test/kotlin/library-tests/multiple_files/methods.ql b/java/ql/test-kotlin1/library-tests/multiple_files/methods.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/multiple_files/methods.ql rename to java/ql/test-kotlin1/library-tests/multiple_files/methods.ql diff --git a/java/ql/test/kotlin/library-tests/no-when-branch-found/test.expected b/java/ql/test-kotlin1/library-tests/no-when-branch-found/test.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/no-when-branch-found/test.expected rename to java/ql/test-kotlin1/library-tests/no-when-branch-found/test.expected diff --git a/java/ql/test/kotlin/library-tests/no-when-branch-found/test.kt b/java/ql/test-kotlin1/library-tests/no-when-branch-found/test.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/no-when-branch-found/test.kt rename to java/ql/test-kotlin1/library-tests/no-when-branch-found/test.kt diff --git a/java/ql/test/kotlin/library-tests/no-when-branch-found/test.ql b/java/ql/test-kotlin1/library-tests/no-when-branch-found/test.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/no-when-branch-found/test.ql rename to java/ql/test-kotlin1/library-tests/no-when-branch-found/test.ql diff --git a/java/ql/test/kotlin/library-tests/numlines/callable.expected b/java/ql/test-kotlin1/library-tests/numlines/callable.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/numlines/callable.expected rename to java/ql/test-kotlin1/library-tests/numlines/callable.expected diff --git a/java/ql/test/kotlin/library-tests/numlines/callable.ql b/java/ql/test-kotlin1/library-tests/numlines/callable.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/numlines/callable.ql rename to java/ql/test-kotlin1/library-tests/numlines/callable.ql diff --git a/java/ql/test/kotlin/library-tests/numlines/classes.expected b/java/ql/test-kotlin1/library-tests/numlines/classes.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/numlines/classes.expected rename to java/ql/test-kotlin1/library-tests/numlines/classes.expected diff --git a/java/ql/test/kotlin/library-tests/numlines/classes.ql b/java/ql/test-kotlin1/library-tests/numlines/classes.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/numlines/classes.ql rename to java/ql/test-kotlin1/library-tests/numlines/classes.ql diff --git a/java/ql/test/kotlin/library-tests/numlines/files.expected b/java/ql/test-kotlin1/library-tests/numlines/files.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/numlines/files.expected rename to java/ql/test-kotlin1/library-tests/numlines/files.expected diff --git a/java/ql/test/kotlin/library-tests/numlines/files.ql b/java/ql/test-kotlin1/library-tests/numlines/files.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/numlines/files.ql rename to java/ql/test-kotlin1/library-tests/numlines/files.ql diff --git a/java/ql/test/kotlin/library-tests/numlines/test.kt b/java/ql/test-kotlin1/library-tests/numlines/test.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/numlines/test.kt rename to java/ql/test-kotlin1/library-tests/numlines/test.kt diff --git a/java/ql/test/kotlin/library-tests/object/accesses.expected b/java/ql/test-kotlin1/library-tests/object/accesses.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/object/accesses.expected rename to java/ql/test-kotlin1/library-tests/object/accesses.expected diff --git a/java/ql/test/kotlin/library-tests/object/accesses.ql b/java/ql/test-kotlin1/library-tests/object/accesses.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/object/accesses.ql rename to java/ql/test-kotlin1/library-tests/object/accesses.ql diff --git a/java/ql/test/kotlin/library-tests/object/objects.expected b/java/ql/test-kotlin1/library-tests/object/objects.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/object/objects.expected rename to java/ql/test-kotlin1/library-tests/object/objects.expected diff --git a/java/ql/test/kotlin/library-tests/object/objects.kt b/java/ql/test-kotlin1/library-tests/object/objects.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/object/objects.kt rename to java/ql/test-kotlin1/library-tests/object/objects.kt diff --git a/java/ql/test/kotlin/library-tests/object/objects.ql b/java/ql/test-kotlin1/library-tests/object/objects.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/object/objects.ql rename to java/ql/test-kotlin1/library-tests/object/objects.ql diff --git a/java/ql/test/kotlin/library-tests/operator-overloads/PrintAst.expected b/java/ql/test-kotlin1/library-tests/operator-overloads/PrintAst.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/operator-overloads/PrintAst.expected rename to java/ql/test-kotlin1/library-tests/operator-overloads/PrintAst.expected diff --git a/java/ql/test/kotlin/library-tests/operator-overloads/PrintAst.qlref b/java/ql/test-kotlin1/library-tests/operator-overloads/PrintAst.qlref similarity index 100% rename from java/ql/test/kotlin/library-tests/operator-overloads/PrintAst.qlref rename to java/ql/test-kotlin1/library-tests/operator-overloads/PrintAst.qlref diff --git a/java/ql/test/kotlin/library-tests/reflection/checkParameterCounts.expected b/java/ql/test-kotlin1/library-tests/operator-overloads/test.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/reflection/checkParameterCounts.expected rename to java/ql/test-kotlin1/library-tests/operator-overloads/test.expected diff --git a/java/ql/test/kotlin/library-tests/operator-overloads/test.kt b/java/ql/test-kotlin1/library-tests/operator-overloads/test.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/operator-overloads/test.kt rename to java/ql/test-kotlin1/library-tests/operator-overloads/test.kt diff --git a/java/ql/test/kotlin/library-tests/operator-overloads/test.ql b/java/ql/test-kotlin1/library-tests/operator-overloads/test.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/operator-overloads/test.ql rename to java/ql/test-kotlin1/library-tests/operator-overloads/test.ql diff --git a/java/ql/test/kotlin/library-tests/parameter-defaults/PrintAst.expected b/java/ql/test-kotlin1/library-tests/parameter-defaults/PrintAst.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/parameter-defaults/PrintAst.expected rename to java/ql/test-kotlin1/library-tests/parameter-defaults/PrintAst.expected diff --git a/java/ql/test/kotlin/library-tests/parameter-defaults/PrintAst.qlref b/java/ql/test-kotlin1/library-tests/parameter-defaults/PrintAst.qlref similarity index 100% rename from java/ql/test/kotlin/library-tests/parameter-defaults/PrintAst.qlref rename to java/ql/test-kotlin1/library-tests/parameter-defaults/PrintAst.qlref diff --git a/java/ql/test/kotlin/library-tests/parameter-defaults/defaults.expected b/java/ql/test-kotlin1/library-tests/parameter-defaults/defaults.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/parameter-defaults/defaults.expected rename to java/ql/test-kotlin1/library-tests/parameter-defaults/defaults.expected diff --git a/java/ql/test/kotlin/library-tests/parameter-defaults/defaults.ql b/java/ql/test-kotlin1/library-tests/parameter-defaults/defaults.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/parameter-defaults/defaults.ql rename to java/ql/test-kotlin1/library-tests/parameter-defaults/defaults.ql diff --git a/java/ql/test/kotlin/library-tests/parameter-defaults/erasure.expected b/java/ql/test-kotlin1/library-tests/parameter-defaults/erasure.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/parameter-defaults/erasure.expected rename to java/ql/test-kotlin1/library-tests/parameter-defaults/erasure.expected diff --git a/java/ql/test/kotlin/library-tests/parameter-defaults/erasure.ql b/java/ql/test-kotlin1/library-tests/parameter-defaults/erasure.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/parameter-defaults/erasure.ql rename to java/ql/test-kotlin1/library-tests/parameter-defaults/erasure.ql diff --git a/java/ql/test/kotlin/library-tests/parameter-defaults/flowTest.expected b/java/ql/test-kotlin1/library-tests/parameter-defaults/flowTest.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/parameter-defaults/flowTest.expected rename to java/ql/test-kotlin1/library-tests/parameter-defaults/flowTest.expected diff --git a/java/ql/test/kotlin/library-tests/parameter-defaults/flowTest.ql b/java/ql/test-kotlin1/library-tests/parameter-defaults/flowTest.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/parameter-defaults/flowTest.ql rename to java/ql/test-kotlin1/library-tests/parameter-defaults/flowTest.ql diff --git a/java/ql/test/kotlin/library-tests/parameter-defaults/test.kt b/java/ql/test-kotlin1/library-tests/parameter-defaults/test.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/parameter-defaults/test.kt rename to java/ql/test-kotlin1/library-tests/parameter-defaults/test.kt diff --git a/java/ql/test/kotlin/library-tests/private-anonymous-types/other.kt b/java/ql/test-kotlin1/library-tests/private-anonymous-types/other.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/private-anonymous-types/other.kt rename to java/ql/test-kotlin1/library-tests/private-anonymous-types/other.kt diff --git a/java/ql/test/kotlin/library-tests/private-anonymous-types/test.expected b/java/ql/test-kotlin1/library-tests/private-anonymous-types/test.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/private-anonymous-types/test.expected rename to java/ql/test-kotlin1/library-tests/private-anonymous-types/test.expected diff --git a/java/ql/test/kotlin/library-tests/private-anonymous-types/test.kt b/java/ql/test-kotlin1/library-tests/private-anonymous-types/test.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/private-anonymous-types/test.kt rename to java/ql/test-kotlin1/library-tests/private-anonymous-types/test.kt diff --git a/java/ql/test/kotlin/library-tests/private-anonymous-types/test.ql b/java/ql/test-kotlin1/library-tests/private-anonymous-types/test.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/private-anonymous-types/test.ql rename to java/ql/test-kotlin1/library-tests/private-anonymous-types/test.ql diff --git a/java/ql/test/kotlin/library-tests/properties/properties.expected b/java/ql/test-kotlin1/library-tests/properties/properties.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/properties/properties.expected rename to java/ql/test-kotlin1/library-tests/properties/properties.expected diff --git a/java/ql/test/kotlin/library-tests/properties/properties.kt b/java/ql/test-kotlin1/library-tests/properties/properties.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/properties/properties.kt rename to java/ql/test-kotlin1/library-tests/properties/properties.kt diff --git a/java/ql/test/kotlin/library-tests/properties/properties.ql b/java/ql/test-kotlin1/library-tests/properties/properties.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/properties/properties.ql rename to java/ql/test-kotlin1/library-tests/properties/properties.ql diff --git a/java/ql/test/kotlin/library-tests/recursive-instantiations/stack-overflow-1/BaseFoo.java b/java/ql/test-kotlin1/library-tests/recursive-instantiations/stack-overflow-1/BaseFoo.java similarity index 100% rename from java/ql/test/kotlin/library-tests/recursive-instantiations/stack-overflow-1/BaseFoo.java rename to java/ql/test-kotlin1/library-tests/recursive-instantiations/stack-overflow-1/BaseFoo.java diff --git a/java/ql/test/kotlin/library-tests/recursive-instantiations/stack-overflow-1/Foo.java b/java/ql/test-kotlin1/library-tests/recursive-instantiations/stack-overflow-1/Foo.java similarity index 100% rename from java/ql/test/kotlin/library-tests/recursive-instantiations/stack-overflow-1/Foo.java rename to java/ql/test-kotlin1/library-tests/recursive-instantiations/stack-overflow-1/Foo.java diff --git a/java/ql/test/kotlin/library-tests/recursive-instantiations/stack-overflow-1/classes.expected b/java/ql/test-kotlin1/library-tests/recursive-instantiations/stack-overflow-1/classes.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/recursive-instantiations/stack-overflow-1/classes.expected rename to java/ql/test-kotlin1/library-tests/recursive-instantiations/stack-overflow-1/classes.expected diff --git a/java/ql/test/kotlin/library-tests/recursive-instantiations/stack-overflow-1/classes.ql b/java/ql/test-kotlin1/library-tests/recursive-instantiations/stack-overflow-1/classes.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/recursive-instantiations/stack-overflow-1/classes.ql rename to java/ql/test-kotlin1/library-tests/recursive-instantiations/stack-overflow-1/classes.ql diff --git a/java/ql/test/kotlin/library-tests/recursive-instantiations/stack-overflow-1/test.kt b/java/ql/test-kotlin1/library-tests/recursive-instantiations/stack-overflow-1/test.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/recursive-instantiations/stack-overflow-1/test.kt rename to java/ql/test-kotlin1/library-tests/recursive-instantiations/stack-overflow-1/test.kt diff --git a/java/ql/test/kotlin/library-tests/recursive-instantiations/stack-overflow-2/classes.expected b/java/ql/test-kotlin1/library-tests/recursive-instantiations/stack-overflow-2/classes.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/recursive-instantiations/stack-overflow-2/classes.expected rename to java/ql/test-kotlin1/library-tests/recursive-instantiations/stack-overflow-2/classes.expected diff --git a/java/ql/test/kotlin/library-tests/recursive-instantiations/stack-overflow-2/classes.ql b/java/ql/test-kotlin1/library-tests/recursive-instantiations/stack-overflow-2/classes.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/recursive-instantiations/stack-overflow-2/classes.ql rename to java/ql/test-kotlin1/library-tests/recursive-instantiations/stack-overflow-2/classes.ql diff --git a/java/ql/test/kotlin/library-tests/recursive-instantiations/stack-overflow-2/stackOverflow.kt b/java/ql/test-kotlin1/library-tests/recursive-instantiations/stack-overflow-2/stackOverflow.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/recursive-instantiations/stack-overflow-2/stackOverflow.kt rename to java/ql/test-kotlin1/library-tests/recursive-instantiations/stack-overflow-2/stackOverflow.kt diff --git a/java/ql/test/kotlin/library-tests/reflection/PrintAst.expected b/java/ql/test-kotlin1/library-tests/reflection/PrintAst.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/reflection/PrintAst.expected rename to java/ql/test-kotlin1/library-tests/reflection/PrintAst.expected diff --git a/java/ql/test/kotlin/library-tests/reflection/PrintAst.qlref b/java/ql/test-kotlin1/library-tests/reflection/PrintAst.qlref similarity index 100% rename from java/ql/test/kotlin/library-tests/reflection/PrintAst.qlref rename to java/ql/test-kotlin1/library-tests/reflection/PrintAst.qlref diff --git a/java/ql/test/kotlin/query-tests/AbstractToConcreteCollection/AbstractToConcreteCollection.expected b/java/ql/test-kotlin1/library-tests/reflection/checkParameterCounts.expected similarity index 100% rename from java/ql/test/kotlin/query-tests/AbstractToConcreteCollection/AbstractToConcreteCollection.expected rename to java/ql/test-kotlin1/library-tests/reflection/checkParameterCounts.expected diff --git a/java/ql/test/kotlin/library-tests/reflection/checkParameterCounts.ql b/java/ql/test-kotlin1/library-tests/reflection/checkParameterCounts.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/reflection/checkParameterCounts.ql rename to java/ql/test-kotlin1/library-tests/reflection/checkParameterCounts.ql diff --git a/java/ql/test/kotlin/library-tests/reflection/reflection.expected b/java/ql/test-kotlin1/library-tests/reflection/reflection.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/reflection/reflection.expected rename to java/ql/test-kotlin1/library-tests/reflection/reflection.expected diff --git a/java/ql/test/kotlin/library-tests/reflection/reflection.kt b/java/ql/test-kotlin1/library-tests/reflection/reflection.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/reflection/reflection.kt rename to java/ql/test-kotlin1/library-tests/reflection/reflection.kt diff --git a/java/ql/test/kotlin/library-tests/reflection/reflection.ql b/java/ql/test-kotlin1/library-tests/reflection/reflection.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/reflection/reflection.ql rename to java/ql/test-kotlin1/library-tests/reflection/reflection.ql diff --git a/java/ql/test/kotlin/library-tests/special-method-getters/test.expected b/java/ql/test-kotlin1/library-tests/special-method-getters/test.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/special-method-getters/test.expected rename to java/ql/test-kotlin1/library-tests/special-method-getters/test.expected diff --git a/java/ql/test/kotlin/library-tests/special-method-getters/test.kt b/java/ql/test-kotlin1/library-tests/special-method-getters/test.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/special-method-getters/test.kt rename to java/ql/test-kotlin1/library-tests/special-method-getters/test.kt diff --git a/java/ql/test/kotlin/library-tests/special-method-getters/test.ql b/java/ql/test-kotlin1/library-tests/special-method-getters/test.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/special-method-getters/test.ql rename to java/ql/test-kotlin1/library-tests/special-method-getters/test.ql diff --git a/java/ql/test/kotlin/library-tests/static-method-calls/test.expected b/java/ql/test-kotlin1/library-tests/static-method-calls/test.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/static-method-calls/test.expected rename to java/ql/test-kotlin1/library-tests/static-method-calls/test.expected diff --git a/java/ql/test/kotlin/library-tests/static-method-calls/test.kt b/java/ql/test-kotlin1/library-tests/static-method-calls/test.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/static-method-calls/test.kt rename to java/ql/test-kotlin1/library-tests/static-method-calls/test.kt diff --git a/java/ql/test/kotlin/library-tests/static-method-calls/test.ql b/java/ql/test-kotlin1/library-tests/static-method-calls/test.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/static-method-calls/test.ql rename to java/ql/test-kotlin1/library-tests/static-method-calls/test.ql diff --git a/java/ql/test/kotlin/library-tests/stmts/PrintAst.expected b/java/ql/test-kotlin1/library-tests/stmts/PrintAst.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/stmts/PrintAst.expected rename to java/ql/test-kotlin1/library-tests/stmts/PrintAst.expected diff --git a/java/ql/test/kotlin/library-tests/stmts/PrintAst.qlref b/java/ql/test-kotlin1/library-tests/stmts/PrintAst.qlref similarity index 100% rename from java/ql/test/kotlin/library-tests/stmts/PrintAst.qlref rename to java/ql/test-kotlin1/library-tests/stmts/PrintAst.qlref diff --git a/java/ql/test/kotlin/library-tests/stmts/exprs.expected b/java/ql/test-kotlin1/library-tests/stmts/exprs.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/stmts/exprs.expected rename to java/ql/test-kotlin1/library-tests/stmts/exprs.expected diff --git a/java/ql/test/kotlin/library-tests/stmts/exprs.ql b/java/ql/test-kotlin1/library-tests/stmts/exprs.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/stmts/exprs.ql rename to java/ql/test-kotlin1/library-tests/stmts/exprs.ql diff --git a/java/ql/test/kotlin/library-tests/stmts/loops.expected b/java/ql/test-kotlin1/library-tests/stmts/loops.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/stmts/loops.expected rename to java/ql/test-kotlin1/library-tests/stmts/loops.expected diff --git a/java/ql/test/kotlin/library-tests/stmts/loops.ql b/java/ql/test-kotlin1/library-tests/stmts/loops.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/stmts/loops.ql rename to java/ql/test-kotlin1/library-tests/stmts/loops.ql diff --git a/java/ql/test/kotlin/library-tests/stmts/stmts.expected b/java/ql/test-kotlin1/library-tests/stmts/stmts.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/stmts/stmts.expected rename to java/ql/test-kotlin1/library-tests/stmts/stmts.expected diff --git a/java/ql/test/kotlin/library-tests/stmts/stmts.kt b/java/ql/test-kotlin1/library-tests/stmts/stmts.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/stmts/stmts.kt rename to java/ql/test-kotlin1/library-tests/stmts/stmts.kt diff --git a/java/ql/test/kotlin/library-tests/stmts/stmts.ql b/java/ql/test-kotlin1/library-tests/stmts/stmts.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/stmts/stmts.ql rename to java/ql/test-kotlin1/library-tests/stmts/stmts.ql diff --git a/java/ql/test/kotlin/library-tests/stmts/tryStmts.expected b/java/ql/test-kotlin1/library-tests/stmts/tryStmts.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/stmts/tryStmts.expected rename to java/ql/test-kotlin1/library-tests/stmts/tryStmts.expected diff --git a/java/ql/test/kotlin/library-tests/stmts/tryStmts.ql b/java/ql/test-kotlin1/library-tests/stmts/tryStmts.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/stmts/tryStmts.ql rename to java/ql/test-kotlin1/library-tests/stmts/tryStmts.ql diff --git a/java/ql/test/kotlin/library-tests/string-charat/Test.java b/java/ql/test-kotlin1/library-tests/string-charat/Test.java similarity index 100% rename from java/ql/test/kotlin/library-tests/string-charat/Test.java rename to java/ql/test-kotlin1/library-tests/string-charat/Test.java diff --git a/java/ql/test/kotlin/library-tests/string-charat/test.expected b/java/ql/test-kotlin1/library-tests/string-charat/test.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/string-charat/test.expected rename to java/ql/test-kotlin1/library-tests/string-charat/test.expected diff --git a/java/ql/test/kotlin/library-tests/string-charat/test.kt b/java/ql/test-kotlin1/library-tests/string-charat/test.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/string-charat/test.kt rename to java/ql/test-kotlin1/library-tests/string-charat/test.kt diff --git a/java/ql/test/kotlin/library-tests/string-charat/test.ql b/java/ql/test-kotlin1/library-tests/string-charat/test.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/string-charat/test.ql rename to java/ql/test-kotlin1/library-tests/string-charat/test.ql diff --git a/java/ql/test/kotlin/library-tests/super-method-calls/test.expected b/java/ql/test-kotlin1/library-tests/super-method-calls/test.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/super-method-calls/test.expected rename to java/ql/test-kotlin1/library-tests/super-method-calls/test.expected diff --git a/java/ql/test/kotlin/library-tests/super-method-calls/test.kt b/java/ql/test-kotlin1/library-tests/super-method-calls/test.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/super-method-calls/test.kt rename to java/ql/test-kotlin1/library-tests/super-method-calls/test.kt diff --git a/java/ql/test/kotlin/library-tests/super-method-calls/test.ql b/java/ql/test-kotlin1/library-tests/super-method-calls/test.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/super-method-calls/test.ql rename to java/ql/test-kotlin1/library-tests/super-method-calls/test.ql diff --git a/java/ql/test/kotlin/library-tests/this/call.expected b/java/ql/test-kotlin1/library-tests/this/call.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/this/call.expected rename to java/ql/test-kotlin1/library-tests/this/call.expected diff --git a/java/ql/test/kotlin/library-tests/this/call.ql b/java/ql/test-kotlin1/library-tests/this/call.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/this/call.ql rename to java/ql/test-kotlin1/library-tests/this/call.ql diff --git a/java/ql/test/kotlin/library-tests/this/this.expected b/java/ql/test-kotlin1/library-tests/this/this.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/this/this.expected rename to java/ql/test-kotlin1/library-tests/this/this.expected diff --git a/java/ql/test/kotlin/library-tests/this/this.kt b/java/ql/test-kotlin1/library-tests/this/this.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/this/this.kt rename to java/ql/test-kotlin1/library-tests/this/this.kt diff --git a/java/ql/test/kotlin/library-tests/this/this.ql b/java/ql/test-kotlin1/library-tests/this/this.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/this/this.ql rename to java/ql/test-kotlin1/library-tests/this/this.ql diff --git a/java/ql/test/kotlin/library-tests/trap/comments.expected b/java/ql/test-kotlin1/library-tests/trap/comments.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/trap/comments.expected rename to java/ql/test-kotlin1/library-tests/trap/comments.expected diff --git a/java/ql/test/kotlin/library-tests/trap/comments.ql b/java/ql/test-kotlin1/library-tests/trap/comments.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/trap/comments.ql rename to java/ql/test-kotlin1/library-tests/trap/comments.ql diff --git a/java/ql/test/kotlin/library-tests/trap/diags.expected b/java/ql/test-kotlin1/library-tests/trap/diags.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/trap/diags.expected rename to java/ql/test-kotlin1/library-tests/trap/diags.expected diff --git a/java/ql/test/kotlin/library-tests/trap/diags.ql b/java/ql/test-kotlin1/library-tests/trap/diags.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/trap/diags.ql rename to java/ql/test-kotlin1/library-tests/trap/diags.ql diff --git a/java/ql/test/kotlin/library-tests/trap/literals.expected b/java/ql/test-kotlin1/library-tests/trap/literals.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/trap/literals.expected rename to java/ql/test-kotlin1/library-tests/trap/literals.expected diff --git a/java/ql/test/kotlin/library-tests/trap/literals.ql b/java/ql/test-kotlin1/library-tests/trap/literals.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/trap/literals.ql rename to java/ql/test-kotlin1/library-tests/trap/literals.ql diff --git a/java/ql/test/kotlin/library-tests/trap/long_comments.kt b/java/ql/test-kotlin1/library-tests/trap/long_comments.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/trap/long_comments.kt rename to java/ql/test-kotlin1/library-tests/trap/long_comments.kt diff --git a/java/ql/test/kotlin/library-tests/trap/long_string.kt b/java/ql/test-kotlin1/library-tests/trap/long_string.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/trap/long_string.kt rename to java/ql/test-kotlin1/library-tests/trap/long_string.kt diff --git a/java/ql/test/kotlin/library-tests/trivial/Trivial.kt b/java/ql/test-kotlin1/library-tests/trivial/Trivial.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/trivial/Trivial.kt rename to java/ql/test-kotlin1/library-tests/trivial/Trivial.kt diff --git a/java/ql/test/kotlin/library-tests/trivial/elements.expected b/java/ql/test-kotlin1/library-tests/trivial/elements.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/trivial/elements.expected rename to java/ql/test-kotlin1/library-tests/trivial/elements.expected diff --git a/java/ql/test/kotlin/library-tests/trivial/elements.ql b/java/ql/test-kotlin1/library-tests/trivial/elements.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/trivial/elements.ql rename to java/ql/test-kotlin1/library-tests/trivial/elements.ql diff --git a/java/ql/test/kotlin/library-tests/type_aliases/aliases_with_type_parameters.kt b/java/ql/test-kotlin1/library-tests/type_aliases/aliases_with_type_parameters.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/type_aliases/aliases_with_type_parameters.kt rename to java/ql/test-kotlin1/library-tests/type_aliases/aliases_with_type_parameters.kt diff --git a/java/ql/test/kotlin/library-tests/type_aliases/test.kt b/java/ql/test-kotlin1/library-tests/type_aliases/test.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/type_aliases/test.kt rename to java/ql/test-kotlin1/library-tests/type_aliases/test.kt diff --git a/java/ql/test/kotlin/library-tests/type_aliases/type_aliases.expected b/java/ql/test-kotlin1/library-tests/type_aliases/type_aliases.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/type_aliases/type_aliases.expected rename to java/ql/test-kotlin1/library-tests/type_aliases/type_aliases.expected diff --git a/java/ql/test/kotlin/library-tests/type_aliases/type_aliases.ql b/java/ql/test-kotlin1/library-tests/type_aliases/type_aliases.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/type_aliases/type_aliases.ql rename to java/ql/test-kotlin1/library-tests/type_aliases/type_aliases.ql diff --git a/java/ql/test/kotlin/library-tests/type_equivalences/type_equivalences.expected b/java/ql/test-kotlin1/library-tests/type_equivalences/type_equivalences.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/type_equivalences/type_equivalences.expected rename to java/ql/test-kotlin1/library-tests/type_equivalences/type_equivalences.expected diff --git a/java/ql/test/kotlin/library-tests/type_equivalences/type_equivalences.kt b/java/ql/test-kotlin1/library-tests/type_equivalences/type_equivalences.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/type_equivalences/type_equivalences.kt rename to java/ql/test-kotlin1/library-tests/type_equivalences/type_equivalences.kt diff --git a/java/ql/test/kotlin/library-tests/type_equivalences/type_equivalences.ql b/java/ql/test-kotlin1/library-tests/type_equivalences/type_equivalences.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/type_equivalences/type_equivalences.ql rename to java/ql/test-kotlin1/library-tests/type_equivalences/type_equivalences.ql diff --git a/java/ql/test/kotlin/library-tests/types/types.expected b/java/ql/test-kotlin1/library-tests/types/types.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/types/types.expected rename to java/ql/test-kotlin1/library-tests/types/types.expected diff --git a/java/ql/test/kotlin/library-tests/types/types.kt b/java/ql/test-kotlin1/library-tests/types/types.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/types/types.kt rename to java/ql/test-kotlin1/library-tests/types/types.kt diff --git a/java/ql/test/kotlin/library-tests/types/types.ql b/java/ql/test-kotlin1/library-tests/types/types.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/types/types.ql rename to java/ql/test-kotlin1/library-tests/types/types.ql diff --git a/java/ql/test/kotlin/library-tests/underscore-parameters/test.expected b/java/ql/test-kotlin1/library-tests/underscore-parameters/test.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/underscore-parameters/test.expected rename to java/ql/test-kotlin1/library-tests/underscore-parameters/test.expected diff --git a/java/ql/test/kotlin/library-tests/underscore-parameters/test.kt b/java/ql/test-kotlin1/library-tests/underscore-parameters/test.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/underscore-parameters/test.kt rename to java/ql/test-kotlin1/library-tests/underscore-parameters/test.kt diff --git a/java/ql/test/kotlin/library-tests/underscore-parameters/test.ql b/java/ql/test-kotlin1/library-tests/underscore-parameters/test.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/underscore-parameters/test.ql rename to java/ql/test-kotlin1/library-tests/underscore-parameters/test.ql diff --git a/java/ql/test/kotlin/library-tests/vararg/args.expected b/java/ql/test-kotlin1/library-tests/vararg/args.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/vararg/args.expected rename to java/ql/test-kotlin1/library-tests/vararg/args.expected diff --git a/java/ql/test/kotlin/library-tests/vararg/args.ql b/java/ql/test-kotlin1/library-tests/vararg/args.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/vararg/args.ql rename to java/ql/test-kotlin1/library-tests/vararg/args.ql diff --git a/java/ql/test/kotlin/library-tests/vararg/dataflow.expected b/java/ql/test-kotlin1/library-tests/vararg/dataflow.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/vararg/dataflow.expected rename to java/ql/test-kotlin1/library-tests/vararg/dataflow.expected diff --git a/java/ql/test/kotlin/library-tests/vararg/dataflow.ql b/java/ql/test-kotlin1/library-tests/vararg/dataflow.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/vararg/dataflow.ql rename to java/ql/test-kotlin1/library-tests/vararg/dataflow.ql diff --git a/java/ql/test/kotlin/library-tests/vararg/intList.kt b/java/ql/test-kotlin1/library-tests/vararg/intList.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/vararg/intList.kt rename to java/ql/test-kotlin1/library-tests/vararg/intList.kt diff --git a/java/ql/test/kotlin/library-tests/vararg/test.kt b/java/ql/test-kotlin1/library-tests/vararg/test.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/vararg/test.kt rename to java/ql/test-kotlin1/library-tests/vararg/test.kt diff --git a/java/ql/test/kotlin/library-tests/variables/variableAccesses.expected b/java/ql/test-kotlin1/library-tests/variables/variableAccesses.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/variables/variableAccesses.expected rename to java/ql/test-kotlin1/library-tests/variables/variableAccesses.expected diff --git a/java/ql/test/kotlin/library-tests/variables/variableAccesses.ql b/java/ql/test-kotlin1/library-tests/variables/variableAccesses.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/variables/variableAccesses.ql rename to java/ql/test-kotlin1/library-tests/variables/variableAccesses.ql diff --git a/java/ql/test/kotlin/library-tests/variables/variables.expected b/java/ql/test-kotlin1/library-tests/variables/variables.expected similarity index 100% rename from java/ql/test/kotlin/library-tests/variables/variables.expected rename to java/ql/test-kotlin1/library-tests/variables/variables.expected diff --git a/java/ql/test/kotlin/library-tests/variables/variables.kt b/java/ql/test-kotlin1/library-tests/variables/variables.kt similarity index 100% rename from java/ql/test/kotlin/library-tests/variables/variables.kt rename to java/ql/test-kotlin1/library-tests/variables/variables.kt diff --git a/java/ql/test/kotlin/library-tests/variables/variables.ql b/java/ql/test-kotlin1/library-tests/variables/variables.ql similarity index 100% rename from java/ql/test/kotlin/library-tests/variables/variables.ql rename to java/ql/test-kotlin1/library-tests/variables/variables.ql diff --git a/java/ql/test-kotlin1/qlpack.yml b/java/ql/test-kotlin1/qlpack.yml new file mode 100644 index 00000000000..6ca37f3eec9 --- /dev/null +++ b/java/ql/test-kotlin1/qlpack.yml @@ -0,0 +1,8 @@ +name: codeql/java-kotlin1-tests +groups: [java, test] +dependencies: + codeql/java-all: ${workspace} + codeql/java-queries: ${workspace} +extractor: java +tests: . +warnOnImplicitThis: true diff --git a/java/ql/test/kotlin/query-tests/AutoBoxing/AutoBoxing.expected b/java/ql/test-kotlin1/query-tests/AbstractToConcreteCollection/AbstractToConcreteCollection.expected similarity index 100% rename from java/ql/test/kotlin/query-tests/AutoBoxing/AutoBoxing.expected rename to java/ql/test-kotlin1/query-tests/AbstractToConcreteCollection/AbstractToConcreteCollection.expected diff --git a/java/ql/test/kotlin/query-tests/AbstractToConcreteCollection/AbstractToConcreteCollection.qlref b/java/ql/test-kotlin1/query-tests/AbstractToConcreteCollection/AbstractToConcreteCollection.qlref similarity index 100% rename from java/ql/test/kotlin/query-tests/AbstractToConcreteCollection/AbstractToConcreteCollection.qlref rename to java/ql/test-kotlin1/query-tests/AbstractToConcreteCollection/AbstractToConcreteCollection.qlref diff --git a/java/ql/test/kotlin/query-tests/AbstractToConcreteCollection/Test.kt b/java/ql/test-kotlin1/query-tests/AbstractToConcreteCollection/Test.kt similarity index 100% rename from java/ql/test/kotlin/query-tests/AbstractToConcreteCollection/Test.kt rename to java/ql/test-kotlin1/query-tests/AbstractToConcreteCollection/Test.kt diff --git a/java/ql/test/kotlin/query-tests/CloseReader/CloseReader.expected b/java/ql/test-kotlin1/query-tests/AutoBoxing/AutoBoxing.expected similarity index 100% rename from java/ql/test/kotlin/query-tests/CloseReader/CloseReader.expected rename to java/ql/test-kotlin1/query-tests/AutoBoxing/AutoBoxing.expected diff --git a/java/ql/test/kotlin/query-tests/AutoBoxing/AutoBoxing.qlref b/java/ql/test-kotlin1/query-tests/AutoBoxing/AutoBoxing.qlref similarity index 100% rename from java/ql/test/kotlin/query-tests/AutoBoxing/AutoBoxing.qlref rename to java/ql/test-kotlin1/query-tests/AutoBoxing/AutoBoxing.qlref diff --git a/java/ql/test/kotlin/query-tests/AutoBoxing/Test.kt b/java/ql/test-kotlin1/query-tests/AutoBoxing/Test.kt similarity index 100% rename from java/ql/test/kotlin/query-tests/AutoBoxing/Test.kt rename to java/ql/test-kotlin1/query-tests/AutoBoxing/Test.kt diff --git a/java/ql/test/kotlin/query-tests/CloseWriter/CloseWriter.expected b/java/ql/test-kotlin1/query-tests/CloseReader/CloseReader.expected similarity index 100% rename from java/ql/test/kotlin/query-tests/CloseWriter/CloseWriter.expected rename to java/ql/test-kotlin1/query-tests/CloseReader/CloseReader.expected diff --git a/java/ql/test/kotlin/query-tests/CloseReader/CloseReader.kt b/java/ql/test-kotlin1/query-tests/CloseReader/CloseReader.kt similarity index 100% rename from java/ql/test/kotlin/query-tests/CloseReader/CloseReader.kt rename to java/ql/test-kotlin1/query-tests/CloseReader/CloseReader.kt diff --git a/java/ql/test/kotlin/query-tests/CloseReader/CloseReader.qlref b/java/ql/test-kotlin1/query-tests/CloseReader/CloseReader.qlref similarity index 100% rename from java/ql/test/kotlin/query-tests/CloseReader/CloseReader.qlref rename to java/ql/test-kotlin1/query-tests/CloseReader/CloseReader.qlref diff --git a/java/ql/test/kotlin/query-tests/ConfusingOverloading/ConfusingOverloading.expected b/java/ql/test-kotlin1/query-tests/CloseWriter/CloseWriter.expected similarity index 100% rename from java/ql/test/kotlin/query-tests/ConfusingOverloading/ConfusingOverloading.expected rename to java/ql/test-kotlin1/query-tests/CloseWriter/CloseWriter.expected diff --git a/java/ql/test/kotlin/query-tests/CloseWriter/CloseWriter.kt b/java/ql/test-kotlin1/query-tests/CloseWriter/CloseWriter.kt similarity index 100% rename from java/ql/test/kotlin/query-tests/CloseWriter/CloseWriter.kt rename to java/ql/test-kotlin1/query-tests/CloseWriter/CloseWriter.kt diff --git a/java/ql/test/kotlin/query-tests/CloseWriter/CloseWriter.qlref b/java/ql/test-kotlin1/query-tests/CloseWriter/CloseWriter.qlref similarity index 100% rename from java/ql/test/kotlin/query-tests/CloseWriter/CloseWriter.qlref rename to java/ql/test-kotlin1/query-tests/CloseWriter/CloseWriter.qlref diff --git a/java/ql/test/kotlin/query-tests/DeadCode/DeadClass.expected b/java/ql/test-kotlin1/query-tests/ConfusingOverloading/ConfusingOverloading.expected similarity index 100% rename from java/ql/test/kotlin/query-tests/DeadCode/DeadClass.expected rename to java/ql/test-kotlin1/query-tests/ConfusingOverloading/ConfusingOverloading.expected diff --git a/java/ql/test/kotlin/query-tests/ConfusingOverloading/ConfusingOverloading.qlref b/java/ql/test-kotlin1/query-tests/ConfusingOverloading/ConfusingOverloading.qlref similarity index 100% rename from java/ql/test/kotlin/query-tests/ConfusingOverloading/ConfusingOverloading.qlref rename to java/ql/test-kotlin1/query-tests/ConfusingOverloading/ConfusingOverloading.qlref diff --git a/java/ql/test/kotlin/query-tests/ConfusingOverloading/Test.kt b/java/ql/test-kotlin1/query-tests/ConfusingOverloading/Test.kt similarity index 100% rename from java/ql/test/kotlin/query-tests/ConfusingOverloading/Test.kt rename to java/ql/test-kotlin1/query-tests/ConfusingOverloading/Test.kt diff --git a/java/ql/test/kotlin/query-tests/ConstantLoopCondition/A.kt b/java/ql/test-kotlin1/query-tests/ConstantLoopCondition/A.kt similarity index 100% rename from java/ql/test/kotlin/query-tests/ConstantLoopCondition/A.kt rename to java/ql/test-kotlin1/query-tests/ConstantLoopCondition/A.kt diff --git a/java/ql/test/kotlin/query-tests/ConstantLoopCondition/ConstantLoopCondition.expected b/java/ql/test-kotlin1/query-tests/ConstantLoopCondition/ConstantLoopCondition.expected similarity index 100% rename from java/ql/test/kotlin/query-tests/ConstantLoopCondition/ConstantLoopCondition.expected rename to java/ql/test-kotlin1/query-tests/ConstantLoopCondition/ConstantLoopCondition.expected diff --git a/java/ql/test/kotlin/query-tests/ConstantLoopCondition/ConstantLoopCondition.qlref b/java/ql/test-kotlin1/query-tests/ConstantLoopCondition/ConstantLoopCondition.qlref similarity index 100% rename from java/ql/test/kotlin/query-tests/ConstantLoopCondition/ConstantLoopCondition.qlref rename to java/ql/test-kotlin1/query-tests/ConstantLoopCondition/ConstantLoopCondition.qlref diff --git a/java/ql/test/kotlin/query-tests/DeadCode/DeadMethod.expected b/java/ql/test-kotlin1/query-tests/DeadCode/DeadClass.expected similarity index 100% rename from java/ql/test/kotlin/query-tests/DeadCode/DeadMethod.expected rename to java/ql/test-kotlin1/query-tests/DeadCode/DeadClass.expected diff --git a/java/ql/test/kotlin/query-tests/DeadCode/DeadClass.qlref b/java/ql/test-kotlin1/query-tests/DeadCode/DeadClass.qlref similarity index 100% rename from java/ql/test/kotlin/query-tests/DeadCode/DeadClass.qlref rename to java/ql/test-kotlin1/query-tests/DeadCode/DeadClass.qlref diff --git a/java/ql/test/kotlin/query-tests/EmptyBlock/EmptyBlock.expected b/java/ql/test-kotlin1/query-tests/DeadCode/DeadMethod.expected similarity index 100% rename from java/ql/test/kotlin/query-tests/EmptyBlock/EmptyBlock.expected rename to java/ql/test-kotlin1/query-tests/DeadCode/DeadMethod.expected diff --git a/java/ql/test/kotlin/query-tests/DeadCode/DeadMethod.qlref b/java/ql/test-kotlin1/query-tests/DeadCode/DeadMethod.qlref similarity index 100% rename from java/ql/test/kotlin/query-tests/DeadCode/DeadMethod.qlref rename to java/ql/test-kotlin1/query-tests/DeadCode/DeadMethod.qlref diff --git a/java/ql/test/kotlin/query-tests/DeadCode/Test.kt b/java/ql/test-kotlin1/query-tests/DeadCode/Test.kt similarity index 100% rename from java/ql/test/kotlin/query-tests/DeadCode/Test.kt rename to java/ql/test-kotlin1/query-tests/DeadCode/Test.kt diff --git a/java/ql/test/kotlin/query-tests/DeadRefTypes/DeadRefTypes.expected b/java/ql/test-kotlin1/query-tests/DeadRefTypes/DeadRefTypes.expected similarity index 100% rename from java/ql/test/kotlin/query-tests/DeadRefTypes/DeadRefTypes.expected rename to java/ql/test-kotlin1/query-tests/DeadRefTypes/DeadRefTypes.expected diff --git a/java/ql/test/kotlin/query-tests/DeadRefTypes/DeadRefTypes.qlref b/java/ql/test-kotlin1/query-tests/DeadRefTypes/DeadRefTypes.qlref similarity index 100% rename from java/ql/test/kotlin/query-tests/DeadRefTypes/DeadRefTypes.qlref rename to java/ql/test-kotlin1/query-tests/DeadRefTypes/DeadRefTypes.qlref diff --git a/java/ql/test/kotlin/query-tests/DeadRefTypes/test.kt b/java/ql/test-kotlin1/query-tests/DeadRefTypes/test.kt similarity index 100% rename from java/ql/test/kotlin/query-tests/DeadRefTypes/test.kt rename to java/ql/test-kotlin1/query-tests/DeadRefTypes/test.kt diff --git a/java/ql/test/kotlin/query-tests/ExposeRepresentation/ExposeRepresentation.expected b/java/ql/test-kotlin1/query-tests/EmptyBlock/EmptyBlock.expected similarity index 100% rename from java/ql/test/kotlin/query-tests/ExposeRepresentation/ExposeRepresentation.expected rename to java/ql/test-kotlin1/query-tests/EmptyBlock/EmptyBlock.expected diff --git a/java/ql/test/kotlin/query-tests/EmptyBlock/EmptyBlock.qlref b/java/ql/test-kotlin1/query-tests/EmptyBlock/EmptyBlock.qlref similarity index 100% rename from java/ql/test/kotlin/query-tests/EmptyBlock/EmptyBlock.qlref rename to java/ql/test-kotlin1/query-tests/EmptyBlock/EmptyBlock.qlref diff --git a/java/ql/test/kotlin/query-tests/EmptyBlock/Test.kt b/java/ql/test-kotlin1/query-tests/EmptyBlock/Test.kt similarity index 100% rename from java/ql/test/kotlin/query-tests/EmptyBlock/Test.kt rename to java/ql/test-kotlin1/query-tests/EmptyBlock/Test.kt diff --git a/java/ql/test/kotlin/query-tests/InnerClassCouldBeStatic/InnerClassCouldBeStatic.expected b/java/ql/test-kotlin1/query-tests/ExposeRepresentation/ExposeRepresentation.expected similarity index 100% rename from java/ql/test/kotlin/query-tests/InnerClassCouldBeStatic/InnerClassCouldBeStatic.expected rename to java/ql/test-kotlin1/query-tests/ExposeRepresentation/ExposeRepresentation.expected diff --git a/java/ql/test/kotlin/query-tests/ExposeRepresentation/ExposeRepresentation.qlref b/java/ql/test-kotlin1/query-tests/ExposeRepresentation/ExposeRepresentation.qlref similarity index 100% rename from java/ql/test/kotlin/query-tests/ExposeRepresentation/ExposeRepresentation.qlref rename to java/ql/test-kotlin1/query-tests/ExposeRepresentation/ExposeRepresentation.qlref diff --git a/java/ql/test/kotlin/query-tests/ExposeRepresentation/ExposesRep.kt b/java/ql/test-kotlin1/query-tests/ExposeRepresentation/ExposesRep.kt similarity index 100% rename from java/ql/test/kotlin/query-tests/ExposeRepresentation/ExposesRep.kt rename to java/ql/test-kotlin1/query-tests/ExposeRepresentation/ExposesRep.kt diff --git a/java/ql/test/kotlin/query-tests/ExposeRepresentation/User.kt b/java/ql/test-kotlin1/query-tests/ExposeRepresentation/User.kt similarity index 100% rename from java/ql/test/kotlin/query-tests/ExposeRepresentation/User.kt rename to java/ql/test-kotlin1/query-tests/ExposeRepresentation/User.kt diff --git a/java/ql/test/kotlin/query-tests/MissingInstanceofInEquals/MissingInstanceofInEquals.expected b/java/ql/test-kotlin1/query-tests/InnerClassCouldBeStatic/InnerClassCouldBeStatic.expected similarity index 100% rename from java/ql/test/kotlin/query-tests/MissingInstanceofInEquals/MissingInstanceofInEquals.expected rename to java/ql/test-kotlin1/query-tests/InnerClassCouldBeStatic/InnerClassCouldBeStatic.expected diff --git a/java/ql/test/kotlin/query-tests/InnerClassCouldBeStatic/InnerClassCouldBeStatic.qlref b/java/ql/test-kotlin1/query-tests/InnerClassCouldBeStatic/InnerClassCouldBeStatic.qlref similarity index 100% rename from java/ql/test/kotlin/query-tests/InnerClassCouldBeStatic/InnerClassCouldBeStatic.qlref rename to java/ql/test-kotlin1/query-tests/InnerClassCouldBeStatic/InnerClassCouldBeStatic.qlref diff --git a/java/ql/test/kotlin/query-tests/InnerClassCouldBeStatic/Test.kt b/java/ql/test-kotlin1/query-tests/InnerClassCouldBeStatic/Test.kt similarity index 100% rename from java/ql/test/kotlin/query-tests/InnerClassCouldBeStatic/Test.kt rename to java/ql/test-kotlin1/query-tests/InnerClassCouldBeStatic/Test.kt diff --git a/java/ql/test/kotlin/query-tests/MissingOverrideAnnotation/MissingOverrideAnnotation.expected b/java/ql/test-kotlin1/query-tests/MissingInstanceofInEquals/MissingInstanceofInEquals.expected similarity index 100% rename from java/ql/test/kotlin/query-tests/MissingOverrideAnnotation/MissingOverrideAnnotation.expected rename to java/ql/test-kotlin1/query-tests/MissingInstanceofInEquals/MissingInstanceofInEquals.expected diff --git a/java/ql/test/kotlin/query-tests/MissingInstanceofInEquals/MissingInstanceofInEquals.qlref b/java/ql/test-kotlin1/query-tests/MissingInstanceofInEquals/MissingInstanceofInEquals.qlref similarity index 100% rename from java/ql/test/kotlin/query-tests/MissingInstanceofInEquals/MissingInstanceofInEquals.qlref rename to java/ql/test-kotlin1/query-tests/MissingInstanceofInEquals/MissingInstanceofInEquals.qlref diff --git a/java/ql/test/kotlin/query-tests/MissingInstanceofInEquals/Test.kt b/java/ql/test-kotlin1/query-tests/MissingInstanceofInEquals/Test.kt similarity index 100% rename from java/ql/test/kotlin/query-tests/MissingInstanceofInEquals/Test.kt rename to java/ql/test-kotlin1/query-tests/MissingInstanceofInEquals/Test.kt diff --git a/java/ql/test/kotlin/query-tests/MutualDependency/MutualDependency.expected b/java/ql/test-kotlin1/query-tests/MissingOverrideAnnotation/MissingOverrideAnnotation.expected similarity index 100% rename from java/ql/test/kotlin/query-tests/MutualDependency/MutualDependency.expected rename to java/ql/test-kotlin1/query-tests/MissingOverrideAnnotation/MissingOverrideAnnotation.expected diff --git a/java/ql/test/kotlin/query-tests/MissingOverrideAnnotation/MissingOverrideAnnotation.qlref b/java/ql/test-kotlin1/query-tests/MissingOverrideAnnotation/MissingOverrideAnnotation.qlref similarity index 100% rename from java/ql/test/kotlin/query-tests/MissingOverrideAnnotation/MissingOverrideAnnotation.qlref rename to java/ql/test-kotlin1/query-tests/MissingOverrideAnnotation/MissingOverrideAnnotation.qlref diff --git a/java/ql/test/kotlin/query-tests/MissingOverrideAnnotation/Test.kt b/java/ql/test-kotlin1/query-tests/MissingOverrideAnnotation/Test.kt similarity index 100% rename from java/ql/test/kotlin/query-tests/MissingOverrideAnnotation/Test.kt rename to java/ql/test-kotlin1/query-tests/MissingOverrideAnnotation/Test.kt diff --git a/java/ql/test/kotlin/query-tests/NonSerializableField/NonSerializableField.expected b/java/ql/test-kotlin1/query-tests/MutualDependency/MutualDependency.expected similarity index 100% rename from java/ql/test/kotlin/query-tests/NonSerializableField/NonSerializableField.expected rename to java/ql/test-kotlin1/query-tests/MutualDependency/MutualDependency.expected diff --git a/java/ql/test/kotlin/query-tests/MutualDependency/MutualDependency.qlref b/java/ql/test-kotlin1/query-tests/MutualDependency/MutualDependency.qlref similarity index 100% rename from java/ql/test/kotlin/query-tests/MutualDependency/MutualDependency.qlref rename to java/ql/test-kotlin1/query-tests/MutualDependency/MutualDependency.qlref diff --git a/java/ql/test/kotlin/query-tests/MutualDependency/Test.kt b/java/ql/test-kotlin1/query-tests/MutualDependency/Test.kt similarity index 100% rename from java/ql/test/kotlin/query-tests/MutualDependency/Test.kt rename to java/ql/test-kotlin1/query-tests/MutualDependency/Test.kt diff --git a/java/ql/test/kotlin/query-tests/NamingConventionsRefTypes/NamingConventionsRefTypes.expected b/java/ql/test-kotlin1/query-tests/NamingConventionsRefTypes/NamingConventionsRefTypes.expected similarity index 100% rename from java/ql/test/kotlin/query-tests/NamingConventionsRefTypes/NamingConventionsRefTypes.expected rename to java/ql/test-kotlin1/query-tests/NamingConventionsRefTypes/NamingConventionsRefTypes.expected diff --git a/java/ql/test/kotlin/query-tests/NamingConventionsRefTypes/NamingConventionsRefTypes.qlref b/java/ql/test-kotlin1/query-tests/NamingConventionsRefTypes/NamingConventionsRefTypes.qlref similarity index 100% rename from java/ql/test/kotlin/query-tests/NamingConventionsRefTypes/NamingConventionsRefTypes.qlref rename to java/ql/test-kotlin1/query-tests/NamingConventionsRefTypes/NamingConventionsRefTypes.qlref diff --git a/java/ql/test/kotlin/query-tests/NamingConventionsRefTypes/Test.kt b/java/ql/test-kotlin1/query-tests/NamingConventionsRefTypes/Test.kt similarity index 100% rename from java/ql/test/kotlin/query-tests/NamingConventionsRefTypes/Test.kt rename to java/ql/test-kotlin1/query-tests/NamingConventionsRefTypes/Test.kt diff --git a/java/ql/test/kotlin/query-tests/NonSerializableInnerClass/NonSerializableInnerClass.expected b/java/ql/test-kotlin1/query-tests/NonSerializableField/NonSerializableField.expected similarity index 100% rename from java/ql/test/kotlin/query-tests/NonSerializableInnerClass/NonSerializableInnerClass.expected rename to java/ql/test-kotlin1/query-tests/NonSerializableField/NonSerializableField.expected diff --git a/java/ql/test/kotlin/query-tests/NonSerializableField/NonSerializableField.qlref b/java/ql/test-kotlin1/query-tests/NonSerializableField/NonSerializableField.qlref similarity index 100% rename from java/ql/test/kotlin/query-tests/NonSerializableField/NonSerializableField.qlref rename to java/ql/test-kotlin1/query-tests/NonSerializableField/NonSerializableField.qlref diff --git a/java/ql/test/kotlin/query-tests/NonSerializableField/NonSerializableFieldTest.kt b/java/ql/test-kotlin1/query-tests/NonSerializableField/NonSerializableFieldTest.kt similarity index 100% rename from java/ql/test/kotlin/query-tests/NonSerializableField/NonSerializableFieldTest.kt rename to java/ql/test-kotlin1/query-tests/NonSerializableField/NonSerializableFieldTest.kt diff --git a/java/ql/test/kotlin/query-tests/NullMaybe/NullMaybe.expected b/java/ql/test-kotlin1/query-tests/NonSerializableInnerClass/NonSerializableInnerClass.expected similarity index 100% rename from java/ql/test/kotlin/query-tests/NullMaybe/NullMaybe.expected rename to java/ql/test-kotlin1/query-tests/NonSerializableInnerClass/NonSerializableInnerClass.expected diff --git a/java/ql/test/kotlin/query-tests/NonSerializableInnerClass/NonSerializableInnerClass.qlref b/java/ql/test-kotlin1/query-tests/NonSerializableInnerClass/NonSerializableInnerClass.qlref similarity index 100% rename from java/ql/test/kotlin/query-tests/NonSerializableInnerClass/NonSerializableInnerClass.qlref rename to java/ql/test-kotlin1/query-tests/NonSerializableInnerClass/NonSerializableInnerClass.qlref diff --git a/java/ql/test/kotlin/query-tests/NonSerializableInnerClass/NonSerializableInnerClassTest.kt b/java/ql/test-kotlin1/query-tests/NonSerializableInnerClass/NonSerializableInnerClassTest.kt similarity index 100% rename from java/ql/test/kotlin/query-tests/NonSerializableInnerClass/NonSerializableInnerClassTest.kt rename to java/ql/test-kotlin1/query-tests/NonSerializableInnerClass/NonSerializableInnerClassTest.kt diff --git a/java/ql/test/kotlin/query-tests/OneStatementPerLine/OneStatementPerLine.expected b/java/ql/test-kotlin1/query-tests/NullMaybe/NullMaybe.expected similarity index 100% rename from java/ql/test/kotlin/query-tests/OneStatementPerLine/OneStatementPerLine.expected rename to java/ql/test-kotlin1/query-tests/NullMaybe/NullMaybe.expected diff --git a/java/ql/test/kotlin/query-tests/NullMaybe/NullMaybe.qlref b/java/ql/test-kotlin1/query-tests/NullMaybe/NullMaybe.qlref similarity index 100% rename from java/ql/test/kotlin/query-tests/NullMaybe/NullMaybe.qlref rename to java/ql/test-kotlin1/query-tests/NullMaybe/NullMaybe.qlref diff --git a/java/ql/test/kotlin/query-tests/NullMaybe/Test.kt b/java/ql/test-kotlin1/query-tests/NullMaybe/Test.kt similarity index 100% rename from java/ql/test/kotlin/query-tests/NullMaybe/Test.kt rename to java/ql/test-kotlin1/query-tests/NullMaybe/Test.kt diff --git a/java/ql/test/kotlin/query-tests/PartiallyMaskedCatch/PartiallyMaskedCatch.expected b/java/ql/test-kotlin1/query-tests/OneStatementPerLine/OneStatementPerLine.expected similarity index 100% rename from java/ql/test/kotlin/query-tests/PartiallyMaskedCatch/PartiallyMaskedCatch.expected rename to java/ql/test-kotlin1/query-tests/OneStatementPerLine/OneStatementPerLine.expected diff --git a/java/ql/test/kotlin/query-tests/OneStatementPerLine/OneStatementPerLine.qlref b/java/ql/test-kotlin1/query-tests/OneStatementPerLine/OneStatementPerLine.qlref similarity index 100% rename from java/ql/test/kotlin/query-tests/OneStatementPerLine/OneStatementPerLine.qlref rename to java/ql/test-kotlin1/query-tests/OneStatementPerLine/OneStatementPerLine.qlref diff --git a/java/ql/test/kotlin/query-tests/OneStatementPerLine/Test.kt b/java/ql/test-kotlin1/query-tests/OneStatementPerLine/Test.kt similarity index 100% rename from java/ql/test/kotlin/query-tests/OneStatementPerLine/Test.kt rename to java/ql/test-kotlin1/query-tests/OneStatementPerLine/Test.kt diff --git a/java/ql/test/kotlin/query-tests/ReturnValueIgnored/ReturnValueIgnored.expected b/java/ql/test-kotlin1/query-tests/PartiallyMaskedCatch/PartiallyMaskedCatch.expected similarity index 100% rename from java/ql/test/kotlin/query-tests/ReturnValueIgnored/ReturnValueIgnored.expected rename to java/ql/test-kotlin1/query-tests/PartiallyMaskedCatch/PartiallyMaskedCatch.expected diff --git a/java/ql/test/kotlin/query-tests/PartiallyMaskedCatch/PartiallyMaskedCatch.qlref b/java/ql/test-kotlin1/query-tests/PartiallyMaskedCatch/PartiallyMaskedCatch.qlref similarity index 100% rename from java/ql/test/kotlin/query-tests/PartiallyMaskedCatch/PartiallyMaskedCatch.qlref rename to java/ql/test-kotlin1/query-tests/PartiallyMaskedCatch/PartiallyMaskedCatch.qlref diff --git a/java/ql/test/kotlin/query-tests/PartiallyMaskedCatch/PartiallyMaskedCatchTest.kt b/java/ql/test-kotlin1/query-tests/PartiallyMaskedCatch/PartiallyMaskedCatchTest.kt similarity index 100% rename from java/ql/test/kotlin/query-tests/PartiallyMaskedCatch/PartiallyMaskedCatchTest.kt rename to java/ql/test-kotlin1/query-tests/PartiallyMaskedCatch/PartiallyMaskedCatchTest.kt diff --git a/java/ql/test/kotlin/query-tests/SimplifyBoolExpr/SimplifyBoolExpr.expected b/java/ql/test-kotlin1/query-tests/ReturnValueIgnored/ReturnValueIgnored.expected similarity index 100% rename from java/ql/test/kotlin/query-tests/SimplifyBoolExpr/SimplifyBoolExpr.expected rename to java/ql/test-kotlin1/query-tests/ReturnValueIgnored/ReturnValueIgnored.expected diff --git a/java/ql/test/kotlin/query-tests/ReturnValueIgnored/ReturnValueIgnored.qlref b/java/ql/test-kotlin1/query-tests/ReturnValueIgnored/ReturnValueIgnored.qlref similarity index 100% rename from java/ql/test/kotlin/query-tests/ReturnValueIgnored/ReturnValueIgnored.qlref rename to java/ql/test-kotlin1/query-tests/ReturnValueIgnored/ReturnValueIgnored.qlref diff --git a/java/ql/test/kotlin/query-tests/ReturnValueIgnored/Test.kt b/java/ql/test-kotlin1/query-tests/ReturnValueIgnored/Test.kt similarity index 100% rename from java/ql/test/kotlin/query-tests/ReturnValueIgnored/Test.kt rename to java/ql/test-kotlin1/query-tests/ReturnValueIgnored/Test.kt diff --git a/java/ql/test/kotlin/query-tests/UnderscoreIdentifier/UnderscoreIdentifier.expected b/java/ql/test-kotlin1/query-tests/SimplifyBoolExpr/SimplifyBoolExpr.expected similarity index 100% rename from java/ql/test/kotlin/query-tests/UnderscoreIdentifier/UnderscoreIdentifier.expected rename to java/ql/test-kotlin1/query-tests/SimplifyBoolExpr/SimplifyBoolExpr.expected diff --git a/java/ql/test/kotlin/query-tests/SimplifyBoolExpr/SimplifyBoolExpr.kt b/java/ql/test-kotlin1/query-tests/SimplifyBoolExpr/SimplifyBoolExpr.kt similarity index 100% rename from java/ql/test/kotlin/query-tests/SimplifyBoolExpr/SimplifyBoolExpr.kt rename to java/ql/test-kotlin1/query-tests/SimplifyBoolExpr/SimplifyBoolExpr.kt diff --git a/java/ql/test/kotlin/query-tests/SimplifyBoolExpr/SimplifyBoolExpr.qlref b/java/ql/test-kotlin1/query-tests/SimplifyBoolExpr/SimplifyBoolExpr.qlref similarity index 100% rename from java/ql/test/kotlin/query-tests/SimplifyBoolExpr/SimplifyBoolExpr.qlref rename to java/ql/test-kotlin1/query-tests/SimplifyBoolExpr/SimplifyBoolExpr.qlref diff --git a/java/ql/test/kotlin/query-tests/UnderscoreIdentifier/Test.kt b/java/ql/test-kotlin1/query-tests/UnderscoreIdentifier/Test.kt similarity index 100% rename from java/ql/test/kotlin/query-tests/UnderscoreIdentifier/Test.kt rename to java/ql/test-kotlin1/query-tests/UnderscoreIdentifier/Test.kt diff --git a/java/ql/test/kotlin/query-tests/UselessParameter/UselessParameter.expected b/java/ql/test-kotlin1/query-tests/UnderscoreIdentifier/UnderscoreIdentifier.expected similarity index 100% rename from java/ql/test/kotlin/query-tests/UselessParameter/UselessParameter.expected rename to java/ql/test-kotlin1/query-tests/UnderscoreIdentifier/UnderscoreIdentifier.expected diff --git a/java/ql/test/kotlin/query-tests/UnderscoreIdentifier/UnderscoreIdentifier.qlref b/java/ql/test-kotlin1/query-tests/UnderscoreIdentifier/UnderscoreIdentifier.qlref similarity index 100% rename from java/ql/test/kotlin/query-tests/UnderscoreIdentifier/UnderscoreIdentifier.qlref rename to java/ql/test-kotlin1/query-tests/UnderscoreIdentifier/UnderscoreIdentifier.qlref diff --git a/java/ql/test/kotlin/query-tests/UnderscoreIdentifier/test.expected b/java/ql/test-kotlin1/query-tests/UnderscoreIdentifier/test.expected similarity index 100% rename from java/ql/test/kotlin/query-tests/UnderscoreIdentifier/test.expected rename to java/ql/test-kotlin1/query-tests/UnderscoreIdentifier/test.expected diff --git a/java/ql/test/kotlin/query-tests/UnderscoreIdentifier/test.ql b/java/ql/test-kotlin1/query-tests/UnderscoreIdentifier/test.ql similarity index 100% rename from java/ql/test/kotlin/query-tests/UnderscoreIdentifier/test.ql rename to java/ql/test-kotlin1/query-tests/UnderscoreIdentifier/test.ql diff --git a/java/ql/test/kotlin/query-tests/UnreadLocal/UnreadLocal.expected b/java/ql/test-kotlin1/query-tests/UnreadLocal/UnreadLocal.expected similarity index 100% rename from java/ql/test/kotlin/query-tests/UnreadLocal/UnreadLocal.expected rename to java/ql/test-kotlin1/query-tests/UnreadLocal/UnreadLocal.expected diff --git a/java/ql/test/kotlin/query-tests/UnreadLocal/UnreadLocal.qlref b/java/ql/test-kotlin1/query-tests/UnreadLocal/UnreadLocal.qlref similarity index 100% rename from java/ql/test/kotlin/query-tests/UnreadLocal/UnreadLocal.qlref rename to java/ql/test-kotlin1/query-tests/UnreadLocal/UnreadLocal.qlref diff --git a/java/ql/test/kotlin/query-tests/UnreadLocal/test.kt b/java/ql/test-kotlin1/query-tests/UnreadLocal/test.kt similarity index 100% rename from java/ql/test/kotlin/query-tests/UnreadLocal/test.kt rename to java/ql/test-kotlin1/query-tests/UnreadLocal/test.kt diff --git a/java/ql/test/kotlin/query-tests/UselessNullCheck/Test.kt b/java/ql/test-kotlin1/query-tests/UselessNullCheck/Test.kt similarity index 100% rename from java/ql/test/kotlin/query-tests/UselessNullCheck/Test.kt rename to java/ql/test-kotlin1/query-tests/UselessNullCheck/Test.kt diff --git a/java/ql/test/kotlin/query-tests/UselessNullCheck/UselessNullCheck.expected b/java/ql/test-kotlin1/query-tests/UselessNullCheck/UselessNullCheck.expected similarity index 100% rename from java/ql/test/kotlin/query-tests/UselessNullCheck/UselessNullCheck.expected rename to java/ql/test-kotlin1/query-tests/UselessNullCheck/UselessNullCheck.expected diff --git a/java/ql/test/kotlin/query-tests/UselessNullCheck/UselessNullCheck.qlref b/java/ql/test-kotlin1/query-tests/UselessNullCheck/UselessNullCheck.qlref similarity index 100% rename from java/ql/test/kotlin/query-tests/UselessNullCheck/UselessNullCheck.qlref rename to java/ql/test-kotlin1/query-tests/UselessNullCheck/UselessNullCheck.qlref diff --git a/java/ql/test/kotlin/query-tests/UselessParameter/Test.kt b/java/ql/test-kotlin1/query-tests/UselessParameter/Test.kt similarity index 100% rename from java/ql/test/kotlin/query-tests/UselessParameter/Test.kt rename to java/ql/test-kotlin1/query-tests/UselessParameter/Test.kt diff --git a/java/ql/test/kotlin/query-tests/WhitespaceContradictsPrecedence/WhitespaceContradictsPrecedence.expected b/java/ql/test-kotlin1/query-tests/UselessParameter/UselessParameter.expected similarity index 100% rename from java/ql/test/kotlin/query-tests/WhitespaceContradictsPrecedence/WhitespaceContradictsPrecedence.expected rename to java/ql/test-kotlin1/query-tests/UselessParameter/UselessParameter.expected diff --git a/java/ql/test/kotlin/query-tests/UselessParameter/UselessParameter.qlref b/java/ql/test-kotlin1/query-tests/UselessParameter/UselessParameter.qlref similarity index 100% rename from java/ql/test/kotlin/query-tests/UselessParameter/UselessParameter.qlref rename to java/ql/test-kotlin1/query-tests/UselessParameter/UselessParameter.qlref diff --git a/java/ql/test-kotlin1/query-tests/WhitespaceContradictsPrecedence/WhitespaceContradictsPrecedence.expected b/java/ql/test-kotlin1/query-tests/WhitespaceContradictsPrecedence/WhitespaceContradictsPrecedence.expected new file mode 100644 index 00000000000..e69de29bb2d diff --git a/java/ql/test/kotlin/query-tests/WhitespaceContradictsPrecedence/WhitespaceContradictsPrecedence.qlref b/java/ql/test-kotlin1/query-tests/WhitespaceContradictsPrecedence/WhitespaceContradictsPrecedence.qlref similarity index 100% rename from java/ql/test/kotlin/query-tests/WhitespaceContradictsPrecedence/WhitespaceContradictsPrecedence.qlref rename to java/ql/test-kotlin1/query-tests/WhitespaceContradictsPrecedence/WhitespaceContradictsPrecedence.qlref diff --git a/java/ql/test/kotlin/query-tests/WhitespaceContradictsPrecedence/test.kt b/java/ql/test-kotlin1/query-tests/WhitespaceContradictsPrecedence/test.kt similarity index 100% rename from java/ql/test/kotlin/query-tests/WhitespaceContradictsPrecedence/test.kt rename to java/ql/test-kotlin1/query-tests/WhitespaceContradictsPrecedence/test.kt diff --git a/java/ql/test-kotlin2/TestUtilities/InlineExpectationsTest.qll b/java/ql/test-kotlin2/TestUtilities/InlineExpectationsTest.qll new file mode 100644 index 00000000000..44306864a97 --- /dev/null +++ b/java/ql/test-kotlin2/TestUtilities/InlineExpectationsTest.qll @@ -0,0 +1,8 @@ +/** + * Inline expectation tests for Java. + * See `shared/util/codeql/util/test/InlineExpectationsTest.qll` + */ + +private import codeql.util.test.InlineExpectationsTest +private import internal.InlineExpectationsTestImpl +import Make diff --git a/java/ql/test-kotlin2/TestUtilities/InlineFlowTest.qll b/java/ql/test-kotlin2/TestUtilities/InlineFlowTest.qll new file mode 100644 index 00000000000..d815f302638 --- /dev/null +++ b/java/ql/test-kotlin2/TestUtilities/InlineFlowTest.qll @@ -0,0 +1,33 @@ +/** + * Inline flow tests for Java. + * See `shared/util/codeql/dataflow/test/InlineFlowTest.qll` + */ + +import java +import semmle.code.java.dataflow.DataFlow +private import codeql.dataflow.test.InlineFlowTest +private import semmle.code.java.dataflow.internal.DataFlowImplSpecific +private import semmle.code.java.dataflow.internal.TaintTrackingImplSpecific +private import internal.InlineExpectationsTestImpl + +private module FlowTestImpl implements InputSig { + predicate defaultSource(DataFlow::Node source) { + source.asExpr().(MethodCall).getMethod().getName() = ["source", "taint"] + } + + predicate defaultSink(DataFlow::Node sink) { + exists(MethodCall ma | ma.getMethod().hasName("sink") | sink.asExpr() = ma.getAnArgument()) + } + + private string getSourceArgString(DataFlow::Node src) { + defaultSource(src) and + src.asExpr().(MethodCall).getAnArgument().(StringLiteral).getValue() = result + } + + string getArgString(DataFlow::Node src, DataFlow::Node sink) { + (if exists(getSourceArgString(src)) then result = getSourceArgString(src) else result = "") and + exists(sink) + } +} + +import InlineFlowTestMake diff --git a/java/ql/test-kotlin2/TestUtilities/internal/InlineExpectationsTestImpl.qll b/java/ql/test-kotlin2/TestUtilities/internal/InlineExpectationsTestImpl.qll new file mode 100644 index 00000000000..cd62fdb757e --- /dev/null +++ b/java/ql/test-kotlin2/TestUtilities/internal/InlineExpectationsTestImpl.qll @@ -0,0 +1,35 @@ +private import java as J +private import codeql.util.test.InlineExpectationsTest + +module Impl implements InlineExpectationsTestSig { + /** + * A class representing line comments in Java, which is simply Javadoc restricted + * to EOL comments, with an extra accessor used by the InlineExpectations core code + */ + abstract class ExpectationComment extends J::Top { + /** Gets the contents of the given comment, _without_ the preceding comment marker (`//`). */ + abstract string getContents(); + } + + private class JavadocExpectationComment extends J::Javadoc, ExpectationComment { + JavadocExpectationComment() { isEolComment(this) } + + override string getContents() { result = this.getChild(0).toString() } + } + + private class KtExpectationComment extends J::KtComment, ExpectationComment { + KtExpectationComment() { this.isEolComment() } + + override string getContents() { result = this.getText().suffix(2).trim() } + } + + private class XmlExpectationComment extends ExpectationComment instanceof J::XmlComment { + override string getContents() { result = super.getText().trim() } + + override Location getLocation() { result = J::XmlComment.super.getLocation() } + + override string toString() { result = J::XmlComment.super.toString() } + } + + class Location = J::Location; +} 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]