From 1a51c015b45613cbec06a057163545ad031d092c Mon Sep 17 00:00:00 2001 From: Sam Browning <106113886+sabrowning1@users.noreply.github.com> Date: Thu, 27 Apr 2023 15:19:45 -0400 Subject: [PATCH 001/202] Add requirements.txt --- requirements.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 requirements.txt diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 00000000000..01e0ca6b827 --- /dev/null +++ b/requirements.txt @@ -0,0 +1 @@ +sphinx == 1.8.5 \ No newline at end of file From 6c8cc79b4ddc3b90fb02a25ab96842eb0447d4ad Mon Sep 17 00:00:00 2001 From: amammad <77095239+amammad@users.noreply.github.com> Date: Sun, 8 Oct 2023 21:24:54 +0200 Subject: [PATCH 002/202] v1 --- python/ql/lib/semmle/python/Frameworks.qll | 2 + .../python/frameworks/FileSystemAccess.qll | 95 +++++++++++++++++++ .../ql/lib/semmle/python/frameworks/Sanic.qll | 42 ++++++++ .../semmle/python/frameworks/Starlette.qll | 27 ++++++ .../lib/semmle/python/frameworks/Stdlib.qll | 20 ++++ .../FileSystemAccess/ConceptsTest.expected | 2 + .../FileSystemAccess/ConceptsTest.ql | 2 + .../FileSystemAccess/Query.expected | 0 .../frameworks/FileSystemAccess/Query.ql | 20 ++++ .../frameworks/FileSystemAccess/aiofile.py | 4 + .../frameworks/FileSystemAccess/aiofiles.py | 3 + .../frameworks/FileSystemAccess/anyio.py | 8 ++ .../frameworks/FileSystemAccess/sanic.py | 4 + .../frameworks/FileSystemAccess/starlette.py | 5 + .../frameworks/stdlib/ConceptsTest.expected | 2 +- .../frameworks/stdlib/FileSystemAccess.py | 2 + 16 files changed, 237 insertions(+), 1 deletion(-) create mode 100644 python/ql/lib/semmle/python/frameworks/FileSystemAccess.qll create mode 100644 python/ql/lib/semmle/python/frameworks/Sanic.qll create mode 100644 python/ql/test/library-tests/frameworks/FileSystemAccess/ConceptsTest.expected create mode 100644 python/ql/test/library-tests/frameworks/FileSystemAccess/ConceptsTest.ql create mode 100644 python/ql/test/library-tests/frameworks/FileSystemAccess/Query.expected create mode 100644 python/ql/test/library-tests/frameworks/FileSystemAccess/Query.ql create mode 100644 python/ql/test/library-tests/frameworks/FileSystemAccess/aiofile.py create mode 100644 python/ql/test/library-tests/frameworks/FileSystemAccess/aiofiles.py create mode 100644 python/ql/test/library-tests/frameworks/FileSystemAccess/anyio.py create mode 100644 python/ql/test/library-tests/frameworks/FileSystemAccess/sanic.py create mode 100644 python/ql/test/library-tests/frameworks/FileSystemAccess/starlette.py diff --git a/python/ql/lib/semmle/python/Frameworks.qll b/python/ql/lib/semmle/python/Frameworks.qll index ff0650fcda0..8b32dcccfb6 100644 --- a/python/ql/lib/semmle/python/Frameworks.qll +++ b/python/ql/lib/semmle/python/Frameworks.qll @@ -21,6 +21,7 @@ private import semmle.python.frameworks.Dill private import semmle.python.frameworks.Django private import semmle.python.frameworks.Fabric private import semmle.python.frameworks.FastApi +private import semmle.python.frameworks.FileSystemAccess private import semmle.python.frameworks.Flask private import semmle.python.frameworks.FlaskAdmin private import semmle.python.frameworks.FlaskSqlAlchemy @@ -51,6 +52,7 @@ private import semmle.python.frameworks.Requests private import semmle.python.frameworks.RestFramework private import semmle.python.frameworks.Rsa private import semmle.python.frameworks.RuamelYaml +private import semmle.python.frameworks.Sanic private import semmle.python.frameworks.ServerLess private import semmle.python.frameworks.Simplejson private import semmle.python.frameworks.SqlAlchemy diff --git a/python/ql/lib/semmle/python/frameworks/FileSystemAccess.qll b/python/ql/lib/semmle/python/frameworks/FileSystemAccess.qll new file mode 100644 index 00000000000..25060eccf58 --- /dev/null +++ b/python/ql/lib/semmle/python/frameworks/FileSystemAccess.qll @@ -0,0 +1,95 @@ +/** + * Provides classes modeling security-relevant aspects of the I/O write or read operations + */ + +private import python +private import semmle.python.dataflow.new.DataFlow +private import semmle.python.dataflow.new.RemoteFlowSources +private import semmle.python.dataflow.new.TaintTracking +private import semmle.python.Concepts +private import semmle.python.ApiGraphs + +/** + * Provides models for the `aiofile` PyPI package. + * See https://github.com/agronholm/anyio. + */ +private module Aiofile { + /** + * A call to the `async_open` function or `AIOFile` constructor from `aiofile` as a sink for Filesystem access. + */ + class FileResponseCall extends FileSystemAccess::Range, API::CallNode { + string methodName; + + FileResponseCall() { + this = API::moduleImport("aiofile").getMember("async_open").getACall() and + methodName = "async_open" + or + this = API::moduleImport("aiofile").getMember("AIOFile").getACall() and + methodName = "AIOFile" + } + + override DataFlow::Node getAPathArgument() { + result = this.getParameter(0, "file_specifier").asSink() and + methodName = "async_open" + or + result = this.getParameter(0, "filename").asSink() and + methodName = "AIOFile" + } + } +} + +/** + * Provides models for the `aiofiles` PyPI package. + * See https://github.com/Tinche/aiofiles. + */ +private module Aiofiles { + /** + * A call to the `open` function from `aiofiles` as a sink for Filesystem access. + */ + class FileResponseCall extends FileSystemAccess::Range, API::CallNode { + FileResponseCall() { this = API::moduleImport("aiofiles").getMember("open").getACall() } + + override DataFlow::Node getAPathArgument() { result = this.getParameter(0, "file").asSink() } + } +} + +/** + * Provides models for the `anyio` PyPI package. + * See https://github.com/agronholm/anyio. + */ +private module Anyio { + /** + * A call to the `from_path` function from `FileReadStream` or `FileWriteStream` constructors of `anyio.streams.file` as a sink for Filesystem access. + */ + class FileStreamCall extends FileSystemAccess::Range, API::CallNode { + FileStreamCall() { + this = + API::moduleImport("anyio") + .getMember("streams") + .getMember("file") + .getMember(["FileReadStream", "FileWriteStream"]) + .getMember("from_path") + .getACall() + } + + override DataFlow::Node getAPathArgument() { result = this.getParameter(0, "path").asSink() } + } + + /** + * A call to the `Path` constructor from `anyio` as a sink for Filesystem access. + */ + class PathCall extends FileSystemAccess::Range, API::CallNode { + PathCall() { this = API::moduleImport("anyio").getMember("Path").getACall() } + + override DataFlow::Node getAPathArgument() { result = this.getParameter(0).asSink() } + } + + /** + * A call to the `open_file` function from `anyio` as a sink for Filesystem access. + */ + class OpenFileCall extends FileSystemAccess::Range, API::CallNode { + OpenFileCall() { this = API::moduleImport("anyio").getMember("open_file").getACall() } + + override DataFlow::Node getAPathArgument() { result = this.getParameter(0, "file").asSink() } + } +} diff --git a/python/ql/lib/semmle/python/frameworks/Sanic.qll b/python/ql/lib/semmle/python/frameworks/Sanic.qll new file mode 100644 index 00000000000..e973109f98a --- /dev/null +++ b/python/ql/lib/semmle/python/frameworks/Sanic.qll @@ -0,0 +1,42 @@ +/** + * Provides classes modeling security-relevant aspects of the `sanic` PyPI package. + * See https://sanic.dev/. + */ + +private import python +private import semmle.python.dataflow.new.DataFlow +private import semmle.python.dataflow.new.RemoteFlowSources +private import semmle.python.dataflow.new.TaintTracking +private import semmle.python.Concepts +private import semmle.python.ApiGraphs + +/** + * Provides models for the `sanic` PyPI package. + * See https://sanic.dev/. + */ +private module Sanic { + /** + * Provides models for Sanic applications (an instance of `sanic.Sanic`). + */ + module App { + /** Gets a reference to a Sanic application (an instance of `sanic.Sanic`). */ + API::Node instance() { result = API::moduleImport("sanic").getMember("Sanic").getReturn() } + } + + /** + * A call to the `file` or `file_stream` functions of `sanic.response` as a sink for Filesystem access. + */ + class FileResponseCall extends FileSystemAccess::Range, API::CallNode { + FileResponseCall() { + this = + API::moduleImport("sanic") + .getMember("response") + .getMember(["file", "file_stream"]) + .getACall() + } + + override DataFlow::Node getAPathArgument() { + result = this.getParameter(0, "location").asSink() + } + } +} diff --git a/python/ql/lib/semmle/python/frameworks/Starlette.qll b/python/ql/lib/semmle/python/frameworks/Starlette.qll index cee5100d436..2141aed80ca 100644 --- a/python/ql/lib/semmle/python/frameworks/Starlette.qll +++ b/python/ql/lib/semmle/python/frameworks/Starlette.qll @@ -163,4 +163,31 @@ module Starlette { /** DEPRECATED: Alias for Url */ deprecated module URL = Url; + + /** + * A call to the `starlette.responses.FileResponse` constructor as a sink for Filesystem access. + */ + class FileResponseCall extends FileSystemAccess::Range, API::CallNode { + FileResponseCall() { + this = + API::moduleImport("starlette").getMember("responses").getMember("FileResponse").getACall() + } + + override DataFlow::Node getAPathArgument() { result = this.getParameter(0, "path").asSink() } + } + + /** + * A call to the `baize.asgi.FileResponse` constructor as a sink for Filesystem access. + * + * it is not contained to Starlette source code but it is mentioned as an alternative to Starlette FileResponse + */ + class BaizeFileResponseCall extends FileSystemAccess::Range, API::CallNode { + BaizeFileResponseCall() { + this = API::moduleImport("baize").getMember("asgi").getMember("FileResponse").getACall() + } + + override DataFlow::Node getAPathArgument() { + result = this.getParameter(0, "filepath").asSink() + } + } } diff --git a/python/ql/lib/semmle/python/frameworks/Stdlib.qll b/python/ql/lib/semmle/python/frameworks/Stdlib.qll index ec79a6dfddf..193ca36d156 100644 --- a/python/ql/lib/semmle/python/frameworks/Stdlib.qll +++ b/python/ql/lib/semmle/python/frameworks/Stdlib.qll @@ -1479,6 +1479,26 @@ private module StdlibPrivate { } } + /** + * A call to the `io.FileIO` constructor. + * See https://docs.python.org/3/library/io.html#io.FileIO + */ + private class FileIOCall extends FileSystemAccess::Range, API::CallNode { + FileIOCall() { this = API::moduleImport("io").getMember("FileIO").getACall() } + + override DataFlow::Node getAPathArgument() { result = this.getParameter(0, "file").asSink() } + } + + /** + * A call to the `io.open_code` function. + * See https://docs.python.org/3/library/io.html#io.FileIO + */ + private class OpenCodeCall extends FileSystemAccess::Range, API::CallNode { + OpenCodeCall() { this = API::moduleImport("io").getMember("open_code").getACall() } + + override DataFlow::Node getAPathArgument() { result = this.getParameter(0, "path").asSink() } + } + /** Gets a reference to an open file. */ private DataFlow::TypeTrackingNode openFile(DataFlow::TypeTracker t, FileSystemAccess openCall) { t.start() and diff --git a/python/ql/test/library-tests/frameworks/FileSystemAccess/ConceptsTest.expected b/python/ql/test/library-tests/frameworks/FileSystemAccess/ConceptsTest.expected new file mode 100644 index 00000000000..8ec8033d086 --- /dev/null +++ b/python/ql/test/library-tests/frameworks/FileSystemAccess/ConceptsTest.expected @@ -0,0 +1,2 @@ +testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/FileSystemAccess/ConceptsTest.ql b/python/ql/test/library-tests/frameworks/FileSystemAccess/ConceptsTest.ql new file mode 100644 index 00000000000..b557a0bccb6 --- /dev/null +++ b/python/ql/test/library-tests/frameworks/FileSystemAccess/ConceptsTest.ql @@ -0,0 +1,2 @@ +import python +import experimental.meta.ConceptsTest diff --git a/python/ql/test/library-tests/frameworks/FileSystemAccess/Query.expected b/python/ql/test/library-tests/frameworks/FileSystemAccess/Query.expected new file mode 100644 index 00000000000..e69de29bb2d diff --git a/python/ql/test/library-tests/frameworks/FileSystemAccess/Query.ql b/python/ql/test/library-tests/frameworks/FileSystemAccess/Query.ql new file mode 100644 index 00000000000..5f89e028f04 --- /dev/null +++ b/python/ql/test/library-tests/frameworks/FileSystemAccess/Query.ql @@ -0,0 +1,20 @@ +import python +import semmle.python.dataflow.new.DataFlow +import semmle.python.Concepts +import TestUtilities.InlineExpectationsTest +private import semmle.python.dataflow.new.internal.PrintNode + +module FileSystemAccessTest implements TestSig { + string getARelevantTag() { result = "getAPathArgument" } + + predicate hasActualResult(Location location, string element, string tag, string value) { + exists(location.getFile().getRelativePath()) and + exists(FileSystemAccess a, DataFlow::Node path | + path = a.getAPathArgument() and + location = a.getLocation() and + element = path.toString() and + value = prettyNodeForInlineTest(path) and + tag = "getAPathArgument" + ) + } +} diff --git a/python/ql/test/library-tests/frameworks/FileSystemAccess/aiofile.py b/python/ql/test/library-tests/frameworks/FileSystemAccess/aiofile.py new file mode 100644 index 00000000000..4546e17eb1a --- /dev/null +++ b/python/ql/test/library-tests/frameworks/FileSystemAccess/aiofile.py @@ -0,0 +1,4 @@ +from aiofile import async_open, AIOFile + +AIOFile("file", 'r') # $ getAPathArgument="file" +async_open("file", "r") # $ getAPathArgument="file" diff --git a/python/ql/test/library-tests/frameworks/FileSystemAccess/aiofiles.py b/python/ql/test/library-tests/frameworks/FileSystemAccess/aiofiles.py new file mode 100644 index 00000000000..d99ccefdf87 --- /dev/null +++ b/python/ql/test/library-tests/frameworks/FileSystemAccess/aiofiles.py @@ -0,0 +1,3 @@ +import aiofiles + +aiofiles.open("file", mode='r') # $ getAPathArgument="file" diff --git a/python/ql/test/library-tests/frameworks/FileSystemAccess/anyio.py b/python/ql/test/library-tests/frameworks/FileSystemAccess/anyio.py new file mode 100644 index 00000000000..abc66c42b61 --- /dev/null +++ b/python/ql/test/library-tests/frameworks/FileSystemAccess/anyio.py @@ -0,0 +1,8 @@ +import anyio +from anyio.streams.file import FileReadStream, FileWriteStream +from anyio import Path + +anyio.open_file("file", 'r') # $ getAPathArgument="file" +FileReadStream.from_path("file") # $ getAPathArgument="file" +FileWriteStream.from_path("file") # $ getAPathArgument="file" +Path("file") # $ getAPathArgument="file" diff --git a/python/ql/test/library-tests/frameworks/FileSystemAccess/sanic.py b/python/ql/test/library-tests/frameworks/FileSystemAccess/sanic.py new file mode 100644 index 00000000000..2f12e476235 --- /dev/null +++ b/python/ql/test/library-tests/frameworks/FileSystemAccess/sanic.py @@ -0,0 +1,4 @@ +from sanic import response + +response.file("file") # $ getAPathArgument="file" +response.file_stream("file") # $ getAPathArgument="file" diff --git a/python/ql/test/library-tests/frameworks/FileSystemAccess/starlette.py b/python/ql/test/library-tests/frameworks/FileSystemAccess/starlette.py new file mode 100644 index 00000000000..5982a937cba --- /dev/null +++ b/python/ql/test/library-tests/frameworks/FileSystemAccess/starlette.py @@ -0,0 +1,5 @@ +from starlette.responses import FileResponse +from baize.asgi import FileResponse as baizeFileResponse + +baizeFileResponse("file") # $ getAPathArgument="file" +FileResponse("file") # $ getAPathArgument="file" diff --git a/python/ql/test/library-tests/frameworks/stdlib/ConceptsTest.expected b/python/ql/test/library-tests/frameworks/stdlib/ConceptsTest.expected index 48de9172b36..8ec8033d086 100644 --- a/python/ql/test/library-tests/frameworks/stdlib/ConceptsTest.expected +++ b/python/ql/test/library-tests/frameworks/stdlib/ConceptsTest.expected @@ -1,2 +1,2 @@ -failures testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/stdlib/FileSystemAccess.py b/python/ql/test/library-tests/frameworks/stdlib/FileSystemAccess.py index 21d66fa548a..197ccd8eb91 100644 --- a/python/ql/test/library-tests/frameworks/stdlib/FileSystemAccess.py +++ b/python/ql/test/library-tests/frameworks/stdlib/FileSystemAccess.py @@ -20,6 +20,8 @@ builtins.open(file="file") # $ getAPathArgument="file" io.open("file") # $ getAPathArgument="file" io.open(file="file") # $ getAPathArgument="file" +io.open_code("file") # $ getAPathArgument="file" +io.FileIO("file") # $ getAPathArgument="file" f = open("path") # $ getAPathArgument="path" f.write("foo") # $ getAPathArgument="path" fileWriteData="foo" From ad2631202de385b94172a6e69e9aa23a0af8d294 Mon Sep 17 00:00:00 2001 From: amammad <77095239+amammad@users.noreply.github.com> Date: Sun, 8 Oct 2023 21:29:55 +0200 Subject: [PATCH 003/202] fix comments --- python/ql/lib/semmle/python/frameworks/FileSystemAccess.qll | 2 +- python/ql/lib/semmle/python/frameworks/Starlette.qll | 2 +- python/ql/lib/semmle/python/frameworks/Stdlib.qll | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/python/ql/lib/semmle/python/frameworks/FileSystemAccess.qll b/python/ql/lib/semmle/python/frameworks/FileSystemAccess.qll index 25060eccf58..9c936e4075d 100644 --- a/python/ql/lib/semmle/python/frameworks/FileSystemAccess.qll +++ b/python/ql/lib/semmle/python/frameworks/FileSystemAccess.qll @@ -1,5 +1,5 @@ /** - * Provides classes modeling security-relevant aspects of the I/O write or read operations + * Provides classes modeling security-relevant aspects of the I/O file write or file read operations */ private import python diff --git a/python/ql/lib/semmle/python/frameworks/Starlette.qll b/python/ql/lib/semmle/python/frameworks/Starlette.qll index 2141aed80ca..ec41376cf67 100644 --- a/python/ql/lib/semmle/python/frameworks/Starlette.qll +++ b/python/ql/lib/semmle/python/frameworks/Starlette.qll @@ -179,7 +179,7 @@ module Starlette { /** * A call to the `baize.asgi.FileResponse` constructor as a sink for Filesystem access. * - * it is not contained to Starlette source code but it is mentioned as an alternative to Starlette FileResponse + * it is not contained to Starlette source code but it is mentioned in documents as an alternative to Starlette FileResponse */ class BaizeFileResponseCall extends FileSystemAccess::Range, API::CallNode { BaizeFileResponseCall() { diff --git a/python/ql/lib/semmle/python/frameworks/Stdlib.qll b/python/ql/lib/semmle/python/frameworks/Stdlib.qll index 193ca36d156..c8ba48a12d2 100644 --- a/python/ql/lib/semmle/python/frameworks/Stdlib.qll +++ b/python/ql/lib/semmle/python/frameworks/Stdlib.qll @@ -1491,7 +1491,7 @@ private module StdlibPrivate { /** * A call to the `io.open_code` function. - * See https://docs.python.org/3/library/io.html#io.FileIO + * See https://docs.python.org/3.11/library/io.html#io.open_code */ private class OpenCodeCall extends FileSystemAccess::Range, API::CallNode { OpenCodeCall() { this = API::moduleImport("io").getMember("open_code").getACall() } From 76e56cdac7518e6100095d7101b73b0ba8c7ad65 Mon Sep 17 00:00:00 2001 From: Remco Vermeulen Date: Mon, 9 Oct 2023 12:52:09 -0700 Subject: [PATCH 004/202] Adjust query severities --- javascript/ql/src/Security/CWE-079/ReflectedXss.ql | 2 +- javascript/ql/src/Security/CWE-079/StoredXss.ql | 2 +- javascript/ql/src/Security/CWE-079/Xss.ql | 2 +- javascript/ql/src/Security/CWE-079/XssThroughDom.ql | 2 +- javascript/ql/src/Security/CWE-117/LogInjection.ql | 2 +- .../2023-10-09-adjust-xss-and-log-injection-severity.md | 6 ++++++ 6 files changed, 11 insertions(+), 5 deletions(-) create mode 100644 javascript/ql/src/change-notes/2023-10-09-adjust-xss-and-log-injection-severity.md diff --git a/javascript/ql/src/Security/CWE-079/ReflectedXss.ql b/javascript/ql/src/Security/CWE-079/ReflectedXss.ql index a95a7aec205..9bed0516d18 100644 --- a/javascript/ql/src/Security/CWE-079/ReflectedXss.ql +++ b/javascript/ql/src/Security/CWE-079/ReflectedXss.ql @@ -4,7 +4,7 @@ * a cross-site scripting vulnerability. * @kind path-problem * @problem.severity error - * @security-severity 6.1 + * @security-severity 7.8 * @precision high * @id js/reflected-xss * @tags security diff --git a/javascript/ql/src/Security/CWE-079/StoredXss.ql b/javascript/ql/src/Security/CWE-079/StoredXss.ql index d5f28b28e55..0c7402b3b68 100644 --- a/javascript/ql/src/Security/CWE-079/StoredXss.ql +++ b/javascript/ql/src/Security/CWE-079/StoredXss.ql @@ -4,7 +4,7 @@ * a stored cross-site scripting vulnerability. * @kind path-problem * @problem.severity error - * @security-severity 6.1 + * @security-severity 7.8 * @precision high * @id js/stored-xss * @tags security diff --git a/javascript/ql/src/Security/CWE-079/Xss.ql b/javascript/ql/src/Security/CWE-079/Xss.ql index 63a56b2a3b3..8e67d249fa9 100644 --- a/javascript/ql/src/Security/CWE-079/Xss.ql +++ b/javascript/ql/src/Security/CWE-079/Xss.ql @@ -4,7 +4,7 @@ * a cross-site scripting vulnerability. * @kind path-problem * @problem.severity error - * @security-severity 6.1 + * @security-severity 7.8 * @precision high * @id js/xss * @tags security diff --git a/javascript/ql/src/Security/CWE-079/XssThroughDom.ql b/javascript/ql/src/Security/CWE-079/XssThroughDom.ql index 87a76d82227..c23ddf168b0 100644 --- a/javascript/ql/src/Security/CWE-079/XssThroughDom.ql +++ b/javascript/ql/src/Security/CWE-079/XssThroughDom.ql @@ -4,7 +4,7 @@ * can lead to a cross-site scripting vulnerability. * @kind path-problem * @problem.severity warning - * @security-severity 6.1 + * @security-severity 7.8 * @precision high * @id js/xss-through-dom * @tags security diff --git a/javascript/ql/src/Security/CWE-117/LogInjection.ql b/javascript/ql/src/Security/CWE-117/LogInjection.ql index d80c3214e74..6a2176a9e9f 100644 --- a/javascript/ql/src/Security/CWE-117/LogInjection.ql +++ b/javascript/ql/src/Security/CWE-117/LogInjection.ql @@ -4,7 +4,7 @@ * insertion of forged log entries by a malicious user. * @kind path-problem * @problem.severity error - * @security-severity 7.8 + * @security-severity 6.1 * @precision medium * @id js/log-injection * @tags security diff --git a/javascript/ql/src/change-notes/2023-10-09-adjust-xss-and-log-injection-severity.md b/javascript/ql/src/change-notes/2023-10-09-adjust-xss-and-log-injection-severity.md new file mode 100644 index 00000000000..997edbf7981 --- /dev/null +++ b/javascript/ql/src/change-notes/2023-10-09-adjust-xss-and-log-injection-severity.md @@ -0,0 +1,6 @@ +--- +category: queryMetadata +--- + +* Lower the severity of log-injection to medium. +* Increase the severity of XSS to high. \ No newline at end of file From 1fe565a46fc535351934a8d55660b343d25e03cf Mon Sep 17 00:00:00 2001 From: amammad <77095239+amammad@users.noreply.github.com> Date: Sat, 21 Oct 2023 19:42:50 +0200 Subject: [PATCH 005/202] cherrypy framework file system access Sinks are added --- .../lib/semmle/python/frameworks/Cherrypy.qll | 48 +++++++++++++++++++ .../frameworks/FileSystemAccess/cherrypy.py | 8 ++++ 2 files changed, 56 insertions(+) create mode 100644 python/ql/lib/semmle/python/frameworks/Cherrypy.qll create mode 100644 python/ql/test/library-tests/frameworks/FileSystemAccess/cherrypy.py diff --git a/python/ql/lib/semmle/python/frameworks/Cherrypy.qll b/python/ql/lib/semmle/python/frameworks/Cherrypy.qll new file mode 100644 index 00000000000..c589d150f56 --- /dev/null +++ b/python/ql/lib/semmle/python/frameworks/Cherrypy.qll @@ -0,0 +1,48 @@ +/** + * Provides classes modeling security-relevant aspects of the `cherrypy` PyPI package. + */ + +private import python +private import semmle.python.dataflow.new.DataFlow +private import semmle.python.dataflow.new.RemoteFlowSources +private import semmle.python.dataflow.new.TaintTracking +private import semmle.python.Concepts +private import semmle.python.ApiGraphs + +/** + * Provides models for the `cherrypy` PyPI package. + * See https://cherrypy.dev/. + */ +private module Cherrypy { + /** + * Holds for an instance of `cherrypy.lib.static` + */ + API::Node libStatic() { + result = API::moduleImport("cherrypy").getMember("lib").getMember("static") + } + + /** + * A call to the `serve_file` or `serve_download`or `staticfile` functions of `cherrypy.lib.static` as a sink for Filesystem access. + */ + class FileResponseCall extends FileSystemAccess::Range, API::CallNode { + string funcName; + + FileResponseCall() { + this = libStatic().getMember("staticfile").getACall() and + funcName = "staticfile" + or + this = libStatic().getMember("serve_file").getACall() and + funcName = "serve_file" + or + this = libStatic().getMember("serve_download").getACall() and + funcName = "serve_download" + } + + override DataFlow::Node getAPathArgument() { + result = this.getParameter(0, "path").asSink() and funcName = ["serve_download", "serve_file"] + or + result = this.getParameter(0, "filename").asSink() and + funcName = "staticfile" + } + } +} diff --git a/python/ql/test/library-tests/frameworks/FileSystemAccess/cherrypy.py b/python/ql/test/library-tests/frameworks/FileSystemAccess/cherrypy.py new file mode 100644 index 00000000000..04400c1ed8f --- /dev/null +++ b/python/ql/test/library-tests/frameworks/FileSystemAccess/cherrypy.py @@ -0,0 +1,8 @@ +import cherrypy +from cherrypy.lib.static import serve_file, serve_download, staticfile + +serve_file("file") # $ getAPathArgument="file" +serve_download("file") # $ getAPathArgument="file" +staticfile("file") # $ getAPathArgument="file" +# root won't make this safe +staticfile("file", root="/path/to/safe/dir") # $ getAPathArgument="file" From a0e2e1ef2105faba1f728c7cd0fda382c70545a4 Mon Sep 17 00:00:00 2001 From: amammad <77095239+amammad@users.noreply.github.com> Date: Sat, 21 Oct 2023 19:49:27 +0200 Subject: [PATCH 006/202] add to Frameworks.qll --- python/ql/lib/semmle/python/Frameworks.qll | 1 + 1 file changed, 1 insertion(+) diff --git a/python/ql/lib/semmle/python/Frameworks.qll b/python/ql/lib/semmle/python/Frameworks.qll index 8b32dcccfb6..cfb34d0db78 100644 --- a/python/ql/lib/semmle/python/Frameworks.qll +++ b/python/ql/lib/semmle/python/Frameworks.qll @@ -12,6 +12,7 @@ private import semmle.python.frameworks.Aiopg private import semmle.python.frameworks.Asyncpg private import semmle.python.frameworks.BSon private import semmle.python.frameworks.CassandraDriver +private import semmle.python.frameworks.Cherrypy private import semmle.python.frameworks.ClickhouseDriver private import semmle.python.frameworks.Cryptodome private import semmle.python.frameworks.Cryptography From 968127eaa3bfb234c6b02595d9a0e540c435da8c Mon Sep 17 00:00:00 2001 From: Stephan Brandauer Date: Tue, 31 Oct 2023 11:09:02 +0100 Subject: [PATCH 007/202] Java: release automodel extraction queries 0.0.7 --- java/ql/automodel/src/CHANGELOG.md | 4 ++++ java/ql/automodel/src/change-notes/released/0.0.7.md | 3 +++ java/ql/automodel/src/codeql-pack.release.yml | 2 +- java/ql/automodel/src/qlpack.yml | 2 +- 4 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 java/ql/automodel/src/change-notes/released/0.0.7.md diff --git a/java/ql/automodel/src/CHANGELOG.md b/java/ql/automodel/src/CHANGELOG.md index 89d062a2a24..88b3b77ee45 100644 --- a/java/ql/automodel/src/CHANGELOG.md +++ b/java/ql/automodel/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.0.7 + +No user-facing changes. + ## 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 new file mode 100644 index 00000000000..a4e26791ae4 --- /dev/null +++ b/java/ql/automodel/src/change-notes/released/0.0.7.md @@ -0,0 +1,3 @@ +## 0.0.7 + +Support for extracting source candidates. diff --git a/java/ql/automodel/src/codeql-pack.release.yml b/java/ql/automodel/src/codeql-pack.release.yml index cf398ce02aa..a2a5484910b 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.6 +lastReleaseVersion: 0.0.7 diff --git a/java/ql/automodel/src/qlpack.yml b/java/ql/automodel/src/qlpack.yml index a157feb9ebe..23b4a9e7e32 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.7-dev +version: 0.0.8-dev groups: - java - automodel From 9087259b1b1c4934e78498891cbd3521f26f92fc Mon Sep 17 00:00:00 2001 From: Stephan Brandauer Date: Tue, 31 Oct 2023 11:11:22 +0100 Subject: [PATCH 008/202] Java: add instructions to automodel query publish script --- java/ql/automodel/publish.sh | 3 +++ 1 file changed, 3 insertions(+) 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" From 3d8a7e0ee319471fb9a0b78f40425e49fcfefed6 Mon Sep 17 00:00:00 2001 From: Rasmus Wriedt Larsen Date: Mon, 6 Nov 2023 11:29:52 +0100 Subject: [PATCH 009/202] Python: Add change-note --- .../src/change-notes/2023-11-06-more-filesystem-modeling.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 python/ql/src/change-notes/2023-11-06-more-filesystem-modeling.md diff --git a/python/ql/src/change-notes/2023-11-06-more-filesystem-modeling.md b/python/ql/src/change-notes/2023-11-06-more-filesystem-modeling.md new file mode 100644 index 00000000000..f801e5c22b5 --- /dev/null +++ b/python/ql/src/change-notes/2023-11-06-more-filesystem-modeling.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Added modeling of more `FileSystemAccess` in packages `cherrypy`, `aiofile`, `aiofiles`, `anyio`, `sanic`, `starlette`, `baize`, and `io`. This will mainly affect the _Uncontrolled data used in path expression_ (`py/path-injection`) query. From ec075f8fbeb67342fc49819ea939603e223d8d32 Mon Sep 17 00:00:00 2001 From: Arthur Baars Date: Tue, 10 Oct 2023 11:44:15 +0200 Subject: [PATCH 010/202] Upgrade typescript to 5.3.1-rc --- docs/codeql/reusables/supported-versions-compilers.rst | 2 +- javascript/extractor/lib/typescript/package-lock.json | 8 ++++---- javascript/extractor/lib/typescript/package.json | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) 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/javascript/extractor/lib/typescript/package-lock.json b/javascript/extractor/lib/typescript/package-lock.json index 9384d286b79..135756e3b52 100644 --- a/javascript/extractor/lib/typescript/package-lock.json +++ b/javascript/extractor/lib/typescript/package-lock.json @@ -6,7 +6,7 @@ "": { "name": "typescript-parser-wrapper", "dependencies": { - "typescript": "5.2.2" + "typescript": "^5.3.1-rc" }, "devDependencies": { "@types/node": "18.15.3" @@ -20,9 +20,9 @@ "license": "MIT" }, "node_modules/typescript": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", - "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "version": "5.3.1-rc", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.1-rc.tgz", + "integrity": "sha512-NVq/AufFc6KVjmVPcuVwdCkhTQlTcMEyRYJPvaGhPvj+X80MYUF+90qf0//uvINPb2ULg9m91/gbdIOhN2cZqA==", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" diff --git a/javascript/extractor/lib/typescript/package.json b/javascript/extractor/lib/typescript/package.json index e043afa01db..6fe0aebeaca 100644 --- a/javascript/extractor/lib/typescript/package.json +++ b/javascript/extractor/lib/typescript/package.json @@ -2,7 +2,7 @@ "name": "typescript-parser-wrapper", "private": true, "dependencies": { - "typescript": "5.2.2" + "typescript": "^5.3.1-rc" }, "scripts": { "build": "tsc --project tsconfig.json", From 1067dd9dd3de9c9ad4318f28f551d03ae36b176c Mon Sep 17 00:00:00 2001 From: Arthur Baars Date: Tue, 10 Oct 2023 11:44:41 +0200 Subject: [PATCH 011/202] Auto-format --- .../ts/extractor/TypeScriptASTConverter.java | 70 ++++++++++--------- 1 file changed, 38 insertions(+), 32 deletions(-) diff --git a/javascript/extractor/src/com/semmle/ts/extractor/TypeScriptASTConverter.java b/javascript/extractor/src/com/semmle/ts/extractor/TypeScriptASTConverter.java index bf48c3fd7c9..44245ec99d0 100644 --- a/javascript/extractor/src/com/semmle/ts/extractor/TypeScriptASTConverter.java +++ b/javascript/extractor/src/com/semmle/ts/extractor/TypeScriptASTConverter.java @@ -1,11 +1,5 @@ package com.semmle.ts.extractor; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonNull; @@ -145,17 +139,22 @@ import com.semmle.ts.ast.OptionalTypeExpr; import com.semmle.ts.ast.ParenthesizedTypeExpr; import com.semmle.ts.ast.PredicateTypeExpr; import com.semmle.ts.ast.RestTypeExpr; +import com.semmle.ts.ast.SatisfiesExpr; import com.semmle.ts.ast.TemplateLiteralTypeExpr; import com.semmle.ts.ast.TupleTypeExpr; import com.semmle.ts.ast.TypeAliasDeclaration; import com.semmle.ts.ast.TypeAssertion; -import com.semmle.ts.ast.SatisfiesExpr; import com.semmle.ts.ast.TypeParameter; import com.semmle.ts.ast.TypeofTypeExpr; import com.semmle.ts.ast.UnaryTypeExpr; import com.semmle.ts.ast.UnionTypeExpr; import com.semmle.util.collections.CollectionUtil; import com.semmle.util.data.IntList; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; /** * Utility class for converting a arguments = convertChildren(node, "arguments"); if (arguments.size() >= 1 && hasKind(node.get("expression"), "ImportKeyword")) { - return new DynamicImport(loc, arguments.get(0), arguments.size() > 1 ? arguments.get(1) : null); + return new DynamicImport( + loc, arguments.get(0), arguments.size() > 1 ? arguments.get(1) : null); } Expression callee = convertChild(node, "expression"); List typeArguments = convertChildrenAsTypes(node, "typeArguments"); @@ -1238,7 +1240,8 @@ public class TypeScriptASTConverter { private Node convertExternalModuleReference(JsonObject node, SourceLocation loc) throws ParseError { - ExternalModuleReference moduleRef = new ExternalModuleReference(loc, convertChild(node, "expression")); + ExternalModuleReference moduleRef = + new ExternalModuleReference(loc, convertChild(node, "expression")); attachSymbolInformation(moduleRef, node); return moduleRef; } @@ -1407,7 +1410,8 @@ public class TypeScriptASTConverter { } hasTypeKeyword = importClause.get("isTypeOnly").getAsBoolean(); } - ImportDeclaration importDecl = new ImportDeclaration(loc, specifiers, src, assertion, hasTypeKeyword); + ImportDeclaration importDecl = + new ImportDeclaration(loc, specifiers, src, assertion, hasTypeKeyword); attachSymbolInformation(importDecl, node); return importDecl; } @@ -1558,7 +1562,9 @@ public class TypeScriptASTConverter { nameNode = nameNode.get("name").getAsJsonObject(); } return new JSXAttribute( - loc, convertJSXName(((Expression)convertNode(nameNode, null))), convertChild(node, "initializer")); // 2 + loc, + convertJSXName(((Expression) convertNode(nameNode, null))), + convertChild(node, "initializer")); // 2 } private Node convertJsxClosingElement(JsonObject node, SourceLocation loc) throws ParseError { @@ -1649,8 +1655,10 @@ public class TypeScriptASTConverter { } } if (literal instanceof TemplateLiteral) { - // A LiteralType containing a NoSubstitutionTemplateLiteral must produce a TemplateLiteralTypeExpr - return new TemplateLiteralTypeExpr(literal.getLoc(), new ArrayList<>(), ((TemplateLiteral)literal).getQuasis()); + // A LiteralType containing a NoSubstitutionTemplateLiteral must produce a + // TemplateLiteralTypeExpr + return new TemplateLiteralTypeExpr( + literal.getLoc(), new ArrayList<>(), ((TemplateLiteral) literal).getQuasis()); } return literal; } @@ -2254,7 +2262,7 @@ public class TypeScriptASTConverter { for (JsonElement element : node.get("elements").getAsJsonArray()) { Identifier id = null; if (getKind(element).equals("NamedTupleMember")) { - id = (Identifier)convertNode(element.getAsJsonObject().get("name").getAsJsonObject()); + id = (Identifier) convertNode(element.getAsJsonObject().get("name").getAsJsonObject()); } names.add(id); } @@ -2262,7 +2270,8 @@ public class TypeScriptASTConverter { return new TupleTypeExpr(loc, convertChildrenAsTypes(node, "elements"), names); } - // This method just does a trivial forward to the type. The names have already been extracted in `convertTupleType`. + // This method just does a trivial forward to the type. The names have already been extracted in + // `convertTupleType`. private Node convertNamedTupleMember(JsonObject node, SourceLocation loc) throws ParseError { return convertChild(node, "type"); } @@ -2291,7 +2300,7 @@ public class TypeScriptASTConverter { private Node convertAssertClause(JsonObject node, SourceLocation loc) throws ParseError { List properties = new ArrayList<>(); for (INode child : convertChildren(node, "elements")) { - properties.add((Property)child); + properties.add((Property) child); } // Adjust location to skip over the `assert` keyword. Matcher m = ASSERT_START.matcher(loc.getSource()); @@ -2303,12 +2312,7 @@ public class TypeScriptASTConverter { private Node convertAssertEntry(JsonObject node, SourceLocation loc) throws ParseError { return new Property( - loc, - convertChild(node, "key"), - convertChild(node, "value"), - "init", - false, - false); + loc, convertChild(node, "key"), convertChild(node, "value"), "init", false, false); } private Node convertSatisfiesExpression(JsonObject node, SourceLocation loc) throws ParseError { @@ -2490,7 +2494,8 @@ public class TypeScriptASTConverter { advance(loc, skipped); // capture group 1 is `default`, if present if (m.group(1) == null) - return new ExportNamedDeclaration(outerLoc, (Statement) decl, new ArrayList<>(), null, null); + return new ExportNamedDeclaration( + outerLoc, (Statement) decl, new ArrayList<>(), null, null); return new ExportDefaultDeclaration(outerLoc, decl); } return decl; @@ -2586,8 +2591,9 @@ public class TypeScriptASTConverter { } /** - * Returns a specific modifier from the given node (or null if absent), as defined by its - * modifiers property and the kind property of the modifier AST node. + * Returns a specific modifier from the given node (or null if absent), as defined by + * its modifiers property and the kind property of the modifier AST + * node. */ private JsonObject getModifier(JsonObject node, String modKind) { for (JsonElement mod : getModifiers(node)) @@ -2597,8 +2603,8 @@ public class TypeScriptASTConverter { } /** - * Check whether a node has a particular modifier, as defined by its modifiers property - * and the kind property of the modifier AST node. + * Check whether a node has a particular modifier, as defined by its modifiers + * property and the kind property of the modifier AST node. */ private boolean hasModifier(JsonObject node, String modKind) { return getModifier(node, modKind) != null; @@ -2639,8 +2645,8 @@ public class TypeScriptASTConverter { } /** - * Check whether a node has a particular flag, as defined by its flags property and the - * ts.NodeFlags in enum. + * Check whether a node has a particular flag, as defined by its flags property and + * the ts.NodeFlags in enum. */ private boolean hasFlag(JsonObject node, String flagName) { int flagId = metadata.getNodeFlagId(flagName); @@ -2683,7 +2689,7 @@ public class TypeScriptASTConverter { } /** - * Gets the declaration kind of the given node, which is one of {@code "var"}, {@code "let"}, + * Gets the declaration kind of the given node, which is one of {@code "var"}, {@code "let"}, * {@code "const"}, or {@code "using"}. */ private String getDeclarationKind(JsonObject declarationList) { From bd62ec294eee76dc3c14a640e8887f0b69719dde Mon Sep 17 00:00:00 2001 From: Arthur Baars Date: Tue, 10 Oct 2023 11:46:37 +0200 Subject: [PATCH 012/202] Support TS 5.3 import attributes (previously import assertions) --- .../ts/extractor/TypeScriptASTConverter.java | 19 +- .../tests/ts/input/import-assertion.ts | 14 +- .../ts/output/trap/import-assertion.ts.trap | 470 +++++++++--------- 3 files changed, 255 insertions(+), 248 deletions(-) diff --git a/javascript/extractor/src/com/semmle/ts/extractor/TypeScriptASTConverter.java b/javascript/extractor/src/com/semmle/ts/extractor/TypeScriptASTConverter.java index 44245ec99d0..869a2227f0d 100644 --- a/javascript/extractor/src/com/semmle/ts/extractor/TypeScriptASTConverter.java +++ b/javascript/extractor/src/com/semmle/ts/extractor/TypeScriptASTConverter.java @@ -176,7 +176,8 @@ public class TypeScriptASTConverter { private static final Pattern EXPORT_DECL_START = Pattern.compile("^export" + "(" + WHITESPACE_CHAR + "+default)?" + WHITESPACE_CHAR + "+"); private static final Pattern TYPEOF_START = Pattern.compile("^typeof" + WHITESPACE_CHAR + "+"); - private static final Pattern ASSERT_START = Pattern.compile("^assert" + WHITESPACE_CHAR + "+"); + private static final Pattern IMPORT_ATTRIBUTE_START = + Pattern.compile("^(assert|with)" + WHITESPACE_CHAR + "+"); private static final Pattern WHITESPACE_END_PAREN = Pattern.compile("^" + WHITESPACE_CHAR + "*\\)"); @@ -342,10 +343,10 @@ public class TypeScriptASTConverter { return convertArrowFunction(node, loc); case "AsExpression": return convertTypeAssertionExpression(node, loc); - case "AssertClause": - return convertAssertClause(node, loc); - case "AssertEntry": - return convertAssertEntry(node, loc); + case "ImportAttributes": + return convertImportAttributes(node, loc); + case "ImportAttribute": + return convertImportAttribute(node, loc); case "SatisfiesExpression": return convertSatisfiesExpression(node, loc); case "AwaitExpression": @@ -2297,20 +2298,20 @@ public class TypeScriptASTConverter { return new TypeAssertion(loc, convertChild(node, "expression"), type, false); } - private Node convertAssertClause(JsonObject node, SourceLocation loc) throws ParseError { + private Node convertImportAttributes(JsonObject node, SourceLocation loc) throws ParseError { List properties = new ArrayList<>(); for (INode child : convertChildren(node, "elements")) { properties.add((Property) child); } - // Adjust location to skip over the `assert` keyword. - Matcher m = ASSERT_START.matcher(loc.getSource()); + // Adjust location to skip over the `with` or `assert` keyword. + Matcher m = IMPORT_ATTRIBUTE_START.matcher(loc.getSource()); if (m.find()) { advance(loc, m.group(0)); } return new ObjectExpression(loc, properties); } - private Node convertAssertEntry(JsonObject node, SourceLocation loc) throws ParseError { + private Node convertImportAttribute(JsonObject node, SourceLocation loc) throws ParseError { return new Property( loc, convertChild(node, "key"), convertChild(node, "value"), "init", false, false); } diff --git a/javascript/extractor/tests/ts/input/import-assertion.ts b/javascript/extractor/tests/ts/input/import-assertion.ts index b138341aa63..79db36cf22b 100644 --- a/javascript/extractor/tests/ts/input/import-assertion.ts +++ b/javascript/extractor/tests/ts/input/import-assertion.ts @@ -1,13 +1,13 @@ -import "module" assert { type: "json" }; -import * as v1 from "module" assert { type: "json" }; -import { v2 } from "module" assert { type: "json" }; +import "module" with { type: "json" }; +import * as v1 from "module" with { type: "json" }; +import { v2 } from "module" with { type: "json" }; import v3 from "module" assert { type: "json" }; -export { v4 } from "module" assert { type: "json" }; -export * from "module" assert { type: "json" }; -export * as v5 from "module" assert { type: "json" }; +export { v4 } from "module" with { type: "json" }; +export * from "module" with { type: "json" }; +export * as v5 from "module" with { type: "json" }; -const v6 = import("module", { assert: { type: "json" } }); +const v6 = import("module", { "with": { type: "json" } }); import "module"; // missing semicolon assert({ type: "json" }); // function call, not import assertion diff --git a/javascript/extractor/tests/ts/output/trap/import-assertion.ts.trap b/javascript/extractor/tests/ts/output/trap/import-assertion.ts.trap index f760d246f7d..6e69eff287c 100644 --- a/javascript/extractor/tests/ts/output/trap/import-assertion.ts.trap +++ b/javascript/extractor/tests/ts/output/trap/import-assertion.ts.trap @@ -20,22 +20,22 @@ comments(#20004,0,#20001," function call, not import assertion","// func ... ser locations_default(#20005,#10000,13,27,13,64) hasLocation(#20004,#20005) #20006=* -lines(#20006,#20001,"import ""module"" assert { type: ""json"" };"," +lines(#20006,#20001,"import ""module"" with { type: ""json"" };"," ") -#20007=@"loc,{#10000},1,1,1,40" -locations_default(#20007,#10000,1,1,1,40) +#20007=@"loc,{#10000},1,1,1,38" +locations_default(#20007,#10000,1,1,1,38) hasLocation(#20006,#20007) #20008=* -lines(#20008,#20001,"import * as v1 from ""module"" assert { type: ""json"" };"," +lines(#20008,#20001,"import * as v1 from ""module"" with { type: ""json"" };"," ") -#20009=@"loc,{#10000},2,1,2,53" -locations_default(#20009,#10000,2,1,2,53) +#20009=@"loc,{#10000},2,1,2,51" +locations_default(#20009,#10000,2,1,2,51) hasLocation(#20008,#20009) #20010=* -lines(#20010,#20001,"import { v2 } from ""module"" assert { type: ""json"" };"," +lines(#20010,#20001,"import { v2 } from ""module"" with { type: ""json"" };"," ") -#20011=@"loc,{#10000},3,1,3,52" -locations_default(#20011,#10000,3,1,3,52) +#20011=@"loc,{#10000},3,1,3,50" +locations_default(#20011,#10000,3,1,3,50) hasLocation(#20010,#20011) #20012=* lines(#20012,#20001,"import v3 from ""module"" assert { type: ""json"" };"," @@ -50,22 +50,22 @@ lines(#20014,#20001,""," locations_default(#20015,#10000,5,1,5,0) hasLocation(#20014,#20015) #20016=* -lines(#20016,#20001,"export { v4 } from ""module"" assert { type: ""json"" };"," +lines(#20016,#20001,"export { v4 } from ""module"" with { type: ""json"" };"," ") -#20017=@"loc,{#10000},6,1,6,52" -locations_default(#20017,#10000,6,1,6,52) +#20017=@"loc,{#10000},6,1,6,50" +locations_default(#20017,#10000,6,1,6,50) hasLocation(#20016,#20017) #20018=* -lines(#20018,#20001,"export * from ""module"" assert { type: ""json"" };"," +lines(#20018,#20001,"export * from ""module"" with { type: ""json"" };"," ") -#20019=@"loc,{#10000},7,1,7,47" -locations_default(#20019,#10000,7,1,7,47) +#20019=@"loc,{#10000},7,1,7,45" +locations_default(#20019,#10000,7,1,7,45) hasLocation(#20018,#20019) #20020=* -lines(#20020,#20001,"export * as v5 from ""module"" assert { type: ""json"" };"," +lines(#20020,#20001,"export * as v5 from ""module"" with { type: ""json"" };"," ") -#20021=@"loc,{#10000},8,1,8,53" -locations_default(#20021,#10000,8,1,8,53) +#20021=@"loc,{#10000},8,1,8,51" +locations_default(#20021,#10000,8,1,8,51) hasLocation(#20020,#20021) #20022=* lines(#20022,#20001,""," @@ -74,7 +74,7 @@ lines(#20022,#20001,""," locations_default(#20023,#10000,9,1,9,0) hasLocation(#20022,#20023) #20024=* -lines(#20024,#20001,"const v6 = import(""module"", { assert: { type: ""json"" } });"," +lines(#20024,#20001,"const v6 = import(""module"", { ""with"": { type: ""json"" } });"," ") #20025=@"loc,{#10000},10,1,10,58" locations_default(#20025,#10000,10,1,10,58) @@ -109,39 +109,39 @@ tokeninfo(#20034,4,#20001,1,"""module""") locations_default(#20035,#10000,1,8,1,15) hasLocation(#20034,#20035) #20036=* -tokeninfo(#20036,7,#20001,2,"assert") -#20037=@"loc,{#10000},1,17,1,22" -locations_default(#20037,#10000,1,17,1,22) +tokeninfo(#20036,7,#20001,2,"with") +#20037=@"loc,{#10000},1,17,1,20" +locations_default(#20037,#10000,1,17,1,20) hasLocation(#20036,#20037) #20038=* tokeninfo(#20038,8,#20001,3,"{") -#20039=@"loc,{#10000},1,24,1,24" -locations_default(#20039,#10000,1,24,1,24) +#20039=@"loc,{#10000},1,22,1,22" +locations_default(#20039,#10000,1,22,1,22) hasLocation(#20038,#20039) #20040=* tokeninfo(#20040,7,#20001,4,"type") -#20041=@"loc,{#10000},1,26,1,29" -locations_default(#20041,#10000,1,26,1,29) +#20041=@"loc,{#10000},1,24,1,27" +locations_default(#20041,#10000,1,24,1,27) hasLocation(#20040,#20041) #20042=* tokeninfo(#20042,8,#20001,5,":") -#20043=@"loc,{#10000},1,30,1,30" -locations_default(#20043,#10000,1,30,1,30) +#20043=@"loc,{#10000},1,28,1,28" +locations_default(#20043,#10000,1,28,1,28) hasLocation(#20042,#20043) #20044=* tokeninfo(#20044,4,#20001,6,"""json""") -#20045=@"loc,{#10000},1,32,1,37" -locations_default(#20045,#10000,1,32,1,37) +#20045=@"loc,{#10000},1,30,1,35" +locations_default(#20045,#10000,1,30,1,35) hasLocation(#20044,#20045) #20046=* tokeninfo(#20046,8,#20001,7,"}") -#20047=@"loc,{#10000},1,39,1,39" -locations_default(#20047,#10000,1,39,1,39) +#20047=@"loc,{#10000},1,37,1,37" +locations_default(#20047,#10000,1,37,1,37) hasLocation(#20046,#20047) #20048=* tokeninfo(#20048,8,#20001,8,";") -#20049=@"loc,{#10000},1,40,1,40" -locations_default(#20049,#10000,1,40,1,40) +#20049=@"loc,{#10000},1,38,1,38" +locations_default(#20049,#10000,1,38,1,38) hasLocation(#20048,#20049) #20050=* tokeninfo(#20050,7,#20001,9,"import") @@ -174,39 +174,39 @@ tokeninfo(#20060,4,#20001,14,"""module""") locations_default(#20061,#10000,2,21,2,28) hasLocation(#20060,#20061) #20062=* -tokeninfo(#20062,7,#20001,15,"assert") -#20063=@"loc,{#10000},2,30,2,35" -locations_default(#20063,#10000,2,30,2,35) +tokeninfo(#20062,7,#20001,15,"with") +#20063=@"loc,{#10000},2,30,2,33" +locations_default(#20063,#10000,2,30,2,33) hasLocation(#20062,#20063) #20064=* tokeninfo(#20064,8,#20001,16,"{") -#20065=@"loc,{#10000},2,37,2,37" -locations_default(#20065,#10000,2,37,2,37) +#20065=@"loc,{#10000},2,35,2,35" +locations_default(#20065,#10000,2,35,2,35) hasLocation(#20064,#20065) #20066=* tokeninfo(#20066,7,#20001,17,"type") -#20067=@"loc,{#10000},2,39,2,42" -locations_default(#20067,#10000,2,39,2,42) +#20067=@"loc,{#10000},2,37,2,40" +locations_default(#20067,#10000,2,37,2,40) hasLocation(#20066,#20067) #20068=* tokeninfo(#20068,8,#20001,18,":") -#20069=@"loc,{#10000},2,43,2,43" -locations_default(#20069,#10000,2,43,2,43) +#20069=@"loc,{#10000},2,41,2,41" +locations_default(#20069,#10000,2,41,2,41) hasLocation(#20068,#20069) #20070=* tokeninfo(#20070,4,#20001,19,"""json""") -#20071=@"loc,{#10000},2,45,2,50" -locations_default(#20071,#10000,2,45,2,50) +#20071=@"loc,{#10000},2,43,2,48" +locations_default(#20071,#10000,2,43,2,48) hasLocation(#20070,#20071) #20072=* tokeninfo(#20072,8,#20001,20,"}") -#20073=@"loc,{#10000},2,52,2,52" -locations_default(#20073,#10000,2,52,2,52) +#20073=@"loc,{#10000},2,50,2,50" +locations_default(#20073,#10000,2,50,2,50) hasLocation(#20072,#20073) #20074=* tokeninfo(#20074,8,#20001,21,";") -#20075=@"loc,{#10000},2,53,2,53" -locations_default(#20075,#10000,2,53,2,53) +#20075=@"loc,{#10000},2,51,2,51" +locations_default(#20075,#10000,2,51,2,51) hasLocation(#20074,#20075) #20076=* tokeninfo(#20076,7,#20001,22,"import") @@ -239,39 +239,39 @@ tokeninfo(#20086,4,#20001,27,"""module""") locations_default(#20087,#10000,3,20,3,27) hasLocation(#20086,#20087) #20088=* -tokeninfo(#20088,7,#20001,28,"assert") -#20089=@"loc,{#10000},3,29,3,34" -locations_default(#20089,#10000,3,29,3,34) +tokeninfo(#20088,7,#20001,28,"with") +#20089=@"loc,{#10000},3,29,3,32" +locations_default(#20089,#10000,3,29,3,32) hasLocation(#20088,#20089) #20090=* tokeninfo(#20090,8,#20001,29,"{") -#20091=@"loc,{#10000},3,36,3,36" -locations_default(#20091,#10000,3,36,3,36) +#20091=@"loc,{#10000},3,34,3,34" +locations_default(#20091,#10000,3,34,3,34) hasLocation(#20090,#20091) #20092=* tokeninfo(#20092,7,#20001,30,"type") -#20093=@"loc,{#10000},3,38,3,41" -locations_default(#20093,#10000,3,38,3,41) +#20093=@"loc,{#10000},3,36,3,39" +locations_default(#20093,#10000,3,36,3,39) hasLocation(#20092,#20093) #20094=* tokeninfo(#20094,8,#20001,31,":") -#20095=@"loc,{#10000},3,42,3,42" -locations_default(#20095,#10000,3,42,3,42) +#20095=@"loc,{#10000},3,40,3,40" +locations_default(#20095,#10000,3,40,3,40) hasLocation(#20094,#20095) #20096=* tokeninfo(#20096,4,#20001,32,"""json""") -#20097=@"loc,{#10000},3,44,3,49" -locations_default(#20097,#10000,3,44,3,49) +#20097=@"loc,{#10000},3,42,3,47" +locations_default(#20097,#10000,3,42,3,47) hasLocation(#20096,#20097) #20098=* tokeninfo(#20098,8,#20001,33,"}") -#20099=@"loc,{#10000},3,51,3,51" -locations_default(#20099,#10000,3,51,3,51) +#20099=@"loc,{#10000},3,49,3,49" +locations_default(#20099,#10000,3,49,3,49) hasLocation(#20098,#20099) #20100=* tokeninfo(#20100,8,#20001,34,";") -#20101=@"loc,{#10000},3,52,3,52" -locations_default(#20101,#10000,3,52,3,52) +#20101=@"loc,{#10000},3,50,3,50" +locations_default(#20101,#10000,3,50,3,50) hasLocation(#20100,#20101) #20102=* tokeninfo(#20102,7,#20001,35,"import") @@ -359,39 +359,39 @@ tokeninfo(#20134,4,#20001,51,"""module""") locations_default(#20135,#10000,6,20,6,27) hasLocation(#20134,#20135) #20136=* -tokeninfo(#20136,7,#20001,52,"assert") -#20137=@"loc,{#10000},6,29,6,34" -locations_default(#20137,#10000,6,29,6,34) +tokeninfo(#20136,7,#20001,52,"with") +#20137=@"loc,{#10000},6,29,6,32" +locations_default(#20137,#10000,6,29,6,32) hasLocation(#20136,#20137) #20138=* tokeninfo(#20138,8,#20001,53,"{") -#20139=@"loc,{#10000},6,36,6,36" -locations_default(#20139,#10000,6,36,6,36) +#20139=@"loc,{#10000},6,34,6,34" +locations_default(#20139,#10000,6,34,6,34) hasLocation(#20138,#20139) #20140=* tokeninfo(#20140,7,#20001,54,"type") -#20141=@"loc,{#10000},6,38,6,41" -locations_default(#20141,#10000,6,38,6,41) +#20141=@"loc,{#10000},6,36,6,39" +locations_default(#20141,#10000,6,36,6,39) hasLocation(#20140,#20141) #20142=* tokeninfo(#20142,8,#20001,55,":") -#20143=@"loc,{#10000},6,42,6,42" -locations_default(#20143,#10000,6,42,6,42) +#20143=@"loc,{#10000},6,40,6,40" +locations_default(#20143,#10000,6,40,6,40) hasLocation(#20142,#20143) #20144=* tokeninfo(#20144,4,#20001,56,"""json""") -#20145=@"loc,{#10000},6,44,6,49" -locations_default(#20145,#10000,6,44,6,49) +#20145=@"loc,{#10000},6,42,6,47" +locations_default(#20145,#10000,6,42,6,47) hasLocation(#20144,#20145) #20146=* tokeninfo(#20146,8,#20001,57,"}") -#20147=@"loc,{#10000},6,51,6,51" -locations_default(#20147,#10000,6,51,6,51) +#20147=@"loc,{#10000},6,49,6,49" +locations_default(#20147,#10000,6,49,6,49) hasLocation(#20146,#20147) #20148=* tokeninfo(#20148,8,#20001,58,";") -#20149=@"loc,{#10000},6,52,6,52" -locations_default(#20149,#10000,6,52,6,52) +#20149=@"loc,{#10000},6,50,6,50" +locations_default(#20149,#10000,6,50,6,50) hasLocation(#20148,#20149) #20150=* tokeninfo(#20150,7,#20001,59,"export") @@ -414,39 +414,39 @@ tokeninfo(#20156,4,#20001,62,"""module""") locations_default(#20157,#10000,7,15,7,22) hasLocation(#20156,#20157) #20158=* -tokeninfo(#20158,7,#20001,63,"assert") -#20159=@"loc,{#10000},7,24,7,29" -locations_default(#20159,#10000,7,24,7,29) +tokeninfo(#20158,7,#20001,63,"with") +#20159=@"loc,{#10000},7,24,7,27" +locations_default(#20159,#10000,7,24,7,27) hasLocation(#20158,#20159) #20160=* tokeninfo(#20160,8,#20001,64,"{") -#20161=@"loc,{#10000},7,31,7,31" -locations_default(#20161,#10000,7,31,7,31) +#20161=@"loc,{#10000},7,29,7,29" +locations_default(#20161,#10000,7,29,7,29) hasLocation(#20160,#20161) #20162=* tokeninfo(#20162,7,#20001,65,"type") -#20163=@"loc,{#10000},7,33,7,36" -locations_default(#20163,#10000,7,33,7,36) +#20163=@"loc,{#10000},7,31,7,34" +locations_default(#20163,#10000,7,31,7,34) hasLocation(#20162,#20163) #20164=* tokeninfo(#20164,8,#20001,66,":") -#20165=@"loc,{#10000},7,37,7,37" -locations_default(#20165,#10000,7,37,7,37) +#20165=@"loc,{#10000},7,35,7,35" +locations_default(#20165,#10000,7,35,7,35) hasLocation(#20164,#20165) #20166=* tokeninfo(#20166,4,#20001,67,"""json""") -#20167=@"loc,{#10000},7,39,7,44" -locations_default(#20167,#10000,7,39,7,44) +#20167=@"loc,{#10000},7,37,7,42" +locations_default(#20167,#10000,7,37,7,42) hasLocation(#20166,#20167) #20168=* tokeninfo(#20168,8,#20001,68,"}") -#20169=@"loc,{#10000},7,46,7,46" -locations_default(#20169,#10000,7,46,7,46) +#20169=@"loc,{#10000},7,44,7,44" +locations_default(#20169,#10000,7,44,7,44) hasLocation(#20168,#20169) #20170=* tokeninfo(#20170,8,#20001,69,";") -#20171=@"loc,{#10000},7,47,7,47" -locations_default(#20171,#10000,7,47,7,47) +#20171=@"loc,{#10000},7,45,7,45" +locations_default(#20171,#10000,7,45,7,45) hasLocation(#20170,#20171) #20172=* tokeninfo(#20172,7,#20001,70,"export") @@ -479,39 +479,39 @@ tokeninfo(#20182,4,#20001,75,"""module""") locations_default(#20183,#10000,8,21,8,28) hasLocation(#20182,#20183) #20184=* -tokeninfo(#20184,7,#20001,76,"assert") -#20185=@"loc,{#10000},8,30,8,35" -locations_default(#20185,#10000,8,30,8,35) +tokeninfo(#20184,7,#20001,76,"with") +#20185=@"loc,{#10000},8,30,8,33" +locations_default(#20185,#10000,8,30,8,33) hasLocation(#20184,#20185) #20186=* tokeninfo(#20186,8,#20001,77,"{") -#20187=@"loc,{#10000},8,37,8,37" -locations_default(#20187,#10000,8,37,8,37) +#20187=@"loc,{#10000},8,35,8,35" +locations_default(#20187,#10000,8,35,8,35) hasLocation(#20186,#20187) #20188=* tokeninfo(#20188,7,#20001,78,"type") -#20189=@"loc,{#10000},8,39,8,42" -locations_default(#20189,#10000,8,39,8,42) +#20189=@"loc,{#10000},8,37,8,40" +locations_default(#20189,#10000,8,37,8,40) hasLocation(#20188,#20189) #20190=* tokeninfo(#20190,8,#20001,79,":") -#20191=@"loc,{#10000},8,43,8,43" -locations_default(#20191,#10000,8,43,8,43) +#20191=@"loc,{#10000},8,41,8,41" +locations_default(#20191,#10000,8,41,8,41) hasLocation(#20190,#20191) #20192=* tokeninfo(#20192,4,#20001,80,"""json""") -#20193=@"loc,{#10000},8,45,8,50" -locations_default(#20193,#10000,8,45,8,50) +#20193=@"loc,{#10000},8,43,8,48" +locations_default(#20193,#10000,8,43,8,48) hasLocation(#20192,#20193) #20194=* tokeninfo(#20194,8,#20001,81,"}") -#20195=@"loc,{#10000},8,52,8,52" -locations_default(#20195,#10000,8,52,8,52) +#20195=@"loc,{#10000},8,50,8,50" +locations_default(#20195,#10000,8,50,8,50) hasLocation(#20194,#20195) #20196=* tokeninfo(#20196,8,#20001,82,";") -#20197=@"loc,{#10000},8,53,8,53" -locations_default(#20197,#10000,8,53,8,53) +#20197=@"loc,{#10000},8,51,8,51" +locations_default(#20197,#10000,8,51,8,51) hasLocation(#20196,#20197) #20198=* tokeninfo(#20198,7,#20001,83,"const") @@ -554,7 +554,7 @@ tokeninfo(#20212,8,#20001,90,"{") locations_default(#20213,#10000,10,29,10,29) hasLocation(#20212,#20213) #20214=* -tokeninfo(#20214,7,#20001,91,"assert") +tokeninfo(#20214,4,#20001,91,"""with""") #20215=@"loc,{#10000},10,31,10,36" locations_default(#20215,#10000,10,31,10,36) hasLocation(#20214,#20215) @@ -727,15 +727,15 @@ hasLocation(#20274,#20275) regexp_const_value(#20274,"module") #20276=* exprs(#20276,8,#20272,-10,"{ type: ""json"" }") -#20277=@"loc,{#10000},1,24,1,39" -locations_default(#20277,#10000,1,24,1,39) +#20277=@"loc,{#10000},1,22,1,37" +locations_default(#20277,#10000,1,22,1,37) hasLocation(#20276,#20277) enclosing_stmt(#20276,#20272) expr_containers(#20276,#20001) #20278=* properties(#20278,#20276,0,0,"type: ""json""") -#20279=@"loc,{#10000},1,26,1,37" -locations_default(#20279,#10000,1,26,1,37) +#20279=@"loc,{#10000},1,24,1,35" +locations_default(#20279,#10000,1,24,1,35) hasLocation(#20278,#20279) #20280=* stmts(#20280,27,#20001,1,"import ... son"" };") @@ -755,15 +755,15 @@ hasLocation(#20282,#20283) regexp_const_value(#20282,"module") #20284=* exprs(#20284,8,#20280,-10,"{ type: ""json"" }") -#20285=@"loc,{#10000},2,37,2,52" -locations_default(#20285,#10000,2,37,2,52) +#20285=@"loc,{#10000},2,35,2,50" +locations_default(#20285,#10000,2,35,2,50) hasLocation(#20284,#20285) enclosing_stmt(#20284,#20280) expr_containers(#20284,#20001) #20286=* properties(#20286,#20284,0,0,"type: ""json""") -#20287=@"loc,{#10000},2,39,2,50" -locations_default(#20287,#10000,2,39,2,50) +#20287=@"loc,{#10000},2,37,2,48" +locations_default(#20287,#10000,2,37,2,48) hasLocation(#20286,#20287) #20288=* exprs(#20288,85,#20280,0,"* as v1") @@ -799,15 +799,15 @@ hasLocation(#20293,#20294) regexp_const_value(#20293,"module") #20295=* exprs(#20295,8,#20291,-10,"{ type: ""json"" }") -#20296=@"loc,{#10000},3,36,3,51" -locations_default(#20296,#10000,3,36,3,51) +#20296=@"loc,{#10000},3,34,3,49" +locations_default(#20296,#10000,3,34,3,49) hasLocation(#20295,#20296) enclosing_stmt(#20295,#20291) expr_containers(#20295,#20001) #20297=* properties(#20297,#20295,0,0,"type: ""json""") -#20298=@"loc,{#10000},3,38,3,49" -locations_default(#20298,#10000,3,38,3,49) +#20298=@"loc,{#10000},3,36,3,47" +locations_default(#20298,#10000,3,36,3,47) hasLocation(#20297,#20298) #20299=* exprs(#20299,83,#20291,0,"v2") @@ -889,15 +889,15 @@ hasLocation(#20314,#20315) regexp_const_value(#20314,"module") #20316=* exprs(#20316,8,#20312,-10,"{ type: ""json"" }") -#20317=@"loc,{#10000},6,36,6,51" -locations_default(#20317,#10000,6,36,6,51) +#20317=@"loc,{#10000},6,34,6,49" +locations_default(#20317,#10000,6,34,6,49) hasLocation(#20316,#20317) enclosing_stmt(#20316,#20312) expr_containers(#20316,#20001) #20318=* properties(#20318,#20316,0,0,"type: ""json""") -#20319=@"loc,{#10000},6,38,6,49" -locations_default(#20319,#10000,6,38,6,49) +#20319=@"loc,{#10000},6,36,6,47" +locations_default(#20319,#10000,6,36,6,47) hasLocation(#20318,#20319) #20320=* exprs(#20320,86,#20312,0,"v4") @@ -934,15 +934,15 @@ hasLocation(#20325,#20326) regexp_const_value(#20325,"module") #20327=* exprs(#20327,8,#20323,-10,"{ type: ""json"" }") -#20328=@"loc,{#10000},7,31,7,46" -locations_default(#20328,#10000,7,31,7,46) +#20328=@"loc,{#10000},7,29,7,44" +locations_default(#20328,#10000,7,29,7,44) hasLocation(#20327,#20328) enclosing_stmt(#20327,#20323) expr_containers(#20327,#20001) #20329=* properties(#20329,#20327,0,0,"type: ""json""") -#20330=@"loc,{#10000},7,33,7,44" -locations_default(#20330,#10000,7,33,7,44) +#20330=@"loc,{#10000},7,31,7,42" +locations_default(#20330,#10000,7,31,7,42) hasLocation(#20329,#20330) #20331=* stmts(#20331,30,#20001,6,"export ... son"" };") @@ -962,15 +962,15 @@ hasLocation(#20333,#20334) regexp_const_value(#20333,"module") #20335=* exprs(#20335,8,#20331,-10,"{ type: ""json"" }") -#20336=@"loc,{#10000},8,37,8,52" -locations_default(#20336,#10000,8,37,8,52) +#20336=@"loc,{#10000},8,35,8,50" +locations_default(#20336,#10000,8,35,8,50) hasLocation(#20335,#20336) enclosing_stmt(#20335,#20331) expr_containers(#20335,#20001) #20337=* properties(#20337,#20335,0,0,"type: ""json""") -#20338=@"loc,{#10000},8,39,8,50" -locations_default(#20338,#10000,8,39,8,50) +#20338=@"loc,{#10000},8,37,8,48" +locations_default(#20338,#10000,8,37,8,48) hasLocation(#20337,#20338) #20339=* exprs(#20339,96,#20331,0,"* as v5") @@ -1023,144 +1023,150 @@ locations_default(#20350,#10000,10,20,10,25) hasLocation(#20349,#20350) regexp_const_value(#20349,"module") #20351=* -exprs(#20351,8,#20346,1,"{ asser ... on"" } }") +exprs(#20351,8,#20346,1,"{ ""with ... on"" } }") #20352=@"loc,{#10000},10,29,10,56" locations_default(#20352,#10000,10,29,10,56) hasLocation(#20351,#20352) enclosing_stmt(#20351,#20342) expr_containers(#20351,#20001) #20353=* -properties(#20353,#20351,0,0,"assert: ... json"" }") +properties(#20353,#20351,0,0,"""with"": ... json"" }") #20354=@"loc,{#10000},10,31,10,54" locations_default(#20354,#10000,10,31,10,54) hasLocation(#20353,#20354) #20355=* -exprs(#20355,0,#20353,0,"assert") +exprs(#20355,4,#20353,0,"""with""") hasLocation(#20355,#20215) enclosing_stmt(#20355,#20342) expr_containers(#20355,#20001) -literals("assert","assert",#20355) +literals("with","""with""",#20355) #20356=* -exprs(#20356,8,#20353,1,"{ type: ""json"" }") -#20357=@"loc,{#10000},10,39,10,54" -locations_default(#20357,#10000,10,39,10,54) +regexpterm(#20356,14,#20355,0,"with") +#20357=@"loc,{#10000},10,32,10,35" +locations_default(#20357,#10000,10,32,10,35) hasLocation(#20356,#20357) -enclosing_stmt(#20356,#20342) -expr_containers(#20356,#20001) +regexp_const_value(#20356,"with") #20358=* -properties(#20358,#20356,0,0,"type: ""json""") -#20359=@"loc,{#10000},10,41,10,52" -locations_default(#20359,#10000,10,41,10,52) +exprs(#20358,8,#20353,1,"{ type: ""json"" }") +#20359=@"loc,{#10000},10,39,10,54" +locations_default(#20359,#10000,10,39,10,54) hasLocation(#20358,#20359) +enclosing_stmt(#20358,#20342) +expr_containers(#20358,#20001) #20360=* -exprs(#20360,0,#20358,0,"type") -hasLocation(#20360,#20221) -enclosing_stmt(#20360,#20342) -expr_containers(#20360,#20001) -literals("type","type",#20360) -#20361=* -exprs(#20361,4,#20358,1,"""json""") -hasLocation(#20361,#20225) -enclosing_stmt(#20361,#20342) -expr_containers(#20361,#20001) -literals("json","""json""",#20361) +properties(#20360,#20358,0,0,"type: ""json""") +#20361=@"loc,{#10000},10,41,10,52" +locations_default(#20361,#10000,10,41,10,52) +hasLocation(#20360,#20361) #20362=* -regexpterm(#20362,14,#20361,0,"json") -#20363=@"loc,{#10000},10,48,10,51" -locations_default(#20363,#10000,10,48,10,51) -hasLocation(#20362,#20363) -regexp_const_value(#20362,"json") +exprs(#20362,0,#20360,0,"type") +hasLocation(#20362,#20221) +enclosing_stmt(#20362,#20342) +expr_containers(#20362,#20001) +literals("type","type",#20362) +#20363=* +exprs(#20363,4,#20360,1,"""json""") +hasLocation(#20363,#20225) +enclosing_stmt(#20363,#20342) +expr_containers(#20363,#20001) +literals("json","""json""",#20363) #20364=* -stmts(#20364,27,#20001,8,"import ""module"";") -#20365=@"loc,{#10000},12,1,12,16" -locations_default(#20365,#10000,12,1,12,16) +regexpterm(#20364,14,#20363,0,"json") +#20365=@"loc,{#10000},10,48,10,51" +locations_default(#20365,#10000,10,48,10,51) hasLocation(#20364,#20365) -stmt_containers(#20364,#20001) +regexp_const_value(#20364,"json") #20366=* -exprs(#20366,4,#20364,-1,"""module""") -hasLocation(#20366,#20237) -enclosing_stmt(#20366,#20364) -expr_containers(#20366,#20001) -literals("module","""module""",#20366) -#20367=* -regexpterm(#20367,14,#20366,0,"module") -#20368=@"loc,{#10000},12,9,12,14" -locations_default(#20368,#10000,12,9,12,14) -hasLocation(#20367,#20368) -regexp_const_value(#20367,"module") +stmts(#20366,27,#20001,8,"import ""module"";") +#20367=@"loc,{#10000},12,1,12,16" +locations_default(#20367,#10000,12,1,12,16) +hasLocation(#20366,#20367) +stmt_containers(#20366,#20001) +#20368=* +exprs(#20368,4,#20366,-1,"""module""") +hasLocation(#20368,#20237) +enclosing_stmt(#20368,#20366) +expr_containers(#20368,#20001) +literals("module","""module""",#20368) #20369=* -stmts(#20369,2,#20001,9,"assert( ... on"" });") -#20370=@"loc,{#10000},13,1,13,25" -locations_default(#20370,#10000,13,1,13,25) +regexpterm(#20369,14,#20368,0,"module") +#20370=@"loc,{#10000},12,9,12,14" +locations_default(#20370,#10000,12,9,12,14) hasLocation(#20369,#20370) -stmt_containers(#20369,#20001) +regexp_const_value(#20369,"module") #20371=* -exprs(#20371,13,#20369,0,"assert( ... son"" })") -#20372=@"loc,{#10000},13,1,13,24" -locations_default(#20372,#10000,13,1,13,24) +stmts(#20371,2,#20001,9,"assert( ... on"" });") +#20372=@"loc,{#10000},13,1,13,25" +locations_default(#20372,#10000,13,1,13,25) hasLocation(#20371,#20372) -enclosing_stmt(#20371,#20369) -expr_containers(#20371,#20001) +stmt_containers(#20371,#20001) #20373=* -exprs(#20373,79,#20371,-1,"assert") -hasLocation(#20373,#20241) -enclosing_stmt(#20373,#20369) +exprs(#20373,13,#20371,0,"assert( ... son"" })") +#20374=@"loc,{#10000},13,1,13,24" +locations_default(#20374,#10000,13,1,13,24) +hasLocation(#20373,#20374) +enclosing_stmt(#20373,#20371) expr_containers(#20373,#20001) -literals("assert","assert",#20373) -#20374=@"var;{assert};{#20000}" -variables(#20374,"assert",#20000) -bind(#20373,#20374) #20375=* -exprs(#20375,8,#20371,0,"{ type: ""json"" }") -#20376=@"loc,{#10000},13,8,13,23" -locations_default(#20376,#10000,13,8,13,23) -hasLocation(#20375,#20376) -enclosing_stmt(#20375,#20369) +exprs(#20375,79,#20373,-1,"assert") +hasLocation(#20375,#20241) +enclosing_stmt(#20375,#20371) expr_containers(#20375,#20001) +literals("assert","assert",#20375) +#20376=@"var;{assert};{#20000}" +variables(#20376,"assert",#20000) +bind(#20375,#20376) #20377=* -properties(#20377,#20375,0,0,"type: ""json""") -#20378=@"loc,{#10000},13,10,13,21" -locations_default(#20378,#10000,13,10,13,21) +exprs(#20377,8,#20373,0,"{ type: ""json"" }") +#20378=@"loc,{#10000},13,8,13,23" +locations_default(#20378,#10000,13,8,13,23) hasLocation(#20377,#20378) +enclosing_stmt(#20377,#20371) +expr_containers(#20377,#20001) #20379=* -exprs(#20379,0,#20377,0,"type") -hasLocation(#20379,#20247) -enclosing_stmt(#20379,#20369) -expr_containers(#20379,#20001) -literals("type","type",#20379) -#20380=* -exprs(#20380,4,#20377,1,"""json""") -hasLocation(#20380,#20251) -enclosing_stmt(#20380,#20369) -expr_containers(#20380,#20001) -literals("json","""json""",#20380) +properties(#20379,#20377,0,0,"type: ""json""") +#20380=@"loc,{#10000},13,10,13,21" +locations_default(#20380,#10000,13,10,13,21) +hasLocation(#20379,#20380) #20381=* -regexpterm(#20381,14,#20380,0,"json") -#20382=@"loc,{#10000},13,17,13,20" -locations_default(#20382,#10000,13,17,13,20) -hasLocation(#20381,#20382) -regexp_const_value(#20381,"json") +exprs(#20381,0,#20379,0,"type") +hasLocation(#20381,#20247) +enclosing_stmt(#20381,#20371) +expr_containers(#20381,#20001) +literals("type","type",#20381) +#20382=* +exprs(#20382,4,#20379,1,"""json""") +hasLocation(#20382,#20251) +enclosing_stmt(#20382,#20371) +expr_containers(#20382,#20001) +literals("json","""json""",#20382) #20383=* -entry_cfg_node(#20383,#20001) -#20384=@"loc,{#10000},1,1,1,0" -locations_default(#20384,#10000,1,1,1,0) +regexpterm(#20383,14,#20382,0,"json") +#20384=@"loc,{#10000},13,17,13,20" +locations_default(#20384,#10000,13,17,13,20) hasLocation(#20383,#20384) +regexp_const_value(#20383,"json") #20385=* -exit_cfg_node(#20385,#20001) -hasLocation(#20385,#20259) -successor(#20369,#20373) -successor(#20375,#20379) -successor(#20380,#20377) -successor(#20379,#20380) -successor(#20377,#20371) -successor(#20373,#20375) -successor(#20371,#20385) -successor(#20364,#20369) +entry_cfg_node(#20385,#20001) +#20386=@"loc,{#10000},1,1,1,0" +locations_default(#20386,#10000,1,1,1,0) +hasLocation(#20385,#20386) +#20387=* +exit_cfg_node(#20387,#20001) +hasLocation(#20387,#20259) +successor(#20371,#20375) +successor(#20377,#20381) +successor(#20382,#20379) +successor(#20381,#20382) +successor(#20379,#20373) +successor(#20375,#20377) +successor(#20373,#20387) +successor(#20366,#20371) successor(#20342,#20345) successor(#20348,#20346) successor(#20346,#20343) successor(#20345,#20348) -successor(#20343,#20364) +successor(#20343,#20366) successor(#20331,#20332) successor(#20339,#20341) successor(#20341,#20342) @@ -1179,6 +1185,6 @@ successor(#20272,#20280) successor(#20310,#20272) successor(#20299,#20310) successor(#20288,#20299) -successor(#20383,#20288) +successor(#20385,#20288) numlines(#10000,13,10,2) filetype(#10000,"typescript") From 3d45944649dcd838976d644de4994c5eef39c4d7 Mon Sep 17 00:00:00 2001 From: Arthur Baars Date: Tue, 10 Oct 2023 16:12:13 +0200 Subject: [PATCH 013/202] Rename 'assertions' to 'attributes' in JS extractor --- javascript/extractor/lib/typescript/src/main.ts | 1 - .../semmle/ts/extractor/TypeScriptASTConverter.java | 10 +++++----- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/javascript/extractor/lib/typescript/src/main.ts b/javascript/extractor/lib/typescript/src/main.ts index e9849f42f5c..6da1b2b0574 100644 --- a/javascript/extractor/lib/typescript/src/main.ts +++ b/javascript/extractor/lib/typescript/src/main.ts @@ -224,7 +224,6 @@ const astProperties: string[] = [ "argument", "argumentExpression", "arguments", - "assertClause", "assertsModifier", "asteriskToken", "attributes", diff --git a/javascript/extractor/src/com/semmle/ts/extractor/TypeScriptASTConverter.java b/javascript/extractor/src/com/semmle/ts/extractor/TypeScriptASTConverter.java index 869a2227f0d..2fc9474d298 100644 --- a/javascript/extractor/src/com/semmle/ts/extractor/TypeScriptASTConverter.java +++ b/javascript/extractor/src/com/semmle/ts/extractor/TypeScriptASTConverter.java @@ -1201,16 +1201,16 @@ public class TypeScriptASTConverter { private Node convertExportDeclaration(JsonObject node, SourceLocation loc) throws ParseError { Literal source = tryConvertChild(node, "moduleSpecifier", Literal.class); - Expression assertion = convertChild(node, "assertClause"); + Expression attributes = convertChild(node, "attributes"); if (hasChild(node, "exportClause")) { boolean hasTypeKeyword = node.get("isTypeOnly").getAsBoolean(); List specifiers = hasKind(node.get("exportClause"), "NamespaceExport") ? Collections.singletonList(convertChild(node, "exportClause")) : convertChildren(node.get("exportClause").getAsJsonObject(), "elements"); - return new ExportNamedDeclaration(loc, null, specifiers, source, assertion, hasTypeKeyword); + return new ExportNamedDeclaration(loc, null, specifiers, source, attributes, hasTypeKeyword); } else { - return new ExportAllDeclaration(loc, source, assertion); + return new ExportAllDeclaration(loc, source, attributes); } } @@ -1393,7 +1393,7 @@ public class TypeScriptASTConverter { private Node convertImportDeclaration(JsonObject node, SourceLocation loc) throws ParseError { Literal src = tryConvertChild(node, "moduleSpecifier", Literal.class); - Expression assertion = convertChild(node, "assertClause"); + Expression attributes = convertChild(node, "attributes"); List specifiers = new ArrayList<>(); boolean hasTypeKeyword = false; if (hasChild(node, "importClause")) { @@ -1412,7 +1412,7 @@ public class TypeScriptASTConverter { hasTypeKeyword = importClause.get("isTypeOnly").getAsBoolean(); } ImportDeclaration importDecl = - new ImportDeclaration(loc, specifiers, src, assertion, hasTypeKeyword); + new ImportDeclaration(loc, specifiers, src, attributes, hasTypeKeyword); attachSymbolInformation(importDecl, node); return importDecl; } From b4d89f7554b6a49a78f85b8649d1816ecef80eb7 Mon Sep 17 00:00:00 2001 From: Arthur Baars Date: Tue, 10 Oct 2023 17:16:02 +0200 Subject: [PATCH 014/202] Replace 'assert' with 'with' in QL test files --- .../TypeScript/ImportAssertions/test.expected | 16 ++++++------- .../ImportAssertions/ts-import-assertions.ts | 16 ++++++------- .../TypeScript/Types/printAst.expected | 24 +++++++++---------- .../library-tests/TypeScript/Types/tst.ts | 2 +- 4 files changed, 29 insertions(+), 29 deletions(-) diff --git a/javascript/ql/test/library-tests/TypeScript/ImportAssertions/test.expected b/javascript/ql/test/library-tests/TypeScript/ImportAssertions/test.expected index 6bbd095348c..21efd893fad 100644 --- a/javascript/ql/test/library-tests/TypeScript/ImportAssertions/test.expected +++ b/javascript/ql/test/library-tests/TypeScript/ImportAssertions/test.expected @@ -7,10 +7,10 @@ getImportAttributesFromImport | js-import-assertions.js:16:1:16:53 | import ... son" }; | js-import-assertions.js:16:37:16:52 | { type: "json" } | | js-import-assertions.js:17:1:17:52 | import ... son" }; | js-import-assertions.js:17:36:17:51 | { type: "json" } | | js-import-assertions.js:18:1:18:48 | import ... son" }; | js-import-assertions.js:18:32:18:47 | { type: "json" } | -| ts-import-assertions.ts:3:1:3:40 | import ... son" }; | ts-import-assertions.ts:3:24:3:39 | { type: "json" } | -| ts-import-assertions.ts:4:1:4:53 | import ... son" }; | ts-import-assertions.ts:4:37:4:52 | { type: "json" } | -| ts-import-assertions.ts:5:1:5:52 | import ... son" }; | ts-import-assertions.ts:5:36:5:51 | { type: "json" } | -| ts-import-assertions.ts:6:1:6:48 | import ... son" }; | ts-import-assertions.ts:6:32:6:47 | { type: "json" } | +| ts-import-assertions.ts:3:1:3:38 | import ... son" }; | ts-import-assertions.ts:3:22:3:37 | { type: "json" } | +| ts-import-assertions.ts:4:1:4:51 | import ... son" }; | ts-import-assertions.ts:4:35:4:50 | { type: "json" } | +| ts-import-assertions.ts:5:1:5:50 | import ... son" }; | ts-import-assertions.ts:5:34:5:49 | { type: "json" } | +| ts-import-assertions.ts:6:1:6:46 | import ... son" }; | ts-import-assertions.ts:6:30:6:45 | { type: "json" } | getImportAttributesFromExport | js-import-assertions.js:6:1:6:50 | export ... son" }; | js-import-assertions.js:6:34:6:49 | { type: "json" } | | js-import-assertions.js:7:1:7:45 | export ... son" }; | js-import-assertions.js:7:29:7:44 | { type: "json" } | @@ -18,11 +18,11 @@ getImportAttributesFromExport | js-import-assertions.js:20:1:20:52 | export ... son" }; | js-import-assertions.js:20:36:20:51 | { type: "json" } | | js-import-assertions.js:21:1:21:47 | export ... son" }; | js-import-assertions.js:21:31:21:46 | { type: "json" } | | js-import-assertions.js:22:1:22:53 | export ... son" }; | js-import-assertions.js:22:37:22:52 | { type: "json" } | -| ts-import-assertions.ts:8:1:8:52 | export ... son" }; | ts-import-assertions.ts:8:36:8:51 | { type: "json" } | -| ts-import-assertions.ts:9:1:9:47 | export ... son" }; | ts-import-assertions.ts:9:31:9:46 | { type: "json" } | -| ts-import-assertions.ts:10:1:10:53 | export ... son" }; | ts-import-assertions.ts:10:37:10:52 | { type: "json" } | +| ts-import-assertions.ts:8:1:8:50 | export ... son" }; | ts-import-assertions.ts:8:34:8:49 | { type: "json" } | +| ts-import-assertions.ts:9:1:9:45 | export ... son" }; | ts-import-assertions.ts:9:29:9:44 | { type: "json" } | +| ts-import-assertions.ts:10:1:10:51 | export ... son" }; | ts-import-assertions.ts:10:35:10:50 | { type: "json" } | getImportOptions | js-import-assertions.js:10:12:10:55 | import( ... n" } }) | js-import-assertions.js:10:29:10:54 | { with: ... on" } } | | js-import-assertions.js:24:12:24:57 | import( ... n" } }) | js-import-assertions.js:24:29:24:56 | { asser ... on" } } | -| ts-import-assertions.ts:12:12:12:57 | import( ... n" } }) | ts-import-assertions.ts:12:29:12:56 | { asser ... on" } } | +| ts-import-assertions.ts:12:12:12:55 | import( ... n" } }) | ts-import-assertions.ts:12:29:12:54 | { with: ... on" } } | errors diff --git a/javascript/ql/test/library-tests/TypeScript/ImportAssertions/ts-import-assertions.ts b/javascript/ql/test/library-tests/TypeScript/ImportAssertions/ts-import-assertions.ts index 5d46b200f54..8c99c5220b8 100644 --- a/javascript/ql/test/library-tests/TypeScript/ImportAssertions/ts-import-assertions.ts +++ b/javascript/ql/test/library-tests/TypeScript/ImportAssertions/ts-import-assertions.ts @@ -1,15 +1,15 @@ // TypeScript -import "module" assert { type: "json" }; -import * as v1 from "module" assert { type: "json" }; -import { v2 } from "module" assert { type: "json" }; -import v3 from "module" assert { type: "json" }; +import "module" with { type: "json" }; +import * as v1 from "module" with { type: "json" }; +import { v2 } from "module" with { type: "json" }; +import v3 from "module" with { type: "json" }; -export { v4 } from "module" assert { type: "json" }; -export * from "module" assert { type: "json" }; -export * as v5 from "module" assert { type: "json" }; +export { v4 } from "module" with { type: "json" }; +export * from "module" with { type: "json" }; +export * as v5 from "module" with { type: "json" }; -const v6 = import("module", { assert: { type: "json" } }); +const v6 = import("module", { with: { type: "json" } }); import "module" // missing semicolon assert({ type: "json" }); // function call, not import assertion diff --git a/javascript/ql/test/library-tests/TypeScript/Types/printAst.expected b/javascript/ql/test/library-tests/TypeScript/Types/printAst.expected index 57a934041c4..5f29995b854 100644 --- a/javascript/ql/test/library-tests/TypeScript/Types/printAst.expected +++ b/javascript/ql/test/library-tests/TypeScript/Types/printAst.expected @@ -977,13 +977,13 @@ nodes | tst.ts:232:28:232:32 | [VarRef] other | semmle.label | [VarRef] other | | tst.ts:232:28:232:38 | [DotExpr] other.#name | semmle.label | [DotExpr] other.#name | | tst.ts:232:34:232:38 | [Label] #name | semmle.label | [Label] #name | -| tst.ts:237:1:237:65 | [ImportDeclaration] import ... son" }; | semmle.label | [ImportDeclaration] import ... son" }; | -| tst.ts:237:1:237:65 | [ImportDeclaration] import ... son" }; | semmle.order | 60 | +| tst.ts:237:1:237:63 | [ImportDeclaration] import ... son" }; | semmle.label | [ImportDeclaration] import ... son" }; | +| tst.ts:237:1:237:63 | [ImportDeclaration] import ... son" }; | semmle.order | 60 | | tst.ts:237:8:237:16 | [ImportSpecifier] * as Foo3 | semmle.label | [ImportSpecifier] * as Foo3 | | tst.ts:237:13:237:16 | [VarDecl] Foo3 | semmle.label | [VarDecl] Foo3 | | tst.ts:237:23:237:40 | [Literal] "./something.json" | semmle.label | [Literal] "./something.json" | -| tst.ts:237:49:237:64 | [ObjectExpr] { type: "json" } | semmle.label | [ObjectExpr] { type: "json" } | -| tst.ts:237:51:237:62 | [Property] type: "json" | semmle.label | [Property] type: "json" | +| tst.ts:237:47:237:62 | [ObjectExpr] { type: "json" } | semmle.label | [ObjectExpr] { type: "json" } | +| tst.ts:237:49:237:60 | [Property] type: "json" | semmle.label | [Property] type: "json" | | tst.ts:238:1:238:19 | [DeclStmt] var foo = ... | semmle.label | [DeclStmt] var foo = ... | | tst.ts:238:1:238:19 | [DeclStmt] var foo = ... | semmle.order | 61 | | tst.ts:238:5:238:7 | [VarDecl] foo | semmle.label | [VarDecl] foo | @@ -3758,16 +3758,16 @@ edges | tst.ts:232:28:232:38 | [DotExpr] other.#name | tst.ts:232:28:232:32 | [VarRef] other | semmle.order | 1 | | tst.ts:232:28:232:38 | [DotExpr] other.#name | tst.ts:232:34:232:38 | [Label] #name | semmle.label | 2 | | tst.ts:232:28:232:38 | [DotExpr] other.#name | tst.ts:232:34:232:38 | [Label] #name | semmle.order | 2 | -| tst.ts:237:1:237:65 | [ImportDeclaration] import ... son" }; | tst.ts:237:8:237:16 | [ImportSpecifier] * as Foo3 | semmle.label | 1 | -| tst.ts:237:1:237:65 | [ImportDeclaration] import ... son" }; | tst.ts:237:8:237:16 | [ImportSpecifier] * as Foo3 | semmle.order | 1 | -| tst.ts:237:1:237:65 | [ImportDeclaration] import ... son" }; | tst.ts:237:23:237:40 | [Literal] "./something.json" | semmle.label | 2 | -| tst.ts:237:1:237:65 | [ImportDeclaration] import ... son" }; | tst.ts:237:23:237:40 | [Literal] "./something.json" | semmle.order | 2 | -| tst.ts:237:1:237:65 | [ImportDeclaration] import ... son" }; | tst.ts:237:49:237:64 | [ObjectExpr] { type: "json" } | semmle.label | 3 | -| tst.ts:237:1:237:65 | [ImportDeclaration] import ... son" }; | tst.ts:237:49:237:64 | [ObjectExpr] { type: "json" } | semmle.order | 3 | +| tst.ts:237:1:237:63 | [ImportDeclaration] import ... son" }; | tst.ts:237:8:237:16 | [ImportSpecifier] * as Foo3 | semmle.label | 1 | +| tst.ts:237:1:237:63 | [ImportDeclaration] import ... son" }; | tst.ts:237:8:237:16 | [ImportSpecifier] * as Foo3 | semmle.order | 1 | +| tst.ts:237:1:237:63 | [ImportDeclaration] import ... son" }; | tst.ts:237:23:237:40 | [Literal] "./something.json" | semmle.label | 2 | +| tst.ts:237:1:237:63 | [ImportDeclaration] import ... son" }; | tst.ts:237:23:237:40 | [Literal] "./something.json" | semmle.order | 2 | +| tst.ts:237:1:237:63 | [ImportDeclaration] import ... son" }; | tst.ts:237:47:237:62 | [ObjectExpr] { type: "json" } | semmle.label | 3 | +| tst.ts:237:1:237:63 | [ImportDeclaration] import ... son" }; | tst.ts:237:47:237:62 | [ObjectExpr] { type: "json" } | semmle.order | 3 | | tst.ts:237:8:237:16 | [ImportSpecifier] * as Foo3 | tst.ts:237:13:237:16 | [VarDecl] Foo3 | semmle.label | 1 | | tst.ts:237:8:237:16 | [ImportSpecifier] * as Foo3 | tst.ts:237:13:237:16 | [VarDecl] Foo3 | semmle.order | 1 | -| tst.ts:237:49:237:64 | [ObjectExpr] { type: "json" } | tst.ts:237:51:237:62 | [Property] type: "json" | semmle.label | 1 | -| tst.ts:237:49:237:64 | [ObjectExpr] { type: "json" } | tst.ts:237:51:237:62 | [Property] type: "json" | semmle.order | 1 | +| tst.ts:237:47:237:62 | [ObjectExpr] { type: "json" } | tst.ts:237:49:237:60 | [Property] type: "json" | semmle.label | 1 | +| tst.ts:237:47:237:62 | [ObjectExpr] { type: "json" } | tst.ts:237:49:237:60 | [Property] type: "json" | semmle.order | 1 | | tst.ts:238:1:238:19 | [DeclStmt] var foo = ... | tst.ts:238:5:238:18 | [VariableDeclarator] foo = Foo3.foo | semmle.label | 1 | | tst.ts:238:1:238:19 | [DeclStmt] var foo = ... | tst.ts:238:5:238:18 | [VariableDeclarator] foo = Foo3.foo | semmle.order | 1 | | tst.ts:238:5:238:18 | [VariableDeclarator] foo = Foo3.foo | tst.ts:238:5:238:7 | [VarDecl] foo | semmle.label | 1 | diff --git a/javascript/ql/test/library-tests/TypeScript/Types/tst.ts b/javascript/ql/test/library-tests/TypeScript/Types/tst.ts index 27ee7357c36..5066993fe15 100644 --- a/javascript/ql/test/library-tests/TypeScript/Types/tst.ts +++ b/javascript/ql/test/library-tests/TypeScript/Types/tst.ts @@ -234,7 +234,7 @@ module TS45 { } } -import * as Foo3 from "./something.json" assert { type: "json" }; +import * as Foo3 from "./something.json" with { type: "json" }; var foo = Foo3.foo; module TS46 { From 4192d09e5ccfd6022cbdb0dd7ccfa08f11abf88b Mon Sep 17 00:00:00 2001 From: Arthur Baars Date: Tue, 10 Oct 2023 17:27:05 +0200 Subject: [PATCH 015/202] Add tests for deprecated 'assert' syntax --- .../TypeScript/ImportAssertions/test.expected | 8 ++++++++ .../ImportAssertions/ts-import-assertions.ts | 11 +++++++++++ 2 files changed, 19 insertions(+) diff --git a/javascript/ql/test/library-tests/TypeScript/ImportAssertions/test.expected b/javascript/ql/test/library-tests/TypeScript/ImportAssertions/test.expected index 21efd893fad..f5170003689 100644 --- a/javascript/ql/test/library-tests/TypeScript/ImportAssertions/test.expected +++ b/javascript/ql/test/library-tests/TypeScript/ImportAssertions/test.expected @@ -11,6 +11,10 @@ getImportAttributesFromImport | ts-import-assertions.ts:4:1:4:51 | import ... son" }; | ts-import-assertions.ts:4:35:4:50 | { type: "json" } | | ts-import-assertions.ts:5:1:5:50 | import ... son" }; | ts-import-assertions.ts:5:34:5:49 | { type: "json" } | | ts-import-assertions.ts:6:1:6:46 | import ... son" }; | ts-import-assertions.ts:6:30:6:45 | { type: "json" } | +| ts-import-assertions.ts:17:1:17:40 | import ... son" }; | ts-import-assertions.ts:17:24:17:39 | { type: "json" } | +| ts-import-assertions.ts:18:1:18:53 | import ... son" }; | ts-import-assertions.ts:18:37:18:52 | { type: "json" } | +| ts-import-assertions.ts:19:1:19:52 | import ... son" }; | ts-import-assertions.ts:19:36:19:51 | { type: "json" } | +| ts-import-assertions.ts:20:1:20:48 | import ... son" }; | ts-import-assertions.ts:20:32:20:47 | { type: "json" } | getImportAttributesFromExport | js-import-assertions.js:6:1:6:50 | export ... son" }; | js-import-assertions.js:6:34:6:49 | { type: "json" } | | js-import-assertions.js:7:1:7:45 | export ... son" }; | js-import-assertions.js:7:29:7:44 | { type: "json" } | @@ -21,8 +25,12 @@ getImportAttributesFromExport | ts-import-assertions.ts:8:1:8:50 | export ... son" }; | ts-import-assertions.ts:8:34:8:49 | { type: "json" } | | ts-import-assertions.ts:9:1:9:45 | export ... son" }; | ts-import-assertions.ts:9:29:9:44 | { type: "json" } | | ts-import-assertions.ts:10:1:10:51 | export ... son" }; | ts-import-assertions.ts:10:35:10:50 | { type: "json" } | +| ts-import-assertions.ts:22:1:22:52 | export ... son" }; | ts-import-assertions.ts:22:36:22:51 | { type: "json" } | +| ts-import-assertions.ts:23:1:23:47 | export ... son" }; | ts-import-assertions.ts:23:31:23:46 | { type: "json" } | +| ts-import-assertions.ts:24:1:24:53 | export ... son" }; | ts-import-assertions.ts:24:37:24:52 | { type: "json" } | getImportOptions | js-import-assertions.js:10:12:10:55 | import( ... n" } }) | js-import-assertions.js:10:29:10:54 | { with: ... on" } } | | js-import-assertions.js:24:12:24:57 | import( ... n" } }) | js-import-assertions.js:24:29:24:56 | { asser ... on" } } | | ts-import-assertions.ts:12:12:12:55 | import( ... n" } }) | ts-import-assertions.ts:12:29:12:54 | { with: ... on" } } | +| ts-import-assertions.ts:26:12:26:57 | import( ... n" } }) | ts-import-assertions.ts:26:29:26:56 | { asser ... on" } } | errors diff --git a/javascript/ql/test/library-tests/TypeScript/ImportAssertions/ts-import-assertions.ts b/javascript/ql/test/library-tests/TypeScript/ImportAssertions/ts-import-assertions.ts index 8c99c5220b8..4679e5abc12 100644 --- a/javascript/ql/test/library-tests/TypeScript/ImportAssertions/ts-import-assertions.ts +++ b/javascript/ql/test/library-tests/TypeScript/ImportAssertions/ts-import-assertions.ts @@ -13,3 +13,14 @@ const v6 = import("module", { with: { type: "json" } }); import "module" // missing semicolon assert({ type: "json" }); // function call, not import assertion + +import "module" assert { type: "json" }; +import * as v1 from "module" assert { type: "json" }; +import { v2 } from "module" assert { type: "json" }; +import v3 from "module" assert { type: "json" }; + +export { v4 } from "module" assert { type: "json" }; +export * from "module" assert { type: "json" }; +export * as v5 from "module" assert { type: "json" }; + +const v6 = import("module", { assert: { type: "json" } }); From eecf32db4d867f05b4443bcf526841eb434d7336 Mon Sep 17 00:00:00 2001 From: Arthur Baars Date: Tue, 10 Oct 2023 12:14:25 +0200 Subject: [PATCH 016/202] Add tests for deprecated 'assert' syntax --- .../tests/ts/input/import-assertion.ts | 13 +- .../ts/output/trap/import-assertion.ts.trap | 2575 +++++++++++------ 2 files changed, 1777 insertions(+), 811 deletions(-) diff --git a/javascript/extractor/tests/ts/input/import-assertion.ts b/javascript/extractor/tests/ts/input/import-assertion.ts index 79db36cf22b..015be0e3065 100644 --- a/javascript/extractor/tests/ts/input/import-assertion.ts +++ b/javascript/extractor/tests/ts/input/import-assertion.ts @@ -1,7 +1,7 @@ import "module" with { type: "json" }; import * as v1 from "module" with { type: "json" }; import { v2 } from "module" with { type: "json" }; -import v3 from "module" assert { type: "json" }; +import v3 from "module" with { type: "json" }; export { v4 } from "module" with { type: "json" }; export * from "module" with { type: "json" }; @@ -11,3 +11,14 @@ const v6 = import("module", { "with": { type: "json" } }); import "module"; // missing semicolon assert({ type: "json" }); // function call, not import assertion + +import "module" assert { type: "json" }; +import * as v1 from "module" assert { type: "json" }; +import { v2 } from "module" assert { type: "json" }; +import v3 from "module" assert { type: "json" }; + +export { v4 } from "module" assert { type: "json" }; +export * from "module" assert { type: "json" }; +export * as v5 from "module" assert { type: "json" }; + +const v6 = import("module", { assert: { type: "json" } }); diff --git a/javascript/extractor/tests/ts/output/trap/import-assertion.ts.trap b/javascript/extractor/tests/ts/output/trap/import-assertion.ts.trap index 6e69eff287c..cba938debe7 100644 --- a/javascript/extractor/tests/ts/output/trap/import-assertion.ts.trap +++ b/javascript/extractor/tests/ts/output/trap/import-assertion.ts.trap @@ -38,10 +38,10 @@ lines(#20010,#20001,"import { v2 } from ""module"" with { type: ""json"" };"," locations_default(#20011,#10000,3,1,3,50) hasLocation(#20010,#20011) #20012=* -lines(#20012,#20001,"import v3 from ""module"" assert { type: ""json"" };"," +lines(#20012,#20001,"import v3 from ""module"" with { type: ""json"" };"," ") -#20013=@"loc,{#10000},4,1,4,48" -locations_default(#20013,#10000,4,1,4,48) +#20013=@"loc,{#10000},4,1,4,46" +locations_default(#20013,#10000,4,1,4,46) hasLocation(#20012,#20013) #20014=* lines(#20014,#20001,""," @@ -97,1094 +97,2049 @@ lines(#20030,#20001,"assert({ type: ""json"" }); // function call, not import as #20031=@"loc,{#10000},13,1,13,64" locations_default(#20031,#10000,13,1,13,64) hasLocation(#20030,#20031) -numlines(#20001,13,10,2) #20032=* -tokeninfo(#20032,7,#20001,0,"import") -#20033=@"loc,{#10000},1,1,1,6" -locations_default(#20033,#10000,1,1,1,6) +lines(#20032,#20001,""," +") +#20033=@"loc,{#10000},14,1,14,0" +locations_default(#20033,#10000,14,1,14,0) hasLocation(#20032,#20033) #20034=* -tokeninfo(#20034,4,#20001,1,"""module""") -#20035=@"loc,{#10000},1,8,1,15" -locations_default(#20035,#10000,1,8,1,15) +lines(#20034,#20001,"import ""module"" assert { type: ""json"" };"," +") +#20035=@"loc,{#10000},15,1,15,40" +locations_default(#20035,#10000,15,1,15,40) hasLocation(#20034,#20035) #20036=* -tokeninfo(#20036,7,#20001,2,"with") -#20037=@"loc,{#10000},1,17,1,20" -locations_default(#20037,#10000,1,17,1,20) +lines(#20036,#20001,"import * as v1 from ""module"" assert { type: ""json"" };"," +") +#20037=@"loc,{#10000},16,1,16,53" +locations_default(#20037,#10000,16,1,16,53) hasLocation(#20036,#20037) #20038=* -tokeninfo(#20038,8,#20001,3,"{") -#20039=@"loc,{#10000},1,22,1,22" -locations_default(#20039,#10000,1,22,1,22) +lines(#20038,#20001,"import { v2 } from ""module"" assert { type: ""json"" };"," +") +#20039=@"loc,{#10000},17,1,17,52" +locations_default(#20039,#10000,17,1,17,52) hasLocation(#20038,#20039) #20040=* -tokeninfo(#20040,7,#20001,4,"type") -#20041=@"loc,{#10000},1,24,1,27" -locations_default(#20041,#10000,1,24,1,27) +lines(#20040,#20001,"import v3 from ""module"" assert { type: ""json"" };"," +") +#20041=@"loc,{#10000},18,1,18,48" +locations_default(#20041,#10000,18,1,18,48) hasLocation(#20040,#20041) #20042=* -tokeninfo(#20042,8,#20001,5,":") -#20043=@"loc,{#10000},1,28,1,28" -locations_default(#20043,#10000,1,28,1,28) +lines(#20042,#20001,""," +") +#20043=@"loc,{#10000},19,1,19,0" +locations_default(#20043,#10000,19,1,19,0) hasLocation(#20042,#20043) #20044=* -tokeninfo(#20044,4,#20001,6,"""json""") -#20045=@"loc,{#10000},1,30,1,35" -locations_default(#20045,#10000,1,30,1,35) +lines(#20044,#20001,"export { v4 } from ""module"" assert { type: ""json"" };"," +") +#20045=@"loc,{#10000},20,1,20,52" +locations_default(#20045,#10000,20,1,20,52) hasLocation(#20044,#20045) #20046=* -tokeninfo(#20046,8,#20001,7,"}") -#20047=@"loc,{#10000},1,37,1,37" -locations_default(#20047,#10000,1,37,1,37) +lines(#20046,#20001,"export * from ""module"" assert { type: ""json"" };"," +") +#20047=@"loc,{#10000},21,1,21,47" +locations_default(#20047,#10000,21,1,21,47) hasLocation(#20046,#20047) #20048=* -tokeninfo(#20048,8,#20001,8,";") -#20049=@"loc,{#10000},1,38,1,38" -locations_default(#20049,#10000,1,38,1,38) +lines(#20048,#20001,"export * as v5 from ""module"" assert { type: ""json"" };"," +") +#20049=@"loc,{#10000},22,1,22,53" +locations_default(#20049,#10000,22,1,22,53) hasLocation(#20048,#20049) #20050=* -tokeninfo(#20050,7,#20001,9,"import") -#20051=@"loc,{#10000},2,1,2,6" -locations_default(#20051,#10000,2,1,2,6) +lines(#20050,#20001,""," +") +#20051=@"loc,{#10000},23,1,23,0" +locations_default(#20051,#10000,23,1,23,0) hasLocation(#20050,#20051) #20052=* -tokeninfo(#20052,8,#20001,10,"*") -#20053=@"loc,{#10000},2,8,2,8" -locations_default(#20053,#10000,2,8,2,8) +lines(#20052,#20001,"const v6 = import(""module"", { assert: { type: ""json"" } });"," +") +#20053=@"loc,{#10000},24,1,24,58" +locations_default(#20053,#10000,24,1,24,58) hasLocation(#20052,#20053) +numlines(#20001,24,18,2) #20054=* -tokeninfo(#20054,7,#20001,11,"as") -#20055=@"loc,{#10000},2,10,2,11" -locations_default(#20055,#10000,2,10,2,11) +tokeninfo(#20054,7,#20001,0,"import") +#20055=@"loc,{#10000},1,1,1,6" +locations_default(#20055,#10000,1,1,1,6) hasLocation(#20054,#20055) #20056=* -tokeninfo(#20056,6,#20001,12,"v1") -#20057=@"loc,{#10000},2,13,2,14" -locations_default(#20057,#10000,2,13,2,14) +tokeninfo(#20056,4,#20001,1,"""module""") +#20057=@"loc,{#10000},1,8,1,15" +locations_default(#20057,#10000,1,8,1,15) hasLocation(#20056,#20057) #20058=* -tokeninfo(#20058,7,#20001,13,"from") -#20059=@"loc,{#10000},2,16,2,19" -locations_default(#20059,#10000,2,16,2,19) +tokeninfo(#20058,7,#20001,2,"with") +#20059=@"loc,{#10000},1,17,1,20" +locations_default(#20059,#10000,1,17,1,20) hasLocation(#20058,#20059) #20060=* -tokeninfo(#20060,4,#20001,14,"""module""") -#20061=@"loc,{#10000},2,21,2,28" -locations_default(#20061,#10000,2,21,2,28) +tokeninfo(#20060,8,#20001,3,"{") +#20061=@"loc,{#10000},1,22,1,22" +locations_default(#20061,#10000,1,22,1,22) hasLocation(#20060,#20061) #20062=* -tokeninfo(#20062,7,#20001,15,"with") -#20063=@"loc,{#10000},2,30,2,33" -locations_default(#20063,#10000,2,30,2,33) +tokeninfo(#20062,7,#20001,4,"type") +#20063=@"loc,{#10000},1,24,1,27" +locations_default(#20063,#10000,1,24,1,27) hasLocation(#20062,#20063) #20064=* -tokeninfo(#20064,8,#20001,16,"{") -#20065=@"loc,{#10000},2,35,2,35" -locations_default(#20065,#10000,2,35,2,35) +tokeninfo(#20064,8,#20001,5,":") +#20065=@"loc,{#10000},1,28,1,28" +locations_default(#20065,#10000,1,28,1,28) hasLocation(#20064,#20065) #20066=* -tokeninfo(#20066,7,#20001,17,"type") -#20067=@"loc,{#10000},2,37,2,40" -locations_default(#20067,#10000,2,37,2,40) +tokeninfo(#20066,4,#20001,6,"""json""") +#20067=@"loc,{#10000},1,30,1,35" +locations_default(#20067,#10000,1,30,1,35) hasLocation(#20066,#20067) #20068=* -tokeninfo(#20068,8,#20001,18,":") -#20069=@"loc,{#10000},2,41,2,41" -locations_default(#20069,#10000,2,41,2,41) +tokeninfo(#20068,8,#20001,7,"}") +#20069=@"loc,{#10000},1,37,1,37" +locations_default(#20069,#10000,1,37,1,37) hasLocation(#20068,#20069) #20070=* -tokeninfo(#20070,4,#20001,19,"""json""") -#20071=@"loc,{#10000},2,43,2,48" -locations_default(#20071,#10000,2,43,2,48) +tokeninfo(#20070,8,#20001,8,";") +#20071=@"loc,{#10000},1,38,1,38" +locations_default(#20071,#10000,1,38,1,38) hasLocation(#20070,#20071) #20072=* -tokeninfo(#20072,8,#20001,20,"}") -#20073=@"loc,{#10000},2,50,2,50" -locations_default(#20073,#10000,2,50,2,50) +tokeninfo(#20072,7,#20001,9,"import") +#20073=@"loc,{#10000},2,1,2,6" +locations_default(#20073,#10000,2,1,2,6) hasLocation(#20072,#20073) #20074=* -tokeninfo(#20074,8,#20001,21,";") -#20075=@"loc,{#10000},2,51,2,51" -locations_default(#20075,#10000,2,51,2,51) +tokeninfo(#20074,8,#20001,10,"*") +#20075=@"loc,{#10000},2,8,2,8" +locations_default(#20075,#10000,2,8,2,8) hasLocation(#20074,#20075) #20076=* -tokeninfo(#20076,7,#20001,22,"import") -#20077=@"loc,{#10000},3,1,3,6" -locations_default(#20077,#10000,3,1,3,6) +tokeninfo(#20076,7,#20001,11,"as") +#20077=@"loc,{#10000},2,10,2,11" +locations_default(#20077,#10000,2,10,2,11) hasLocation(#20076,#20077) #20078=* -tokeninfo(#20078,8,#20001,23,"{") -#20079=@"loc,{#10000},3,8,3,8" -locations_default(#20079,#10000,3,8,3,8) +tokeninfo(#20078,6,#20001,12,"v1") +#20079=@"loc,{#10000},2,13,2,14" +locations_default(#20079,#10000,2,13,2,14) hasLocation(#20078,#20079) #20080=* -tokeninfo(#20080,6,#20001,24,"v2") -#20081=@"loc,{#10000},3,10,3,11" -locations_default(#20081,#10000,3,10,3,11) +tokeninfo(#20080,7,#20001,13,"from") +#20081=@"loc,{#10000},2,16,2,19" +locations_default(#20081,#10000,2,16,2,19) hasLocation(#20080,#20081) #20082=* -tokeninfo(#20082,8,#20001,25,"}") -#20083=@"loc,{#10000},3,13,3,13" -locations_default(#20083,#10000,3,13,3,13) +tokeninfo(#20082,4,#20001,14,"""module""") +#20083=@"loc,{#10000},2,21,2,28" +locations_default(#20083,#10000,2,21,2,28) hasLocation(#20082,#20083) #20084=* -tokeninfo(#20084,7,#20001,26,"from") -#20085=@"loc,{#10000},3,15,3,18" -locations_default(#20085,#10000,3,15,3,18) +tokeninfo(#20084,7,#20001,15,"with") +#20085=@"loc,{#10000},2,30,2,33" +locations_default(#20085,#10000,2,30,2,33) hasLocation(#20084,#20085) #20086=* -tokeninfo(#20086,4,#20001,27,"""module""") -#20087=@"loc,{#10000},3,20,3,27" -locations_default(#20087,#10000,3,20,3,27) +tokeninfo(#20086,8,#20001,16,"{") +#20087=@"loc,{#10000},2,35,2,35" +locations_default(#20087,#10000,2,35,2,35) hasLocation(#20086,#20087) #20088=* -tokeninfo(#20088,7,#20001,28,"with") -#20089=@"loc,{#10000},3,29,3,32" -locations_default(#20089,#10000,3,29,3,32) +tokeninfo(#20088,7,#20001,17,"type") +#20089=@"loc,{#10000},2,37,2,40" +locations_default(#20089,#10000,2,37,2,40) hasLocation(#20088,#20089) #20090=* -tokeninfo(#20090,8,#20001,29,"{") -#20091=@"loc,{#10000},3,34,3,34" -locations_default(#20091,#10000,3,34,3,34) +tokeninfo(#20090,8,#20001,18,":") +#20091=@"loc,{#10000},2,41,2,41" +locations_default(#20091,#10000,2,41,2,41) hasLocation(#20090,#20091) #20092=* -tokeninfo(#20092,7,#20001,30,"type") -#20093=@"loc,{#10000},3,36,3,39" -locations_default(#20093,#10000,3,36,3,39) +tokeninfo(#20092,4,#20001,19,"""json""") +#20093=@"loc,{#10000},2,43,2,48" +locations_default(#20093,#10000,2,43,2,48) hasLocation(#20092,#20093) #20094=* -tokeninfo(#20094,8,#20001,31,":") -#20095=@"loc,{#10000},3,40,3,40" -locations_default(#20095,#10000,3,40,3,40) +tokeninfo(#20094,8,#20001,20,"}") +#20095=@"loc,{#10000},2,50,2,50" +locations_default(#20095,#10000,2,50,2,50) hasLocation(#20094,#20095) #20096=* -tokeninfo(#20096,4,#20001,32,"""json""") -#20097=@"loc,{#10000},3,42,3,47" -locations_default(#20097,#10000,3,42,3,47) +tokeninfo(#20096,8,#20001,21,";") +#20097=@"loc,{#10000},2,51,2,51" +locations_default(#20097,#10000,2,51,2,51) hasLocation(#20096,#20097) #20098=* -tokeninfo(#20098,8,#20001,33,"}") -#20099=@"loc,{#10000},3,49,3,49" -locations_default(#20099,#10000,3,49,3,49) +tokeninfo(#20098,7,#20001,22,"import") +#20099=@"loc,{#10000},3,1,3,6" +locations_default(#20099,#10000,3,1,3,6) hasLocation(#20098,#20099) #20100=* -tokeninfo(#20100,8,#20001,34,";") -#20101=@"loc,{#10000},3,50,3,50" -locations_default(#20101,#10000,3,50,3,50) +tokeninfo(#20100,8,#20001,23,"{") +#20101=@"loc,{#10000},3,8,3,8" +locations_default(#20101,#10000,3,8,3,8) hasLocation(#20100,#20101) #20102=* -tokeninfo(#20102,7,#20001,35,"import") -#20103=@"loc,{#10000},4,1,4,6" -locations_default(#20103,#10000,4,1,4,6) +tokeninfo(#20102,6,#20001,24,"v2") +#20103=@"loc,{#10000},3,10,3,11" +locations_default(#20103,#10000,3,10,3,11) hasLocation(#20102,#20103) #20104=* -tokeninfo(#20104,6,#20001,36,"v3") -#20105=@"loc,{#10000},4,8,4,9" -locations_default(#20105,#10000,4,8,4,9) +tokeninfo(#20104,8,#20001,25,"}") +#20105=@"loc,{#10000},3,13,3,13" +locations_default(#20105,#10000,3,13,3,13) hasLocation(#20104,#20105) #20106=* -tokeninfo(#20106,7,#20001,37,"from") -#20107=@"loc,{#10000},4,11,4,14" -locations_default(#20107,#10000,4,11,4,14) +tokeninfo(#20106,7,#20001,26,"from") +#20107=@"loc,{#10000},3,15,3,18" +locations_default(#20107,#10000,3,15,3,18) hasLocation(#20106,#20107) #20108=* -tokeninfo(#20108,4,#20001,38,"""module""") -#20109=@"loc,{#10000},4,16,4,23" -locations_default(#20109,#10000,4,16,4,23) +tokeninfo(#20108,4,#20001,27,"""module""") +#20109=@"loc,{#10000},3,20,3,27" +locations_default(#20109,#10000,3,20,3,27) hasLocation(#20108,#20109) #20110=* -tokeninfo(#20110,7,#20001,39,"assert") -#20111=@"loc,{#10000},4,25,4,30" -locations_default(#20111,#10000,4,25,4,30) +tokeninfo(#20110,7,#20001,28,"with") +#20111=@"loc,{#10000},3,29,3,32" +locations_default(#20111,#10000,3,29,3,32) hasLocation(#20110,#20111) #20112=* -tokeninfo(#20112,8,#20001,40,"{") -#20113=@"loc,{#10000},4,32,4,32" -locations_default(#20113,#10000,4,32,4,32) +tokeninfo(#20112,8,#20001,29,"{") +#20113=@"loc,{#10000},3,34,3,34" +locations_default(#20113,#10000,3,34,3,34) hasLocation(#20112,#20113) #20114=* -tokeninfo(#20114,7,#20001,41,"type") -#20115=@"loc,{#10000},4,34,4,37" -locations_default(#20115,#10000,4,34,4,37) +tokeninfo(#20114,7,#20001,30,"type") +#20115=@"loc,{#10000},3,36,3,39" +locations_default(#20115,#10000,3,36,3,39) hasLocation(#20114,#20115) #20116=* -tokeninfo(#20116,8,#20001,42,":") -#20117=@"loc,{#10000},4,38,4,38" -locations_default(#20117,#10000,4,38,4,38) +tokeninfo(#20116,8,#20001,31,":") +#20117=@"loc,{#10000},3,40,3,40" +locations_default(#20117,#10000,3,40,3,40) hasLocation(#20116,#20117) #20118=* -tokeninfo(#20118,4,#20001,43,"""json""") -#20119=@"loc,{#10000},4,40,4,45" -locations_default(#20119,#10000,4,40,4,45) +tokeninfo(#20118,4,#20001,32,"""json""") +#20119=@"loc,{#10000},3,42,3,47" +locations_default(#20119,#10000,3,42,3,47) hasLocation(#20118,#20119) #20120=* -tokeninfo(#20120,8,#20001,44,"}") -#20121=@"loc,{#10000},4,47,4,47" -locations_default(#20121,#10000,4,47,4,47) +tokeninfo(#20120,8,#20001,33,"}") +#20121=@"loc,{#10000},3,49,3,49" +locations_default(#20121,#10000,3,49,3,49) hasLocation(#20120,#20121) #20122=* -tokeninfo(#20122,8,#20001,45,";") -#20123=@"loc,{#10000},4,48,4,48" -locations_default(#20123,#10000,4,48,4,48) +tokeninfo(#20122,8,#20001,34,";") +#20123=@"loc,{#10000},3,50,3,50" +locations_default(#20123,#10000,3,50,3,50) hasLocation(#20122,#20123) #20124=* -tokeninfo(#20124,7,#20001,46,"export") -#20125=@"loc,{#10000},6,1,6,6" -locations_default(#20125,#10000,6,1,6,6) +tokeninfo(#20124,7,#20001,35,"import") +#20125=@"loc,{#10000},4,1,4,6" +locations_default(#20125,#10000,4,1,4,6) hasLocation(#20124,#20125) #20126=* -tokeninfo(#20126,8,#20001,47,"{") -#20127=@"loc,{#10000},6,8,6,8" -locations_default(#20127,#10000,6,8,6,8) +tokeninfo(#20126,6,#20001,36,"v3") +#20127=@"loc,{#10000},4,8,4,9" +locations_default(#20127,#10000,4,8,4,9) hasLocation(#20126,#20127) #20128=* -tokeninfo(#20128,6,#20001,48,"v4") -#20129=@"loc,{#10000},6,10,6,11" -locations_default(#20129,#10000,6,10,6,11) +tokeninfo(#20128,7,#20001,37,"from") +#20129=@"loc,{#10000},4,11,4,14" +locations_default(#20129,#10000,4,11,4,14) hasLocation(#20128,#20129) #20130=* -tokeninfo(#20130,8,#20001,49,"}") -#20131=@"loc,{#10000},6,13,6,13" -locations_default(#20131,#10000,6,13,6,13) +tokeninfo(#20130,4,#20001,38,"""module""") +#20131=@"loc,{#10000},4,16,4,23" +locations_default(#20131,#10000,4,16,4,23) hasLocation(#20130,#20131) #20132=* -tokeninfo(#20132,7,#20001,50,"from") -#20133=@"loc,{#10000},6,15,6,18" -locations_default(#20133,#10000,6,15,6,18) +tokeninfo(#20132,7,#20001,39,"with") +#20133=@"loc,{#10000},4,25,4,28" +locations_default(#20133,#10000,4,25,4,28) hasLocation(#20132,#20133) #20134=* -tokeninfo(#20134,4,#20001,51,"""module""") -#20135=@"loc,{#10000},6,20,6,27" -locations_default(#20135,#10000,6,20,6,27) +tokeninfo(#20134,8,#20001,40,"{") +#20135=@"loc,{#10000},4,30,4,30" +locations_default(#20135,#10000,4,30,4,30) hasLocation(#20134,#20135) #20136=* -tokeninfo(#20136,7,#20001,52,"with") -#20137=@"loc,{#10000},6,29,6,32" -locations_default(#20137,#10000,6,29,6,32) +tokeninfo(#20136,7,#20001,41,"type") +#20137=@"loc,{#10000},4,32,4,35" +locations_default(#20137,#10000,4,32,4,35) hasLocation(#20136,#20137) #20138=* -tokeninfo(#20138,8,#20001,53,"{") -#20139=@"loc,{#10000},6,34,6,34" -locations_default(#20139,#10000,6,34,6,34) +tokeninfo(#20138,8,#20001,42,":") +#20139=@"loc,{#10000},4,36,4,36" +locations_default(#20139,#10000,4,36,4,36) hasLocation(#20138,#20139) #20140=* -tokeninfo(#20140,7,#20001,54,"type") -#20141=@"loc,{#10000},6,36,6,39" -locations_default(#20141,#10000,6,36,6,39) +tokeninfo(#20140,4,#20001,43,"""json""") +#20141=@"loc,{#10000},4,38,4,43" +locations_default(#20141,#10000,4,38,4,43) hasLocation(#20140,#20141) #20142=* -tokeninfo(#20142,8,#20001,55,":") -#20143=@"loc,{#10000},6,40,6,40" -locations_default(#20143,#10000,6,40,6,40) +tokeninfo(#20142,8,#20001,44,"}") +#20143=@"loc,{#10000},4,45,4,45" +locations_default(#20143,#10000,4,45,4,45) hasLocation(#20142,#20143) #20144=* -tokeninfo(#20144,4,#20001,56,"""json""") -#20145=@"loc,{#10000},6,42,6,47" -locations_default(#20145,#10000,6,42,6,47) +tokeninfo(#20144,8,#20001,45,";") +#20145=@"loc,{#10000},4,46,4,46" +locations_default(#20145,#10000,4,46,4,46) hasLocation(#20144,#20145) #20146=* -tokeninfo(#20146,8,#20001,57,"}") -#20147=@"loc,{#10000},6,49,6,49" -locations_default(#20147,#10000,6,49,6,49) +tokeninfo(#20146,7,#20001,46,"export") +#20147=@"loc,{#10000},6,1,6,6" +locations_default(#20147,#10000,6,1,6,6) hasLocation(#20146,#20147) #20148=* -tokeninfo(#20148,8,#20001,58,";") -#20149=@"loc,{#10000},6,50,6,50" -locations_default(#20149,#10000,6,50,6,50) +tokeninfo(#20148,8,#20001,47,"{") +#20149=@"loc,{#10000},6,8,6,8" +locations_default(#20149,#10000,6,8,6,8) hasLocation(#20148,#20149) #20150=* -tokeninfo(#20150,7,#20001,59,"export") -#20151=@"loc,{#10000},7,1,7,6" -locations_default(#20151,#10000,7,1,7,6) +tokeninfo(#20150,6,#20001,48,"v4") +#20151=@"loc,{#10000},6,10,6,11" +locations_default(#20151,#10000,6,10,6,11) hasLocation(#20150,#20151) #20152=* -tokeninfo(#20152,8,#20001,60,"*") -#20153=@"loc,{#10000},7,8,7,8" -locations_default(#20153,#10000,7,8,7,8) +tokeninfo(#20152,8,#20001,49,"}") +#20153=@"loc,{#10000},6,13,6,13" +locations_default(#20153,#10000,6,13,6,13) hasLocation(#20152,#20153) #20154=* -tokeninfo(#20154,7,#20001,61,"from") -#20155=@"loc,{#10000},7,10,7,13" -locations_default(#20155,#10000,7,10,7,13) +tokeninfo(#20154,7,#20001,50,"from") +#20155=@"loc,{#10000},6,15,6,18" +locations_default(#20155,#10000,6,15,6,18) hasLocation(#20154,#20155) #20156=* -tokeninfo(#20156,4,#20001,62,"""module""") -#20157=@"loc,{#10000},7,15,7,22" -locations_default(#20157,#10000,7,15,7,22) +tokeninfo(#20156,4,#20001,51,"""module""") +#20157=@"loc,{#10000},6,20,6,27" +locations_default(#20157,#10000,6,20,6,27) hasLocation(#20156,#20157) #20158=* -tokeninfo(#20158,7,#20001,63,"with") -#20159=@"loc,{#10000},7,24,7,27" -locations_default(#20159,#10000,7,24,7,27) +tokeninfo(#20158,7,#20001,52,"with") +#20159=@"loc,{#10000},6,29,6,32" +locations_default(#20159,#10000,6,29,6,32) hasLocation(#20158,#20159) #20160=* -tokeninfo(#20160,8,#20001,64,"{") -#20161=@"loc,{#10000},7,29,7,29" -locations_default(#20161,#10000,7,29,7,29) +tokeninfo(#20160,8,#20001,53,"{") +#20161=@"loc,{#10000},6,34,6,34" +locations_default(#20161,#10000,6,34,6,34) hasLocation(#20160,#20161) #20162=* -tokeninfo(#20162,7,#20001,65,"type") -#20163=@"loc,{#10000},7,31,7,34" -locations_default(#20163,#10000,7,31,7,34) +tokeninfo(#20162,7,#20001,54,"type") +#20163=@"loc,{#10000},6,36,6,39" +locations_default(#20163,#10000,6,36,6,39) hasLocation(#20162,#20163) #20164=* -tokeninfo(#20164,8,#20001,66,":") -#20165=@"loc,{#10000},7,35,7,35" -locations_default(#20165,#10000,7,35,7,35) +tokeninfo(#20164,8,#20001,55,":") +#20165=@"loc,{#10000},6,40,6,40" +locations_default(#20165,#10000,6,40,6,40) hasLocation(#20164,#20165) #20166=* -tokeninfo(#20166,4,#20001,67,"""json""") -#20167=@"loc,{#10000},7,37,7,42" -locations_default(#20167,#10000,7,37,7,42) +tokeninfo(#20166,4,#20001,56,"""json""") +#20167=@"loc,{#10000},6,42,6,47" +locations_default(#20167,#10000,6,42,6,47) hasLocation(#20166,#20167) #20168=* -tokeninfo(#20168,8,#20001,68,"}") -#20169=@"loc,{#10000},7,44,7,44" -locations_default(#20169,#10000,7,44,7,44) +tokeninfo(#20168,8,#20001,57,"}") +#20169=@"loc,{#10000},6,49,6,49" +locations_default(#20169,#10000,6,49,6,49) hasLocation(#20168,#20169) #20170=* -tokeninfo(#20170,8,#20001,69,";") -#20171=@"loc,{#10000},7,45,7,45" -locations_default(#20171,#10000,7,45,7,45) +tokeninfo(#20170,8,#20001,58,";") +#20171=@"loc,{#10000},6,50,6,50" +locations_default(#20171,#10000,6,50,6,50) hasLocation(#20170,#20171) #20172=* -tokeninfo(#20172,7,#20001,70,"export") -#20173=@"loc,{#10000},8,1,8,6" -locations_default(#20173,#10000,8,1,8,6) +tokeninfo(#20172,7,#20001,59,"export") +#20173=@"loc,{#10000},7,1,7,6" +locations_default(#20173,#10000,7,1,7,6) hasLocation(#20172,#20173) #20174=* -tokeninfo(#20174,8,#20001,71,"*") -#20175=@"loc,{#10000},8,8,8,8" -locations_default(#20175,#10000,8,8,8,8) +tokeninfo(#20174,8,#20001,60,"*") +#20175=@"loc,{#10000},7,8,7,8" +locations_default(#20175,#10000,7,8,7,8) hasLocation(#20174,#20175) #20176=* -tokeninfo(#20176,7,#20001,72,"as") -#20177=@"loc,{#10000},8,10,8,11" -locations_default(#20177,#10000,8,10,8,11) +tokeninfo(#20176,7,#20001,61,"from") +#20177=@"loc,{#10000},7,10,7,13" +locations_default(#20177,#10000,7,10,7,13) hasLocation(#20176,#20177) #20178=* -tokeninfo(#20178,6,#20001,73,"v5") -#20179=@"loc,{#10000},8,13,8,14" -locations_default(#20179,#10000,8,13,8,14) +tokeninfo(#20178,4,#20001,62,"""module""") +#20179=@"loc,{#10000},7,15,7,22" +locations_default(#20179,#10000,7,15,7,22) hasLocation(#20178,#20179) #20180=* -tokeninfo(#20180,7,#20001,74,"from") -#20181=@"loc,{#10000},8,16,8,19" -locations_default(#20181,#10000,8,16,8,19) +tokeninfo(#20180,7,#20001,63,"with") +#20181=@"loc,{#10000},7,24,7,27" +locations_default(#20181,#10000,7,24,7,27) hasLocation(#20180,#20181) #20182=* -tokeninfo(#20182,4,#20001,75,"""module""") -#20183=@"loc,{#10000},8,21,8,28" -locations_default(#20183,#10000,8,21,8,28) +tokeninfo(#20182,8,#20001,64,"{") +#20183=@"loc,{#10000},7,29,7,29" +locations_default(#20183,#10000,7,29,7,29) hasLocation(#20182,#20183) #20184=* -tokeninfo(#20184,7,#20001,76,"with") -#20185=@"loc,{#10000},8,30,8,33" -locations_default(#20185,#10000,8,30,8,33) +tokeninfo(#20184,7,#20001,65,"type") +#20185=@"loc,{#10000},7,31,7,34" +locations_default(#20185,#10000,7,31,7,34) hasLocation(#20184,#20185) #20186=* -tokeninfo(#20186,8,#20001,77,"{") -#20187=@"loc,{#10000},8,35,8,35" -locations_default(#20187,#10000,8,35,8,35) +tokeninfo(#20186,8,#20001,66,":") +#20187=@"loc,{#10000},7,35,7,35" +locations_default(#20187,#10000,7,35,7,35) hasLocation(#20186,#20187) #20188=* -tokeninfo(#20188,7,#20001,78,"type") -#20189=@"loc,{#10000},8,37,8,40" -locations_default(#20189,#10000,8,37,8,40) +tokeninfo(#20188,4,#20001,67,"""json""") +#20189=@"loc,{#10000},7,37,7,42" +locations_default(#20189,#10000,7,37,7,42) hasLocation(#20188,#20189) #20190=* -tokeninfo(#20190,8,#20001,79,":") -#20191=@"loc,{#10000},8,41,8,41" -locations_default(#20191,#10000,8,41,8,41) +tokeninfo(#20190,8,#20001,68,"}") +#20191=@"loc,{#10000},7,44,7,44" +locations_default(#20191,#10000,7,44,7,44) hasLocation(#20190,#20191) #20192=* -tokeninfo(#20192,4,#20001,80,"""json""") -#20193=@"loc,{#10000},8,43,8,48" -locations_default(#20193,#10000,8,43,8,48) +tokeninfo(#20192,8,#20001,69,";") +#20193=@"loc,{#10000},7,45,7,45" +locations_default(#20193,#10000,7,45,7,45) hasLocation(#20192,#20193) #20194=* -tokeninfo(#20194,8,#20001,81,"}") -#20195=@"loc,{#10000},8,50,8,50" -locations_default(#20195,#10000,8,50,8,50) +tokeninfo(#20194,7,#20001,70,"export") +#20195=@"loc,{#10000},8,1,8,6" +locations_default(#20195,#10000,8,1,8,6) hasLocation(#20194,#20195) #20196=* -tokeninfo(#20196,8,#20001,82,";") -#20197=@"loc,{#10000},8,51,8,51" -locations_default(#20197,#10000,8,51,8,51) +tokeninfo(#20196,8,#20001,71,"*") +#20197=@"loc,{#10000},8,8,8,8" +locations_default(#20197,#10000,8,8,8,8) hasLocation(#20196,#20197) #20198=* -tokeninfo(#20198,7,#20001,83,"const") -#20199=@"loc,{#10000},10,1,10,5" -locations_default(#20199,#10000,10,1,10,5) +tokeninfo(#20198,7,#20001,72,"as") +#20199=@"loc,{#10000},8,10,8,11" +locations_default(#20199,#10000,8,10,8,11) hasLocation(#20198,#20199) #20200=* -tokeninfo(#20200,6,#20001,84,"v6") -#20201=@"loc,{#10000},10,7,10,8" -locations_default(#20201,#10000,10,7,10,8) +tokeninfo(#20200,6,#20001,73,"v5") +#20201=@"loc,{#10000},8,13,8,14" +locations_default(#20201,#10000,8,13,8,14) hasLocation(#20200,#20201) #20202=* -tokeninfo(#20202,8,#20001,85,"=") -#20203=@"loc,{#10000},10,10,10,10" -locations_default(#20203,#10000,10,10,10,10) +tokeninfo(#20202,7,#20001,74,"from") +#20203=@"loc,{#10000},8,16,8,19" +locations_default(#20203,#10000,8,16,8,19) hasLocation(#20202,#20203) #20204=* -tokeninfo(#20204,7,#20001,86,"import") -#20205=@"loc,{#10000},10,12,10,17" -locations_default(#20205,#10000,10,12,10,17) +tokeninfo(#20204,4,#20001,75,"""module""") +#20205=@"loc,{#10000},8,21,8,28" +locations_default(#20205,#10000,8,21,8,28) hasLocation(#20204,#20205) #20206=* -tokeninfo(#20206,8,#20001,87,"(") -#20207=@"loc,{#10000},10,18,10,18" -locations_default(#20207,#10000,10,18,10,18) +tokeninfo(#20206,7,#20001,76,"with") +#20207=@"loc,{#10000},8,30,8,33" +locations_default(#20207,#10000,8,30,8,33) hasLocation(#20206,#20207) #20208=* -tokeninfo(#20208,4,#20001,88,"""module""") -#20209=@"loc,{#10000},10,19,10,26" -locations_default(#20209,#10000,10,19,10,26) +tokeninfo(#20208,8,#20001,77,"{") +#20209=@"loc,{#10000},8,35,8,35" +locations_default(#20209,#10000,8,35,8,35) hasLocation(#20208,#20209) #20210=* -tokeninfo(#20210,8,#20001,89,",") -#20211=@"loc,{#10000},10,27,10,27" -locations_default(#20211,#10000,10,27,10,27) +tokeninfo(#20210,7,#20001,78,"type") +#20211=@"loc,{#10000},8,37,8,40" +locations_default(#20211,#10000,8,37,8,40) hasLocation(#20210,#20211) #20212=* -tokeninfo(#20212,8,#20001,90,"{") -#20213=@"loc,{#10000},10,29,10,29" -locations_default(#20213,#10000,10,29,10,29) +tokeninfo(#20212,8,#20001,79,":") +#20213=@"loc,{#10000},8,41,8,41" +locations_default(#20213,#10000,8,41,8,41) hasLocation(#20212,#20213) #20214=* -tokeninfo(#20214,4,#20001,91,"""with""") -#20215=@"loc,{#10000},10,31,10,36" -locations_default(#20215,#10000,10,31,10,36) +tokeninfo(#20214,4,#20001,80,"""json""") +#20215=@"loc,{#10000},8,43,8,48" +locations_default(#20215,#10000,8,43,8,48) hasLocation(#20214,#20215) #20216=* -tokeninfo(#20216,8,#20001,92,":") -#20217=@"loc,{#10000},10,37,10,37" -locations_default(#20217,#10000,10,37,10,37) +tokeninfo(#20216,8,#20001,81,"}") +#20217=@"loc,{#10000},8,50,8,50" +locations_default(#20217,#10000,8,50,8,50) hasLocation(#20216,#20217) #20218=* -tokeninfo(#20218,8,#20001,93,"{") -#20219=@"loc,{#10000},10,39,10,39" -locations_default(#20219,#10000,10,39,10,39) +tokeninfo(#20218,8,#20001,82,";") +#20219=@"loc,{#10000},8,51,8,51" +locations_default(#20219,#10000,8,51,8,51) hasLocation(#20218,#20219) #20220=* -tokeninfo(#20220,7,#20001,94,"type") -#20221=@"loc,{#10000},10,41,10,44" -locations_default(#20221,#10000,10,41,10,44) +tokeninfo(#20220,7,#20001,83,"const") +#20221=@"loc,{#10000},10,1,10,5" +locations_default(#20221,#10000,10,1,10,5) hasLocation(#20220,#20221) #20222=* -tokeninfo(#20222,8,#20001,95,":") -#20223=@"loc,{#10000},10,45,10,45" -locations_default(#20223,#10000,10,45,10,45) +tokeninfo(#20222,6,#20001,84,"v6") +#20223=@"loc,{#10000},10,7,10,8" +locations_default(#20223,#10000,10,7,10,8) hasLocation(#20222,#20223) #20224=* -tokeninfo(#20224,4,#20001,96,"""json""") -#20225=@"loc,{#10000},10,47,10,52" -locations_default(#20225,#10000,10,47,10,52) +tokeninfo(#20224,8,#20001,85,"=") +#20225=@"loc,{#10000},10,10,10,10" +locations_default(#20225,#10000,10,10,10,10) hasLocation(#20224,#20225) #20226=* -tokeninfo(#20226,8,#20001,97,"}") -#20227=@"loc,{#10000},10,54,10,54" -locations_default(#20227,#10000,10,54,10,54) +tokeninfo(#20226,7,#20001,86,"import") +#20227=@"loc,{#10000},10,12,10,17" +locations_default(#20227,#10000,10,12,10,17) hasLocation(#20226,#20227) #20228=* -tokeninfo(#20228,8,#20001,98,"}") -#20229=@"loc,{#10000},10,56,10,56" -locations_default(#20229,#10000,10,56,10,56) +tokeninfo(#20228,8,#20001,87,"(") +#20229=@"loc,{#10000},10,18,10,18" +locations_default(#20229,#10000,10,18,10,18) hasLocation(#20228,#20229) #20230=* -tokeninfo(#20230,8,#20001,99,")") -#20231=@"loc,{#10000},10,57,10,57" -locations_default(#20231,#10000,10,57,10,57) +tokeninfo(#20230,4,#20001,88,"""module""") +#20231=@"loc,{#10000},10,19,10,26" +locations_default(#20231,#10000,10,19,10,26) hasLocation(#20230,#20231) #20232=* -tokeninfo(#20232,8,#20001,100,";") -#20233=@"loc,{#10000},10,58,10,58" -locations_default(#20233,#10000,10,58,10,58) +tokeninfo(#20232,8,#20001,89,",") +#20233=@"loc,{#10000},10,27,10,27" +locations_default(#20233,#10000,10,27,10,27) hasLocation(#20232,#20233) #20234=* -tokeninfo(#20234,7,#20001,101,"import") -#20235=@"loc,{#10000},12,1,12,6" -locations_default(#20235,#10000,12,1,12,6) +tokeninfo(#20234,8,#20001,90,"{") +#20235=@"loc,{#10000},10,29,10,29" +locations_default(#20235,#10000,10,29,10,29) hasLocation(#20234,#20235) #20236=* -tokeninfo(#20236,4,#20001,102,"""module""") -#20237=@"loc,{#10000},12,8,12,15" -locations_default(#20237,#10000,12,8,12,15) +tokeninfo(#20236,4,#20001,91,"""with""") +#20237=@"loc,{#10000},10,31,10,36" +locations_default(#20237,#10000,10,31,10,36) hasLocation(#20236,#20237) #20238=* -tokeninfo(#20238,8,#20001,103,";") -#20239=@"loc,{#10000},12,16,12,16" -locations_default(#20239,#10000,12,16,12,16) +tokeninfo(#20238,8,#20001,92,":") +#20239=@"loc,{#10000},10,37,10,37" +locations_default(#20239,#10000,10,37,10,37) hasLocation(#20238,#20239) #20240=* -tokeninfo(#20240,7,#20001,104,"assert") -#20241=@"loc,{#10000},13,1,13,6" -locations_default(#20241,#10000,13,1,13,6) +tokeninfo(#20240,8,#20001,93,"{") +#20241=@"loc,{#10000},10,39,10,39" +locations_default(#20241,#10000,10,39,10,39) hasLocation(#20240,#20241) -next_token(#20002,#20240) #20242=* -tokeninfo(#20242,8,#20001,105,"(") -#20243=@"loc,{#10000},13,7,13,7" -locations_default(#20243,#10000,13,7,13,7) +tokeninfo(#20242,7,#20001,94,"type") +#20243=@"loc,{#10000},10,41,10,44" +locations_default(#20243,#10000,10,41,10,44) hasLocation(#20242,#20243) #20244=* -tokeninfo(#20244,8,#20001,106,"{") -#20245=@"loc,{#10000},13,8,13,8" -locations_default(#20245,#10000,13,8,13,8) +tokeninfo(#20244,8,#20001,95,":") +#20245=@"loc,{#10000},10,45,10,45" +locations_default(#20245,#10000,10,45,10,45) hasLocation(#20244,#20245) #20246=* -tokeninfo(#20246,7,#20001,107,"type") -#20247=@"loc,{#10000},13,10,13,13" -locations_default(#20247,#10000,13,10,13,13) +tokeninfo(#20246,4,#20001,96,"""json""") +#20247=@"loc,{#10000},10,47,10,52" +locations_default(#20247,#10000,10,47,10,52) hasLocation(#20246,#20247) #20248=* -tokeninfo(#20248,8,#20001,108,":") -#20249=@"loc,{#10000},13,14,13,14" -locations_default(#20249,#10000,13,14,13,14) +tokeninfo(#20248,8,#20001,97,"}") +#20249=@"loc,{#10000},10,54,10,54" +locations_default(#20249,#10000,10,54,10,54) hasLocation(#20248,#20249) #20250=* -tokeninfo(#20250,4,#20001,109,"""json""") -#20251=@"loc,{#10000},13,16,13,21" -locations_default(#20251,#10000,13,16,13,21) +tokeninfo(#20250,8,#20001,98,"}") +#20251=@"loc,{#10000},10,56,10,56" +locations_default(#20251,#10000,10,56,10,56) hasLocation(#20250,#20251) #20252=* -tokeninfo(#20252,8,#20001,110,"}") -#20253=@"loc,{#10000},13,23,13,23" -locations_default(#20253,#10000,13,23,13,23) +tokeninfo(#20252,8,#20001,99,")") +#20253=@"loc,{#10000},10,57,10,57" +locations_default(#20253,#10000,10,57,10,57) hasLocation(#20252,#20253) #20254=* -tokeninfo(#20254,8,#20001,111,")") -#20255=@"loc,{#10000},13,24,13,24" -locations_default(#20255,#10000,13,24,13,24) +tokeninfo(#20254,8,#20001,100,";") +#20255=@"loc,{#10000},10,58,10,58" +locations_default(#20255,#10000,10,58,10,58) hasLocation(#20254,#20255) #20256=* -tokeninfo(#20256,8,#20001,112,";") -#20257=@"loc,{#10000},13,25,13,25" -locations_default(#20257,#10000,13,25,13,25) +tokeninfo(#20256,7,#20001,101,"import") +#20257=@"loc,{#10000},12,1,12,6" +locations_default(#20257,#10000,12,1,12,6) hasLocation(#20256,#20257) #20258=* -tokeninfo(#20258,0,#20001,113,"") -#20259=@"loc,{#10000},14,1,14,0" -locations_default(#20259,#10000,14,1,14,0) +tokeninfo(#20258,4,#20001,102,"""module""") +#20259=@"loc,{#10000},12,8,12,15" +locations_default(#20259,#10000,12,8,12,15) hasLocation(#20258,#20259) -next_token(#20004,#20258) -toplevels(#20001,0) -#20260=@"loc,{#10000},1,1,14,0" -locations_default(#20260,#10000,1,1,14,0) -hasLocation(#20001,#20260) -#20261=@"module;{#10000},1,1" -scopes(#20261,3) -scopenodes(#20001,#20261) -scopenesting(#20261,#20000) -is_module(#20001) -is_es2015_module(#20001) -#20262=@"var;{v1};{#20261}" -variables(#20262,"v1",#20261) -#20263=@"var;{v2};{#20261}" -variables(#20263,"v2",#20261) -#20264=@"var;{v3};{#20261}" -variables(#20264,"v3",#20261) -#20265=@"local_type_name;{v1};{#20261}" -local_type_names(#20265,"v1",#20261) -#20266=@"local_type_name;{v2};{#20261}" -local_type_names(#20266,"v2",#20261) -#20267=@"local_type_name;{v3};{#20261}" -local_type_names(#20267,"v3",#20261) -#20268=@"local_namespace_name;{v1};{#20261}" -local_namespace_names(#20268,"v1",#20261) -#20269=@"local_namespace_name;{v2};{#20261}" -local_namespace_names(#20269,"v2",#20261) -#20270=@"local_namespace_name;{v3};{#20261}" -local_namespace_names(#20270,"v3",#20261) -variables(#20262,"v1",#20261) -variables(#20263,"v2",#20261) -variables(#20264,"v3",#20261) -#20271=@"var;{v6};{#20261}" -variables(#20271,"v6",#20261) -local_type_names(#20265,"v1",#20261) -local_type_names(#20266,"v2",#20261) -local_type_names(#20267,"v3",#20261) -local_namespace_names(#20268,"v1",#20261) -local_namespace_names(#20269,"v2",#20261) -local_namespace_names(#20270,"v3",#20261) +#20260=* +tokeninfo(#20260,8,#20001,103,";") +#20261=@"loc,{#10000},12,16,12,16" +locations_default(#20261,#10000,12,16,12,16) +hasLocation(#20260,#20261) +#20262=* +tokeninfo(#20262,7,#20001,104,"assert") +#20263=@"loc,{#10000},13,1,13,6" +locations_default(#20263,#10000,13,1,13,6) +hasLocation(#20262,#20263) +next_token(#20002,#20262) +#20264=* +tokeninfo(#20264,8,#20001,105,"(") +#20265=@"loc,{#10000},13,7,13,7" +locations_default(#20265,#10000,13,7,13,7) +hasLocation(#20264,#20265) +#20266=* +tokeninfo(#20266,8,#20001,106,"{") +#20267=@"loc,{#10000},13,8,13,8" +locations_default(#20267,#10000,13,8,13,8) +hasLocation(#20266,#20267) +#20268=* +tokeninfo(#20268,7,#20001,107,"type") +#20269=@"loc,{#10000},13,10,13,13" +locations_default(#20269,#10000,13,10,13,13) +hasLocation(#20268,#20269) +#20270=* +tokeninfo(#20270,8,#20001,108,":") +#20271=@"loc,{#10000},13,14,13,14" +locations_default(#20271,#10000,13,14,13,14) +hasLocation(#20270,#20271) #20272=* -stmts(#20272,27,#20001,0,"import ... son"" };") -hasLocation(#20272,#20007) -stmt_containers(#20272,#20001) -#20273=* -exprs(#20273,4,#20272,-1,"""module""") -hasLocation(#20273,#20035) -enclosing_stmt(#20273,#20272) -expr_containers(#20273,#20001) -literals("module","""module""",#20273) +tokeninfo(#20272,4,#20001,109,"""json""") +#20273=@"loc,{#10000},13,16,13,21" +locations_default(#20273,#10000,13,16,13,21) +hasLocation(#20272,#20273) #20274=* -regexpterm(#20274,14,#20273,0,"module") -#20275=@"loc,{#10000},1,9,1,14" -locations_default(#20275,#10000,1,9,1,14) +tokeninfo(#20274,8,#20001,110,"}") +#20275=@"loc,{#10000},13,23,13,23" +locations_default(#20275,#10000,13,23,13,23) hasLocation(#20274,#20275) -regexp_const_value(#20274,"module") #20276=* -exprs(#20276,8,#20272,-10,"{ type: ""json"" }") -#20277=@"loc,{#10000},1,22,1,37" -locations_default(#20277,#10000,1,22,1,37) +tokeninfo(#20276,8,#20001,111,")") +#20277=@"loc,{#10000},13,24,13,24" +locations_default(#20277,#10000,13,24,13,24) hasLocation(#20276,#20277) -enclosing_stmt(#20276,#20272) -expr_containers(#20276,#20001) #20278=* -properties(#20278,#20276,0,0,"type: ""json""") -#20279=@"loc,{#10000},1,24,1,35" -locations_default(#20279,#10000,1,24,1,35) +tokeninfo(#20278,8,#20001,112,";") +#20279=@"loc,{#10000},13,25,13,25" +locations_default(#20279,#10000,13,25,13,25) hasLocation(#20278,#20279) #20280=* -stmts(#20280,27,#20001,1,"import ... son"" };") -hasLocation(#20280,#20009) -stmt_containers(#20280,#20001) -#20281=* -exprs(#20281,4,#20280,-1,"""module""") -hasLocation(#20281,#20061) -enclosing_stmt(#20281,#20280) -expr_containers(#20281,#20001) -literals("module","""module""",#20281) +tokeninfo(#20280,7,#20001,113,"import") +#20281=@"loc,{#10000},15,1,15,6" +locations_default(#20281,#10000,15,1,15,6) +hasLocation(#20280,#20281) +next_token(#20004,#20280) #20282=* -regexpterm(#20282,14,#20281,0,"module") -#20283=@"loc,{#10000},2,22,2,27" -locations_default(#20283,#10000,2,22,2,27) +tokeninfo(#20282,4,#20001,114,"""module""") +#20283=@"loc,{#10000},15,8,15,15" +locations_default(#20283,#10000,15,8,15,15) hasLocation(#20282,#20283) -regexp_const_value(#20282,"module") #20284=* -exprs(#20284,8,#20280,-10,"{ type: ""json"" }") -#20285=@"loc,{#10000},2,35,2,50" -locations_default(#20285,#10000,2,35,2,50) +tokeninfo(#20284,7,#20001,115,"assert") +#20285=@"loc,{#10000},15,17,15,22" +locations_default(#20285,#10000,15,17,15,22) hasLocation(#20284,#20285) -enclosing_stmt(#20284,#20280) -expr_containers(#20284,#20001) #20286=* -properties(#20286,#20284,0,0,"type: ""json""") -#20287=@"loc,{#10000},2,37,2,48" -locations_default(#20287,#10000,2,37,2,48) +tokeninfo(#20286,8,#20001,116,"{") +#20287=@"loc,{#10000},15,24,15,24" +locations_default(#20287,#10000,15,24,15,24) hasLocation(#20286,#20287) #20288=* -exprs(#20288,85,#20280,0,"* as v1") -#20289=@"loc,{#10000},2,8,2,14" -locations_default(#20289,#10000,2,8,2,14) +tokeninfo(#20288,7,#20001,117,"type") +#20289=@"loc,{#10000},15,26,15,29" +locations_default(#20289,#10000,15,26,15,29) hasLocation(#20288,#20289) -enclosing_stmt(#20288,#20280) -expr_containers(#20288,#20001) #20290=* -exprs(#20290,78,#20288,1,"v1") -hasLocation(#20290,#20057) -enclosing_stmt(#20290,#20280) -expr_containers(#20290,#20001) -literals("v1","v1",#20290) -decl(#20290,#20262) -typedecl(#20290,#20265) -namespacedecl(#20290,#20268) -#20291=* -stmts(#20291,27,#20001,2,"import ... son"" };") -hasLocation(#20291,#20011) -stmt_containers(#20291,#20001) +tokeninfo(#20290,8,#20001,118,":") +#20291=@"loc,{#10000},15,30,15,30" +locations_default(#20291,#10000,15,30,15,30) +hasLocation(#20290,#20291) #20292=* -exprs(#20292,4,#20291,-1,"""module""") -hasLocation(#20292,#20087) -enclosing_stmt(#20292,#20291) -expr_containers(#20292,#20001) -literals("module","""module""",#20292) -#20293=* -regexpterm(#20293,14,#20292,0,"module") -#20294=@"loc,{#10000},3,21,3,26" -locations_default(#20294,#10000,3,21,3,26) -hasLocation(#20293,#20294) -regexp_const_value(#20293,"module") -#20295=* -exprs(#20295,8,#20291,-10,"{ type: ""json"" }") -#20296=@"loc,{#10000},3,34,3,49" -locations_default(#20296,#10000,3,34,3,49) -hasLocation(#20295,#20296) -enclosing_stmt(#20295,#20291) -expr_containers(#20295,#20001) -#20297=* -properties(#20297,#20295,0,0,"type: ""json""") -#20298=@"loc,{#10000},3,36,3,47" -locations_default(#20298,#10000,3,36,3,47) -hasLocation(#20297,#20298) -#20299=* -exprs(#20299,83,#20291,0,"v2") -hasLocation(#20299,#20081) -enclosing_stmt(#20299,#20291) -expr_containers(#20299,#20001) +tokeninfo(#20292,4,#20001,119,"""json""") +#20293=@"loc,{#10000},15,32,15,37" +locations_default(#20293,#10000,15,32,15,37) +hasLocation(#20292,#20293) +#20294=* +tokeninfo(#20294,8,#20001,120,"}") +#20295=@"loc,{#10000},15,39,15,39" +locations_default(#20295,#10000,15,39,15,39) +hasLocation(#20294,#20295) +#20296=* +tokeninfo(#20296,8,#20001,121,";") +#20297=@"loc,{#10000},15,40,15,40" +locations_default(#20297,#10000,15,40,15,40) +hasLocation(#20296,#20297) +#20298=* +tokeninfo(#20298,7,#20001,122,"import") +#20299=@"loc,{#10000},16,1,16,6" +locations_default(#20299,#10000,16,1,16,6) +hasLocation(#20298,#20299) #20300=* -exprs(#20300,0,#20299,0,"v2") -hasLocation(#20300,#20081) -enclosing_stmt(#20300,#20291) -expr_containers(#20300,#20001) -literals("v2","v2",#20300) -#20301=* -exprs(#20301,78,#20299,1,"v2") -hasLocation(#20301,#20081) -enclosing_stmt(#20301,#20291) -expr_containers(#20301,#20001) -literals("v2","v2",#20301) -decl(#20301,#20263) -typedecl(#20301,#20266) -namespacedecl(#20301,#20269) +tokeninfo(#20300,8,#20001,123,"*") +#20301=@"loc,{#10000},16,8,16,8" +locations_default(#20301,#10000,16,8,16,8) +hasLocation(#20300,#20301) #20302=* -stmts(#20302,27,#20001,3,"import ... son"" };") -hasLocation(#20302,#20013) -stmt_containers(#20302,#20001) -#20303=* -exprs(#20303,4,#20302,-1,"""module""") -hasLocation(#20303,#20109) -enclosing_stmt(#20303,#20302) -expr_containers(#20303,#20001) -literals("module","""module""",#20303) +tokeninfo(#20302,7,#20001,124,"as") +#20303=@"loc,{#10000},16,10,16,11" +locations_default(#20303,#10000,16,10,16,11) +hasLocation(#20302,#20303) #20304=* -regexpterm(#20304,14,#20303,0,"module") -#20305=@"loc,{#10000},4,17,4,22" -locations_default(#20305,#10000,4,17,4,22) +tokeninfo(#20304,6,#20001,125,"v1") +#20305=@"loc,{#10000},16,13,16,14" +locations_default(#20305,#10000,16,13,16,14) hasLocation(#20304,#20305) -regexp_const_value(#20304,"module") #20306=* -exprs(#20306,8,#20302,-10,"{ type: ""json"" }") -#20307=@"loc,{#10000},4,32,4,47" -locations_default(#20307,#10000,4,32,4,47) +tokeninfo(#20306,7,#20001,126,"from") +#20307=@"loc,{#10000},16,16,16,19" +locations_default(#20307,#10000,16,16,16,19) hasLocation(#20306,#20307) -enclosing_stmt(#20306,#20302) -expr_containers(#20306,#20001) #20308=* -properties(#20308,#20306,0,0,"type: ""json""") -#20309=@"loc,{#10000},4,34,4,45" -locations_default(#20309,#10000,4,34,4,45) +tokeninfo(#20308,4,#20001,127,"""module""") +#20309=@"loc,{#10000},16,21,16,28" +locations_default(#20309,#10000,16,21,16,28) hasLocation(#20308,#20309) #20310=* -exprs(#20310,84,#20302,0,"v3") -hasLocation(#20310,#20105) -enclosing_stmt(#20310,#20302) -expr_containers(#20310,#20001) -#20311=* -exprs(#20311,78,#20310,1,"v3") -hasLocation(#20311,#20105) -enclosing_stmt(#20311,#20302) -expr_containers(#20311,#20001) -literals("v3","v3",#20311) -decl(#20311,#20264) -typedecl(#20311,#20267) -namespacedecl(#20311,#20270) +tokeninfo(#20310,7,#20001,128,"assert") +#20311=@"loc,{#10000},16,30,16,35" +locations_default(#20311,#10000,16,30,16,35) +hasLocation(#20310,#20311) #20312=* -stmts(#20312,30,#20001,4,"export ... son"" };") -hasLocation(#20312,#20017) -stmt_containers(#20312,#20001) -#20313=* -exprs(#20313,4,#20312,-2,"""module""") -hasLocation(#20313,#20135) -enclosing_stmt(#20313,#20312) -expr_containers(#20313,#20001) -literals("module","""module""",#20313) +tokeninfo(#20312,8,#20001,129,"{") +#20313=@"loc,{#10000},16,37,16,37" +locations_default(#20313,#10000,16,37,16,37) +hasLocation(#20312,#20313) #20314=* -regexpterm(#20314,14,#20313,0,"module") -#20315=@"loc,{#10000},6,21,6,26" -locations_default(#20315,#10000,6,21,6,26) +tokeninfo(#20314,7,#20001,130,"type") +#20315=@"loc,{#10000},16,39,16,42" +locations_default(#20315,#10000,16,39,16,42) hasLocation(#20314,#20315) -regexp_const_value(#20314,"module") #20316=* -exprs(#20316,8,#20312,-10,"{ type: ""json"" }") -#20317=@"loc,{#10000},6,34,6,49" -locations_default(#20317,#10000,6,34,6,49) +tokeninfo(#20316,8,#20001,131,":") +#20317=@"loc,{#10000},16,43,16,43" +locations_default(#20317,#10000,16,43,16,43) hasLocation(#20316,#20317) -enclosing_stmt(#20316,#20312) -expr_containers(#20316,#20001) #20318=* -properties(#20318,#20316,0,0,"type: ""json""") -#20319=@"loc,{#10000},6,36,6,47" -locations_default(#20319,#10000,6,36,6,47) +tokeninfo(#20318,4,#20001,132,"""json""") +#20319=@"loc,{#10000},16,45,16,50" +locations_default(#20319,#10000,16,45,16,50) hasLocation(#20318,#20319) #20320=* -exprs(#20320,86,#20312,0,"v4") -hasLocation(#20320,#20129) -enclosing_stmt(#20320,#20312) -expr_containers(#20320,#20001) -#20321=* -exprs(#20321,0,#20320,0,"v4") -hasLocation(#20321,#20129) -enclosing_stmt(#20321,#20312) -expr_containers(#20321,#20001) -literals("v4","v4",#20321) +tokeninfo(#20320,8,#20001,133,"}") +#20321=@"loc,{#10000},16,52,16,52" +locations_default(#20321,#10000,16,52,16,52) +hasLocation(#20320,#20321) #20322=* -exprs(#20322,0,#20320,1,"v4") -hasLocation(#20322,#20129) -enclosing_stmt(#20322,#20312) -expr_containers(#20322,#20001) -literals("v4","v4",#20322) -#20323=* -stmts(#20323,28,#20001,5,"export ... son"" };") -hasLocation(#20323,#20019) -stmt_containers(#20323,#20001) +tokeninfo(#20322,8,#20001,134,";") +#20323=@"loc,{#10000},16,53,16,53" +locations_default(#20323,#10000,16,53,16,53) +hasLocation(#20322,#20323) #20324=* -exprs(#20324,4,#20323,0,"""module""") -hasLocation(#20324,#20157) -enclosing_stmt(#20324,#20323) -expr_containers(#20324,#20001) -literals("module","""module""",#20324) -#20325=* -regexpterm(#20325,14,#20324,0,"module") -#20326=@"loc,{#10000},7,16,7,21" -locations_default(#20326,#10000,7,16,7,21) -hasLocation(#20325,#20326) -regexp_const_value(#20325,"module") -#20327=* -exprs(#20327,8,#20323,-10,"{ type: ""json"" }") -#20328=@"loc,{#10000},7,29,7,44" -locations_default(#20328,#10000,7,29,7,44) -hasLocation(#20327,#20328) -enclosing_stmt(#20327,#20323) -expr_containers(#20327,#20001) -#20329=* -properties(#20329,#20327,0,0,"type: ""json""") -#20330=@"loc,{#10000},7,31,7,42" -locations_default(#20330,#10000,7,31,7,42) -hasLocation(#20329,#20330) -#20331=* -stmts(#20331,30,#20001,6,"export ... son"" };") -hasLocation(#20331,#20021) -stmt_containers(#20331,#20001) +tokeninfo(#20324,7,#20001,135,"import") +#20325=@"loc,{#10000},17,1,17,6" +locations_default(#20325,#10000,17,1,17,6) +hasLocation(#20324,#20325) +#20326=* +tokeninfo(#20326,8,#20001,136,"{") +#20327=@"loc,{#10000},17,8,17,8" +locations_default(#20327,#10000,17,8,17,8) +hasLocation(#20326,#20327) +#20328=* +tokeninfo(#20328,6,#20001,137,"v2") +#20329=@"loc,{#10000},17,10,17,11" +locations_default(#20329,#10000,17,10,17,11) +hasLocation(#20328,#20329) +#20330=* +tokeninfo(#20330,8,#20001,138,"}") +#20331=@"loc,{#10000},17,13,17,13" +locations_default(#20331,#10000,17,13,17,13) +hasLocation(#20330,#20331) #20332=* -exprs(#20332,4,#20331,-2,"""module""") -hasLocation(#20332,#20183) -enclosing_stmt(#20332,#20331) -expr_containers(#20332,#20001) -literals("module","""module""",#20332) -#20333=* -regexpterm(#20333,14,#20332,0,"module") -#20334=@"loc,{#10000},8,22,8,27" -locations_default(#20334,#10000,8,22,8,27) -hasLocation(#20333,#20334) -regexp_const_value(#20333,"module") -#20335=* -exprs(#20335,8,#20331,-10,"{ type: ""json"" }") -#20336=@"loc,{#10000},8,35,8,50" -locations_default(#20336,#10000,8,35,8,50) -hasLocation(#20335,#20336) -enclosing_stmt(#20335,#20331) -expr_containers(#20335,#20001) -#20337=* -properties(#20337,#20335,0,0,"type: ""json""") -#20338=@"loc,{#10000},8,37,8,48" -locations_default(#20338,#10000,8,37,8,48) -hasLocation(#20337,#20338) -#20339=* -exprs(#20339,96,#20331,0,"* as v5") -#20340=@"loc,{#10000},8,8,8,14" -locations_default(#20340,#10000,8,8,8,14) -hasLocation(#20339,#20340) -enclosing_stmt(#20339,#20331) -expr_containers(#20339,#20001) -#20341=* -exprs(#20341,0,#20339,1,"v5") -hasLocation(#20341,#20179) -enclosing_stmt(#20341,#20331) -expr_containers(#20341,#20001) -literals("v5","v5",#20341) +tokeninfo(#20332,7,#20001,139,"from") +#20333=@"loc,{#10000},17,15,17,18" +locations_default(#20333,#10000,17,15,17,18) +hasLocation(#20332,#20333) +#20334=* +tokeninfo(#20334,4,#20001,140,"""module""") +#20335=@"loc,{#10000},17,20,17,27" +locations_default(#20335,#10000,17,20,17,27) +hasLocation(#20334,#20335) +#20336=* +tokeninfo(#20336,7,#20001,141,"assert") +#20337=@"loc,{#10000},17,29,17,34" +locations_default(#20337,#10000,17,29,17,34) +hasLocation(#20336,#20337) +#20338=* +tokeninfo(#20338,8,#20001,142,"{") +#20339=@"loc,{#10000},17,36,17,36" +locations_default(#20339,#10000,17,36,17,36) +hasLocation(#20338,#20339) +#20340=* +tokeninfo(#20340,7,#20001,143,"type") +#20341=@"loc,{#10000},17,38,17,41" +locations_default(#20341,#10000,17,38,17,41) +hasLocation(#20340,#20341) #20342=* -stmts(#20342,22,#20001,7,"const v ... "" } });") -hasLocation(#20342,#20025) -stmt_containers(#20342,#20001) -#20343=* -exprs(#20343,64,#20342,0,"v6 = im ... n"" } })") -#20344=@"loc,{#10000},10,7,10,57" -locations_default(#20344,#10000,10,7,10,57) -hasLocation(#20343,#20344) -enclosing_stmt(#20343,#20342) -expr_containers(#20343,#20001) -#20345=* -exprs(#20345,78,#20343,0,"v6") -hasLocation(#20345,#20201) -enclosing_stmt(#20345,#20342) -expr_containers(#20345,#20001) -literals("v6","v6",#20345) -decl(#20345,#20271) +tokeninfo(#20342,8,#20001,144,":") +#20343=@"loc,{#10000},17,42,17,42" +locations_default(#20343,#10000,17,42,17,42) +hasLocation(#20342,#20343) +#20344=* +tokeninfo(#20344,4,#20001,145,"""json""") +#20345=@"loc,{#10000},17,44,17,49" +locations_default(#20345,#10000,17,44,17,49) +hasLocation(#20344,#20345) #20346=* -exprs(#20346,99,#20343,1,"import( ... n"" } })") -#20347=@"loc,{#10000},10,12,10,57" -locations_default(#20347,#10000,10,12,10,57) +tokeninfo(#20346,8,#20001,146,"}") +#20347=@"loc,{#10000},17,51,17,51" +locations_default(#20347,#10000,17,51,17,51) hasLocation(#20346,#20347) -enclosing_stmt(#20346,#20342) -expr_containers(#20346,#20001) #20348=* -exprs(#20348,4,#20346,0,"""module""") -hasLocation(#20348,#20209) -enclosing_stmt(#20348,#20342) -expr_containers(#20348,#20001) -literals("module","""module""",#20348) -#20349=* -regexpterm(#20349,14,#20348,0,"module") -#20350=@"loc,{#10000},10,20,10,25" -locations_default(#20350,#10000,10,20,10,25) -hasLocation(#20349,#20350) -regexp_const_value(#20349,"module") -#20351=* -exprs(#20351,8,#20346,1,"{ ""with ... on"" } }") -#20352=@"loc,{#10000},10,29,10,56" -locations_default(#20352,#10000,10,29,10,56) -hasLocation(#20351,#20352) -enclosing_stmt(#20351,#20342) -expr_containers(#20351,#20001) -#20353=* -properties(#20353,#20351,0,0,"""with"": ... json"" }") -#20354=@"loc,{#10000},10,31,10,54" -locations_default(#20354,#10000,10,31,10,54) -hasLocation(#20353,#20354) -#20355=* -exprs(#20355,4,#20353,0,"""with""") -hasLocation(#20355,#20215) -enclosing_stmt(#20355,#20342) -expr_containers(#20355,#20001) -literals("with","""with""",#20355) +tokeninfo(#20348,8,#20001,147,";") +#20349=@"loc,{#10000},17,52,17,52" +locations_default(#20349,#10000,17,52,17,52) +hasLocation(#20348,#20349) +#20350=* +tokeninfo(#20350,7,#20001,148,"import") +#20351=@"loc,{#10000},18,1,18,6" +locations_default(#20351,#10000,18,1,18,6) +hasLocation(#20350,#20351) +#20352=* +tokeninfo(#20352,6,#20001,149,"v3") +#20353=@"loc,{#10000},18,8,18,9" +locations_default(#20353,#10000,18,8,18,9) +hasLocation(#20352,#20353) +#20354=* +tokeninfo(#20354,7,#20001,150,"from") +#20355=@"loc,{#10000},18,11,18,14" +locations_default(#20355,#10000,18,11,18,14) +hasLocation(#20354,#20355) #20356=* -regexpterm(#20356,14,#20355,0,"with") -#20357=@"loc,{#10000},10,32,10,35" -locations_default(#20357,#10000,10,32,10,35) +tokeninfo(#20356,4,#20001,151,"""module""") +#20357=@"loc,{#10000},18,16,18,23" +locations_default(#20357,#10000,18,16,18,23) hasLocation(#20356,#20357) -regexp_const_value(#20356,"with") #20358=* -exprs(#20358,8,#20353,1,"{ type: ""json"" }") -#20359=@"loc,{#10000},10,39,10,54" -locations_default(#20359,#10000,10,39,10,54) +tokeninfo(#20358,7,#20001,152,"assert") +#20359=@"loc,{#10000},18,25,18,30" +locations_default(#20359,#10000,18,25,18,30) hasLocation(#20358,#20359) -enclosing_stmt(#20358,#20342) -expr_containers(#20358,#20001) #20360=* -properties(#20360,#20358,0,0,"type: ""json""") -#20361=@"loc,{#10000},10,41,10,52" -locations_default(#20361,#10000,10,41,10,52) +tokeninfo(#20360,8,#20001,153,"{") +#20361=@"loc,{#10000},18,32,18,32" +locations_default(#20361,#10000,18,32,18,32) hasLocation(#20360,#20361) #20362=* -exprs(#20362,0,#20360,0,"type") -hasLocation(#20362,#20221) -enclosing_stmt(#20362,#20342) -expr_containers(#20362,#20001) -literals("type","type",#20362) -#20363=* -exprs(#20363,4,#20360,1,"""json""") -hasLocation(#20363,#20225) -enclosing_stmt(#20363,#20342) -expr_containers(#20363,#20001) -literals("json","""json""",#20363) +tokeninfo(#20362,7,#20001,154,"type") +#20363=@"loc,{#10000},18,34,18,37" +locations_default(#20363,#10000,18,34,18,37) +hasLocation(#20362,#20363) #20364=* -regexpterm(#20364,14,#20363,0,"json") -#20365=@"loc,{#10000},10,48,10,51" -locations_default(#20365,#10000,10,48,10,51) +tokeninfo(#20364,8,#20001,155,":") +#20365=@"loc,{#10000},18,38,18,38" +locations_default(#20365,#10000,18,38,18,38) hasLocation(#20364,#20365) -regexp_const_value(#20364,"json") #20366=* -stmts(#20366,27,#20001,8,"import ""module"";") -#20367=@"loc,{#10000},12,1,12,16" -locations_default(#20367,#10000,12,1,12,16) +tokeninfo(#20366,4,#20001,156,"""json""") +#20367=@"loc,{#10000},18,40,18,45" +locations_default(#20367,#10000,18,40,18,45) hasLocation(#20366,#20367) -stmt_containers(#20366,#20001) #20368=* -exprs(#20368,4,#20366,-1,"""module""") -hasLocation(#20368,#20237) -enclosing_stmt(#20368,#20366) -expr_containers(#20368,#20001) -literals("module","""module""",#20368) -#20369=* -regexpterm(#20369,14,#20368,0,"module") -#20370=@"loc,{#10000},12,9,12,14" -locations_default(#20370,#10000,12,9,12,14) -hasLocation(#20369,#20370) -regexp_const_value(#20369,"module") -#20371=* -stmts(#20371,2,#20001,9,"assert( ... on"" });") -#20372=@"loc,{#10000},13,1,13,25" -locations_default(#20372,#10000,13,1,13,25) -hasLocation(#20371,#20372) -stmt_containers(#20371,#20001) -#20373=* -exprs(#20373,13,#20371,0,"assert( ... son"" })") -#20374=@"loc,{#10000},13,1,13,24" -locations_default(#20374,#10000,13,1,13,24) -hasLocation(#20373,#20374) -enclosing_stmt(#20373,#20371) -expr_containers(#20373,#20001) -#20375=* -exprs(#20375,79,#20373,-1,"assert") -hasLocation(#20375,#20241) -enclosing_stmt(#20375,#20371) -expr_containers(#20375,#20001) -literals("assert","assert",#20375) -#20376=@"var;{assert};{#20000}" -variables(#20376,"assert",#20000) -bind(#20375,#20376) -#20377=* -exprs(#20377,8,#20373,0,"{ type: ""json"" }") -#20378=@"loc,{#10000},13,8,13,23" -locations_default(#20378,#10000,13,8,13,23) -hasLocation(#20377,#20378) -enclosing_stmt(#20377,#20371) -expr_containers(#20377,#20001) -#20379=* -properties(#20379,#20377,0,0,"type: ""json""") -#20380=@"loc,{#10000},13,10,13,21" -locations_default(#20380,#10000,13,10,13,21) -hasLocation(#20379,#20380) -#20381=* -exprs(#20381,0,#20379,0,"type") -hasLocation(#20381,#20247) -enclosing_stmt(#20381,#20371) -expr_containers(#20381,#20001) -literals("type","type",#20381) +tokeninfo(#20368,8,#20001,157,"}") +#20369=@"loc,{#10000},18,47,18,47" +locations_default(#20369,#10000,18,47,18,47) +hasLocation(#20368,#20369) +#20370=* +tokeninfo(#20370,8,#20001,158,";") +#20371=@"loc,{#10000},18,48,18,48" +locations_default(#20371,#10000,18,48,18,48) +hasLocation(#20370,#20371) +#20372=* +tokeninfo(#20372,7,#20001,159,"export") +#20373=@"loc,{#10000},20,1,20,6" +locations_default(#20373,#10000,20,1,20,6) +hasLocation(#20372,#20373) +#20374=* +tokeninfo(#20374,8,#20001,160,"{") +#20375=@"loc,{#10000},20,8,20,8" +locations_default(#20375,#10000,20,8,20,8) +hasLocation(#20374,#20375) +#20376=* +tokeninfo(#20376,6,#20001,161,"v4") +#20377=@"loc,{#10000},20,10,20,11" +locations_default(#20377,#10000,20,10,20,11) +hasLocation(#20376,#20377) +#20378=* +tokeninfo(#20378,8,#20001,162,"}") +#20379=@"loc,{#10000},20,13,20,13" +locations_default(#20379,#10000,20,13,20,13) +hasLocation(#20378,#20379) +#20380=* +tokeninfo(#20380,7,#20001,163,"from") +#20381=@"loc,{#10000},20,15,20,18" +locations_default(#20381,#10000,20,15,20,18) +hasLocation(#20380,#20381) #20382=* -exprs(#20382,4,#20379,1,"""json""") -hasLocation(#20382,#20251) -enclosing_stmt(#20382,#20371) -expr_containers(#20382,#20001) -literals("json","""json""",#20382) -#20383=* -regexpterm(#20383,14,#20382,0,"json") -#20384=@"loc,{#10000},13,17,13,20" -locations_default(#20384,#10000,13,17,13,20) -hasLocation(#20383,#20384) -regexp_const_value(#20383,"json") -#20385=* -entry_cfg_node(#20385,#20001) -#20386=@"loc,{#10000},1,1,1,0" -locations_default(#20386,#10000,1,1,1,0) -hasLocation(#20385,#20386) -#20387=* -exit_cfg_node(#20387,#20001) -hasLocation(#20387,#20259) -successor(#20371,#20375) -successor(#20377,#20381) -successor(#20382,#20379) -successor(#20381,#20382) -successor(#20379,#20373) -successor(#20375,#20377) -successor(#20373,#20387) -successor(#20366,#20371) -successor(#20342,#20345) -successor(#20348,#20346) -successor(#20346,#20343) -successor(#20345,#20348) -successor(#20343,#20366) -successor(#20331,#20332) -successor(#20339,#20341) -successor(#20341,#20342) -successor(#20332,#20339) -successor(#20323,#20324) -successor(#20324,#20331) -successor(#20312,#20313) -successor(#20320,#20321) -successor(#20322,#20323) -successor(#20321,#20322) -successor(#20313,#20320) -successor(#20302,#20312) -successor(#20291,#20302) -successor(#20280,#20291) -successor(#20272,#20280) -successor(#20310,#20272) -successor(#20299,#20310) -successor(#20288,#20299) -successor(#20385,#20288) -numlines(#10000,13,10,2) +tokeninfo(#20382,4,#20001,164,"""module""") +#20383=@"loc,{#10000},20,20,20,27" +locations_default(#20383,#10000,20,20,20,27) +hasLocation(#20382,#20383) +#20384=* +tokeninfo(#20384,7,#20001,165,"assert") +#20385=@"loc,{#10000},20,29,20,34" +locations_default(#20385,#10000,20,29,20,34) +hasLocation(#20384,#20385) +#20386=* +tokeninfo(#20386,8,#20001,166,"{") +#20387=@"loc,{#10000},20,36,20,36" +locations_default(#20387,#10000,20,36,20,36) +hasLocation(#20386,#20387) +#20388=* +tokeninfo(#20388,7,#20001,167,"type") +#20389=@"loc,{#10000},20,38,20,41" +locations_default(#20389,#10000,20,38,20,41) +hasLocation(#20388,#20389) +#20390=* +tokeninfo(#20390,8,#20001,168,":") +#20391=@"loc,{#10000},20,42,20,42" +locations_default(#20391,#10000,20,42,20,42) +hasLocation(#20390,#20391) +#20392=* +tokeninfo(#20392,4,#20001,169,"""json""") +#20393=@"loc,{#10000},20,44,20,49" +locations_default(#20393,#10000,20,44,20,49) +hasLocation(#20392,#20393) +#20394=* +tokeninfo(#20394,8,#20001,170,"}") +#20395=@"loc,{#10000},20,51,20,51" +locations_default(#20395,#10000,20,51,20,51) +hasLocation(#20394,#20395) +#20396=* +tokeninfo(#20396,8,#20001,171,";") +#20397=@"loc,{#10000},20,52,20,52" +locations_default(#20397,#10000,20,52,20,52) +hasLocation(#20396,#20397) +#20398=* +tokeninfo(#20398,7,#20001,172,"export") +#20399=@"loc,{#10000},21,1,21,6" +locations_default(#20399,#10000,21,1,21,6) +hasLocation(#20398,#20399) +#20400=* +tokeninfo(#20400,8,#20001,173,"*") +#20401=@"loc,{#10000},21,8,21,8" +locations_default(#20401,#10000,21,8,21,8) +hasLocation(#20400,#20401) +#20402=* +tokeninfo(#20402,7,#20001,174,"from") +#20403=@"loc,{#10000},21,10,21,13" +locations_default(#20403,#10000,21,10,21,13) +hasLocation(#20402,#20403) +#20404=* +tokeninfo(#20404,4,#20001,175,"""module""") +#20405=@"loc,{#10000},21,15,21,22" +locations_default(#20405,#10000,21,15,21,22) +hasLocation(#20404,#20405) +#20406=* +tokeninfo(#20406,7,#20001,176,"assert") +#20407=@"loc,{#10000},21,24,21,29" +locations_default(#20407,#10000,21,24,21,29) +hasLocation(#20406,#20407) +#20408=* +tokeninfo(#20408,8,#20001,177,"{") +#20409=@"loc,{#10000},21,31,21,31" +locations_default(#20409,#10000,21,31,21,31) +hasLocation(#20408,#20409) +#20410=* +tokeninfo(#20410,7,#20001,178,"type") +#20411=@"loc,{#10000},21,33,21,36" +locations_default(#20411,#10000,21,33,21,36) +hasLocation(#20410,#20411) +#20412=* +tokeninfo(#20412,8,#20001,179,":") +#20413=@"loc,{#10000},21,37,21,37" +locations_default(#20413,#10000,21,37,21,37) +hasLocation(#20412,#20413) +#20414=* +tokeninfo(#20414,4,#20001,180,"""json""") +#20415=@"loc,{#10000},21,39,21,44" +locations_default(#20415,#10000,21,39,21,44) +hasLocation(#20414,#20415) +#20416=* +tokeninfo(#20416,8,#20001,181,"}") +#20417=@"loc,{#10000},21,46,21,46" +locations_default(#20417,#10000,21,46,21,46) +hasLocation(#20416,#20417) +#20418=* +tokeninfo(#20418,8,#20001,182,";") +#20419=@"loc,{#10000},21,47,21,47" +locations_default(#20419,#10000,21,47,21,47) +hasLocation(#20418,#20419) +#20420=* +tokeninfo(#20420,7,#20001,183,"export") +#20421=@"loc,{#10000},22,1,22,6" +locations_default(#20421,#10000,22,1,22,6) +hasLocation(#20420,#20421) +#20422=* +tokeninfo(#20422,8,#20001,184,"*") +#20423=@"loc,{#10000},22,8,22,8" +locations_default(#20423,#10000,22,8,22,8) +hasLocation(#20422,#20423) +#20424=* +tokeninfo(#20424,7,#20001,185,"as") +#20425=@"loc,{#10000},22,10,22,11" +locations_default(#20425,#10000,22,10,22,11) +hasLocation(#20424,#20425) +#20426=* +tokeninfo(#20426,6,#20001,186,"v5") +#20427=@"loc,{#10000},22,13,22,14" +locations_default(#20427,#10000,22,13,22,14) +hasLocation(#20426,#20427) +#20428=* +tokeninfo(#20428,7,#20001,187,"from") +#20429=@"loc,{#10000},22,16,22,19" +locations_default(#20429,#10000,22,16,22,19) +hasLocation(#20428,#20429) +#20430=* +tokeninfo(#20430,4,#20001,188,"""module""") +#20431=@"loc,{#10000},22,21,22,28" +locations_default(#20431,#10000,22,21,22,28) +hasLocation(#20430,#20431) +#20432=* +tokeninfo(#20432,7,#20001,189,"assert") +#20433=@"loc,{#10000},22,30,22,35" +locations_default(#20433,#10000,22,30,22,35) +hasLocation(#20432,#20433) +#20434=* +tokeninfo(#20434,8,#20001,190,"{") +#20435=@"loc,{#10000},22,37,22,37" +locations_default(#20435,#10000,22,37,22,37) +hasLocation(#20434,#20435) +#20436=* +tokeninfo(#20436,7,#20001,191,"type") +#20437=@"loc,{#10000},22,39,22,42" +locations_default(#20437,#10000,22,39,22,42) +hasLocation(#20436,#20437) +#20438=* +tokeninfo(#20438,8,#20001,192,":") +#20439=@"loc,{#10000},22,43,22,43" +locations_default(#20439,#10000,22,43,22,43) +hasLocation(#20438,#20439) +#20440=* +tokeninfo(#20440,4,#20001,193,"""json""") +#20441=@"loc,{#10000},22,45,22,50" +locations_default(#20441,#10000,22,45,22,50) +hasLocation(#20440,#20441) +#20442=* +tokeninfo(#20442,8,#20001,194,"}") +#20443=@"loc,{#10000},22,52,22,52" +locations_default(#20443,#10000,22,52,22,52) +hasLocation(#20442,#20443) +#20444=* +tokeninfo(#20444,8,#20001,195,";") +#20445=@"loc,{#10000},22,53,22,53" +locations_default(#20445,#10000,22,53,22,53) +hasLocation(#20444,#20445) +#20446=* +tokeninfo(#20446,7,#20001,196,"const") +#20447=@"loc,{#10000},24,1,24,5" +locations_default(#20447,#10000,24,1,24,5) +hasLocation(#20446,#20447) +#20448=* +tokeninfo(#20448,6,#20001,197,"v6") +#20449=@"loc,{#10000},24,7,24,8" +locations_default(#20449,#10000,24,7,24,8) +hasLocation(#20448,#20449) +#20450=* +tokeninfo(#20450,8,#20001,198,"=") +#20451=@"loc,{#10000},24,10,24,10" +locations_default(#20451,#10000,24,10,24,10) +hasLocation(#20450,#20451) +#20452=* +tokeninfo(#20452,7,#20001,199,"import") +#20453=@"loc,{#10000},24,12,24,17" +locations_default(#20453,#10000,24,12,24,17) +hasLocation(#20452,#20453) +#20454=* +tokeninfo(#20454,8,#20001,200,"(") +#20455=@"loc,{#10000},24,18,24,18" +locations_default(#20455,#10000,24,18,24,18) +hasLocation(#20454,#20455) +#20456=* +tokeninfo(#20456,4,#20001,201,"""module""") +#20457=@"loc,{#10000},24,19,24,26" +locations_default(#20457,#10000,24,19,24,26) +hasLocation(#20456,#20457) +#20458=* +tokeninfo(#20458,8,#20001,202,",") +#20459=@"loc,{#10000},24,27,24,27" +locations_default(#20459,#10000,24,27,24,27) +hasLocation(#20458,#20459) +#20460=* +tokeninfo(#20460,8,#20001,203,"{") +#20461=@"loc,{#10000},24,29,24,29" +locations_default(#20461,#10000,24,29,24,29) +hasLocation(#20460,#20461) +#20462=* +tokeninfo(#20462,7,#20001,204,"assert") +#20463=@"loc,{#10000},24,31,24,36" +locations_default(#20463,#10000,24,31,24,36) +hasLocation(#20462,#20463) +#20464=* +tokeninfo(#20464,8,#20001,205,":") +#20465=@"loc,{#10000},24,37,24,37" +locations_default(#20465,#10000,24,37,24,37) +hasLocation(#20464,#20465) +#20466=* +tokeninfo(#20466,8,#20001,206,"{") +#20467=@"loc,{#10000},24,39,24,39" +locations_default(#20467,#10000,24,39,24,39) +hasLocation(#20466,#20467) +#20468=* +tokeninfo(#20468,7,#20001,207,"type") +#20469=@"loc,{#10000},24,41,24,44" +locations_default(#20469,#10000,24,41,24,44) +hasLocation(#20468,#20469) +#20470=* +tokeninfo(#20470,8,#20001,208,":") +#20471=@"loc,{#10000},24,45,24,45" +locations_default(#20471,#10000,24,45,24,45) +hasLocation(#20470,#20471) +#20472=* +tokeninfo(#20472,4,#20001,209,"""json""") +#20473=@"loc,{#10000},24,47,24,52" +locations_default(#20473,#10000,24,47,24,52) +hasLocation(#20472,#20473) +#20474=* +tokeninfo(#20474,8,#20001,210,"}") +#20475=@"loc,{#10000},24,54,24,54" +locations_default(#20475,#10000,24,54,24,54) +hasLocation(#20474,#20475) +#20476=* +tokeninfo(#20476,8,#20001,211,"}") +#20477=@"loc,{#10000},24,56,24,56" +locations_default(#20477,#10000,24,56,24,56) +hasLocation(#20476,#20477) +#20478=* +tokeninfo(#20478,8,#20001,212,")") +#20479=@"loc,{#10000},24,57,24,57" +locations_default(#20479,#10000,24,57,24,57) +hasLocation(#20478,#20479) +#20480=* +tokeninfo(#20480,8,#20001,213,";") +#20481=@"loc,{#10000},24,58,24,58" +locations_default(#20481,#10000,24,58,24,58) +hasLocation(#20480,#20481) +#20482=* +tokeninfo(#20482,0,#20001,214,"") +#20483=@"loc,{#10000},25,1,25,0" +locations_default(#20483,#10000,25,1,25,0) +hasLocation(#20482,#20483) +toplevels(#20001,0) +#20484=@"loc,{#10000},1,1,25,0" +locations_default(#20484,#10000,1,1,25,0) +hasLocation(#20001,#20484) +#20485=@"module;{#10000},1,1" +scopes(#20485,3) +scopenodes(#20001,#20485) +scopenesting(#20485,#20000) +is_module(#20001) +is_es2015_module(#20001) +#20486=@"var;{v1};{#20485}" +variables(#20486,"v1",#20485) +#20487=@"var;{v2};{#20485}" +variables(#20487,"v2",#20485) +#20488=@"var;{v3};{#20485}" +variables(#20488,"v3",#20485) +#20489=@"local_type_name;{v1};{#20485}" +local_type_names(#20489,"v1",#20485) +#20490=@"local_type_name;{v2};{#20485}" +local_type_names(#20490,"v2",#20485) +#20491=@"local_type_name;{v3};{#20485}" +local_type_names(#20491,"v3",#20485) +#20492=@"local_namespace_name;{v1};{#20485}" +local_namespace_names(#20492,"v1",#20485) +#20493=@"local_namespace_name;{v2};{#20485}" +local_namespace_names(#20493,"v2",#20485) +#20494=@"local_namespace_name;{v3};{#20485}" +local_namespace_names(#20494,"v3",#20485) +variables(#20486,"v1",#20485) +variables(#20487,"v2",#20485) +variables(#20488,"v3",#20485) +#20495=@"var;{v6};{#20485}" +variables(#20495,"v6",#20485) +local_type_names(#20489,"v1",#20485) +local_type_names(#20490,"v2",#20485) +local_type_names(#20491,"v3",#20485) +local_namespace_names(#20492,"v1",#20485) +local_namespace_names(#20493,"v2",#20485) +local_namespace_names(#20494,"v3",#20485) +#20496=* +stmts(#20496,27,#20001,0,"import ... son"" };") +hasLocation(#20496,#20007) +stmt_containers(#20496,#20001) +#20497=* +exprs(#20497,4,#20496,-1,"""module""") +hasLocation(#20497,#20057) +enclosing_stmt(#20497,#20496) +expr_containers(#20497,#20001) +literals("module","""module""",#20497) +#20498=* +regexpterm(#20498,14,#20497,0,"module") +#20499=@"loc,{#10000},1,9,1,14" +locations_default(#20499,#10000,1,9,1,14) +hasLocation(#20498,#20499) +regexp_const_value(#20498,"module") +#20500=* +exprs(#20500,8,#20496,-10,"{ type: ""json"" }") +#20501=@"loc,{#10000},1,22,1,37" +locations_default(#20501,#10000,1,22,1,37) +hasLocation(#20500,#20501) +enclosing_stmt(#20500,#20496) +expr_containers(#20500,#20001) +#20502=* +properties(#20502,#20500,0,0,"type: ""json""") +#20503=@"loc,{#10000},1,24,1,35" +locations_default(#20503,#10000,1,24,1,35) +hasLocation(#20502,#20503) +#20504=* +stmts(#20504,27,#20001,1,"import ... son"" };") +hasLocation(#20504,#20009) +stmt_containers(#20504,#20001) +#20505=* +exprs(#20505,4,#20504,-1,"""module""") +hasLocation(#20505,#20083) +enclosing_stmt(#20505,#20504) +expr_containers(#20505,#20001) +literals("module","""module""",#20505) +#20506=* +regexpterm(#20506,14,#20505,0,"module") +#20507=@"loc,{#10000},2,22,2,27" +locations_default(#20507,#10000,2,22,2,27) +hasLocation(#20506,#20507) +regexp_const_value(#20506,"module") +#20508=* +exprs(#20508,8,#20504,-10,"{ type: ""json"" }") +#20509=@"loc,{#10000},2,35,2,50" +locations_default(#20509,#10000,2,35,2,50) +hasLocation(#20508,#20509) +enclosing_stmt(#20508,#20504) +expr_containers(#20508,#20001) +#20510=* +properties(#20510,#20508,0,0,"type: ""json""") +#20511=@"loc,{#10000},2,37,2,48" +locations_default(#20511,#10000,2,37,2,48) +hasLocation(#20510,#20511) +#20512=* +exprs(#20512,85,#20504,0,"* as v1") +#20513=@"loc,{#10000},2,8,2,14" +locations_default(#20513,#10000,2,8,2,14) +hasLocation(#20512,#20513) +enclosing_stmt(#20512,#20504) +expr_containers(#20512,#20001) +#20514=* +exprs(#20514,78,#20512,1,"v1") +hasLocation(#20514,#20079) +enclosing_stmt(#20514,#20504) +expr_containers(#20514,#20001) +literals("v1","v1",#20514) +decl(#20514,#20486) +typedecl(#20514,#20489) +namespacedecl(#20514,#20492) +#20515=* +stmts(#20515,27,#20001,2,"import ... son"" };") +hasLocation(#20515,#20011) +stmt_containers(#20515,#20001) +#20516=* +exprs(#20516,4,#20515,-1,"""module""") +hasLocation(#20516,#20109) +enclosing_stmt(#20516,#20515) +expr_containers(#20516,#20001) +literals("module","""module""",#20516) +#20517=* +regexpterm(#20517,14,#20516,0,"module") +#20518=@"loc,{#10000},3,21,3,26" +locations_default(#20518,#10000,3,21,3,26) +hasLocation(#20517,#20518) +regexp_const_value(#20517,"module") +#20519=* +exprs(#20519,8,#20515,-10,"{ type: ""json"" }") +#20520=@"loc,{#10000},3,34,3,49" +locations_default(#20520,#10000,3,34,3,49) +hasLocation(#20519,#20520) +enclosing_stmt(#20519,#20515) +expr_containers(#20519,#20001) +#20521=* +properties(#20521,#20519,0,0,"type: ""json""") +#20522=@"loc,{#10000},3,36,3,47" +locations_default(#20522,#10000,3,36,3,47) +hasLocation(#20521,#20522) +#20523=* +exprs(#20523,83,#20515,0,"v2") +hasLocation(#20523,#20103) +enclosing_stmt(#20523,#20515) +expr_containers(#20523,#20001) +#20524=* +exprs(#20524,0,#20523,0,"v2") +hasLocation(#20524,#20103) +enclosing_stmt(#20524,#20515) +expr_containers(#20524,#20001) +literals("v2","v2",#20524) +#20525=* +exprs(#20525,78,#20523,1,"v2") +hasLocation(#20525,#20103) +enclosing_stmt(#20525,#20515) +expr_containers(#20525,#20001) +literals("v2","v2",#20525) +decl(#20525,#20487) +typedecl(#20525,#20490) +namespacedecl(#20525,#20493) +#20526=* +stmts(#20526,27,#20001,3,"import ... son"" };") +hasLocation(#20526,#20013) +stmt_containers(#20526,#20001) +#20527=* +exprs(#20527,4,#20526,-1,"""module""") +hasLocation(#20527,#20131) +enclosing_stmt(#20527,#20526) +expr_containers(#20527,#20001) +literals("module","""module""",#20527) +#20528=* +regexpterm(#20528,14,#20527,0,"module") +#20529=@"loc,{#10000},4,17,4,22" +locations_default(#20529,#10000,4,17,4,22) +hasLocation(#20528,#20529) +regexp_const_value(#20528,"module") +#20530=* +exprs(#20530,8,#20526,-10,"{ type: ""json"" }") +#20531=@"loc,{#10000},4,30,4,45" +locations_default(#20531,#10000,4,30,4,45) +hasLocation(#20530,#20531) +enclosing_stmt(#20530,#20526) +expr_containers(#20530,#20001) +#20532=* +properties(#20532,#20530,0,0,"type: ""json""") +#20533=@"loc,{#10000},4,32,4,43" +locations_default(#20533,#10000,4,32,4,43) +hasLocation(#20532,#20533) +#20534=* +exprs(#20534,84,#20526,0,"v3") +hasLocation(#20534,#20127) +enclosing_stmt(#20534,#20526) +expr_containers(#20534,#20001) +#20535=* +exprs(#20535,78,#20534,1,"v3") +hasLocation(#20535,#20127) +enclosing_stmt(#20535,#20526) +expr_containers(#20535,#20001) +literals("v3","v3",#20535) +decl(#20535,#20488) +typedecl(#20535,#20491) +namespacedecl(#20535,#20494) +#20536=* +stmts(#20536,30,#20001,4,"export ... son"" };") +hasLocation(#20536,#20017) +stmt_containers(#20536,#20001) +#20537=* +exprs(#20537,4,#20536,-2,"""module""") +hasLocation(#20537,#20157) +enclosing_stmt(#20537,#20536) +expr_containers(#20537,#20001) +literals("module","""module""",#20537) +#20538=* +regexpterm(#20538,14,#20537,0,"module") +#20539=@"loc,{#10000},6,21,6,26" +locations_default(#20539,#10000,6,21,6,26) +hasLocation(#20538,#20539) +regexp_const_value(#20538,"module") +#20540=* +exprs(#20540,8,#20536,-10,"{ type: ""json"" }") +#20541=@"loc,{#10000},6,34,6,49" +locations_default(#20541,#10000,6,34,6,49) +hasLocation(#20540,#20541) +enclosing_stmt(#20540,#20536) +expr_containers(#20540,#20001) +#20542=* +properties(#20542,#20540,0,0,"type: ""json""") +#20543=@"loc,{#10000},6,36,6,47" +locations_default(#20543,#10000,6,36,6,47) +hasLocation(#20542,#20543) +#20544=* +exprs(#20544,86,#20536,0,"v4") +hasLocation(#20544,#20151) +enclosing_stmt(#20544,#20536) +expr_containers(#20544,#20001) +#20545=* +exprs(#20545,0,#20544,0,"v4") +hasLocation(#20545,#20151) +enclosing_stmt(#20545,#20536) +expr_containers(#20545,#20001) +literals("v4","v4",#20545) +#20546=* +exprs(#20546,0,#20544,1,"v4") +hasLocation(#20546,#20151) +enclosing_stmt(#20546,#20536) +expr_containers(#20546,#20001) +literals("v4","v4",#20546) +#20547=* +stmts(#20547,28,#20001,5,"export ... son"" };") +hasLocation(#20547,#20019) +stmt_containers(#20547,#20001) +#20548=* +exprs(#20548,4,#20547,0,"""module""") +hasLocation(#20548,#20179) +enclosing_stmt(#20548,#20547) +expr_containers(#20548,#20001) +literals("module","""module""",#20548) +#20549=* +regexpterm(#20549,14,#20548,0,"module") +#20550=@"loc,{#10000},7,16,7,21" +locations_default(#20550,#10000,7,16,7,21) +hasLocation(#20549,#20550) +regexp_const_value(#20549,"module") +#20551=* +exprs(#20551,8,#20547,-10,"{ type: ""json"" }") +#20552=@"loc,{#10000},7,29,7,44" +locations_default(#20552,#10000,7,29,7,44) +hasLocation(#20551,#20552) +enclosing_stmt(#20551,#20547) +expr_containers(#20551,#20001) +#20553=* +properties(#20553,#20551,0,0,"type: ""json""") +#20554=@"loc,{#10000},7,31,7,42" +locations_default(#20554,#10000,7,31,7,42) +hasLocation(#20553,#20554) +#20555=* +stmts(#20555,30,#20001,6,"export ... son"" };") +hasLocation(#20555,#20021) +stmt_containers(#20555,#20001) +#20556=* +exprs(#20556,4,#20555,-2,"""module""") +hasLocation(#20556,#20205) +enclosing_stmt(#20556,#20555) +expr_containers(#20556,#20001) +literals("module","""module""",#20556) +#20557=* +regexpterm(#20557,14,#20556,0,"module") +#20558=@"loc,{#10000},8,22,8,27" +locations_default(#20558,#10000,8,22,8,27) +hasLocation(#20557,#20558) +regexp_const_value(#20557,"module") +#20559=* +exprs(#20559,8,#20555,-10,"{ type: ""json"" }") +#20560=@"loc,{#10000},8,35,8,50" +locations_default(#20560,#10000,8,35,8,50) +hasLocation(#20559,#20560) +enclosing_stmt(#20559,#20555) +expr_containers(#20559,#20001) +#20561=* +properties(#20561,#20559,0,0,"type: ""json""") +#20562=@"loc,{#10000},8,37,8,48" +locations_default(#20562,#10000,8,37,8,48) +hasLocation(#20561,#20562) +#20563=* +exprs(#20563,96,#20555,0,"* as v5") +#20564=@"loc,{#10000},8,8,8,14" +locations_default(#20564,#10000,8,8,8,14) +hasLocation(#20563,#20564) +enclosing_stmt(#20563,#20555) +expr_containers(#20563,#20001) +#20565=* +exprs(#20565,0,#20563,1,"v5") +hasLocation(#20565,#20201) +enclosing_stmt(#20565,#20555) +expr_containers(#20565,#20001) +literals("v5","v5",#20565) +#20566=* +stmts(#20566,22,#20001,7,"const v ... "" } });") +hasLocation(#20566,#20025) +stmt_containers(#20566,#20001) +#20567=* +exprs(#20567,64,#20566,0,"v6 = im ... n"" } })") +#20568=@"loc,{#10000},10,7,10,57" +locations_default(#20568,#10000,10,7,10,57) +hasLocation(#20567,#20568) +enclosing_stmt(#20567,#20566) +expr_containers(#20567,#20001) +#20569=* +exprs(#20569,78,#20567,0,"v6") +hasLocation(#20569,#20223) +enclosing_stmt(#20569,#20566) +expr_containers(#20569,#20001) +literals("v6","v6",#20569) +decl(#20569,#20495) +#20570=* +exprs(#20570,99,#20567,1,"import( ... n"" } })") +#20571=@"loc,{#10000},10,12,10,57" +locations_default(#20571,#10000,10,12,10,57) +hasLocation(#20570,#20571) +enclosing_stmt(#20570,#20566) +expr_containers(#20570,#20001) +#20572=* +exprs(#20572,4,#20570,0,"""module""") +hasLocation(#20572,#20231) +enclosing_stmt(#20572,#20566) +expr_containers(#20572,#20001) +literals("module","""module""",#20572) +#20573=* +regexpterm(#20573,14,#20572,0,"module") +#20574=@"loc,{#10000},10,20,10,25" +locations_default(#20574,#10000,10,20,10,25) +hasLocation(#20573,#20574) +regexp_const_value(#20573,"module") +#20575=* +exprs(#20575,8,#20570,1,"{ ""with ... on"" } }") +#20576=@"loc,{#10000},10,29,10,56" +locations_default(#20576,#10000,10,29,10,56) +hasLocation(#20575,#20576) +enclosing_stmt(#20575,#20566) +expr_containers(#20575,#20001) +#20577=* +properties(#20577,#20575,0,0,"""with"": ... json"" }") +#20578=@"loc,{#10000},10,31,10,54" +locations_default(#20578,#10000,10,31,10,54) +hasLocation(#20577,#20578) +#20579=* +exprs(#20579,4,#20577,0,"""with""") +hasLocation(#20579,#20237) +enclosing_stmt(#20579,#20566) +expr_containers(#20579,#20001) +literals("with","""with""",#20579) +#20580=* +regexpterm(#20580,14,#20579,0,"with") +#20581=@"loc,{#10000},10,32,10,35" +locations_default(#20581,#10000,10,32,10,35) +hasLocation(#20580,#20581) +regexp_const_value(#20580,"with") +#20582=* +exprs(#20582,8,#20577,1,"{ type: ""json"" }") +#20583=@"loc,{#10000},10,39,10,54" +locations_default(#20583,#10000,10,39,10,54) +hasLocation(#20582,#20583) +enclosing_stmt(#20582,#20566) +expr_containers(#20582,#20001) +#20584=* +properties(#20584,#20582,0,0,"type: ""json""") +#20585=@"loc,{#10000},10,41,10,52" +locations_default(#20585,#10000,10,41,10,52) +hasLocation(#20584,#20585) +#20586=* +exprs(#20586,0,#20584,0,"type") +hasLocation(#20586,#20243) +enclosing_stmt(#20586,#20566) +expr_containers(#20586,#20001) +literals("type","type",#20586) +#20587=* +exprs(#20587,4,#20584,1,"""json""") +hasLocation(#20587,#20247) +enclosing_stmt(#20587,#20566) +expr_containers(#20587,#20001) +literals("json","""json""",#20587) +#20588=* +regexpterm(#20588,14,#20587,0,"json") +#20589=@"loc,{#10000},10,48,10,51" +locations_default(#20589,#10000,10,48,10,51) +hasLocation(#20588,#20589) +regexp_const_value(#20588,"json") +#20590=* +stmts(#20590,27,#20001,8,"import ""module"";") +#20591=@"loc,{#10000},12,1,12,16" +locations_default(#20591,#10000,12,1,12,16) +hasLocation(#20590,#20591) +stmt_containers(#20590,#20001) +#20592=* +exprs(#20592,4,#20590,-1,"""module""") +hasLocation(#20592,#20259) +enclosing_stmt(#20592,#20590) +expr_containers(#20592,#20001) +literals("module","""module""",#20592) +#20593=* +regexpterm(#20593,14,#20592,0,"module") +#20594=@"loc,{#10000},12,9,12,14" +locations_default(#20594,#10000,12,9,12,14) +hasLocation(#20593,#20594) +regexp_const_value(#20593,"module") +#20595=* +stmts(#20595,2,#20001,9,"assert( ... on"" });") +#20596=@"loc,{#10000},13,1,13,25" +locations_default(#20596,#10000,13,1,13,25) +hasLocation(#20595,#20596) +stmt_containers(#20595,#20001) +#20597=* +exprs(#20597,13,#20595,0,"assert( ... son"" })") +#20598=@"loc,{#10000},13,1,13,24" +locations_default(#20598,#10000,13,1,13,24) +hasLocation(#20597,#20598) +enclosing_stmt(#20597,#20595) +expr_containers(#20597,#20001) +#20599=* +exprs(#20599,79,#20597,-1,"assert") +hasLocation(#20599,#20263) +enclosing_stmt(#20599,#20595) +expr_containers(#20599,#20001) +literals("assert","assert",#20599) +#20600=@"var;{assert};{#20000}" +variables(#20600,"assert",#20000) +bind(#20599,#20600) +#20601=* +exprs(#20601,8,#20597,0,"{ type: ""json"" }") +#20602=@"loc,{#10000},13,8,13,23" +locations_default(#20602,#10000,13,8,13,23) +hasLocation(#20601,#20602) +enclosing_stmt(#20601,#20595) +expr_containers(#20601,#20001) +#20603=* +properties(#20603,#20601,0,0,"type: ""json""") +#20604=@"loc,{#10000},13,10,13,21" +locations_default(#20604,#10000,13,10,13,21) +hasLocation(#20603,#20604) +#20605=* +exprs(#20605,0,#20603,0,"type") +hasLocation(#20605,#20269) +enclosing_stmt(#20605,#20595) +expr_containers(#20605,#20001) +literals("type","type",#20605) +#20606=* +exprs(#20606,4,#20603,1,"""json""") +hasLocation(#20606,#20273) +enclosing_stmt(#20606,#20595) +expr_containers(#20606,#20001) +literals("json","""json""",#20606) +#20607=* +regexpterm(#20607,14,#20606,0,"json") +#20608=@"loc,{#10000},13,17,13,20" +locations_default(#20608,#10000,13,17,13,20) +hasLocation(#20607,#20608) +regexp_const_value(#20607,"json") +#20609=* +stmts(#20609,27,#20001,10,"import ... son"" };") +hasLocation(#20609,#20035) +stmt_containers(#20609,#20001) +#20610=* +exprs(#20610,4,#20609,-1,"""module""") +hasLocation(#20610,#20283) +enclosing_stmt(#20610,#20609) +expr_containers(#20610,#20001) +literals("module","""module""",#20610) +#20611=* +regexpterm(#20611,14,#20610,0,"module") +#20612=@"loc,{#10000},15,9,15,14" +locations_default(#20612,#10000,15,9,15,14) +hasLocation(#20611,#20612) +regexp_const_value(#20611,"module") +#20613=* +exprs(#20613,8,#20609,-10,"{ type: ""json"" }") +#20614=@"loc,{#10000},15,24,15,39" +locations_default(#20614,#10000,15,24,15,39) +hasLocation(#20613,#20614) +enclosing_stmt(#20613,#20609) +expr_containers(#20613,#20001) +#20615=* +properties(#20615,#20613,0,0,"type: ""json""") +#20616=@"loc,{#10000},15,26,15,37" +locations_default(#20616,#10000,15,26,15,37) +hasLocation(#20615,#20616) +#20617=* +stmts(#20617,27,#20001,11,"import ... son"" };") +hasLocation(#20617,#20037) +stmt_containers(#20617,#20001) +#20618=* +exprs(#20618,4,#20617,-1,"""module""") +hasLocation(#20618,#20309) +enclosing_stmt(#20618,#20617) +expr_containers(#20618,#20001) +literals("module","""module""",#20618) +#20619=* +regexpterm(#20619,14,#20618,0,"module") +#20620=@"loc,{#10000},16,22,16,27" +locations_default(#20620,#10000,16,22,16,27) +hasLocation(#20619,#20620) +regexp_const_value(#20619,"module") +#20621=* +exprs(#20621,8,#20617,-10,"{ type: ""json"" }") +#20622=@"loc,{#10000},16,37,16,52" +locations_default(#20622,#10000,16,37,16,52) +hasLocation(#20621,#20622) +enclosing_stmt(#20621,#20617) +expr_containers(#20621,#20001) +#20623=* +properties(#20623,#20621,0,0,"type: ""json""") +#20624=@"loc,{#10000},16,39,16,50" +locations_default(#20624,#10000,16,39,16,50) +hasLocation(#20623,#20624) +#20625=* +exprs(#20625,85,#20617,0,"* as v1") +#20626=@"loc,{#10000},16,8,16,14" +locations_default(#20626,#10000,16,8,16,14) +hasLocation(#20625,#20626) +enclosing_stmt(#20625,#20617) +expr_containers(#20625,#20001) +#20627=* +exprs(#20627,78,#20625,1,"v1") +hasLocation(#20627,#20305) +enclosing_stmt(#20627,#20617) +expr_containers(#20627,#20001) +literals("v1","v1",#20627) +decl(#20627,#20486) +typedecl(#20627,#20489) +namespacedecl(#20627,#20492) +#20628=* +stmts(#20628,27,#20001,12,"import ... son"" };") +hasLocation(#20628,#20039) +stmt_containers(#20628,#20001) +#20629=* +exprs(#20629,4,#20628,-1,"""module""") +hasLocation(#20629,#20335) +enclosing_stmt(#20629,#20628) +expr_containers(#20629,#20001) +literals("module","""module""",#20629) +#20630=* +regexpterm(#20630,14,#20629,0,"module") +#20631=@"loc,{#10000},17,21,17,26" +locations_default(#20631,#10000,17,21,17,26) +hasLocation(#20630,#20631) +regexp_const_value(#20630,"module") +#20632=* +exprs(#20632,8,#20628,-10,"{ type: ""json"" }") +#20633=@"loc,{#10000},17,36,17,51" +locations_default(#20633,#10000,17,36,17,51) +hasLocation(#20632,#20633) +enclosing_stmt(#20632,#20628) +expr_containers(#20632,#20001) +#20634=* +properties(#20634,#20632,0,0,"type: ""json""") +#20635=@"loc,{#10000},17,38,17,49" +locations_default(#20635,#10000,17,38,17,49) +hasLocation(#20634,#20635) +#20636=* +exprs(#20636,83,#20628,0,"v2") +hasLocation(#20636,#20329) +enclosing_stmt(#20636,#20628) +expr_containers(#20636,#20001) +#20637=* +exprs(#20637,0,#20636,0,"v2") +hasLocation(#20637,#20329) +enclosing_stmt(#20637,#20628) +expr_containers(#20637,#20001) +literals("v2","v2",#20637) +#20638=* +exprs(#20638,78,#20636,1,"v2") +hasLocation(#20638,#20329) +enclosing_stmt(#20638,#20628) +expr_containers(#20638,#20001) +literals("v2","v2",#20638) +decl(#20638,#20487) +typedecl(#20638,#20490) +namespacedecl(#20638,#20493) +#20639=* +stmts(#20639,27,#20001,13,"import ... son"" };") +hasLocation(#20639,#20041) +stmt_containers(#20639,#20001) +#20640=* +exprs(#20640,4,#20639,-1,"""module""") +hasLocation(#20640,#20357) +enclosing_stmt(#20640,#20639) +expr_containers(#20640,#20001) +literals("module","""module""",#20640) +#20641=* +regexpterm(#20641,14,#20640,0,"module") +#20642=@"loc,{#10000},18,17,18,22" +locations_default(#20642,#10000,18,17,18,22) +hasLocation(#20641,#20642) +regexp_const_value(#20641,"module") +#20643=* +exprs(#20643,8,#20639,-10,"{ type: ""json"" }") +#20644=@"loc,{#10000},18,32,18,47" +locations_default(#20644,#10000,18,32,18,47) +hasLocation(#20643,#20644) +enclosing_stmt(#20643,#20639) +expr_containers(#20643,#20001) +#20645=* +properties(#20645,#20643,0,0,"type: ""json""") +#20646=@"loc,{#10000},18,34,18,45" +locations_default(#20646,#10000,18,34,18,45) +hasLocation(#20645,#20646) +#20647=* +exprs(#20647,84,#20639,0,"v3") +hasLocation(#20647,#20353) +enclosing_stmt(#20647,#20639) +expr_containers(#20647,#20001) +#20648=* +exprs(#20648,78,#20647,1,"v3") +hasLocation(#20648,#20353) +enclosing_stmt(#20648,#20639) +expr_containers(#20648,#20001) +literals("v3","v3",#20648) +decl(#20648,#20488) +typedecl(#20648,#20491) +namespacedecl(#20648,#20494) +#20649=* +stmts(#20649,30,#20001,14,"export ... son"" };") +hasLocation(#20649,#20045) +stmt_containers(#20649,#20001) +#20650=* +exprs(#20650,4,#20649,-2,"""module""") +hasLocation(#20650,#20383) +enclosing_stmt(#20650,#20649) +expr_containers(#20650,#20001) +literals("module","""module""",#20650) +#20651=* +regexpterm(#20651,14,#20650,0,"module") +#20652=@"loc,{#10000},20,21,20,26" +locations_default(#20652,#10000,20,21,20,26) +hasLocation(#20651,#20652) +regexp_const_value(#20651,"module") +#20653=* +exprs(#20653,8,#20649,-10,"{ type: ""json"" }") +#20654=@"loc,{#10000},20,36,20,51" +locations_default(#20654,#10000,20,36,20,51) +hasLocation(#20653,#20654) +enclosing_stmt(#20653,#20649) +expr_containers(#20653,#20001) +#20655=* +properties(#20655,#20653,0,0,"type: ""json""") +#20656=@"loc,{#10000},20,38,20,49" +locations_default(#20656,#10000,20,38,20,49) +hasLocation(#20655,#20656) +#20657=* +exprs(#20657,86,#20649,0,"v4") +hasLocation(#20657,#20377) +enclosing_stmt(#20657,#20649) +expr_containers(#20657,#20001) +#20658=* +exprs(#20658,0,#20657,0,"v4") +hasLocation(#20658,#20377) +enclosing_stmt(#20658,#20649) +expr_containers(#20658,#20001) +literals("v4","v4",#20658) +#20659=* +exprs(#20659,0,#20657,1,"v4") +hasLocation(#20659,#20377) +enclosing_stmt(#20659,#20649) +expr_containers(#20659,#20001) +literals("v4","v4",#20659) +#20660=* +stmts(#20660,28,#20001,15,"export ... son"" };") +hasLocation(#20660,#20047) +stmt_containers(#20660,#20001) +#20661=* +exprs(#20661,4,#20660,0,"""module""") +hasLocation(#20661,#20405) +enclosing_stmt(#20661,#20660) +expr_containers(#20661,#20001) +literals("module","""module""",#20661) +#20662=* +regexpterm(#20662,14,#20661,0,"module") +#20663=@"loc,{#10000},21,16,21,21" +locations_default(#20663,#10000,21,16,21,21) +hasLocation(#20662,#20663) +regexp_const_value(#20662,"module") +#20664=* +exprs(#20664,8,#20660,-10,"{ type: ""json"" }") +#20665=@"loc,{#10000},21,31,21,46" +locations_default(#20665,#10000,21,31,21,46) +hasLocation(#20664,#20665) +enclosing_stmt(#20664,#20660) +expr_containers(#20664,#20001) +#20666=* +properties(#20666,#20664,0,0,"type: ""json""") +#20667=@"loc,{#10000},21,33,21,44" +locations_default(#20667,#10000,21,33,21,44) +hasLocation(#20666,#20667) +#20668=* +stmts(#20668,30,#20001,16,"export ... son"" };") +hasLocation(#20668,#20049) +stmt_containers(#20668,#20001) +#20669=* +exprs(#20669,4,#20668,-2,"""module""") +hasLocation(#20669,#20431) +enclosing_stmt(#20669,#20668) +expr_containers(#20669,#20001) +literals("module","""module""",#20669) +#20670=* +regexpterm(#20670,14,#20669,0,"module") +#20671=@"loc,{#10000},22,22,22,27" +locations_default(#20671,#10000,22,22,22,27) +hasLocation(#20670,#20671) +regexp_const_value(#20670,"module") +#20672=* +exprs(#20672,8,#20668,-10,"{ type: ""json"" }") +#20673=@"loc,{#10000},22,37,22,52" +locations_default(#20673,#10000,22,37,22,52) +hasLocation(#20672,#20673) +enclosing_stmt(#20672,#20668) +expr_containers(#20672,#20001) +#20674=* +properties(#20674,#20672,0,0,"type: ""json""") +#20675=@"loc,{#10000},22,39,22,50" +locations_default(#20675,#10000,22,39,22,50) +hasLocation(#20674,#20675) +#20676=* +exprs(#20676,96,#20668,0,"* as v5") +#20677=@"loc,{#10000},22,8,22,14" +locations_default(#20677,#10000,22,8,22,14) +hasLocation(#20676,#20677) +enclosing_stmt(#20676,#20668) +expr_containers(#20676,#20001) +#20678=* +exprs(#20678,0,#20676,1,"v5") +hasLocation(#20678,#20427) +enclosing_stmt(#20678,#20668) +expr_containers(#20678,#20001) +literals("v5","v5",#20678) +#20679=* +stmts(#20679,22,#20001,17,"const v ... "" } });") +hasLocation(#20679,#20053) +stmt_containers(#20679,#20001) +#20680=* +exprs(#20680,64,#20679,0,"v6 = im ... n"" } })") +#20681=@"loc,{#10000},24,7,24,57" +locations_default(#20681,#10000,24,7,24,57) +hasLocation(#20680,#20681) +enclosing_stmt(#20680,#20679) +expr_containers(#20680,#20001) +#20682=* +exprs(#20682,78,#20680,0,"v6") +hasLocation(#20682,#20449) +enclosing_stmt(#20682,#20679) +expr_containers(#20682,#20001) +literals("v6","v6",#20682) +decl(#20682,#20495) +#20683=* +exprs(#20683,99,#20680,1,"import( ... n"" } })") +#20684=@"loc,{#10000},24,12,24,57" +locations_default(#20684,#10000,24,12,24,57) +hasLocation(#20683,#20684) +enclosing_stmt(#20683,#20679) +expr_containers(#20683,#20001) +#20685=* +exprs(#20685,4,#20683,0,"""module""") +hasLocation(#20685,#20457) +enclosing_stmt(#20685,#20679) +expr_containers(#20685,#20001) +literals("module","""module""",#20685) +#20686=* +regexpterm(#20686,14,#20685,0,"module") +#20687=@"loc,{#10000},24,20,24,25" +locations_default(#20687,#10000,24,20,24,25) +hasLocation(#20686,#20687) +regexp_const_value(#20686,"module") +#20688=* +exprs(#20688,8,#20683,1,"{ asser ... on"" } }") +#20689=@"loc,{#10000},24,29,24,56" +locations_default(#20689,#10000,24,29,24,56) +hasLocation(#20688,#20689) +enclosing_stmt(#20688,#20679) +expr_containers(#20688,#20001) +#20690=* +properties(#20690,#20688,0,0,"assert: ... json"" }") +#20691=@"loc,{#10000},24,31,24,54" +locations_default(#20691,#10000,24,31,24,54) +hasLocation(#20690,#20691) +#20692=* +exprs(#20692,0,#20690,0,"assert") +hasLocation(#20692,#20463) +enclosing_stmt(#20692,#20679) +expr_containers(#20692,#20001) +literals("assert","assert",#20692) +#20693=* +exprs(#20693,8,#20690,1,"{ type: ""json"" }") +#20694=@"loc,{#10000},24,39,24,54" +locations_default(#20694,#10000,24,39,24,54) +hasLocation(#20693,#20694) +enclosing_stmt(#20693,#20679) +expr_containers(#20693,#20001) +#20695=* +properties(#20695,#20693,0,0,"type: ""json""") +#20696=@"loc,{#10000},24,41,24,52" +locations_default(#20696,#10000,24,41,24,52) +hasLocation(#20695,#20696) +#20697=* +exprs(#20697,0,#20695,0,"type") +hasLocation(#20697,#20469) +enclosing_stmt(#20697,#20679) +expr_containers(#20697,#20001) +literals("type","type",#20697) +#20698=* +exprs(#20698,4,#20695,1,"""json""") +hasLocation(#20698,#20473) +enclosing_stmt(#20698,#20679) +expr_containers(#20698,#20001) +literals("json","""json""",#20698) +#20699=* +regexpterm(#20699,14,#20698,0,"json") +#20700=@"loc,{#10000},24,48,24,51" +locations_default(#20700,#10000,24,48,24,51) +hasLocation(#20699,#20700) +regexp_const_value(#20699,"json") +#20701=* +entry_cfg_node(#20701,#20001) +#20702=@"loc,{#10000},1,1,1,0" +locations_default(#20702,#10000,1,1,1,0) +hasLocation(#20701,#20702) +#20703=* +exit_cfg_node(#20703,#20001) +hasLocation(#20703,#20483) +successor(#20679,#20682) +successor(#20685,#20683) +successor(#20683,#20680) +successor(#20682,#20685) +successor(#20680,#20703) +successor(#20668,#20669) +successor(#20676,#20678) +successor(#20678,#20679) +successor(#20669,#20676) +successor(#20660,#20661) +successor(#20661,#20668) +successor(#20649,#20650) +successor(#20657,#20658) +successor(#20659,#20660) +successor(#20658,#20659) +successor(#20650,#20657) +successor(#20639,#20649) +successor(#20628,#20639) +successor(#20617,#20628) +successor(#20609,#20617) +successor(#20595,#20599) +successor(#20601,#20605) +successor(#20606,#20603) +successor(#20605,#20606) +successor(#20603,#20597) +successor(#20599,#20601) +successor(#20597,#20609) +successor(#20590,#20595) +successor(#20566,#20569) +successor(#20572,#20570) +successor(#20570,#20567) +successor(#20569,#20572) +successor(#20567,#20590) +successor(#20555,#20556) +successor(#20563,#20565) +successor(#20565,#20566) +successor(#20556,#20563) +successor(#20547,#20548) +successor(#20548,#20555) +successor(#20536,#20537) +successor(#20544,#20545) +successor(#20546,#20547) +successor(#20545,#20546) +successor(#20537,#20544) +successor(#20526,#20536) +successor(#20515,#20526) +successor(#20504,#20515) +successor(#20496,#20504) +successor(#20647,#20496) +successor(#20636,#20647) +successor(#20625,#20636) +successor(#20534,#20625) +successor(#20523,#20534) +successor(#20512,#20523) +successor(#20701,#20512) +numlines(#10000,24,18,2) filetype(#10000,"typescript") From 7f4bcdfa64848889797df8ad29b08f6dd0e2312d Mon Sep 17 00:00:00 2001 From: Arthur Baars Date: Tue, 10 Oct 2023 17:30:53 +0200 Subject: [PATCH 017/202] Rename test files --- ...port-assertion.ts => import-attributes.ts} | 0 ...tion.ts.trap => import-attributes.ts.trap} | 4 +-- .../TypeScript/ImportAssertions/test.expected | 36 ------------------- .../js-import-attributes.js} | 0 .../TypeScript/ImportAttributes/test.expected | 36 +++++++++++++++++++ .../test.ql | 0 .../ts-import-attributes.ts} | 0 7 files changed, 38 insertions(+), 38 deletions(-) rename javascript/extractor/tests/ts/input/{import-assertion.ts => import-attributes.ts} (100%) rename javascript/extractor/tests/ts/output/trap/{import-assertion.ts.trap => import-attributes.ts.trap} (99%) delete mode 100644 javascript/ql/test/library-tests/TypeScript/ImportAssertions/test.expected rename javascript/ql/test/library-tests/TypeScript/{ImportAssertions/js-import-assertions.js => ImportAttributes/js-import-attributes.js} (100%) create mode 100644 javascript/ql/test/library-tests/TypeScript/ImportAttributes/test.expected rename javascript/ql/test/library-tests/TypeScript/{ImportAssertions => ImportAttributes}/test.ql (100%) rename javascript/ql/test/library-tests/TypeScript/{ImportAssertions/ts-import-assertions.ts => ImportAttributes/ts-import-attributes.ts} (100%) diff --git a/javascript/extractor/tests/ts/input/import-assertion.ts b/javascript/extractor/tests/ts/input/import-attributes.ts similarity index 100% rename from javascript/extractor/tests/ts/input/import-assertion.ts rename to javascript/extractor/tests/ts/input/import-attributes.ts diff --git a/javascript/extractor/tests/ts/output/trap/import-assertion.ts.trap b/javascript/extractor/tests/ts/output/trap/import-attributes.ts.trap similarity index 99% rename from javascript/extractor/tests/ts/output/trap/import-assertion.ts.trap rename to javascript/extractor/tests/ts/output/trap/import-attributes.ts.trap index cba938debe7..705137f5a27 100644 --- a/javascript/extractor/tests/ts/output/trap/import-assertion.ts.trap +++ b/javascript/extractor/tests/ts/output/trap/import-attributes.ts.trap @@ -1,5 +1,5 @@ -#10000=@"/import-assertion.ts;sourcefile" -files(#10000,"/import-assertion.ts") +#10000=@"/import-attributes.ts;sourcefile" +files(#10000,"/import-attributes.ts") #10001=@"/;folder" folders(#10001,"/") containerparent(#10001,#10000) diff --git a/javascript/ql/test/library-tests/TypeScript/ImportAssertions/test.expected b/javascript/ql/test/library-tests/TypeScript/ImportAssertions/test.expected deleted file mode 100644 index f5170003689..00000000000 --- a/javascript/ql/test/library-tests/TypeScript/ImportAssertions/test.expected +++ /dev/null @@ -1,36 +0,0 @@ -getImportAttributesFromImport -| js-import-assertions.js:1:1:1:38 | import ... son" }; | js-import-assertions.js:1:22:1:37 | { type: "json" } | -| js-import-assertions.js:2:1:2:51 | import ... son" }; | js-import-assertions.js:2:35:2:50 | { type: "json" } | -| js-import-assertions.js:3:1:3:50 | import ... son" }; | js-import-assertions.js:3:34:3:49 | { type: "json" } | -| js-import-assertions.js:4:1:4:46 | import ... son" }; | js-import-assertions.js:4:30:4:45 | { type: "json" } | -| js-import-assertions.js:15:1:15:40 | import ... son" }; | js-import-assertions.js:15:24:15:39 | { type: "json" } | -| js-import-assertions.js:16:1:16:53 | import ... son" }; | js-import-assertions.js:16:37:16:52 | { type: "json" } | -| js-import-assertions.js:17:1:17:52 | import ... son" }; | js-import-assertions.js:17:36:17:51 | { type: "json" } | -| js-import-assertions.js:18:1:18:48 | import ... son" }; | js-import-assertions.js:18:32:18:47 | { type: "json" } | -| ts-import-assertions.ts:3:1:3:38 | import ... son" }; | ts-import-assertions.ts:3:22:3:37 | { type: "json" } | -| ts-import-assertions.ts:4:1:4:51 | import ... son" }; | ts-import-assertions.ts:4:35:4:50 | { type: "json" } | -| ts-import-assertions.ts:5:1:5:50 | import ... son" }; | ts-import-assertions.ts:5:34:5:49 | { type: "json" } | -| ts-import-assertions.ts:6:1:6:46 | import ... son" }; | ts-import-assertions.ts:6:30:6:45 | { type: "json" } | -| ts-import-assertions.ts:17:1:17:40 | import ... son" }; | ts-import-assertions.ts:17:24:17:39 | { type: "json" } | -| ts-import-assertions.ts:18:1:18:53 | import ... son" }; | ts-import-assertions.ts:18:37:18:52 | { type: "json" } | -| ts-import-assertions.ts:19:1:19:52 | import ... son" }; | ts-import-assertions.ts:19:36:19:51 | { type: "json" } | -| ts-import-assertions.ts:20:1:20:48 | import ... son" }; | ts-import-assertions.ts:20:32:20:47 | { type: "json" } | -getImportAttributesFromExport -| js-import-assertions.js:6:1:6:50 | export ... son" }; | js-import-assertions.js:6:34:6:49 | { type: "json" } | -| js-import-assertions.js:7:1:7:45 | export ... son" }; | js-import-assertions.js:7:29:7:44 | { type: "json" } | -| js-import-assertions.js:8:1:8:51 | export ... son" }; | js-import-assertions.js:8:35:8:50 | { type: "json" } | -| js-import-assertions.js:20:1:20:52 | export ... son" }; | js-import-assertions.js:20:36:20:51 | { type: "json" } | -| js-import-assertions.js:21:1:21:47 | export ... son" }; | js-import-assertions.js:21:31:21:46 | { type: "json" } | -| js-import-assertions.js:22:1:22:53 | export ... son" }; | js-import-assertions.js:22:37:22:52 | { type: "json" } | -| ts-import-assertions.ts:8:1:8:50 | export ... son" }; | ts-import-assertions.ts:8:34:8:49 | { type: "json" } | -| ts-import-assertions.ts:9:1:9:45 | export ... son" }; | ts-import-assertions.ts:9:29:9:44 | { type: "json" } | -| ts-import-assertions.ts:10:1:10:51 | export ... son" }; | ts-import-assertions.ts:10:35:10:50 | { type: "json" } | -| ts-import-assertions.ts:22:1:22:52 | export ... son" }; | ts-import-assertions.ts:22:36:22:51 | { type: "json" } | -| ts-import-assertions.ts:23:1:23:47 | export ... son" }; | ts-import-assertions.ts:23:31:23:46 | { type: "json" } | -| ts-import-assertions.ts:24:1:24:53 | export ... son" }; | ts-import-assertions.ts:24:37:24:52 | { type: "json" } | -getImportOptions -| js-import-assertions.js:10:12:10:55 | import( ... n" } }) | js-import-assertions.js:10:29:10:54 | { with: ... on" } } | -| js-import-assertions.js:24:12:24:57 | import( ... n" } }) | js-import-assertions.js:24:29:24:56 | { asser ... on" } } | -| ts-import-assertions.ts:12:12:12:55 | import( ... n" } }) | ts-import-assertions.ts:12:29:12:54 | { with: ... on" } } | -| ts-import-assertions.ts:26:12:26:57 | import( ... n" } }) | ts-import-assertions.ts:26:29:26:56 | { asser ... on" } } | -errors diff --git a/javascript/ql/test/library-tests/TypeScript/ImportAssertions/js-import-assertions.js b/javascript/ql/test/library-tests/TypeScript/ImportAttributes/js-import-attributes.js similarity index 100% rename from javascript/ql/test/library-tests/TypeScript/ImportAssertions/js-import-assertions.js rename to javascript/ql/test/library-tests/TypeScript/ImportAttributes/js-import-attributes.js diff --git a/javascript/ql/test/library-tests/TypeScript/ImportAttributes/test.expected b/javascript/ql/test/library-tests/TypeScript/ImportAttributes/test.expected new file mode 100644 index 00000000000..9b3caa21514 --- /dev/null +++ b/javascript/ql/test/library-tests/TypeScript/ImportAttributes/test.expected @@ -0,0 +1,36 @@ +getImportAttributesFromImport +| js-import-attributes.js:1:1:1:38 | import ... son" }; | js-import-attributes.js:1:22:1:37 | { type: "json" } | +| js-import-attributes.js:2:1:2:51 | import ... son" }; | js-import-attributes.js:2:35:2:50 | { type: "json" } | +| js-import-attributes.js:3:1:3:50 | import ... son" }; | js-import-attributes.js:3:34:3:49 | { type: "json" } | +| js-import-attributes.js:4:1:4:46 | import ... son" }; | js-import-attributes.js:4:30:4:45 | { type: "json" } | +| js-import-attributes.js:15:1:15:40 | import ... son" }; | js-import-attributes.js:15:24:15:39 | { type: "json" } | +| js-import-attributes.js:16:1:16:53 | import ... son" }; | js-import-attributes.js:16:37:16:52 | { type: "json" } | +| js-import-attributes.js:17:1:17:52 | import ... son" }; | js-import-attributes.js:17:36:17:51 | { type: "json" } | +| js-import-attributes.js:18:1:18:48 | import ... son" }; | js-import-attributes.js:18:32:18:47 | { type: "json" } | +| ts-import-attributes.ts:3:1:3:38 | import ... son" }; | ts-import-attributes.ts:3:22:3:37 | { type: "json" } | +| ts-import-attributes.ts:4:1:4:51 | import ... son" }; | ts-import-attributes.ts:4:35:4:50 | { type: "json" } | +| ts-import-attributes.ts:5:1:5:50 | import ... son" }; | ts-import-attributes.ts:5:34:5:49 | { type: "json" } | +| ts-import-attributes.ts:6:1:6:46 | import ... son" }; | ts-import-attributes.ts:6:30:6:45 | { type: "json" } | +| ts-import-attributes.ts:17:1:17:40 | import ... son" }; | ts-import-attributes.ts:17:24:17:39 | { type: "json" } | +| ts-import-attributes.ts:18:1:18:53 | import ... son" }; | ts-import-attributes.ts:18:37:18:52 | { type: "json" } | +| ts-import-attributes.ts:19:1:19:52 | import ... son" }; | ts-import-attributes.ts:19:36:19:51 | { type: "json" } | +| ts-import-attributes.ts:20:1:20:48 | import ... son" }; | ts-import-attributes.ts:20:32:20:47 | { type: "json" } | +getImportAttributesFromExport +| js-import-attributes.js:6:1:6:50 | export ... son" }; | js-import-attributes.js:6:34:6:49 | { type: "json" } | +| js-import-attributes.js:7:1:7:45 | export ... son" }; | js-import-attributes.js:7:29:7:44 | { type: "json" } | +| js-import-attributes.js:8:1:8:51 | export ... son" }; | js-import-attributes.js:8:35:8:50 | { type: "json" } | +| js-import-attributes.js:20:1:20:52 | export ... son" }; | js-import-attributes.js:20:36:20:51 | { type: "json" } | +| js-import-attributes.js:21:1:21:47 | export ... son" }; | js-import-attributes.js:21:31:21:46 | { type: "json" } | +| js-import-attributes.js:22:1:22:53 | export ... son" }; | js-import-attributes.js:22:37:22:52 | { type: "json" } | +| ts-import-attributes.ts:8:1:8:50 | export ... son" }; | ts-import-attributes.ts:8:34:8:49 | { type: "json" } | +| ts-import-attributes.ts:9:1:9:45 | export ... son" }; | ts-import-attributes.ts:9:29:9:44 | { type: "json" } | +| ts-import-attributes.ts:10:1:10:51 | export ... son" }; | ts-import-attributes.ts:10:35:10:50 | { type: "json" } | +| ts-import-attributes.ts:22:1:22:52 | export ... son" }; | ts-import-attributes.ts:22:36:22:51 | { type: "json" } | +| ts-import-attributes.ts:23:1:23:47 | export ... son" }; | ts-import-attributes.ts:23:31:23:46 | { type: "json" } | +| ts-import-attributes.ts:24:1:24:53 | export ... son" }; | ts-import-attributes.ts:24:37:24:52 | { type: "json" } | +getImportOptions +| js-import-attributes.js:10:12:10:55 | import( ... n" } }) | js-import-attributes.js:10:29:10:54 | { with: ... on" } } | +| js-import-attributes.js:24:12:24:57 | import( ... n" } }) | js-import-attributes.js:24:29:24:56 | { asser ... on" } } | +| ts-import-attributes.ts:12:12:12:55 | import( ... n" } }) | ts-import-attributes.ts:12:29:12:54 | { with: ... on" } } | +| ts-import-attributes.ts:26:12:26:57 | import( ... n" } }) | ts-import-attributes.ts:26:29:26:56 | { asser ... on" } } | +errors diff --git a/javascript/ql/test/library-tests/TypeScript/ImportAssertions/test.ql b/javascript/ql/test/library-tests/TypeScript/ImportAttributes/test.ql similarity index 100% rename from javascript/ql/test/library-tests/TypeScript/ImportAssertions/test.ql rename to javascript/ql/test/library-tests/TypeScript/ImportAttributes/test.ql diff --git a/javascript/ql/test/library-tests/TypeScript/ImportAssertions/ts-import-assertions.ts b/javascript/ql/test/library-tests/TypeScript/ImportAttributes/ts-import-attributes.ts similarity index 100% rename from javascript/ql/test/library-tests/TypeScript/ImportAssertions/ts-import-assertions.ts rename to javascript/ql/test/library-tests/TypeScript/ImportAttributes/ts-import-attributes.ts From 01e7d57dba591a395bf7f4eea647aac76f10a20d Mon Sep 17 00:00:00 2001 From: Arthur Baars Date: Tue, 10 Oct 2023 16:41:18 +0200 Subject: [PATCH 018/202] Add changenote --- .../ql/lib/change-notes/2023-10-12-import-attributes.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 javascript/ql/lib/change-notes/2023-10-12-import-attributes.md diff --git a/javascript/ql/lib/change-notes/2023-10-12-import-attributes.md b/javascript/ql/lib/change-notes/2023-10-12-import-attributes.md new file mode 100644 index 00000000000..cb063d7880f --- /dev/null +++ b/javascript/ql/lib/change-notes/2023-10-12-import-attributes.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* TypeScript 5.3 is now supported. From c397f707a10f6c26f923d096ccaec76983b706c4 Mon Sep 17 00:00:00 2001 From: Taus Date: Mon, 30 Oct 2023 16:11:39 +0000 Subject: [PATCH 019/202] Python: Add automatically generated files For these, I opted for a placement that would cause as few changes to the dbscheme as possible. This puts the new `type_parameters` fields as the last field on function and class definitions. --- python/ql/lib/semmle/python/AstGenerated.qll | 98 ++++++++++++++++++++ python/ql/lib/semmlecode.python.dbscheme | 45 ++++++++- 2 files changed, 139 insertions(+), 4 deletions(-) diff --git a/python/ql/lib/semmle/python/AstGenerated.qll b/python/ql/lib/semmle/python/AstGenerated.qll index b6fab779b15..1550095b395 100644 --- a/python/ql/lib/semmle/python/AstGenerated.qll +++ b/python/ql/lib/semmle/python/AstGenerated.qll @@ -285,6 +285,15 @@ class ClassExpr_ extends @py_ClassExpr, Expr { /** Gets the class scope of this class definition. */ Class getInnerScope() { py_Classes(result, this) } + /** Gets the type parameters of this class definition. */ + TypeParameterList getTypeParameters() { py_type_parameter_lists(result, this) } + + /** Gets the nth type parameter of this class definition. */ + TypeParameter getTypeParameter(int index) { result = this.getTypeParameters().getItem(index) } + + /** Gets a type parameter of this class definition. */ + TypeParameter getATypeParameter() { result = this.getTypeParameters().getAnItem() } + override string toString() { result = "ClassExpr" } } @@ -554,6 +563,15 @@ class Function_ extends @py_Function { /** Whether the async property of this function is true. */ predicate isAsync() { py_bools(this, 6) } + /** Gets the type parameters of this function. */ + TypeParameterList getTypeParameters() { py_type_parameter_lists(result, this) } + + /** Gets the nth type parameter of this function. */ + TypeParameter getTypeParameter(int index) { result = this.getTypeParameters().getItem(index) } + + /** Gets a type parameter of this function. */ + TypeParameter getATypeParameter() { result = this.getTypeParameters().getAnItem() } + /** Gets a parent of this function */ FunctionParent getParent() { py_Functions(this, result) } @@ -1103,6 +1121,14 @@ class Param_ extends @py_Param, ExprContext { override string toString() { result = "Param" } } +/** INTERNAL: See the class `ParamSpec` for further information. */ +class ParamSpec_ extends @py_ParamSpec, TypeParameter { + /** Gets the name of this parameter spec. */ + Expr getName() { py_exprs(result, _, this, 1) } + + override string toString() { result = "ParamSpec" } +} + /** INTERNAL: See the class `Pass` for further information. */ class Pass_ extends @py_Pass, Stmt { override string toString() { result = "Pass" } @@ -1412,6 +1438,45 @@ class Tuple_ extends @py_Tuple, Expr { override string toString() { result = "Tuple" } } +/** INTERNAL: See the class `TypeAlias` for further information. */ +class TypeAlias_ extends @py_TypeAlias, Stmt { + /** Gets the name of this type alias. */ + Expr getName() { py_exprs(result, _, this, 1) } + + /** Gets the type_parameters of this type alias. */ + TypeParameterList getTypeParameters() { py_type_parameter_lists(result, this) } + + /** Gets the nth type_parameter of this type alias. */ + TypeParameter getTypeParameter(int index) { result = this.getTypeParameters().getItem(index) } + + /** Gets a type_parameter of this type alias. */ + TypeParameter getATypeParameter() { result = this.getTypeParameters().getAnItem() } + + /** Gets the value of this type alias. */ + Expr getValue() { py_exprs(result, _, this, 3) } + + override string toString() { result = "TypeAlias" } +} + +/** INTERNAL: See the class `TypeVar` for further information. */ +class TypeVar_ extends @py_TypeVar, TypeParameter { + /** Gets the name of this type variable. */ + Expr getName() { py_exprs(result, _, this, 1) } + + /** Gets the bound of this type variable. */ + Expr getBound() { py_exprs(result, _, this, 2) } + + override string toString() { result = "TypeVar" } +} + +/** INTERNAL: See the class `TypeVarTuple` for further information. */ +class TypeVarTuple_ extends @py_TypeVarTuple, TypeParameter { + /** Gets the name of this type variable tuple. */ + Expr getName() { py_exprs(result, _, this, 1) } + + override string toString() { result = "TypeVarTuple" } +} + /** INTERNAL: See the class `UAdd` for further information. */ class UAdd_ extends @py_UAdd, Unaryop { override string toString() { result = "UAdd" } @@ -1908,6 +1973,39 @@ class StrParent_ extends @py_str_parent { string toString() { result = "StrParent" } } +/** INTERNAL: See the class `TypeParameter` for further information. */ +class TypeParameter_ extends @py_type_parameter { + /** Gets the location of this type parameter. */ + Location getLocation() { py_locations(result, this) } + + /** Gets a parent of this type parameter */ + TypeParameterList getParent() { py_type_parameters(this, _, result, _) } + + /** Gets a textual representation of this element. */ + string toString() { result = "TypeParameter" } +} + +/** INTERNAL: See the class `TypeParameterList` for further information. */ +class TypeParameterList_ extends @py_type_parameter_list { + /** Gets a parent of this type parameter list */ + TypeParameterListParent getParent() { py_type_parameter_lists(this, result) } + + /** Gets an item of this type parameter list */ + TypeParameter getAnItem() { py_type_parameters(result, _, this, _) } + + /** Gets the nth item of this type parameter list */ + TypeParameter getItem(int index) { py_type_parameters(result, _, this, index) } + + /** Gets a textual representation of this element. */ + string toString() { result = "TypeParameterList" } +} + +/** INTERNAL: See the class `TypeParameterListParent` for further information. */ +class TypeParameterListParent_ extends @py_type_parameter_list_parent { + /** Gets a textual representation of this element. */ + string toString() { result = "TypeParameterListParent" } +} + /** INTERNAL: See the class `Unaryop` for further information. */ class Unaryop_ extends @py_unaryop { /** Gets a parent of this unary operation */ diff --git a/python/ql/lib/semmlecode.python.dbscheme b/python/ql/lib/semmlecode.python.dbscheme index 0565f746643..728c6d65e61 100644 --- a/python/ql/lib/semmlecode.python.dbscheme +++ b/python/ql/lib/semmlecode.python.dbscheme @@ -388,6 +388,7 @@ py_extracted_version(int module : @py_Module ref, /* ClassExpr.bases = 3, expr_list */ /* ClassExpr.keywords = 4, dict_item_list */ /* ClassExpr.inner_scope = 5, Class */ +/* ClassExpr.type_parameters = 6, type_parameter_list */ /* Compare.location = 0, location */ /* Compare.parenthesised = 1, bool */ @@ -458,6 +459,7 @@ py_extracted_version(int module : @py_Module ref, /* Function.kwarg = 4, expr */ /* Function.body = 5, stmt_list */ /* Function.is_async = 6, bool */ +/* Function.type_parameters = 7, type_parameter_list */ /* Function = FunctionParent */ /* FunctionExpr.location = 0, location */ @@ -613,6 +615,9 @@ py_extracted_version(int module : @py_Module ref, /* Num.n = 2, number */ /* Num.text = 3, number */ +/* ParamSpec.location = 0, location */ +/* ParamSpec.name = 1, expr */ + /* Pass.location = 0, location */ /* PlaceHolder.location = 0, location */ @@ -702,6 +707,18 @@ py_extracted_version(int module : @py_Module ref, /* Tuple.ctx = 3, expr_context */ /* Tuple = ParameterList */ +/* TypeAlias.location = 0, location */ +/* TypeAlias.name = 1, expr */ +/* TypeAlias.type_parameters = 2, type_parameter_list */ +/* TypeAlias.value = 3, expr */ + +/* TypeVar.location = 0, location */ +/* TypeVar.name = 1, expr */ +/* TypeVar.bound = 2, expr */ + +/* TypeVarTuple.location = 0, location */ +/* TypeVarTuple.name = 1, expr */ + /* UnaryExpr.location = 0, location */ /* UnaryExpr.parenthesised = 1, bool */ /* UnaryExpr.op = 2, unaryop */ @@ -778,6 +795,10 @@ py_extracted_version(int module : @py_Module ref, /* StmtList = StmtListParent */ /* string = StrParent */ /* StringList = StrListParent */ + +/* TypeParameter.location = 0, location */ +/* TypeParameter = TypeParameterList */ +/* TypeParameterList = TypeParameterListParent */ /* Unaryop = UnaryExpr */ /* Variable = VariableParent */ py_Classes(unique int id : @py_Class, @@ -894,6 +915,14 @@ py_strs(varchar(1) id : string ref, py_str_lists(unique int id : @py_str_list, unique int parent : @py_str_list_parent ref); +py_type_parameters(unique int id : @py_type_parameter, + int kind: int ref, + int parent : @py_type_parameter_list ref, + int idx : int ref); + +py_type_parameter_lists(unique int id : @py_type_parameter_list, + unique int parent : @py_type_parameter_list_parent ref); + py_unaryops(unique int id : @py_unaryop, int kind: int ref, unique int parent : @py_UnaryExpr ref); @@ -1029,7 +1058,13 @@ case @py_stmt.kind of | 23 = @py_While | 24 = @py_With | 25 = @py_TemplateWrite -| 26 = @py_AnnAssign; +| 26 = @py_AnnAssign +| 27 = @py_TypeAlias; + +case @py_type_parameter.kind of + 0 = @py_ParamSpec +| 1 = @py_TypeVar +| 2 = @py_TypeVarTuple; case @py_unaryop.kind of 0 = @py_Invert @@ -1043,7 +1078,7 @@ case @py_unaryop.kind of @py_arguments_parent = @py_FunctionExpr | @py_Lambda; -@py_ast_node = @py_Class | @py_Function | @py_Module | @py_StringPart | @py_comprehension | @py_dict_item | @py_expr | @py_pattern | @py_stmt; +@py_ast_node = @py_Class | @py_Function | @py_Module | @py_StringPart | @py_comprehension | @py_dict_item | @py_expr | @py_pattern | @py_stmt | @py_type_parameter; @py_bool_parent = @py_For | @py_Function | @py_Print | @py_With | @py_expr | @py_pattern; @@ -1055,9 +1090,9 @@ case @py_unaryop.kind of @py_expr_or_stmt = @py_expr | @py_stmt; -@py_expr_parent = @py_AnnAssign | @py_Assert | @py_Assign | @py_AssignExpr | @py_Attribute | @py_AugAssign | @py_Await | @py_BinaryExpr | @py_Call | @py_Case | @py_Compare | @py_DictComp | @py_DictUnpacking | @py_ExceptGroupStmt | @py_ExceptStmt | @py_Exec | @py_Expr_stmt | @py_Filter | @py_For | @py_FormattedValue | @py_Function | @py_FunctionExpr | @py_GeneratorExp | @py_Guard | @py_If | @py_IfExp | @py_ImportMember | @py_ImportStar | @py_KeyValuePair | @py_ListComp | @py_MatchAsPattern | @py_MatchCapturePattern | @py_MatchClassPattern | @py_MatchKeywordPattern | @py_MatchLiteralPattern | @py_MatchStmt | @py_MatchValuePattern | @py_Print | @py_Raise | @py_Repr | @py_Return | @py_SetComp | @py_Slice | @py_Starred | @py_Subscript | @py_TemplateDottedNotation | @py_TemplateWrite | @py_UnaryExpr | @py_While | @py_With | @py_Yield | @py_YieldFrom | @py_alias | @py_arguments | @py_comprehension | @py_expr_list | @py_keyword | @py_parameter_list; +@py_expr_parent = @py_AnnAssign | @py_Assert | @py_Assign | @py_AssignExpr | @py_Attribute | @py_AugAssign | @py_Await | @py_BinaryExpr | @py_Call | @py_Case | @py_Compare | @py_DictComp | @py_DictUnpacking | @py_ExceptGroupStmt | @py_ExceptStmt | @py_Exec | @py_Expr_stmt | @py_Filter | @py_For | @py_FormattedValue | @py_Function | @py_FunctionExpr | @py_GeneratorExp | @py_Guard | @py_If | @py_IfExp | @py_ImportMember | @py_ImportStar | @py_KeyValuePair | @py_ListComp | @py_MatchAsPattern | @py_MatchCapturePattern | @py_MatchClassPattern | @py_MatchKeywordPattern | @py_MatchLiteralPattern | @py_MatchStmt | @py_MatchValuePattern | @py_ParamSpec | @py_Print | @py_Raise | @py_Repr | @py_Return | @py_SetComp | @py_Slice | @py_Starred | @py_Subscript | @py_TemplateDottedNotation | @py_TemplateWrite | @py_TypeAlias | @py_TypeVar | @py_TypeVarTuple | @py_UnaryExpr | @py_While | @py_With | @py_Yield | @py_YieldFrom | @py_alias | @py_arguments | @py_comprehension | @py_expr_list | @py_keyword | @py_parameter_list; -@py_location_parent = @py_DictUnpacking | @py_KeyValuePair | @py_StringPart | @py_comprehension | @py_expr | @py_keyword | @py_pattern | @py_stmt; +@py_location_parent = @py_DictUnpacking | @py_KeyValuePair | @py_StringPart | @py_comprehension | @py_expr | @py_keyword | @py_pattern | @py_stmt | @py_type_parameter; @py_parameter = @py_Name | @py_Tuple; @@ -1073,6 +1108,8 @@ case @py_unaryop.kind of @py_str_parent = @py_Attribute | @py_Class | @py_ClassExpr | @py_FormattedValue | @py_Function | @py_FunctionExpr | @py_ImportExpr | @py_ImportMember | @py_Module | @py_SpecialOperation | @py_Str | @py_StringPart | @py_TemplateDottedNotation | @py_keyword | @py_str_list; +@py_type_parameter_list_parent = @py_ClassExpr | @py_Function | @py_TypeAlias; + @py_variable_parent = @py_Name | @py_PlaceHolder; From 2e77b8d3c2d93657df3190c8f87a04d4c092df80 Mon Sep 17 00:00:00 2001 From: Taus Date: Mon, 30 Oct 2023 16:12:13 +0000 Subject: [PATCH 020/202] Python: Add wrapper classes around the newly added AST nodes --- python/ql/lib/semmle/python/AstExtended.qll | 30 +++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/python/ql/lib/semmle/python/AstExtended.qll b/python/ql/lib/semmle/python/AstExtended.qll index de44bab966a..cb5665270c4 100644 --- a/python/ql/lib/semmle/python/AstExtended.qll +++ b/python/ql/lib/semmle/python/AstExtended.qll @@ -220,3 +220,33 @@ class StringList extends StringList_ { } /** A list of aliases in an import statement */ class AliasList extends AliasList_ { } + +/** A generic type parameter, as seen in function, class, and type alias definitions. */ +class TypeParameter extends TypeParameter_ { } + +/** A list of type parameters */ +class TypeParameterList extends TypeParameterList_ { } + +/** A parent of a `TypeParameterList`. Internal implementation class. */ +class TypeParameterListParent extends TypeParameterListParent_ { } + +/** A type alias statement, such as `type T[T1,T2] = T3`. */ +class TypeAlias extends TypeAlias_, Stmt { + /** Gets the name of this type alias. */ + override Name getName() { result = super.getName() } +} + +/** A type variable, with an optional bound, such as `T1` and `T2` in `type T[T1, T2: T3] = T4`. */ +class TypeVar extends TypeVar_, TypeParameter { + override Name getName() { result = super.getName() } +} + +/** A type var tuple parameter, such as `*T1` in `type T[*T1] = T2`. */ +class TypeVarTuple extends TypeVarTuple_, TypeParameter { + override Name getName() { result = super.getName() } +} + +/** A param spec parameter, such as `**T1` in `type T[**T1] = T2`. */ +class ParamSpec extends ParamSpec_, TypeParameter { + override Name getName() { result = super.getName() } +} From e8209a6a105b7a5df67bdfd7be6ae5bd3d2a1f6e Mon Sep 17 00:00:00 2001 From: Taus Date: Tue, 31 Oct 2023 13:13:55 +0000 Subject: [PATCH 021/202] Python: Fix missing `override` compilation error --- python/ql/lib/semmle/python/AstExtended.qll | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/python/ql/lib/semmle/python/AstExtended.qll b/python/ql/lib/semmle/python/AstExtended.qll index cb5665270c4..1447656543c 100644 --- a/python/ql/lib/semmle/python/AstExtended.qll +++ b/python/ql/lib/semmle/python/AstExtended.qll @@ -222,7 +222,10 @@ class StringList extends StringList_ { } class AliasList extends AliasList_ { } /** A generic type parameter, as seen in function, class, and type alias definitions. */ -class TypeParameter extends TypeParameter_ { } +class TypeParameter extends TypeParameter_ { + /** Gets a textual representation of this element */ + override string toString() { result = TypeParameter_.super.toString() } +} /** A list of type parameters */ class TypeParameterList extends TypeParameterList_ { } From 9cd1e0e546825b98718f263f06a2f1f7db3684ee Mon Sep 17 00:00:00 2001 From: Taus Date: Tue, 31 Oct 2023 13:14:05 +0000 Subject: [PATCH 022/202] Python: Add stats for new relations --- .../ql/lib/semmlecode.python.dbscheme.stats | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/python/ql/lib/semmlecode.python.dbscheme.stats b/python/ql/lib/semmlecode.python.dbscheme.stats index 0424528c8db..289c0487066 100644 --- a/python/ql/lib/semmlecode.python.dbscheme.stats +++ b/python/ql/lib/semmlecode.python.dbscheme.stats @@ -1,5 +1,10 @@ + @py_ParamSpec100 + @py_TypeAlias100 + @py_TypeVar100 + @py_TypeVarTuple100 + @py_type_parameter_list100 @py_Guard100 @py_MatchAsPattern100 @py_MatchOrPattern100 @@ -7548,6 +7553,44 @@ +py_type_parameters +1000 + + +id +1000 + + +kind +3 + + +parent +1000 + + +idx +100 + + + + + +py_type_parameter_lists +1000 + + +id +1000 + + +parent +1000 + + + + + py_pattern_lists 1000 From 878299823c746ef0b2a53df895d83fb53733090d Mon Sep 17 00:00:00 2001 From: Taus Date: Fri, 3 Nov 2023 14:51:58 +0000 Subject: [PATCH 023/202] Python: Add up-/downgrade scripts In the upgrade direction, we simply do nothing. In the downgrade direction, we remove the two new relations, and also any `Stmt` nodes corresponding to `TypeAlias` nodes. --- .../old.dbscheme | 1233 +++++++++++++++++ .../py_stmts.ql | 18 + .../semmlecode.python.dbscheme | 1196 ++++++++++++++++ .../upgrade.properties | 5 + .../old.dbscheme | 1196 ++++++++++++++++ .../semmlecode.python.dbscheme | 1233 +++++++++++++++++ .../upgrade.properties | 2 + 7 files changed, 4883 insertions(+) create mode 100644 python/downgrades/728c6d65e61d808ae276013ebc15abc3a97aaef1/old.dbscheme create mode 100644 python/downgrades/728c6d65e61d808ae276013ebc15abc3a97aaef1/py_stmts.ql create mode 100644 python/downgrades/728c6d65e61d808ae276013ebc15abc3a97aaef1/semmlecode.python.dbscheme create mode 100644 python/downgrades/728c6d65e61d808ae276013ebc15abc3a97aaef1/upgrade.properties create mode 100644 python/ql/lib/upgrades/0565f7466437d52e1dc64a3b930926ab2f60cd64/old.dbscheme create mode 100644 python/ql/lib/upgrades/0565f7466437d52e1dc64a3b930926ab2f60cd64/semmlecode.python.dbscheme create mode 100644 python/ql/lib/upgrades/0565f7466437d52e1dc64a3b930926ab2f60cd64/upgrade.properties diff --git a/python/downgrades/728c6d65e61d808ae276013ebc15abc3a97aaef1/old.dbscheme b/python/downgrades/728c6d65e61d808ae276013ebc15abc3a97aaef1/old.dbscheme new file mode 100644 index 00000000000..728c6d65e61 --- /dev/null +++ b/python/downgrades/728c6d65e61d808ae276013ebc15abc3a97aaef1/old.dbscheme @@ -0,0 +1,1233 @@ +/* + * This dbscheme is auto-generated by 'semmle/dbscheme_gen.py'. + * WARNING: Any modifications to this file will be lost. + * Relations can be changed by modifying master.py or + * by adding rules to dbscheme.template + */ + +/* This is a dummy line to alter the dbscheme, so we can make a database upgrade + * without actually changing any of the dbscheme predicates. It contains a date + * to allow for such updates in the future as well. + * + * 2020-07-02 + * + * DO NOT remove this comment carelessly, since it can revert the dbscheme back to a + * previously seen state (matching a previously seen SHA), which would make the upgrade + * mechanism not work properly. + */ + +/*- DEPRECATED: External defects and metrics -*/ + +externalDefects( + unique int id : @externalDefect, + varchar(900) queryPath : string ref, + int location : @location ref, + varchar(900) message : string ref, + float severity : float ref +); + +externalMetrics( + unique int id : @externalMetric, + varchar(900) queryPath : string ref, + int location : @location ref, + float value : float ref +); + +/*- External data -*/ + +/** + * External data, loaded from CSV files during snapshot creation. See + * [Tutorial: Incorporating external data](https://help.semmle.com/wiki/display/SD/Tutorial%3A+Incorporating+external+data) + * for more information. + */ +externalData( + int id : @externalDataElement, + string path : string ref, + int column: int ref, + string value : string ref +); + +/*- DEPRECATED: Snapshot date -*/ + +snapshotDate(unique date snapshotDate : date ref); + +/*- Source location prefix -*/ + +/** + * The source location of the snapshot. + */ +sourceLocationPrefix(string prefix : string ref); + +/*- DEPRECATED: Duplicate code -*/ + +duplicateCode( + unique int id : @duplication, + string relativePath : string ref, + int equivClass : int ref +); + +similarCode( + unique int id : @similarity, + string relativePath : string ref, + int equivClass : int ref +); + +@duplication_or_similarity = @duplication | @similarity + +tokens( + int id : @duplication_or_similarity ref, + int offset : int ref, + int beginLine : int ref, + int beginColumn : int ref, + int endLine : int ref, + int endColumn : int ref +); + +/*- DEPRECATED: Version control data -*/ + +svnentries( + unique int id : @svnentry, + string revision : string ref, + string author : string ref, + date revisionDate : date ref, + int changeSize : int ref +) + +svnaffectedfiles( + int id : @svnentry ref, + int file : @file ref, + string action : string ref +) + +svnentrymsg( + unique int id : @svnentry ref, + string message : string ref +) + +svnchurn( + int commit : @svnentry ref, + int file : @file ref, + int addedLines : int ref, + int deletedLines : int ref +) + +/*- Lines of code -*/ + +numlines( + int element_id: @sourceline ref, + int num_lines: int ref, + int num_code: int ref, + int num_comment: int ref +); + +/*- Files and folders -*/ + +/** + * The location of an element. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `file`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ +locations_default( + unique int id: @location_default, + int file: @file ref, + int beginLine: int ref, + int beginColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +files( + unique int id: @file, + string name: string ref +); + +folders( + unique int id: @folder, + string name: string ref +); + +@container = @file | @folder + +containerparent( + int parent: @container ref, + unique int child: @container ref +); + +/*- XML Files -*/ + +xmlEncoding( + unique int id: @file ref, + string encoding: string ref +); + +xmlDTDs( + unique int id: @xmldtd, + string root: string ref, + string publicId: string ref, + string systemId: string ref, + int fileid: @file ref +); + +xmlElements( + unique int id: @xmlelement, + string name: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int fileid: @file ref +); + +xmlAttrs( + unique int id: @xmlattribute, + int elementid: @xmlelement ref, + string name: string ref, + string value: string ref, + int idx: int ref, + int fileid: @file ref +); + +xmlNs( + int id: @xmlnamespace, + string prefixName: string ref, + string URI: string ref, + int fileid: @file ref +); + +xmlHasNs( + int elementId: @xmlnamespaceable ref, + int nsId: @xmlnamespace ref, + int fileid: @file ref +); + +xmlComments( + unique int id: @xmlcomment, + string text: string ref, + int parentid: @xmlparent ref, + int fileid: @file ref +); + +xmlChars( + unique int id: @xmlcharacters, + string text: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int isCDATA: int ref, + int fileid: @file ref +); + +@xmlparent = @file | @xmlelement; +@xmlnamespaceable = @xmlelement | @xmlattribute; + +xmllocations( + int xmlElement: @xmllocatable ref, + int location: @location_default ref +); + +@xmllocatable = @xmlcharacters | @xmlelement | @xmlcomment | @xmlattribute | @xmldtd | @file | @xmlnamespace; + +/*- YAML -*/ + +#keyset[parent, idx] +yaml (unique int id: @yaml_node, + int kind: int ref, + int parent: @yaml_node_parent ref, + int idx: int ref, + string tag: string ref, + string tostring: string ref); + +case @yaml_node.kind of + 0 = @yaml_scalar_node +| 1 = @yaml_mapping_node +| 2 = @yaml_sequence_node +| 3 = @yaml_alias_node +; + +@yaml_collection_node = @yaml_mapping_node | @yaml_sequence_node; + +@yaml_node_parent = @yaml_collection_node | @file; + +yaml_anchors (unique int node: @yaml_node ref, + string anchor: string ref); + +yaml_aliases (unique int alias: @yaml_alias_node ref, + string target: string ref); + +yaml_scalars (unique int scalar: @yaml_scalar_node ref, + int style: int ref, + string value: string ref); + +yaml_errors (unique int id: @yaml_error, + string message: string ref); + +yaml_locations(unique int locatable: @yaml_locatable ref, + int location: @location_default ref); + +@yaml_locatable = @yaml_node | @yaml_error; + +/*- Python dbscheme -*/ + +/* + * Line metrics + */ +py_codelines(int id : @py_scope ref, + int count : int ref); + +py_commentlines(int id : @py_scope ref, + int count : int ref); + +py_docstringlines(int id : @py_scope ref, + int count : int ref); + +py_alllines(int id : @py_scope ref, + int count : int ref); + +/**************************** + Python dbscheme +****************************/ + +@sourceline = @file | @py_Module | @xmllocatable; + +@location = @location_ast | @location_default ; + +locations_ast(unique int id: @location_ast, + int module: @py_Module ref, + int beginLine: int ref, + int beginColumn: int ref, + int endLine: int ref, + int endColumn: int ref); + +file_contents(unique int file: @file ref, string contents: string ref); + +py_module_path(int module: @py_Module ref, int file: @container ref); + +variable(unique int id : @py_variable, + int scope : @py_scope ref, + varchar(1) name : string ref); + +py_line_lengths(unique int id : @py_line, + int file: @py_Module ref, + int line : int ref, + int length : int ref); + +py_extracted_version(int module : @py_Module ref, + varchar(1) version : string ref); + +/* AUTO GENERATED PART STARTS HERE */ + + +/* AnnAssign.location = 0, location */ +/* AnnAssign.value = 1, expr */ +/* AnnAssign.annotation = 2, expr */ +/* AnnAssign.target = 3, expr */ + +/* Assert.location = 0, location */ +/* Assert.test = 1, expr */ +/* Assert.msg = 2, expr */ + +/* Assign.location = 0, location */ +/* Assign.value = 1, expr */ +/* Assign.targets = 2, expr_list */ + +/* AssignExpr.location = 0, location */ +/* AssignExpr.parenthesised = 1, bool */ +/* AssignExpr.value = 2, expr */ +/* AssignExpr.target = 3, expr */ + +/* Attribute.location = 0, location */ +/* Attribute.parenthesised = 1, bool */ +/* Attribute.value = 2, expr */ +/* Attribute.attr = 3, str */ +/* Attribute.ctx = 4, expr_context */ + +/* AugAssign.location = 0, location */ +/* AugAssign.operation = 1, BinOp */ + +/* Await.location = 0, location */ +/* Await.parenthesised = 1, bool */ +/* Await.value = 2, expr */ + +/* BinaryExpr.location = 0, location */ +/* BinaryExpr.parenthesised = 1, bool */ +/* BinaryExpr.left = 2, expr */ +/* BinaryExpr.op = 3, operator */ +/* BinaryExpr.right = 4, expr */ +/* BinaryExpr = AugAssign */ + +/* BoolExpr.location = 0, location */ +/* BoolExpr.parenthesised = 1, bool */ +/* BoolExpr.op = 2, boolop */ +/* BoolExpr.values = 3, expr_list */ + +/* Break.location = 0, location */ + +/* Bytes.location = 0, location */ +/* Bytes.parenthesised = 1, bool */ +/* Bytes.s = 2, bytes */ +/* Bytes.prefix = 3, bytes */ +/* Bytes.implicitly_concatenated_parts = 4, StringPart_list */ + +/* Call.location = 0, location */ +/* Call.parenthesised = 1, bool */ +/* Call.func = 2, expr */ +/* Call.positional_args = 3, expr_list */ +/* Call.named_args = 4, dict_item_list */ + +/* Case.location = 0, location */ +/* Case.pattern = 1, pattern */ +/* Case.guard = 2, expr */ +/* Case.body = 3, stmt_list */ + +/* Class.name = 0, str */ +/* Class.body = 1, stmt_list */ +/* Class = ClassExpr */ + +/* ClassExpr.location = 0, location */ +/* ClassExpr.parenthesised = 1, bool */ +/* ClassExpr.name = 2, str */ +/* ClassExpr.bases = 3, expr_list */ +/* ClassExpr.keywords = 4, dict_item_list */ +/* ClassExpr.inner_scope = 5, Class */ +/* ClassExpr.type_parameters = 6, type_parameter_list */ + +/* Compare.location = 0, location */ +/* Compare.parenthesised = 1, bool */ +/* Compare.left = 2, expr */ +/* Compare.ops = 3, cmpop_list */ +/* Compare.comparators = 4, expr_list */ + +/* Continue.location = 0, location */ + +/* Delete.location = 0, location */ +/* Delete.targets = 1, expr_list */ + +/* Dict.location = 0, location */ +/* Dict.parenthesised = 1, bool */ +/* Dict.items = 2, dict_item_list */ + +/* DictComp.location = 0, location */ +/* DictComp.parenthesised = 1, bool */ +/* DictComp.function = 2, Function */ +/* DictComp.iterable = 3, expr */ + +/* DictUnpacking.location = 0, location */ +/* DictUnpacking.value = 1, expr */ + +/* Ellipsis.location = 0, location */ +/* Ellipsis.parenthesised = 1, bool */ + +/* ExceptGroupStmt.location = 0, location */ +/* ExceptGroupStmt.type = 1, expr */ +/* ExceptGroupStmt.name = 2, expr */ +/* ExceptGroupStmt.body = 3, stmt_list */ + +/* ExceptStmt.location = 0, location */ +/* ExceptStmt.type = 1, expr */ +/* ExceptStmt.name = 2, expr */ +/* ExceptStmt.body = 3, stmt_list */ + +/* Exec.location = 0, location */ +/* Exec.body = 1, expr */ +/* Exec.globals = 2, expr */ +/* Exec.locals = 3, expr */ + +/* ExprStmt.location = 0, location */ +/* ExprStmt.value = 1, expr */ + +/* Filter.location = 0, location */ +/* Filter.parenthesised = 1, bool */ +/* Filter.value = 2, expr */ +/* Filter.filter = 3, expr */ + +/* For.location = 0, location */ +/* For.target = 1, expr */ +/* For.iter = 2, expr */ +/* For.body = 3, stmt_list */ +/* For.orelse = 4, stmt_list */ +/* For.is_async = 5, bool */ + +/* FormattedValue.location = 0, location */ +/* FormattedValue.parenthesised = 1, bool */ +/* FormattedValue.value = 2, expr */ +/* FormattedValue.conversion = 3, str */ +/* FormattedValue.format_spec = 4, JoinedStr */ + +/* Function.name = 0, str */ +/* Function.args = 1, parameter_list */ +/* Function.vararg = 2, expr */ +/* Function.kwonlyargs = 3, expr_list */ +/* Function.kwarg = 4, expr */ +/* Function.body = 5, stmt_list */ +/* Function.is_async = 6, bool */ +/* Function.type_parameters = 7, type_parameter_list */ +/* Function = FunctionParent */ + +/* FunctionExpr.location = 0, location */ +/* FunctionExpr.parenthesised = 1, bool */ +/* FunctionExpr.name = 2, str */ +/* FunctionExpr.args = 3, arguments */ +/* FunctionExpr.returns = 4, expr */ +/* FunctionExpr.inner_scope = 5, Function */ + +/* GeneratorExp.location = 0, location */ +/* GeneratorExp.parenthesised = 1, bool */ +/* GeneratorExp.function = 2, Function */ +/* GeneratorExp.iterable = 3, expr */ + +/* Global.location = 0, location */ +/* Global.names = 1, str_list */ + +/* Guard.location = 0, location */ +/* Guard.parenthesised = 1, bool */ +/* Guard.test = 2, expr */ + +/* If.location = 0, location */ +/* If.test = 1, expr */ +/* If.body = 2, stmt_list */ +/* If.orelse = 3, stmt_list */ + +/* IfExp.location = 0, location */ +/* IfExp.parenthesised = 1, bool */ +/* IfExp.test = 2, expr */ +/* IfExp.body = 3, expr */ +/* IfExp.orelse = 4, expr */ + +/* Import.location = 0, location */ +/* Import.names = 1, alias_list */ + +/* ImportExpr.location = 0, location */ +/* ImportExpr.parenthesised = 1, bool */ +/* ImportExpr.level = 2, int */ +/* ImportExpr.name = 3, str */ +/* ImportExpr.top = 4, bool */ + +/* ImportStar.location = 0, location */ +/* ImportStar.module = 1, expr */ + +/* ImportMember.location = 0, location */ +/* ImportMember.parenthesised = 1, bool */ +/* ImportMember.module = 2, expr */ +/* ImportMember.name = 3, str */ + +/* Fstring.location = 0, location */ +/* Fstring.parenthesised = 1, bool */ +/* Fstring.values = 2, expr_list */ +/* Fstring = FormattedValue */ + +/* KeyValuePair.location = 0, location */ +/* KeyValuePair.value = 1, expr */ +/* KeyValuePair.key = 2, expr */ + +/* Lambda.location = 0, location */ +/* Lambda.parenthesised = 1, bool */ +/* Lambda.args = 2, arguments */ +/* Lambda.inner_scope = 3, Function */ + +/* List.location = 0, location */ +/* List.parenthesised = 1, bool */ +/* List.elts = 2, expr_list */ +/* List.ctx = 3, expr_context */ + +/* ListComp.location = 0, location */ +/* ListComp.parenthesised = 1, bool */ +/* ListComp.function = 2, Function */ +/* ListComp.iterable = 3, expr */ +/* ListComp.generators = 4, comprehension_list */ +/* ListComp.elt = 5, expr */ + +/* MatchStmt.location = 0, location */ +/* MatchStmt.subject = 1, expr */ +/* MatchStmt.cases = 2, stmt_list */ + +/* MatchAsPattern.location = 0, location */ +/* MatchAsPattern.parenthesised = 1, bool */ +/* MatchAsPattern.pattern = 2, pattern */ +/* MatchAsPattern.alias = 3, expr */ + +/* MatchCapturePattern.location = 0, location */ +/* MatchCapturePattern.parenthesised = 1, bool */ +/* MatchCapturePattern.variable = 2, expr */ + +/* MatchClassPattern.location = 0, location */ +/* MatchClassPattern.parenthesised = 1, bool */ +/* MatchClassPattern.class = 2, expr */ +/* MatchClassPattern.class_name = 3, expr */ +/* MatchClassPattern.positional = 4, pattern_list */ +/* MatchClassPattern.keyword = 5, pattern_list */ + +/* MatchDoubleStarPattern.location = 0, location */ +/* MatchDoubleStarPattern.parenthesised = 1, bool */ +/* MatchDoubleStarPattern.target = 2, pattern */ + +/* MatchKeyValuePattern.location = 0, location */ +/* MatchKeyValuePattern.parenthesised = 1, bool */ +/* MatchKeyValuePattern.key = 2, pattern */ +/* MatchKeyValuePattern.value = 3, pattern */ + +/* MatchKeywordPattern.location = 0, location */ +/* MatchKeywordPattern.parenthesised = 1, bool */ +/* MatchKeywordPattern.attribute = 2, expr */ +/* MatchKeywordPattern.value = 3, pattern */ + +/* MatchLiteralPattern.location = 0, location */ +/* MatchLiteralPattern.parenthesised = 1, bool */ +/* MatchLiteralPattern.literal = 2, expr */ + +/* MatchMappingPattern.location = 0, location */ +/* MatchMappingPattern.parenthesised = 1, bool */ +/* MatchMappingPattern.mappings = 2, pattern_list */ + +/* MatchOrPattern.location = 0, location */ +/* MatchOrPattern.parenthesised = 1, bool */ +/* MatchOrPattern.patterns = 2, pattern_list */ + +/* MatchSequencePattern.location = 0, location */ +/* MatchSequencePattern.parenthesised = 1, bool */ +/* MatchSequencePattern.patterns = 2, pattern_list */ + +/* MatchStarPattern.location = 0, location */ +/* MatchStarPattern.parenthesised = 1, bool */ +/* MatchStarPattern.target = 2, pattern */ + +/* MatchValuePattern.location = 0, location */ +/* MatchValuePattern.parenthesised = 1, bool */ +/* MatchValuePattern.value = 2, expr */ + +/* MatchWildcardPattern.location = 0, location */ +/* MatchWildcardPattern.parenthesised = 1, bool */ + +/* Module.name = 0, str */ +/* Module.hash = 1, str */ +/* Module.body = 2, stmt_list */ +/* Module.kind = 3, str */ + +/* Name.location = 0, location */ +/* Name.parenthesised = 1, bool */ +/* Name.variable = 2, variable */ +/* Name.ctx = 3, expr_context */ +/* Name = ParameterList */ + +/* Nonlocal.location = 0, location */ +/* Nonlocal.names = 1, str_list */ + +/* Num.location = 0, location */ +/* Num.parenthesised = 1, bool */ +/* Num.n = 2, number */ +/* Num.text = 3, number */ + +/* ParamSpec.location = 0, location */ +/* ParamSpec.name = 1, expr */ + +/* Pass.location = 0, location */ + +/* PlaceHolder.location = 0, location */ +/* PlaceHolder.parenthesised = 1, bool */ +/* PlaceHolder.variable = 2, variable */ +/* PlaceHolder.ctx = 3, expr_context */ + +/* Print.location = 0, location */ +/* Print.dest = 1, expr */ +/* Print.values = 2, expr_list */ +/* Print.nl = 3, bool */ + +/* Raise.location = 0, location */ +/* Raise.exc = 1, expr */ +/* Raise.cause = 2, expr */ +/* Raise.type = 3, expr */ +/* Raise.inst = 4, expr */ +/* Raise.tback = 5, expr */ + +/* Repr.location = 0, location */ +/* Repr.parenthesised = 1, bool */ +/* Repr.value = 2, expr */ + +/* Return.location = 0, location */ +/* Return.value = 1, expr */ + +/* Set.location = 0, location */ +/* Set.parenthesised = 1, bool */ +/* Set.elts = 2, expr_list */ + +/* SetComp.location = 0, location */ +/* SetComp.parenthesised = 1, bool */ +/* SetComp.function = 2, Function */ +/* SetComp.iterable = 3, expr */ + +/* Slice.location = 0, location */ +/* Slice.parenthesised = 1, bool */ +/* Slice.start = 2, expr */ +/* Slice.stop = 3, expr */ +/* Slice.step = 4, expr */ + +/* SpecialOperation.location = 0, location */ +/* SpecialOperation.parenthesised = 1, bool */ +/* SpecialOperation.name = 2, str */ +/* SpecialOperation.arguments = 3, expr_list */ + +/* Starred.location = 0, location */ +/* Starred.parenthesised = 1, bool */ +/* Starred.value = 2, expr */ +/* Starred.ctx = 3, expr_context */ + +/* Str.location = 0, location */ +/* Str.parenthesised = 1, bool */ +/* Str.s = 2, str */ +/* Str.prefix = 3, str */ +/* Str.implicitly_concatenated_parts = 4, StringPart_list */ + +/* StringPart.text = 0, str */ +/* StringPart.location = 1, location */ +/* StringPart = StringPartList */ +/* StringPartList = BytesOrStr */ + +/* Subscript.location = 0, location */ +/* Subscript.parenthesised = 1, bool */ +/* Subscript.value = 2, expr */ +/* Subscript.index = 3, expr */ +/* Subscript.ctx = 4, expr_context */ + +/* TemplateDottedNotation.location = 0, location */ +/* TemplateDottedNotation.parenthesised = 1, bool */ +/* TemplateDottedNotation.value = 2, expr */ +/* TemplateDottedNotation.attr = 3, str */ +/* TemplateDottedNotation.ctx = 4, expr_context */ + +/* TemplateWrite.location = 0, location */ +/* TemplateWrite.value = 1, expr */ + +/* Try.location = 0, location */ +/* Try.body = 1, stmt_list */ +/* Try.orelse = 2, stmt_list */ +/* Try.handlers = 3, stmt_list */ +/* Try.finalbody = 4, stmt_list */ + +/* Tuple.location = 0, location */ +/* Tuple.parenthesised = 1, bool */ +/* Tuple.elts = 2, expr_list */ +/* Tuple.ctx = 3, expr_context */ +/* Tuple = ParameterList */ + +/* TypeAlias.location = 0, location */ +/* TypeAlias.name = 1, expr */ +/* TypeAlias.type_parameters = 2, type_parameter_list */ +/* TypeAlias.value = 3, expr */ + +/* TypeVar.location = 0, location */ +/* TypeVar.name = 1, expr */ +/* TypeVar.bound = 2, expr */ + +/* TypeVarTuple.location = 0, location */ +/* TypeVarTuple.name = 1, expr */ + +/* UnaryExpr.location = 0, location */ +/* UnaryExpr.parenthesised = 1, bool */ +/* UnaryExpr.op = 2, unaryop */ +/* UnaryExpr.operand = 3, expr */ + +/* While.location = 0, location */ +/* While.test = 1, expr */ +/* While.body = 2, stmt_list */ +/* While.orelse = 3, stmt_list */ + +/* With.location = 0, location */ +/* With.context_expr = 1, expr */ +/* With.optional_vars = 2, expr */ +/* With.body = 3, stmt_list */ +/* With.is_async = 4, bool */ + +/* Yield.location = 0, location */ +/* Yield.parenthesised = 1, bool */ +/* Yield.value = 2, expr */ + +/* YieldFrom.location = 0, location */ +/* YieldFrom.parenthesised = 1, bool */ +/* YieldFrom.value = 2, expr */ + +/* Alias.value = 0, expr */ +/* Alias.asname = 1, expr */ +/* Alias = AliasList */ +/* AliasList = Import */ + +/* Arguments.kw_defaults = 0, expr_list */ +/* Arguments.defaults = 1, expr_list */ +/* Arguments.annotations = 2, expr_list */ +/* Arguments.varargannotation = 3, expr */ +/* Arguments.kwargannotation = 4, expr */ +/* Arguments.kw_annotations = 5, expr_list */ +/* Arguments = ArgumentsParent */ +/* boolean = BoolParent */ +/* Boolop = BoolExpr */ +/* string = Bytes */ +/* Cmpop = CmpopList */ +/* CmpopList = Compare */ + +/* Comprehension.location = 0, location */ +/* Comprehension.iter = 1, expr */ +/* Comprehension.target = 2, expr */ +/* Comprehension.ifs = 3, expr_list */ +/* Comprehension = ComprehensionList */ +/* ComprehensionList = ListComp */ +/* DictItem = DictItemList */ +/* DictItemList = DictItemListParent */ + +/* Expr.location = 0, location */ +/* Expr.parenthesised = 1, bool */ +/* Expr = ExprParent */ +/* ExprContext = ExprContextParent */ +/* ExprList = ExprListParent */ +/* int = ImportExpr */ + +/* Keyword.location = 0, location */ +/* Keyword.value = 1, expr */ +/* Keyword.arg = 2, str */ +/* Location = LocationParent */ +/* string = Num */ +/* Operator = BinaryExpr */ +/* ParameterList = Function */ + +/* Pattern.location = 0, location */ +/* Pattern.parenthesised = 1, bool */ +/* Pattern = PatternParent */ +/* PatternList = PatternListParent */ + +/* Stmt.location = 0, location */ +/* Stmt = StmtList */ +/* StmtList = StmtListParent */ +/* string = StrParent */ +/* StringList = StrListParent */ + +/* TypeParameter.location = 0, location */ +/* TypeParameter = TypeParameterList */ +/* TypeParameterList = TypeParameterListParent */ +/* Unaryop = UnaryExpr */ +/* Variable = VariableParent */ +py_Classes(unique int id : @py_Class, + unique int parent : @py_ClassExpr ref); + +py_Functions(unique int id : @py_Function, + unique int parent : @py_Function_parent ref); + +py_Modules(unique int id : @py_Module); + +py_StringParts(unique int id : @py_StringPart, + int parent : @py_StringPart_list ref, + int idx : int ref); + +py_StringPart_lists(unique int id : @py_StringPart_list, + unique int parent : @py_Bytes_or_Str ref); + +py_aliases(unique int id : @py_alias, + int parent : @py_alias_list ref, + int idx : int ref); + +py_alias_lists(unique int id : @py_alias_list, + unique int parent : @py_Import ref); + +py_arguments(unique int id : @py_arguments, + unique int parent : @py_arguments_parent ref); + +py_bools(int parent : @py_bool_parent ref, + int idx : int ref); + +py_boolops(unique int id : @py_boolop, + int kind: int ref, + unique int parent : @py_BoolExpr ref); + +py_bytes(varchar(1) id : string ref, + int parent : @py_Bytes ref, + int idx : int ref); + +py_cmpops(unique int id : @py_cmpop, + int kind: int ref, + int parent : @py_cmpop_list ref, + int idx : int ref); + +py_cmpop_lists(unique int id : @py_cmpop_list, + unique int parent : @py_Compare ref); + +py_comprehensions(unique int id : @py_comprehension, + int parent : @py_comprehension_list ref, + int idx : int ref); + +py_comprehension_lists(unique int id : @py_comprehension_list, + unique int parent : @py_ListComp ref); + +py_dict_items(unique int id : @py_dict_item, + int kind: int ref, + int parent : @py_dict_item_list ref, + int idx : int ref); + +py_dict_item_lists(unique int id : @py_dict_item_list, + unique int parent : @py_dict_item_list_parent ref); + +py_exprs(unique int id : @py_expr, + int kind: int ref, + int parent : @py_expr_parent ref, + int idx : int ref); + +py_expr_contexts(unique int id : @py_expr_context, + int kind: int ref, + unique int parent : @py_expr_context_parent ref); + +py_expr_lists(unique int id : @py_expr_list, + int parent : @py_expr_list_parent ref, + int idx : int ref); + +py_ints(int id : int ref, + unique int parent : @py_ImportExpr ref); + +py_locations(unique int id : @location ref, + unique int parent : @py_location_parent ref); + +py_numbers(varchar(1) id : string ref, + int parent : @py_Num ref, + int idx : int ref); + +py_operators(unique int id : @py_operator, + int kind: int ref, + unique int parent : @py_BinaryExpr ref); + +py_parameter_lists(unique int id : @py_parameter_list, + unique int parent : @py_Function ref); + +py_patterns(unique int id : @py_pattern, + int kind: int ref, + int parent : @py_pattern_parent ref, + int idx : int ref); + +py_pattern_lists(unique int id : @py_pattern_list, + int parent : @py_pattern_list_parent ref, + int idx : int ref); + +py_stmts(unique int id : @py_stmt, + int kind: int ref, + int parent : @py_stmt_list ref, + int idx : int ref); + +py_stmt_lists(unique int id : @py_stmt_list, + int parent : @py_stmt_list_parent ref, + int idx : int ref); + +py_strs(varchar(1) id : string ref, + int parent : @py_str_parent ref, + int idx : int ref); + +py_str_lists(unique int id : @py_str_list, + unique int parent : @py_str_list_parent ref); + +py_type_parameters(unique int id : @py_type_parameter, + int kind: int ref, + int parent : @py_type_parameter_list ref, + int idx : int ref); + +py_type_parameter_lists(unique int id : @py_type_parameter_list, + unique int parent : @py_type_parameter_list_parent ref); + +py_unaryops(unique int id : @py_unaryop, + int kind: int ref, + unique int parent : @py_UnaryExpr ref); + +py_variables(int id : @py_variable ref, + unique int parent : @py_variable_parent ref); + +case @py_boolop.kind of + 0 = @py_And +| 1 = @py_Or; + +case @py_cmpop.kind of + 0 = @py_Eq +| 1 = @py_Gt +| 2 = @py_GtE +| 3 = @py_In +| 4 = @py_Is +| 5 = @py_IsNot +| 6 = @py_Lt +| 7 = @py_LtE +| 8 = @py_NotEq +| 9 = @py_NotIn; + +case @py_dict_item.kind of + 0 = @py_DictUnpacking +| 1 = @py_KeyValuePair +| 2 = @py_keyword; + +case @py_expr.kind of + 0 = @py_Attribute +| 1 = @py_BinaryExpr +| 2 = @py_BoolExpr +| 3 = @py_Bytes +| 4 = @py_Call +| 5 = @py_ClassExpr +| 6 = @py_Compare +| 7 = @py_Dict +| 8 = @py_DictComp +| 9 = @py_Ellipsis +| 10 = @py_FunctionExpr +| 11 = @py_GeneratorExp +| 12 = @py_IfExp +| 13 = @py_ImportExpr +| 14 = @py_ImportMember +| 15 = @py_Lambda +| 16 = @py_List +| 17 = @py_ListComp +| 18 = @py_Guard +| 19 = @py_Name +| 20 = @py_Num +| 21 = @py_Repr +| 22 = @py_Set +| 23 = @py_SetComp +| 24 = @py_Slice +| 25 = @py_Starred +| 26 = @py_Str +| 27 = @py_Subscript +| 28 = @py_Tuple +| 29 = @py_UnaryExpr +| 30 = @py_Yield +| 31 = @py_YieldFrom +| 32 = @py_TemplateDottedNotation +| 33 = @py_Filter +| 34 = @py_PlaceHolder +| 35 = @py_Await +| 36 = @py_Fstring +| 37 = @py_FormattedValue +| 38 = @py_AssignExpr +| 39 = @py_SpecialOperation; + +case @py_expr_context.kind of + 0 = @py_AugLoad +| 1 = @py_AugStore +| 2 = @py_Del +| 3 = @py_Load +| 4 = @py_Param +| 5 = @py_Store; + +case @py_operator.kind of + 0 = @py_Add +| 1 = @py_BitAnd +| 2 = @py_BitOr +| 3 = @py_BitXor +| 4 = @py_Div +| 5 = @py_FloorDiv +| 6 = @py_LShift +| 7 = @py_Mod +| 8 = @py_Mult +| 9 = @py_Pow +| 10 = @py_RShift +| 11 = @py_Sub +| 12 = @py_MatMult; + +case @py_pattern.kind of + 0 = @py_MatchAsPattern +| 1 = @py_MatchOrPattern +| 2 = @py_MatchLiteralPattern +| 3 = @py_MatchCapturePattern +| 4 = @py_MatchWildcardPattern +| 5 = @py_MatchValuePattern +| 6 = @py_MatchSequencePattern +| 7 = @py_MatchStarPattern +| 8 = @py_MatchMappingPattern +| 9 = @py_MatchDoubleStarPattern +| 10 = @py_MatchKeyValuePattern +| 11 = @py_MatchClassPattern +| 12 = @py_MatchKeywordPattern; + +case @py_stmt.kind of + 0 = @py_Assert +| 1 = @py_Assign +| 2 = @py_AugAssign +| 3 = @py_Break +| 4 = @py_Continue +| 5 = @py_Delete +| 6 = @py_ExceptStmt +| 7 = @py_ExceptGroupStmt +| 8 = @py_Exec +| 9 = @py_Expr_stmt +| 10 = @py_For +| 11 = @py_Global +| 12 = @py_If +| 13 = @py_Import +| 14 = @py_ImportStar +| 15 = @py_MatchStmt +| 16 = @py_Case +| 17 = @py_Nonlocal +| 18 = @py_Pass +| 19 = @py_Print +| 20 = @py_Raise +| 21 = @py_Return +| 22 = @py_Try +| 23 = @py_While +| 24 = @py_With +| 25 = @py_TemplateWrite +| 26 = @py_AnnAssign +| 27 = @py_TypeAlias; + +case @py_type_parameter.kind of + 0 = @py_ParamSpec +| 1 = @py_TypeVar +| 2 = @py_TypeVarTuple; + +case @py_unaryop.kind of + 0 = @py_Invert +| 1 = @py_Not +| 2 = @py_UAdd +| 3 = @py_USub; + +@py_Bytes_or_Str = @py_Bytes | @py_Str; + +@py_Function_parent = @py_DictComp | @py_FunctionExpr | @py_GeneratorExp | @py_Lambda | @py_ListComp | @py_SetComp; + +@py_arguments_parent = @py_FunctionExpr | @py_Lambda; + +@py_ast_node = @py_Class | @py_Function | @py_Module | @py_StringPart | @py_comprehension | @py_dict_item | @py_expr | @py_pattern | @py_stmt | @py_type_parameter; + +@py_bool_parent = @py_For | @py_Function | @py_Print | @py_With | @py_expr | @py_pattern; + +@py_dict_item_list_parent = @py_Call | @py_ClassExpr | @py_Dict; + +@py_expr_context_parent = @py_Attribute | @py_List | @py_Name | @py_PlaceHolder | @py_Starred | @py_Subscript | @py_TemplateDottedNotation | @py_Tuple; + +@py_expr_list_parent = @py_Assign | @py_BoolExpr | @py_Call | @py_ClassExpr | @py_Compare | @py_Delete | @py_Fstring | @py_Function | @py_List | @py_Print | @py_Set | @py_SpecialOperation | @py_Tuple | @py_arguments | @py_comprehension; + +@py_expr_or_stmt = @py_expr | @py_stmt; + +@py_expr_parent = @py_AnnAssign | @py_Assert | @py_Assign | @py_AssignExpr | @py_Attribute | @py_AugAssign | @py_Await | @py_BinaryExpr | @py_Call | @py_Case | @py_Compare | @py_DictComp | @py_DictUnpacking | @py_ExceptGroupStmt | @py_ExceptStmt | @py_Exec | @py_Expr_stmt | @py_Filter | @py_For | @py_FormattedValue | @py_Function | @py_FunctionExpr | @py_GeneratorExp | @py_Guard | @py_If | @py_IfExp | @py_ImportMember | @py_ImportStar | @py_KeyValuePair | @py_ListComp | @py_MatchAsPattern | @py_MatchCapturePattern | @py_MatchClassPattern | @py_MatchKeywordPattern | @py_MatchLiteralPattern | @py_MatchStmt | @py_MatchValuePattern | @py_ParamSpec | @py_Print | @py_Raise | @py_Repr | @py_Return | @py_SetComp | @py_Slice | @py_Starred | @py_Subscript | @py_TemplateDottedNotation | @py_TemplateWrite | @py_TypeAlias | @py_TypeVar | @py_TypeVarTuple | @py_UnaryExpr | @py_While | @py_With | @py_Yield | @py_YieldFrom | @py_alias | @py_arguments | @py_comprehension | @py_expr_list | @py_keyword | @py_parameter_list; + +@py_location_parent = @py_DictUnpacking | @py_KeyValuePair | @py_StringPart | @py_comprehension | @py_expr | @py_keyword | @py_pattern | @py_stmt | @py_type_parameter; + +@py_parameter = @py_Name | @py_Tuple; + +@py_pattern_list_parent = @py_MatchClassPattern | @py_MatchMappingPattern | @py_MatchOrPattern | @py_MatchSequencePattern; + +@py_pattern_parent = @py_Case | @py_MatchAsPattern | @py_MatchDoubleStarPattern | @py_MatchKeyValuePattern | @py_MatchKeywordPattern | @py_MatchStarPattern | @py_pattern_list; + +@py_scope = @py_Class | @py_Function | @py_Module; + +@py_stmt_list_parent = @py_Case | @py_Class | @py_ExceptGroupStmt | @py_ExceptStmt | @py_For | @py_Function | @py_If | @py_MatchStmt | @py_Module | @py_Try | @py_While | @py_With; + +@py_str_list_parent = @py_Global | @py_Nonlocal; + +@py_str_parent = @py_Attribute | @py_Class | @py_ClassExpr | @py_FormattedValue | @py_Function | @py_FunctionExpr | @py_ImportExpr | @py_ImportMember | @py_Module | @py_SpecialOperation | @py_Str | @py_StringPart | @py_TemplateDottedNotation | @py_keyword | @py_str_list; + +@py_type_parameter_list_parent = @py_ClassExpr | @py_Function | @py_TypeAlias; + +@py_variable_parent = @py_Name | @py_PlaceHolder; + + +/* + * End of auto-generated part + */ + + + +/* Map relative names to absolute names for imports */ +py_absolute_names(int module : @py_Module ref, + varchar(1) relname : string ref, + varchar(1) absname : string ref); + +py_exports(int id : @py_Module ref, + varchar(1) name : string ref); + +/* Successor information */ +py_successors(int predecessor : @py_flow_node ref, + int successor : @py_flow_node ref); + +py_true_successors(int predecessor : @py_flow_node ref, + int successor : @py_flow_node ref); + +py_exception_successors(int predecessor : @py_flow_node ref, + int successor : @py_flow_node ref); + +py_false_successors(int predecessor : @py_flow_node ref, + int successor : @py_flow_node ref); + +py_flow_bb_node(unique int flownode : @py_flow_node, + int realnode : @py_ast_node ref, + int basicblock : @py_flow_node ref, + int index : int ref); + +py_scope_flow(int flow : @py_flow_node ref, + int scope : @py_scope ref, + int kind : int ref); + +py_idoms(unique int node : @py_flow_node ref, + int immediate_dominator : @py_flow_node ref); + +py_ssa_phi(int phi : @py_ssa_var ref, + int arg: @py_ssa_var ref); + +py_ssa_var(unique int id : @py_ssa_var, + int var : @py_variable ref); + +py_ssa_use(int node: @py_flow_node ref, + int var : @py_ssa_var ref); + +py_ssa_defn(unique int id : @py_ssa_var ref, + int node: @py_flow_node ref); + +@py_base_var = @py_variable | @py_ssa_var; + +py_scopes(unique int node : @py_expr_or_stmt ref, + int scope : @py_scope ref); + +py_scope_location(unique int id : @location ref, + unique int scope : @py_scope ref); + +py_flags_versioned(varchar(1) name : string ref, + varchar(1) value : string ref, + varchar(1) version : string ref); + +py_syntax_error_versioned(unique int id : @location ref, + varchar(1) message : string ref, + varchar(1) version : string ref); + +py_comments(unique int id : @py_comment, + varchar(1) text : string ref, + unique int location : @location ref); + +/* Type information support */ + +py_cobjects(unique int obj : @py_cobject); + +py_cobjecttypes(unique int obj : @py_cobject ref, + int typeof : @py_cobject ref); + +py_cobjectnames(unique int obj : @py_cobject ref, + varchar(1) name : string ref); + +/* Kind should be 0 for introspection, > 0 from source, as follows: + 1 from C extension source + */ +py_cobject_sources(int obj : @py_cobject ref, + int kind : int ref); + +py_cmembers_versioned(int object : @py_cobject ref, + varchar(1) name : string ref, + int member : @py_cobject ref, + varchar(1) version : string ref); + +py_citems(int object : @py_cobject ref, + int index : int ref, + int member : @py_cobject ref); + +ext_argtype(int funcid : @py_object ref, + int arg : int ref, + int typeid : @py_object ref); + +ext_rettype(int funcid : @py_object ref, + int typeid : @py_object ref); + +ext_proptype(int propid : @py_object ref, + int typeid : @py_object ref); + +ext_argreturn(int funcid : @py_object ref, + int arg : int ref); + +py_special_objects(unique int obj : @py_cobject ref, + unique varchar(1) name : string ref); + +py_decorated_object(int object : @py_object ref, + int level: int ref); + +@py_object = @py_cobject | @py_flow_node; + +@py_source_element = @py_ast_node | @container; diff --git a/python/downgrades/728c6d65e61d808ae276013ebc15abc3a97aaef1/py_stmts.ql b/python/downgrades/728c6d65e61d808ae276013ebc15abc3a97aaef1/py_stmts.ql new file mode 100644 index 00000000000..5ae1374fa9a --- /dev/null +++ b/python/downgrades/728c6d65e61d808ae276013ebc15abc3a97aaef1/py_stmts.ql @@ -0,0 +1,18 @@ +// We must wrap the DB types, as these cannot appear in argument lists +class Stmt_ extends @py_stmt { + string toString() { result = "Stmt" } +} + +class StmtList_ extends @py_stmt_list { + string toString() { result = "StmtList" } +} + +query predicate py_stmts_without_typealias(Stmt_ id, int kind, StmtList_ parent, int idx) { + py_stmts(id, kind, parent, idx) and + // From the dbscheme: + // + // case @py_stmt.kind of + // ... + // | 27 = @py_TypeAlias; + kind != 27 +} diff --git a/python/downgrades/728c6d65e61d808ae276013ebc15abc3a97aaef1/semmlecode.python.dbscheme b/python/downgrades/728c6d65e61d808ae276013ebc15abc3a97aaef1/semmlecode.python.dbscheme new file mode 100644 index 00000000000..0565f746643 --- /dev/null +++ b/python/downgrades/728c6d65e61d808ae276013ebc15abc3a97aaef1/semmlecode.python.dbscheme @@ -0,0 +1,1196 @@ +/* + * This dbscheme is auto-generated by 'semmle/dbscheme_gen.py'. + * WARNING: Any modifications to this file will be lost. + * Relations can be changed by modifying master.py or + * by adding rules to dbscheme.template + */ + +/* This is a dummy line to alter the dbscheme, so we can make a database upgrade + * without actually changing any of the dbscheme predicates. It contains a date + * to allow for such updates in the future as well. + * + * 2020-07-02 + * + * DO NOT remove this comment carelessly, since it can revert the dbscheme back to a + * previously seen state (matching a previously seen SHA), which would make the upgrade + * mechanism not work properly. + */ + +/*- DEPRECATED: External defects and metrics -*/ + +externalDefects( + unique int id : @externalDefect, + varchar(900) queryPath : string ref, + int location : @location ref, + varchar(900) message : string ref, + float severity : float ref +); + +externalMetrics( + unique int id : @externalMetric, + varchar(900) queryPath : string ref, + int location : @location ref, + float value : float ref +); + +/*- External data -*/ + +/** + * External data, loaded from CSV files during snapshot creation. See + * [Tutorial: Incorporating external data](https://help.semmle.com/wiki/display/SD/Tutorial%3A+Incorporating+external+data) + * for more information. + */ +externalData( + int id : @externalDataElement, + string path : string ref, + int column: int ref, + string value : string ref +); + +/*- DEPRECATED: Snapshot date -*/ + +snapshotDate(unique date snapshotDate : date ref); + +/*- Source location prefix -*/ + +/** + * The source location of the snapshot. + */ +sourceLocationPrefix(string prefix : string ref); + +/*- DEPRECATED: Duplicate code -*/ + +duplicateCode( + unique int id : @duplication, + string relativePath : string ref, + int equivClass : int ref +); + +similarCode( + unique int id : @similarity, + string relativePath : string ref, + int equivClass : int ref +); + +@duplication_or_similarity = @duplication | @similarity + +tokens( + int id : @duplication_or_similarity ref, + int offset : int ref, + int beginLine : int ref, + int beginColumn : int ref, + int endLine : int ref, + int endColumn : int ref +); + +/*- DEPRECATED: Version control data -*/ + +svnentries( + unique int id : @svnentry, + string revision : string ref, + string author : string ref, + date revisionDate : date ref, + int changeSize : int ref +) + +svnaffectedfiles( + int id : @svnentry ref, + int file : @file ref, + string action : string ref +) + +svnentrymsg( + unique int id : @svnentry ref, + string message : string ref +) + +svnchurn( + int commit : @svnentry ref, + int file : @file ref, + int addedLines : int ref, + int deletedLines : int ref +) + +/*- Lines of code -*/ + +numlines( + int element_id: @sourceline ref, + int num_lines: int ref, + int num_code: int ref, + int num_comment: int ref +); + +/*- Files and folders -*/ + +/** + * The location of an element. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `file`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ +locations_default( + unique int id: @location_default, + int file: @file ref, + int beginLine: int ref, + int beginColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +files( + unique int id: @file, + string name: string ref +); + +folders( + unique int id: @folder, + string name: string ref +); + +@container = @file | @folder + +containerparent( + int parent: @container ref, + unique int child: @container ref +); + +/*- XML Files -*/ + +xmlEncoding( + unique int id: @file ref, + string encoding: string ref +); + +xmlDTDs( + unique int id: @xmldtd, + string root: string ref, + string publicId: string ref, + string systemId: string ref, + int fileid: @file ref +); + +xmlElements( + unique int id: @xmlelement, + string name: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int fileid: @file ref +); + +xmlAttrs( + unique int id: @xmlattribute, + int elementid: @xmlelement ref, + string name: string ref, + string value: string ref, + int idx: int ref, + int fileid: @file ref +); + +xmlNs( + int id: @xmlnamespace, + string prefixName: string ref, + string URI: string ref, + int fileid: @file ref +); + +xmlHasNs( + int elementId: @xmlnamespaceable ref, + int nsId: @xmlnamespace ref, + int fileid: @file ref +); + +xmlComments( + unique int id: @xmlcomment, + string text: string ref, + int parentid: @xmlparent ref, + int fileid: @file ref +); + +xmlChars( + unique int id: @xmlcharacters, + string text: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int isCDATA: int ref, + int fileid: @file ref +); + +@xmlparent = @file | @xmlelement; +@xmlnamespaceable = @xmlelement | @xmlattribute; + +xmllocations( + int xmlElement: @xmllocatable ref, + int location: @location_default ref +); + +@xmllocatable = @xmlcharacters | @xmlelement | @xmlcomment | @xmlattribute | @xmldtd | @file | @xmlnamespace; + +/*- YAML -*/ + +#keyset[parent, idx] +yaml (unique int id: @yaml_node, + int kind: int ref, + int parent: @yaml_node_parent ref, + int idx: int ref, + string tag: string ref, + string tostring: string ref); + +case @yaml_node.kind of + 0 = @yaml_scalar_node +| 1 = @yaml_mapping_node +| 2 = @yaml_sequence_node +| 3 = @yaml_alias_node +; + +@yaml_collection_node = @yaml_mapping_node | @yaml_sequence_node; + +@yaml_node_parent = @yaml_collection_node | @file; + +yaml_anchors (unique int node: @yaml_node ref, + string anchor: string ref); + +yaml_aliases (unique int alias: @yaml_alias_node ref, + string target: string ref); + +yaml_scalars (unique int scalar: @yaml_scalar_node ref, + int style: int ref, + string value: string ref); + +yaml_errors (unique int id: @yaml_error, + string message: string ref); + +yaml_locations(unique int locatable: @yaml_locatable ref, + int location: @location_default ref); + +@yaml_locatable = @yaml_node | @yaml_error; + +/*- Python dbscheme -*/ + +/* + * Line metrics + */ +py_codelines(int id : @py_scope ref, + int count : int ref); + +py_commentlines(int id : @py_scope ref, + int count : int ref); + +py_docstringlines(int id : @py_scope ref, + int count : int ref); + +py_alllines(int id : @py_scope ref, + int count : int ref); + +/**************************** + Python dbscheme +****************************/ + +@sourceline = @file | @py_Module | @xmllocatable; + +@location = @location_ast | @location_default ; + +locations_ast(unique int id: @location_ast, + int module: @py_Module ref, + int beginLine: int ref, + int beginColumn: int ref, + int endLine: int ref, + int endColumn: int ref); + +file_contents(unique int file: @file ref, string contents: string ref); + +py_module_path(int module: @py_Module ref, int file: @container ref); + +variable(unique int id : @py_variable, + int scope : @py_scope ref, + varchar(1) name : string ref); + +py_line_lengths(unique int id : @py_line, + int file: @py_Module ref, + int line : int ref, + int length : int ref); + +py_extracted_version(int module : @py_Module ref, + varchar(1) version : string ref); + +/* AUTO GENERATED PART STARTS HERE */ + + +/* AnnAssign.location = 0, location */ +/* AnnAssign.value = 1, expr */ +/* AnnAssign.annotation = 2, expr */ +/* AnnAssign.target = 3, expr */ + +/* Assert.location = 0, location */ +/* Assert.test = 1, expr */ +/* Assert.msg = 2, expr */ + +/* Assign.location = 0, location */ +/* Assign.value = 1, expr */ +/* Assign.targets = 2, expr_list */ + +/* AssignExpr.location = 0, location */ +/* AssignExpr.parenthesised = 1, bool */ +/* AssignExpr.value = 2, expr */ +/* AssignExpr.target = 3, expr */ + +/* Attribute.location = 0, location */ +/* Attribute.parenthesised = 1, bool */ +/* Attribute.value = 2, expr */ +/* Attribute.attr = 3, str */ +/* Attribute.ctx = 4, expr_context */ + +/* AugAssign.location = 0, location */ +/* AugAssign.operation = 1, BinOp */ + +/* Await.location = 0, location */ +/* Await.parenthesised = 1, bool */ +/* Await.value = 2, expr */ + +/* BinaryExpr.location = 0, location */ +/* BinaryExpr.parenthesised = 1, bool */ +/* BinaryExpr.left = 2, expr */ +/* BinaryExpr.op = 3, operator */ +/* BinaryExpr.right = 4, expr */ +/* BinaryExpr = AugAssign */ + +/* BoolExpr.location = 0, location */ +/* BoolExpr.parenthesised = 1, bool */ +/* BoolExpr.op = 2, boolop */ +/* BoolExpr.values = 3, expr_list */ + +/* Break.location = 0, location */ + +/* Bytes.location = 0, location */ +/* Bytes.parenthesised = 1, bool */ +/* Bytes.s = 2, bytes */ +/* Bytes.prefix = 3, bytes */ +/* Bytes.implicitly_concatenated_parts = 4, StringPart_list */ + +/* Call.location = 0, location */ +/* Call.parenthesised = 1, bool */ +/* Call.func = 2, expr */ +/* Call.positional_args = 3, expr_list */ +/* Call.named_args = 4, dict_item_list */ + +/* Case.location = 0, location */ +/* Case.pattern = 1, pattern */ +/* Case.guard = 2, expr */ +/* Case.body = 3, stmt_list */ + +/* Class.name = 0, str */ +/* Class.body = 1, stmt_list */ +/* Class = ClassExpr */ + +/* ClassExpr.location = 0, location */ +/* ClassExpr.parenthesised = 1, bool */ +/* ClassExpr.name = 2, str */ +/* ClassExpr.bases = 3, expr_list */ +/* ClassExpr.keywords = 4, dict_item_list */ +/* ClassExpr.inner_scope = 5, Class */ + +/* Compare.location = 0, location */ +/* Compare.parenthesised = 1, bool */ +/* Compare.left = 2, expr */ +/* Compare.ops = 3, cmpop_list */ +/* Compare.comparators = 4, expr_list */ + +/* Continue.location = 0, location */ + +/* Delete.location = 0, location */ +/* Delete.targets = 1, expr_list */ + +/* Dict.location = 0, location */ +/* Dict.parenthesised = 1, bool */ +/* Dict.items = 2, dict_item_list */ + +/* DictComp.location = 0, location */ +/* DictComp.parenthesised = 1, bool */ +/* DictComp.function = 2, Function */ +/* DictComp.iterable = 3, expr */ + +/* DictUnpacking.location = 0, location */ +/* DictUnpacking.value = 1, expr */ + +/* Ellipsis.location = 0, location */ +/* Ellipsis.parenthesised = 1, bool */ + +/* ExceptGroupStmt.location = 0, location */ +/* ExceptGroupStmt.type = 1, expr */ +/* ExceptGroupStmt.name = 2, expr */ +/* ExceptGroupStmt.body = 3, stmt_list */ + +/* ExceptStmt.location = 0, location */ +/* ExceptStmt.type = 1, expr */ +/* ExceptStmt.name = 2, expr */ +/* ExceptStmt.body = 3, stmt_list */ + +/* Exec.location = 0, location */ +/* Exec.body = 1, expr */ +/* Exec.globals = 2, expr */ +/* Exec.locals = 3, expr */ + +/* ExprStmt.location = 0, location */ +/* ExprStmt.value = 1, expr */ + +/* Filter.location = 0, location */ +/* Filter.parenthesised = 1, bool */ +/* Filter.value = 2, expr */ +/* Filter.filter = 3, expr */ + +/* For.location = 0, location */ +/* For.target = 1, expr */ +/* For.iter = 2, expr */ +/* For.body = 3, stmt_list */ +/* For.orelse = 4, stmt_list */ +/* For.is_async = 5, bool */ + +/* FormattedValue.location = 0, location */ +/* FormattedValue.parenthesised = 1, bool */ +/* FormattedValue.value = 2, expr */ +/* FormattedValue.conversion = 3, str */ +/* FormattedValue.format_spec = 4, JoinedStr */ + +/* Function.name = 0, str */ +/* Function.args = 1, parameter_list */ +/* Function.vararg = 2, expr */ +/* Function.kwonlyargs = 3, expr_list */ +/* Function.kwarg = 4, expr */ +/* Function.body = 5, stmt_list */ +/* Function.is_async = 6, bool */ +/* Function = FunctionParent */ + +/* FunctionExpr.location = 0, location */ +/* FunctionExpr.parenthesised = 1, bool */ +/* FunctionExpr.name = 2, str */ +/* FunctionExpr.args = 3, arguments */ +/* FunctionExpr.returns = 4, expr */ +/* FunctionExpr.inner_scope = 5, Function */ + +/* GeneratorExp.location = 0, location */ +/* GeneratorExp.parenthesised = 1, bool */ +/* GeneratorExp.function = 2, Function */ +/* GeneratorExp.iterable = 3, expr */ + +/* Global.location = 0, location */ +/* Global.names = 1, str_list */ + +/* Guard.location = 0, location */ +/* Guard.parenthesised = 1, bool */ +/* Guard.test = 2, expr */ + +/* If.location = 0, location */ +/* If.test = 1, expr */ +/* If.body = 2, stmt_list */ +/* If.orelse = 3, stmt_list */ + +/* IfExp.location = 0, location */ +/* IfExp.parenthesised = 1, bool */ +/* IfExp.test = 2, expr */ +/* IfExp.body = 3, expr */ +/* IfExp.orelse = 4, expr */ + +/* Import.location = 0, location */ +/* Import.names = 1, alias_list */ + +/* ImportExpr.location = 0, location */ +/* ImportExpr.parenthesised = 1, bool */ +/* ImportExpr.level = 2, int */ +/* ImportExpr.name = 3, str */ +/* ImportExpr.top = 4, bool */ + +/* ImportStar.location = 0, location */ +/* ImportStar.module = 1, expr */ + +/* ImportMember.location = 0, location */ +/* ImportMember.parenthesised = 1, bool */ +/* ImportMember.module = 2, expr */ +/* ImportMember.name = 3, str */ + +/* Fstring.location = 0, location */ +/* Fstring.parenthesised = 1, bool */ +/* Fstring.values = 2, expr_list */ +/* Fstring = FormattedValue */ + +/* KeyValuePair.location = 0, location */ +/* KeyValuePair.value = 1, expr */ +/* KeyValuePair.key = 2, expr */ + +/* Lambda.location = 0, location */ +/* Lambda.parenthesised = 1, bool */ +/* Lambda.args = 2, arguments */ +/* Lambda.inner_scope = 3, Function */ + +/* List.location = 0, location */ +/* List.parenthesised = 1, bool */ +/* List.elts = 2, expr_list */ +/* List.ctx = 3, expr_context */ + +/* ListComp.location = 0, location */ +/* ListComp.parenthesised = 1, bool */ +/* ListComp.function = 2, Function */ +/* ListComp.iterable = 3, expr */ +/* ListComp.generators = 4, comprehension_list */ +/* ListComp.elt = 5, expr */ + +/* MatchStmt.location = 0, location */ +/* MatchStmt.subject = 1, expr */ +/* MatchStmt.cases = 2, stmt_list */ + +/* MatchAsPattern.location = 0, location */ +/* MatchAsPattern.parenthesised = 1, bool */ +/* MatchAsPattern.pattern = 2, pattern */ +/* MatchAsPattern.alias = 3, expr */ + +/* MatchCapturePattern.location = 0, location */ +/* MatchCapturePattern.parenthesised = 1, bool */ +/* MatchCapturePattern.variable = 2, expr */ + +/* MatchClassPattern.location = 0, location */ +/* MatchClassPattern.parenthesised = 1, bool */ +/* MatchClassPattern.class = 2, expr */ +/* MatchClassPattern.class_name = 3, expr */ +/* MatchClassPattern.positional = 4, pattern_list */ +/* MatchClassPattern.keyword = 5, pattern_list */ + +/* MatchDoubleStarPattern.location = 0, location */ +/* MatchDoubleStarPattern.parenthesised = 1, bool */ +/* MatchDoubleStarPattern.target = 2, pattern */ + +/* MatchKeyValuePattern.location = 0, location */ +/* MatchKeyValuePattern.parenthesised = 1, bool */ +/* MatchKeyValuePattern.key = 2, pattern */ +/* MatchKeyValuePattern.value = 3, pattern */ + +/* MatchKeywordPattern.location = 0, location */ +/* MatchKeywordPattern.parenthesised = 1, bool */ +/* MatchKeywordPattern.attribute = 2, expr */ +/* MatchKeywordPattern.value = 3, pattern */ + +/* MatchLiteralPattern.location = 0, location */ +/* MatchLiteralPattern.parenthesised = 1, bool */ +/* MatchLiteralPattern.literal = 2, expr */ + +/* MatchMappingPattern.location = 0, location */ +/* MatchMappingPattern.parenthesised = 1, bool */ +/* MatchMappingPattern.mappings = 2, pattern_list */ + +/* MatchOrPattern.location = 0, location */ +/* MatchOrPattern.parenthesised = 1, bool */ +/* MatchOrPattern.patterns = 2, pattern_list */ + +/* MatchSequencePattern.location = 0, location */ +/* MatchSequencePattern.parenthesised = 1, bool */ +/* MatchSequencePattern.patterns = 2, pattern_list */ + +/* MatchStarPattern.location = 0, location */ +/* MatchStarPattern.parenthesised = 1, bool */ +/* MatchStarPattern.target = 2, pattern */ + +/* MatchValuePattern.location = 0, location */ +/* MatchValuePattern.parenthesised = 1, bool */ +/* MatchValuePattern.value = 2, expr */ + +/* MatchWildcardPattern.location = 0, location */ +/* MatchWildcardPattern.parenthesised = 1, bool */ + +/* Module.name = 0, str */ +/* Module.hash = 1, str */ +/* Module.body = 2, stmt_list */ +/* Module.kind = 3, str */ + +/* Name.location = 0, location */ +/* Name.parenthesised = 1, bool */ +/* Name.variable = 2, variable */ +/* Name.ctx = 3, expr_context */ +/* Name = ParameterList */ + +/* Nonlocal.location = 0, location */ +/* Nonlocal.names = 1, str_list */ + +/* Num.location = 0, location */ +/* Num.parenthesised = 1, bool */ +/* Num.n = 2, number */ +/* Num.text = 3, number */ + +/* Pass.location = 0, location */ + +/* PlaceHolder.location = 0, location */ +/* PlaceHolder.parenthesised = 1, bool */ +/* PlaceHolder.variable = 2, variable */ +/* PlaceHolder.ctx = 3, expr_context */ + +/* Print.location = 0, location */ +/* Print.dest = 1, expr */ +/* Print.values = 2, expr_list */ +/* Print.nl = 3, bool */ + +/* Raise.location = 0, location */ +/* Raise.exc = 1, expr */ +/* Raise.cause = 2, expr */ +/* Raise.type = 3, expr */ +/* Raise.inst = 4, expr */ +/* Raise.tback = 5, expr */ + +/* Repr.location = 0, location */ +/* Repr.parenthesised = 1, bool */ +/* Repr.value = 2, expr */ + +/* Return.location = 0, location */ +/* Return.value = 1, expr */ + +/* Set.location = 0, location */ +/* Set.parenthesised = 1, bool */ +/* Set.elts = 2, expr_list */ + +/* SetComp.location = 0, location */ +/* SetComp.parenthesised = 1, bool */ +/* SetComp.function = 2, Function */ +/* SetComp.iterable = 3, expr */ + +/* Slice.location = 0, location */ +/* Slice.parenthesised = 1, bool */ +/* Slice.start = 2, expr */ +/* Slice.stop = 3, expr */ +/* Slice.step = 4, expr */ + +/* SpecialOperation.location = 0, location */ +/* SpecialOperation.parenthesised = 1, bool */ +/* SpecialOperation.name = 2, str */ +/* SpecialOperation.arguments = 3, expr_list */ + +/* Starred.location = 0, location */ +/* Starred.parenthesised = 1, bool */ +/* Starred.value = 2, expr */ +/* Starred.ctx = 3, expr_context */ + +/* Str.location = 0, location */ +/* Str.parenthesised = 1, bool */ +/* Str.s = 2, str */ +/* Str.prefix = 3, str */ +/* Str.implicitly_concatenated_parts = 4, StringPart_list */ + +/* StringPart.text = 0, str */ +/* StringPart.location = 1, location */ +/* StringPart = StringPartList */ +/* StringPartList = BytesOrStr */ + +/* Subscript.location = 0, location */ +/* Subscript.parenthesised = 1, bool */ +/* Subscript.value = 2, expr */ +/* Subscript.index = 3, expr */ +/* Subscript.ctx = 4, expr_context */ + +/* TemplateDottedNotation.location = 0, location */ +/* TemplateDottedNotation.parenthesised = 1, bool */ +/* TemplateDottedNotation.value = 2, expr */ +/* TemplateDottedNotation.attr = 3, str */ +/* TemplateDottedNotation.ctx = 4, expr_context */ + +/* TemplateWrite.location = 0, location */ +/* TemplateWrite.value = 1, expr */ + +/* Try.location = 0, location */ +/* Try.body = 1, stmt_list */ +/* Try.orelse = 2, stmt_list */ +/* Try.handlers = 3, stmt_list */ +/* Try.finalbody = 4, stmt_list */ + +/* Tuple.location = 0, location */ +/* Tuple.parenthesised = 1, bool */ +/* Tuple.elts = 2, expr_list */ +/* Tuple.ctx = 3, expr_context */ +/* Tuple = ParameterList */ + +/* UnaryExpr.location = 0, location */ +/* UnaryExpr.parenthesised = 1, bool */ +/* UnaryExpr.op = 2, unaryop */ +/* UnaryExpr.operand = 3, expr */ + +/* While.location = 0, location */ +/* While.test = 1, expr */ +/* While.body = 2, stmt_list */ +/* While.orelse = 3, stmt_list */ + +/* With.location = 0, location */ +/* With.context_expr = 1, expr */ +/* With.optional_vars = 2, expr */ +/* With.body = 3, stmt_list */ +/* With.is_async = 4, bool */ + +/* Yield.location = 0, location */ +/* Yield.parenthesised = 1, bool */ +/* Yield.value = 2, expr */ + +/* YieldFrom.location = 0, location */ +/* YieldFrom.parenthesised = 1, bool */ +/* YieldFrom.value = 2, expr */ + +/* Alias.value = 0, expr */ +/* Alias.asname = 1, expr */ +/* Alias = AliasList */ +/* AliasList = Import */ + +/* Arguments.kw_defaults = 0, expr_list */ +/* Arguments.defaults = 1, expr_list */ +/* Arguments.annotations = 2, expr_list */ +/* Arguments.varargannotation = 3, expr */ +/* Arguments.kwargannotation = 4, expr */ +/* Arguments.kw_annotations = 5, expr_list */ +/* Arguments = ArgumentsParent */ +/* boolean = BoolParent */ +/* Boolop = BoolExpr */ +/* string = Bytes */ +/* Cmpop = CmpopList */ +/* CmpopList = Compare */ + +/* Comprehension.location = 0, location */ +/* Comprehension.iter = 1, expr */ +/* Comprehension.target = 2, expr */ +/* Comprehension.ifs = 3, expr_list */ +/* Comprehension = ComprehensionList */ +/* ComprehensionList = ListComp */ +/* DictItem = DictItemList */ +/* DictItemList = DictItemListParent */ + +/* Expr.location = 0, location */ +/* Expr.parenthesised = 1, bool */ +/* Expr = ExprParent */ +/* ExprContext = ExprContextParent */ +/* ExprList = ExprListParent */ +/* int = ImportExpr */ + +/* Keyword.location = 0, location */ +/* Keyword.value = 1, expr */ +/* Keyword.arg = 2, str */ +/* Location = LocationParent */ +/* string = Num */ +/* Operator = BinaryExpr */ +/* ParameterList = Function */ + +/* Pattern.location = 0, location */ +/* Pattern.parenthesised = 1, bool */ +/* Pattern = PatternParent */ +/* PatternList = PatternListParent */ + +/* Stmt.location = 0, location */ +/* Stmt = StmtList */ +/* StmtList = StmtListParent */ +/* string = StrParent */ +/* StringList = StrListParent */ +/* Unaryop = UnaryExpr */ +/* Variable = VariableParent */ +py_Classes(unique int id : @py_Class, + unique int parent : @py_ClassExpr ref); + +py_Functions(unique int id : @py_Function, + unique int parent : @py_Function_parent ref); + +py_Modules(unique int id : @py_Module); + +py_StringParts(unique int id : @py_StringPart, + int parent : @py_StringPart_list ref, + int idx : int ref); + +py_StringPart_lists(unique int id : @py_StringPart_list, + unique int parent : @py_Bytes_or_Str ref); + +py_aliases(unique int id : @py_alias, + int parent : @py_alias_list ref, + int idx : int ref); + +py_alias_lists(unique int id : @py_alias_list, + unique int parent : @py_Import ref); + +py_arguments(unique int id : @py_arguments, + unique int parent : @py_arguments_parent ref); + +py_bools(int parent : @py_bool_parent ref, + int idx : int ref); + +py_boolops(unique int id : @py_boolop, + int kind: int ref, + unique int parent : @py_BoolExpr ref); + +py_bytes(varchar(1) id : string ref, + int parent : @py_Bytes ref, + int idx : int ref); + +py_cmpops(unique int id : @py_cmpop, + int kind: int ref, + int parent : @py_cmpop_list ref, + int idx : int ref); + +py_cmpop_lists(unique int id : @py_cmpop_list, + unique int parent : @py_Compare ref); + +py_comprehensions(unique int id : @py_comprehension, + int parent : @py_comprehension_list ref, + int idx : int ref); + +py_comprehension_lists(unique int id : @py_comprehension_list, + unique int parent : @py_ListComp ref); + +py_dict_items(unique int id : @py_dict_item, + int kind: int ref, + int parent : @py_dict_item_list ref, + int idx : int ref); + +py_dict_item_lists(unique int id : @py_dict_item_list, + unique int parent : @py_dict_item_list_parent ref); + +py_exprs(unique int id : @py_expr, + int kind: int ref, + int parent : @py_expr_parent ref, + int idx : int ref); + +py_expr_contexts(unique int id : @py_expr_context, + int kind: int ref, + unique int parent : @py_expr_context_parent ref); + +py_expr_lists(unique int id : @py_expr_list, + int parent : @py_expr_list_parent ref, + int idx : int ref); + +py_ints(int id : int ref, + unique int parent : @py_ImportExpr ref); + +py_locations(unique int id : @location ref, + unique int parent : @py_location_parent ref); + +py_numbers(varchar(1) id : string ref, + int parent : @py_Num ref, + int idx : int ref); + +py_operators(unique int id : @py_operator, + int kind: int ref, + unique int parent : @py_BinaryExpr ref); + +py_parameter_lists(unique int id : @py_parameter_list, + unique int parent : @py_Function ref); + +py_patterns(unique int id : @py_pattern, + int kind: int ref, + int parent : @py_pattern_parent ref, + int idx : int ref); + +py_pattern_lists(unique int id : @py_pattern_list, + int parent : @py_pattern_list_parent ref, + int idx : int ref); + +py_stmts(unique int id : @py_stmt, + int kind: int ref, + int parent : @py_stmt_list ref, + int idx : int ref); + +py_stmt_lists(unique int id : @py_stmt_list, + int parent : @py_stmt_list_parent ref, + int idx : int ref); + +py_strs(varchar(1) id : string ref, + int parent : @py_str_parent ref, + int idx : int ref); + +py_str_lists(unique int id : @py_str_list, + unique int parent : @py_str_list_parent ref); + +py_unaryops(unique int id : @py_unaryop, + int kind: int ref, + unique int parent : @py_UnaryExpr ref); + +py_variables(int id : @py_variable ref, + unique int parent : @py_variable_parent ref); + +case @py_boolop.kind of + 0 = @py_And +| 1 = @py_Or; + +case @py_cmpop.kind of + 0 = @py_Eq +| 1 = @py_Gt +| 2 = @py_GtE +| 3 = @py_In +| 4 = @py_Is +| 5 = @py_IsNot +| 6 = @py_Lt +| 7 = @py_LtE +| 8 = @py_NotEq +| 9 = @py_NotIn; + +case @py_dict_item.kind of + 0 = @py_DictUnpacking +| 1 = @py_KeyValuePair +| 2 = @py_keyword; + +case @py_expr.kind of + 0 = @py_Attribute +| 1 = @py_BinaryExpr +| 2 = @py_BoolExpr +| 3 = @py_Bytes +| 4 = @py_Call +| 5 = @py_ClassExpr +| 6 = @py_Compare +| 7 = @py_Dict +| 8 = @py_DictComp +| 9 = @py_Ellipsis +| 10 = @py_FunctionExpr +| 11 = @py_GeneratorExp +| 12 = @py_IfExp +| 13 = @py_ImportExpr +| 14 = @py_ImportMember +| 15 = @py_Lambda +| 16 = @py_List +| 17 = @py_ListComp +| 18 = @py_Guard +| 19 = @py_Name +| 20 = @py_Num +| 21 = @py_Repr +| 22 = @py_Set +| 23 = @py_SetComp +| 24 = @py_Slice +| 25 = @py_Starred +| 26 = @py_Str +| 27 = @py_Subscript +| 28 = @py_Tuple +| 29 = @py_UnaryExpr +| 30 = @py_Yield +| 31 = @py_YieldFrom +| 32 = @py_TemplateDottedNotation +| 33 = @py_Filter +| 34 = @py_PlaceHolder +| 35 = @py_Await +| 36 = @py_Fstring +| 37 = @py_FormattedValue +| 38 = @py_AssignExpr +| 39 = @py_SpecialOperation; + +case @py_expr_context.kind of + 0 = @py_AugLoad +| 1 = @py_AugStore +| 2 = @py_Del +| 3 = @py_Load +| 4 = @py_Param +| 5 = @py_Store; + +case @py_operator.kind of + 0 = @py_Add +| 1 = @py_BitAnd +| 2 = @py_BitOr +| 3 = @py_BitXor +| 4 = @py_Div +| 5 = @py_FloorDiv +| 6 = @py_LShift +| 7 = @py_Mod +| 8 = @py_Mult +| 9 = @py_Pow +| 10 = @py_RShift +| 11 = @py_Sub +| 12 = @py_MatMult; + +case @py_pattern.kind of + 0 = @py_MatchAsPattern +| 1 = @py_MatchOrPattern +| 2 = @py_MatchLiteralPattern +| 3 = @py_MatchCapturePattern +| 4 = @py_MatchWildcardPattern +| 5 = @py_MatchValuePattern +| 6 = @py_MatchSequencePattern +| 7 = @py_MatchStarPattern +| 8 = @py_MatchMappingPattern +| 9 = @py_MatchDoubleStarPattern +| 10 = @py_MatchKeyValuePattern +| 11 = @py_MatchClassPattern +| 12 = @py_MatchKeywordPattern; + +case @py_stmt.kind of + 0 = @py_Assert +| 1 = @py_Assign +| 2 = @py_AugAssign +| 3 = @py_Break +| 4 = @py_Continue +| 5 = @py_Delete +| 6 = @py_ExceptStmt +| 7 = @py_ExceptGroupStmt +| 8 = @py_Exec +| 9 = @py_Expr_stmt +| 10 = @py_For +| 11 = @py_Global +| 12 = @py_If +| 13 = @py_Import +| 14 = @py_ImportStar +| 15 = @py_MatchStmt +| 16 = @py_Case +| 17 = @py_Nonlocal +| 18 = @py_Pass +| 19 = @py_Print +| 20 = @py_Raise +| 21 = @py_Return +| 22 = @py_Try +| 23 = @py_While +| 24 = @py_With +| 25 = @py_TemplateWrite +| 26 = @py_AnnAssign; + +case @py_unaryop.kind of + 0 = @py_Invert +| 1 = @py_Not +| 2 = @py_UAdd +| 3 = @py_USub; + +@py_Bytes_or_Str = @py_Bytes | @py_Str; + +@py_Function_parent = @py_DictComp | @py_FunctionExpr | @py_GeneratorExp | @py_Lambda | @py_ListComp | @py_SetComp; + +@py_arguments_parent = @py_FunctionExpr | @py_Lambda; + +@py_ast_node = @py_Class | @py_Function | @py_Module | @py_StringPart | @py_comprehension | @py_dict_item | @py_expr | @py_pattern | @py_stmt; + +@py_bool_parent = @py_For | @py_Function | @py_Print | @py_With | @py_expr | @py_pattern; + +@py_dict_item_list_parent = @py_Call | @py_ClassExpr | @py_Dict; + +@py_expr_context_parent = @py_Attribute | @py_List | @py_Name | @py_PlaceHolder | @py_Starred | @py_Subscript | @py_TemplateDottedNotation | @py_Tuple; + +@py_expr_list_parent = @py_Assign | @py_BoolExpr | @py_Call | @py_ClassExpr | @py_Compare | @py_Delete | @py_Fstring | @py_Function | @py_List | @py_Print | @py_Set | @py_SpecialOperation | @py_Tuple | @py_arguments | @py_comprehension; + +@py_expr_or_stmt = @py_expr | @py_stmt; + +@py_expr_parent = @py_AnnAssign | @py_Assert | @py_Assign | @py_AssignExpr | @py_Attribute | @py_AugAssign | @py_Await | @py_BinaryExpr | @py_Call | @py_Case | @py_Compare | @py_DictComp | @py_DictUnpacking | @py_ExceptGroupStmt | @py_ExceptStmt | @py_Exec | @py_Expr_stmt | @py_Filter | @py_For | @py_FormattedValue | @py_Function | @py_FunctionExpr | @py_GeneratorExp | @py_Guard | @py_If | @py_IfExp | @py_ImportMember | @py_ImportStar | @py_KeyValuePair | @py_ListComp | @py_MatchAsPattern | @py_MatchCapturePattern | @py_MatchClassPattern | @py_MatchKeywordPattern | @py_MatchLiteralPattern | @py_MatchStmt | @py_MatchValuePattern | @py_Print | @py_Raise | @py_Repr | @py_Return | @py_SetComp | @py_Slice | @py_Starred | @py_Subscript | @py_TemplateDottedNotation | @py_TemplateWrite | @py_UnaryExpr | @py_While | @py_With | @py_Yield | @py_YieldFrom | @py_alias | @py_arguments | @py_comprehension | @py_expr_list | @py_keyword | @py_parameter_list; + +@py_location_parent = @py_DictUnpacking | @py_KeyValuePair | @py_StringPart | @py_comprehension | @py_expr | @py_keyword | @py_pattern | @py_stmt; + +@py_parameter = @py_Name | @py_Tuple; + +@py_pattern_list_parent = @py_MatchClassPattern | @py_MatchMappingPattern | @py_MatchOrPattern | @py_MatchSequencePattern; + +@py_pattern_parent = @py_Case | @py_MatchAsPattern | @py_MatchDoubleStarPattern | @py_MatchKeyValuePattern | @py_MatchKeywordPattern | @py_MatchStarPattern | @py_pattern_list; + +@py_scope = @py_Class | @py_Function | @py_Module; + +@py_stmt_list_parent = @py_Case | @py_Class | @py_ExceptGroupStmt | @py_ExceptStmt | @py_For | @py_Function | @py_If | @py_MatchStmt | @py_Module | @py_Try | @py_While | @py_With; + +@py_str_list_parent = @py_Global | @py_Nonlocal; + +@py_str_parent = @py_Attribute | @py_Class | @py_ClassExpr | @py_FormattedValue | @py_Function | @py_FunctionExpr | @py_ImportExpr | @py_ImportMember | @py_Module | @py_SpecialOperation | @py_Str | @py_StringPart | @py_TemplateDottedNotation | @py_keyword | @py_str_list; + +@py_variable_parent = @py_Name | @py_PlaceHolder; + + +/* + * End of auto-generated part + */ + + + +/* Map relative names to absolute names for imports */ +py_absolute_names(int module : @py_Module ref, + varchar(1) relname : string ref, + varchar(1) absname : string ref); + +py_exports(int id : @py_Module ref, + varchar(1) name : string ref); + +/* Successor information */ +py_successors(int predecessor : @py_flow_node ref, + int successor : @py_flow_node ref); + +py_true_successors(int predecessor : @py_flow_node ref, + int successor : @py_flow_node ref); + +py_exception_successors(int predecessor : @py_flow_node ref, + int successor : @py_flow_node ref); + +py_false_successors(int predecessor : @py_flow_node ref, + int successor : @py_flow_node ref); + +py_flow_bb_node(unique int flownode : @py_flow_node, + int realnode : @py_ast_node ref, + int basicblock : @py_flow_node ref, + int index : int ref); + +py_scope_flow(int flow : @py_flow_node ref, + int scope : @py_scope ref, + int kind : int ref); + +py_idoms(unique int node : @py_flow_node ref, + int immediate_dominator : @py_flow_node ref); + +py_ssa_phi(int phi : @py_ssa_var ref, + int arg: @py_ssa_var ref); + +py_ssa_var(unique int id : @py_ssa_var, + int var : @py_variable ref); + +py_ssa_use(int node: @py_flow_node ref, + int var : @py_ssa_var ref); + +py_ssa_defn(unique int id : @py_ssa_var ref, + int node: @py_flow_node ref); + +@py_base_var = @py_variable | @py_ssa_var; + +py_scopes(unique int node : @py_expr_or_stmt ref, + int scope : @py_scope ref); + +py_scope_location(unique int id : @location ref, + unique int scope : @py_scope ref); + +py_flags_versioned(varchar(1) name : string ref, + varchar(1) value : string ref, + varchar(1) version : string ref); + +py_syntax_error_versioned(unique int id : @location ref, + varchar(1) message : string ref, + varchar(1) version : string ref); + +py_comments(unique int id : @py_comment, + varchar(1) text : string ref, + unique int location : @location ref); + +/* Type information support */ + +py_cobjects(unique int obj : @py_cobject); + +py_cobjecttypes(unique int obj : @py_cobject ref, + int typeof : @py_cobject ref); + +py_cobjectnames(unique int obj : @py_cobject ref, + varchar(1) name : string ref); + +/* Kind should be 0 for introspection, > 0 from source, as follows: + 1 from C extension source + */ +py_cobject_sources(int obj : @py_cobject ref, + int kind : int ref); + +py_cmembers_versioned(int object : @py_cobject ref, + varchar(1) name : string ref, + int member : @py_cobject ref, + varchar(1) version : string ref); + +py_citems(int object : @py_cobject ref, + int index : int ref, + int member : @py_cobject ref); + +ext_argtype(int funcid : @py_object ref, + int arg : int ref, + int typeid : @py_object ref); + +ext_rettype(int funcid : @py_object ref, + int typeid : @py_object ref); + +ext_proptype(int propid : @py_object ref, + int typeid : @py_object ref); + +ext_argreturn(int funcid : @py_object ref, + int arg : int ref); + +py_special_objects(unique int obj : @py_cobject ref, + unique varchar(1) name : string ref); + +py_decorated_object(int object : @py_object ref, + int level: int ref); + +@py_object = @py_cobject | @py_flow_node; + +@py_source_element = @py_ast_node | @container; diff --git a/python/downgrades/728c6d65e61d808ae276013ebc15abc3a97aaef1/upgrade.properties b/python/downgrades/728c6d65e61d808ae276013ebc15abc3a97aaef1/upgrade.properties new file mode 100644 index 00000000000..2292915ba0c --- /dev/null +++ b/python/downgrades/728c6d65e61d808ae276013ebc15abc3a97aaef1/upgrade.properties @@ -0,0 +1,5 @@ +description: Remove support for type parameters and type alias statements +compatibility: backwards +py_type_parameters.rel: delete +py_type_parameter_lists.rel: delete +py_stmts.rel: run py_stmts.qlo py_stmts_without_typealias diff --git a/python/ql/lib/upgrades/0565f7466437d52e1dc64a3b930926ab2f60cd64/old.dbscheme b/python/ql/lib/upgrades/0565f7466437d52e1dc64a3b930926ab2f60cd64/old.dbscheme new file mode 100644 index 00000000000..0565f746643 --- /dev/null +++ b/python/ql/lib/upgrades/0565f7466437d52e1dc64a3b930926ab2f60cd64/old.dbscheme @@ -0,0 +1,1196 @@ +/* + * This dbscheme is auto-generated by 'semmle/dbscheme_gen.py'. + * WARNING: Any modifications to this file will be lost. + * Relations can be changed by modifying master.py or + * by adding rules to dbscheme.template + */ + +/* This is a dummy line to alter the dbscheme, so we can make a database upgrade + * without actually changing any of the dbscheme predicates. It contains a date + * to allow for such updates in the future as well. + * + * 2020-07-02 + * + * DO NOT remove this comment carelessly, since it can revert the dbscheme back to a + * previously seen state (matching a previously seen SHA), which would make the upgrade + * mechanism not work properly. + */ + +/*- DEPRECATED: External defects and metrics -*/ + +externalDefects( + unique int id : @externalDefect, + varchar(900) queryPath : string ref, + int location : @location ref, + varchar(900) message : string ref, + float severity : float ref +); + +externalMetrics( + unique int id : @externalMetric, + varchar(900) queryPath : string ref, + int location : @location ref, + float value : float ref +); + +/*- External data -*/ + +/** + * External data, loaded from CSV files during snapshot creation. See + * [Tutorial: Incorporating external data](https://help.semmle.com/wiki/display/SD/Tutorial%3A+Incorporating+external+data) + * for more information. + */ +externalData( + int id : @externalDataElement, + string path : string ref, + int column: int ref, + string value : string ref +); + +/*- DEPRECATED: Snapshot date -*/ + +snapshotDate(unique date snapshotDate : date ref); + +/*- Source location prefix -*/ + +/** + * The source location of the snapshot. + */ +sourceLocationPrefix(string prefix : string ref); + +/*- DEPRECATED: Duplicate code -*/ + +duplicateCode( + unique int id : @duplication, + string relativePath : string ref, + int equivClass : int ref +); + +similarCode( + unique int id : @similarity, + string relativePath : string ref, + int equivClass : int ref +); + +@duplication_or_similarity = @duplication | @similarity + +tokens( + int id : @duplication_or_similarity ref, + int offset : int ref, + int beginLine : int ref, + int beginColumn : int ref, + int endLine : int ref, + int endColumn : int ref +); + +/*- DEPRECATED: Version control data -*/ + +svnentries( + unique int id : @svnentry, + string revision : string ref, + string author : string ref, + date revisionDate : date ref, + int changeSize : int ref +) + +svnaffectedfiles( + int id : @svnentry ref, + int file : @file ref, + string action : string ref +) + +svnentrymsg( + unique int id : @svnentry ref, + string message : string ref +) + +svnchurn( + int commit : @svnentry ref, + int file : @file ref, + int addedLines : int ref, + int deletedLines : int ref +) + +/*- Lines of code -*/ + +numlines( + int element_id: @sourceline ref, + int num_lines: int ref, + int num_code: int ref, + int num_comment: int ref +); + +/*- Files and folders -*/ + +/** + * The location of an element. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `file`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ +locations_default( + unique int id: @location_default, + int file: @file ref, + int beginLine: int ref, + int beginColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +files( + unique int id: @file, + string name: string ref +); + +folders( + unique int id: @folder, + string name: string ref +); + +@container = @file | @folder + +containerparent( + int parent: @container ref, + unique int child: @container ref +); + +/*- XML Files -*/ + +xmlEncoding( + unique int id: @file ref, + string encoding: string ref +); + +xmlDTDs( + unique int id: @xmldtd, + string root: string ref, + string publicId: string ref, + string systemId: string ref, + int fileid: @file ref +); + +xmlElements( + unique int id: @xmlelement, + string name: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int fileid: @file ref +); + +xmlAttrs( + unique int id: @xmlattribute, + int elementid: @xmlelement ref, + string name: string ref, + string value: string ref, + int idx: int ref, + int fileid: @file ref +); + +xmlNs( + int id: @xmlnamespace, + string prefixName: string ref, + string URI: string ref, + int fileid: @file ref +); + +xmlHasNs( + int elementId: @xmlnamespaceable ref, + int nsId: @xmlnamespace ref, + int fileid: @file ref +); + +xmlComments( + unique int id: @xmlcomment, + string text: string ref, + int parentid: @xmlparent ref, + int fileid: @file ref +); + +xmlChars( + unique int id: @xmlcharacters, + string text: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int isCDATA: int ref, + int fileid: @file ref +); + +@xmlparent = @file | @xmlelement; +@xmlnamespaceable = @xmlelement | @xmlattribute; + +xmllocations( + int xmlElement: @xmllocatable ref, + int location: @location_default ref +); + +@xmllocatable = @xmlcharacters | @xmlelement | @xmlcomment | @xmlattribute | @xmldtd | @file | @xmlnamespace; + +/*- YAML -*/ + +#keyset[parent, idx] +yaml (unique int id: @yaml_node, + int kind: int ref, + int parent: @yaml_node_parent ref, + int idx: int ref, + string tag: string ref, + string tostring: string ref); + +case @yaml_node.kind of + 0 = @yaml_scalar_node +| 1 = @yaml_mapping_node +| 2 = @yaml_sequence_node +| 3 = @yaml_alias_node +; + +@yaml_collection_node = @yaml_mapping_node | @yaml_sequence_node; + +@yaml_node_parent = @yaml_collection_node | @file; + +yaml_anchors (unique int node: @yaml_node ref, + string anchor: string ref); + +yaml_aliases (unique int alias: @yaml_alias_node ref, + string target: string ref); + +yaml_scalars (unique int scalar: @yaml_scalar_node ref, + int style: int ref, + string value: string ref); + +yaml_errors (unique int id: @yaml_error, + string message: string ref); + +yaml_locations(unique int locatable: @yaml_locatable ref, + int location: @location_default ref); + +@yaml_locatable = @yaml_node | @yaml_error; + +/*- Python dbscheme -*/ + +/* + * Line metrics + */ +py_codelines(int id : @py_scope ref, + int count : int ref); + +py_commentlines(int id : @py_scope ref, + int count : int ref); + +py_docstringlines(int id : @py_scope ref, + int count : int ref); + +py_alllines(int id : @py_scope ref, + int count : int ref); + +/**************************** + Python dbscheme +****************************/ + +@sourceline = @file | @py_Module | @xmllocatable; + +@location = @location_ast | @location_default ; + +locations_ast(unique int id: @location_ast, + int module: @py_Module ref, + int beginLine: int ref, + int beginColumn: int ref, + int endLine: int ref, + int endColumn: int ref); + +file_contents(unique int file: @file ref, string contents: string ref); + +py_module_path(int module: @py_Module ref, int file: @container ref); + +variable(unique int id : @py_variable, + int scope : @py_scope ref, + varchar(1) name : string ref); + +py_line_lengths(unique int id : @py_line, + int file: @py_Module ref, + int line : int ref, + int length : int ref); + +py_extracted_version(int module : @py_Module ref, + varchar(1) version : string ref); + +/* AUTO GENERATED PART STARTS HERE */ + + +/* AnnAssign.location = 0, location */ +/* AnnAssign.value = 1, expr */ +/* AnnAssign.annotation = 2, expr */ +/* AnnAssign.target = 3, expr */ + +/* Assert.location = 0, location */ +/* Assert.test = 1, expr */ +/* Assert.msg = 2, expr */ + +/* Assign.location = 0, location */ +/* Assign.value = 1, expr */ +/* Assign.targets = 2, expr_list */ + +/* AssignExpr.location = 0, location */ +/* AssignExpr.parenthesised = 1, bool */ +/* AssignExpr.value = 2, expr */ +/* AssignExpr.target = 3, expr */ + +/* Attribute.location = 0, location */ +/* Attribute.parenthesised = 1, bool */ +/* Attribute.value = 2, expr */ +/* Attribute.attr = 3, str */ +/* Attribute.ctx = 4, expr_context */ + +/* AugAssign.location = 0, location */ +/* AugAssign.operation = 1, BinOp */ + +/* Await.location = 0, location */ +/* Await.parenthesised = 1, bool */ +/* Await.value = 2, expr */ + +/* BinaryExpr.location = 0, location */ +/* BinaryExpr.parenthesised = 1, bool */ +/* BinaryExpr.left = 2, expr */ +/* BinaryExpr.op = 3, operator */ +/* BinaryExpr.right = 4, expr */ +/* BinaryExpr = AugAssign */ + +/* BoolExpr.location = 0, location */ +/* BoolExpr.parenthesised = 1, bool */ +/* BoolExpr.op = 2, boolop */ +/* BoolExpr.values = 3, expr_list */ + +/* Break.location = 0, location */ + +/* Bytes.location = 0, location */ +/* Bytes.parenthesised = 1, bool */ +/* Bytes.s = 2, bytes */ +/* Bytes.prefix = 3, bytes */ +/* Bytes.implicitly_concatenated_parts = 4, StringPart_list */ + +/* Call.location = 0, location */ +/* Call.parenthesised = 1, bool */ +/* Call.func = 2, expr */ +/* Call.positional_args = 3, expr_list */ +/* Call.named_args = 4, dict_item_list */ + +/* Case.location = 0, location */ +/* Case.pattern = 1, pattern */ +/* Case.guard = 2, expr */ +/* Case.body = 3, stmt_list */ + +/* Class.name = 0, str */ +/* Class.body = 1, stmt_list */ +/* Class = ClassExpr */ + +/* ClassExpr.location = 0, location */ +/* ClassExpr.parenthesised = 1, bool */ +/* ClassExpr.name = 2, str */ +/* ClassExpr.bases = 3, expr_list */ +/* ClassExpr.keywords = 4, dict_item_list */ +/* ClassExpr.inner_scope = 5, Class */ + +/* Compare.location = 0, location */ +/* Compare.parenthesised = 1, bool */ +/* Compare.left = 2, expr */ +/* Compare.ops = 3, cmpop_list */ +/* Compare.comparators = 4, expr_list */ + +/* Continue.location = 0, location */ + +/* Delete.location = 0, location */ +/* Delete.targets = 1, expr_list */ + +/* Dict.location = 0, location */ +/* Dict.parenthesised = 1, bool */ +/* Dict.items = 2, dict_item_list */ + +/* DictComp.location = 0, location */ +/* DictComp.parenthesised = 1, bool */ +/* DictComp.function = 2, Function */ +/* DictComp.iterable = 3, expr */ + +/* DictUnpacking.location = 0, location */ +/* DictUnpacking.value = 1, expr */ + +/* Ellipsis.location = 0, location */ +/* Ellipsis.parenthesised = 1, bool */ + +/* ExceptGroupStmt.location = 0, location */ +/* ExceptGroupStmt.type = 1, expr */ +/* ExceptGroupStmt.name = 2, expr */ +/* ExceptGroupStmt.body = 3, stmt_list */ + +/* ExceptStmt.location = 0, location */ +/* ExceptStmt.type = 1, expr */ +/* ExceptStmt.name = 2, expr */ +/* ExceptStmt.body = 3, stmt_list */ + +/* Exec.location = 0, location */ +/* Exec.body = 1, expr */ +/* Exec.globals = 2, expr */ +/* Exec.locals = 3, expr */ + +/* ExprStmt.location = 0, location */ +/* ExprStmt.value = 1, expr */ + +/* Filter.location = 0, location */ +/* Filter.parenthesised = 1, bool */ +/* Filter.value = 2, expr */ +/* Filter.filter = 3, expr */ + +/* For.location = 0, location */ +/* For.target = 1, expr */ +/* For.iter = 2, expr */ +/* For.body = 3, stmt_list */ +/* For.orelse = 4, stmt_list */ +/* For.is_async = 5, bool */ + +/* FormattedValue.location = 0, location */ +/* FormattedValue.parenthesised = 1, bool */ +/* FormattedValue.value = 2, expr */ +/* FormattedValue.conversion = 3, str */ +/* FormattedValue.format_spec = 4, JoinedStr */ + +/* Function.name = 0, str */ +/* Function.args = 1, parameter_list */ +/* Function.vararg = 2, expr */ +/* Function.kwonlyargs = 3, expr_list */ +/* Function.kwarg = 4, expr */ +/* Function.body = 5, stmt_list */ +/* Function.is_async = 6, bool */ +/* Function = FunctionParent */ + +/* FunctionExpr.location = 0, location */ +/* FunctionExpr.parenthesised = 1, bool */ +/* FunctionExpr.name = 2, str */ +/* FunctionExpr.args = 3, arguments */ +/* FunctionExpr.returns = 4, expr */ +/* FunctionExpr.inner_scope = 5, Function */ + +/* GeneratorExp.location = 0, location */ +/* GeneratorExp.parenthesised = 1, bool */ +/* GeneratorExp.function = 2, Function */ +/* GeneratorExp.iterable = 3, expr */ + +/* Global.location = 0, location */ +/* Global.names = 1, str_list */ + +/* Guard.location = 0, location */ +/* Guard.parenthesised = 1, bool */ +/* Guard.test = 2, expr */ + +/* If.location = 0, location */ +/* If.test = 1, expr */ +/* If.body = 2, stmt_list */ +/* If.orelse = 3, stmt_list */ + +/* IfExp.location = 0, location */ +/* IfExp.parenthesised = 1, bool */ +/* IfExp.test = 2, expr */ +/* IfExp.body = 3, expr */ +/* IfExp.orelse = 4, expr */ + +/* Import.location = 0, location */ +/* Import.names = 1, alias_list */ + +/* ImportExpr.location = 0, location */ +/* ImportExpr.parenthesised = 1, bool */ +/* ImportExpr.level = 2, int */ +/* ImportExpr.name = 3, str */ +/* ImportExpr.top = 4, bool */ + +/* ImportStar.location = 0, location */ +/* ImportStar.module = 1, expr */ + +/* ImportMember.location = 0, location */ +/* ImportMember.parenthesised = 1, bool */ +/* ImportMember.module = 2, expr */ +/* ImportMember.name = 3, str */ + +/* Fstring.location = 0, location */ +/* Fstring.parenthesised = 1, bool */ +/* Fstring.values = 2, expr_list */ +/* Fstring = FormattedValue */ + +/* KeyValuePair.location = 0, location */ +/* KeyValuePair.value = 1, expr */ +/* KeyValuePair.key = 2, expr */ + +/* Lambda.location = 0, location */ +/* Lambda.parenthesised = 1, bool */ +/* Lambda.args = 2, arguments */ +/* Lambda.inner_scope = 3, Function */ + +/* List.location = 0, location */ +/* List.parenthesised = 1, bool */ +/* List.elts = 2, expr_list */ +/* List.ctx = 3, expr_context */ + +/* ListComp.location = 0, location */ +/* ListComp.parenthesised = 1, bool */ +/* ListComp.function = 2, Function */ +/* ListComp.iterable = 3, expr */ +/* ListComp.generators = 4, comprehension_list */ +/* ListComp.elt = 5, expr */ + +/* MatchStmt.location = 0, location */ +/* MatchStmt.subject = 1, expr */ +/* MatchStmt.cases = 2, stmt_list */ + +/* MatchAsPattern.location = 0, location */ +/* MatchAsPattern.parenthesised = 1, bool */ +/* MatchAsPattern.pattern = 2, pattern */ +/* MatchAsPattern.alias = 3, expr */ + +/* MatchCapturePattern.location = 0, location */ +/* MatchCapturePattern.parenthesised = 1, bool */ +/* MatchCapturePattern.variable = 2, expr */ + +/* MatchClassPattern.location = 0, location */ +/* MatchClassPattern.parenthesised = 1, bool */ +/* MatchClassPattern.class = 2, expr */ +/* MatchClassPattern.class_name = 3, expr */ +/* MatchClassPattern.positional = 4, pattern_list */ +/* MatchClassPattern.keyword = 5, pattern_list */ + +/* MatchDoubleStarPattern.location = 0, location */ +/* MatchDoubleStarPattern.parenthesised = 1, bool */ +/* MatchDoubleStarPattern.target = 2, pattern */ + +/* MatchKeyValuePattern.location = 0, location */ +/* MatchKeyValuePattern.parenthesised = 1, bool */ +/* MatchKeyValuePattern.key = 2, pattern */ +/* MatchKeyValuePattern.value = 3, pattern */ + +/* MatchKeywordPattern.location = 0, location */ +/* MatchKeywordPattern.parenthesised = 1, bool */ +/* MatchKeywordPattern.attribute = 2, expr */ +/* MatchKeywordPattern.value = 3, pattern */ + +/* MatchLiteralPattern.location = 0, location */ +/* MatchLiteralPattern.parenthesised = 1, bool */ +/* MatchLiteralPattern.literal = 2, expr */ + +/* MatchMappingPattern.location = 0, location */ +/* MatchMappingPattern.parenthesised = 1, bool */ +/* MatchMappingPattern.mappings = 2, pattern_list */ + +/* MatchOrPattern.location = 0, location */ +/* MatchOrPattern.parenthesised = 1, bool */ +/* MatchOrPattern.patterns = 2, pattern_list */ + +/* MatchSequencePattern.location = 0, location */ +/* MatchSequencePattern.parenthesised = 1, bool */ +/* MatchSequencePattern.patterns = 2, pattern_list */ + +/* MatchStarPattern.location = 0, location */ +/* MatchStarPattern.parenthesised = 1, bool */ +/* MatchStarPattern.target = 2, pattern */ + +/* MatchValuePattern.location = 0, location */ +/* MatchValuePattern.parenthesised = 1, bool */ +/* MatchValuePattern.value = 2, expr */ + +/* MatchWildcardPattern.location = 0, location */ +/* MatchWildcardPattern.parenthesised = 1, bool */ + +/* Module.name = 0, str */ +/* Module.hash = 1, str */ +/* Module.body = 2, stmt_list */ +/* Module.kind = 3, str */ + +/* Name.location = 0, location */ +/* Name.parenthesised = 1, bool */ +/* Name.variable = 2, variable */ +/* Name.ctx = 3, expr_context */ +/* Name = ParameterList */ + +/* Nonlocal.location = 0, location */ +/* Nonlocal.names = 1, str_list */ + +/* Num.location = 0, location */ +/* Num.parenthesised = 1, bool */ +/* Num.n = 2, number */ +/* Num.text = 3, number */ + +/* Pass.location = 0, location */ + +/* PlaceHolder.location = 0, location */ +/* PlaceHolder.parenthesised = 1, bool */ +/* PlaceHolder.variable = 2, variable */ +/* PlaceHolder.ctx = 3, expr_context */ + +/* Print.location = 0, location */ +/* Print.dest = 1, expr */ +/* Print.values = 2, expr_list */ +/* Print.nl = 3, bool */ + +/* Raise.location = 0, location */ +/* Raise.exc = 1, expr */ +/* Raise.cause = 2, expr */ +/* Raise.type = 3, expr */ +/* Raise.inst = 4, expr */ +/* Raise.tback = 5, expr */ + +/* Repr.location = 0, location */ +/* Repr.parenthesised = 1, bool */ +/* Repr.value = 2, expr */ + +/* Return.location = 0, location */ +/* Return.value = 1, expr */ + +/* Set.location = 0, location */ +/* Set.parenthesised = 1, bool */ +/* Set.elts = 2, expr_list */ + +/* SetComp.location = 0, location */ +/* SetComp.parenthesised = 1, bool */ +/* SetComp.function = 2, Function */ +/* SetComp.iterable = 3, expr */ + +/* Slice.location = 0, location */ +/* Slice.parenthesised = 1, bool */ +/* Slice.start = 2, expr */ +/* Slice.stop = 3, expr */ +/* Slice.step = 4, expr */ + +/* SpecialOperation.location = 0, location */ +/* SpecialOperation.parenthesised = 1, bool */ +/* SpecialOperation.name = 2, str */ +/* SpecialOperation.arguments = 3, expr_list */ + +/* Starred.location = 0, location */ +/* Starred.parenthesised = 1, bool */ +/* Starred.value = 2, expr */ +/* Starred.ctx = 3, expr_context */ + +/* Str.location = 0, location */ +/* Str.parenthesised = 1, bool */ +/* Str.s = 2, str */ +/* Str.prefix = 3, str */ +/* Str.implicitly_concatenated_parts = 4, StringPart_list */ + +/* StringPart.text = 0, str */ +/* StringPart.location = 1, location */ +/* StringPart = StringPartList */ +/* StringPartList = BytesOrStr */ + +/* Subscript.location = 0, location */ +/* Subscript.parenthesised = 1, bool */ +/* Subscript.value = 2, expr */ +/* Subscript.index = 3, expr */ +/* Subscript.ctx = 4, expr_context */ + +/* TemplateDottedNotation.location = 0, location */ +/* TemplateDottedNotation.parenthesised = 1, bool */ +/* TemplateDottedNotation.value = 2, expr */ +/* TemplateDottedNotation.attr = 3, str */ +/* TemplateDottedNotation.ctx = 4, expr_context */ + +/* TemplateWrite.location = 0, location */ +/* TemplateWrite.value = 1, expr */ + +/* Try.location = 0, location */ +/* Try.body = 1, stmt_list */ +/* Try.orelse = 2, stmt_list */ +/* Try.handlers = 3, stmt_list */ +/* Try.finalbody = 4, stmt_list */ + +/* Tuple.location = 0, location */ +/* Tuple.parenthesised = 1, bool */ +/* Tuple.elts = 2, expr_list */ +/* Tuple.ctx = 3, expr_context */ +/* Tuple = ParameterList */ + +/* UnaryExpr.location = 0, location */ +/* UnaryExpr.parenthesised = 1, bool */ +/* UnaryExpr.op = 2, unaryop */ +/* UnaryExpr.operand = 3, expr */ + +/* While.location = 0, location */ +/* While.test = 1, expr */ +/* While.body = 2, stmt_list */ +/* While.orelse = 3, stmt_list */ + +/* With.location = 0, location */ +/* With.context_expr = 1, expr */ +/* With.optional_vars = 2, expr */ +/* With.body = 3, stmt_list */ +/* With.is_async = 4, bool */ + +/* Yield.location = 0, location */ +/* Yield.parenthesised = 1, bool */ +/* Yield.value = 2, expr */ + +/* YieldFrom.location = 0, location */ +/* YieldFrom.parenthesised = 1, bool */ +/* YieldFrom.value = 2, expr */ + +/* Alias.value = 0, expr */ +/* Alias.asname = 1, expr */ +/* Alias = AliasList */ +/* AliasList = Import */ + +/* Arguments.kw_defaults = 0, expr_list */ +/* Arguments.defaults = 1, expr_list */ +/* Arguments.annotations = 2, expr_list */ +/* Arguments.varargannotation = 3, expr */ +/* Arguments.kwargannotation = 4, expr */ +/* Arguments.kw_annotations = 5, expr_list */ +/* Arguments = ArgumentsParent */ +/* boolean = BoolParent */ +/* Boolop = BoolExpr */ +/* string = Bytes */ +/* Cmpop = CmpopList */ +/* CmpopList = Compare */ + +/* Comprehension.location = 0, location */ +/* Comprehension.iter = 1, expr */ +/* Comprehension.target = 2, expr */ +/* Comprehension.ifs = 3, expr_list */ +/* Comprehension = ComprehensionList */ +/* ComprehensionList = ListComp */ +/* DictItem = DictItemList */ +/* DictItemList = DictItemListParent */ + +/* Expr.location = 0, location */ +/* Expr.parenthesised = 1, bool */ +/* Expr = ExprParent */ +/* ExprContext = ExprContextParent */ +/* ExprList = ExprListParent */ +/* int = ImportExpr */ + +/* Keyword.location = 0, location */ +/* Keyword.value = 1, expr */ +/* Keyword.arg = 2, str */ +/* Location = LocationParent */ +/* string = Num */ +/* Operator = BinaryExpr */ +/* ParameterList = Function */ + +/* Pattern.location = 0, location */ +/* Pattern.parenthesised = 1, bool */ +/* Pattern = PatternParent */ +/* PatternList = PatternListParent */ + +/* Stmt.location = 0, location */ +/* Stmt = StmtList */ +/* StmtList = StmtListParent */ +/* string = StrParent */ +/* StringList = StrListParent */ +/* Unaryop = UnaryExpr */ +/* Variable = VariableParent */ +py_Classes(unique int id : @py_Class, + unique int parent : @py_ClassExpr ref); + +py_Functions(unique int id : @py_Function, + unique int parent : @py_Function_parent ref); + +py_Modules(unique int id : @py_Module); + +py_StringParts(unique int id : @py_StringPart, + int parent : @py_StringPart_list ref, + int idx : int ref); + +py_StringPart_lists(unique int id : @py_StringPart_list, + unique int parent : @py_Bytes_or_Str ref); + +py_aliases(unique int id : @py_alias, + int parent : @py_alias_list ref, + int idx : int ref); + +py_alias_lists(unique int id : @py_alias_list, + unique int parent : @py_Import ref); + +py_arguments(unique int id : @py_arguments, + unique int parent : @py_arguments_parent ref); + +py_bools(int parent : @py_bool_parent ref, + int idx : int ref); + +py_boolops(unique int id : @py_boolop, + int kind: int ref, + unique int parent : @py_BoolExpr ref); + +py_bytes(varchar(1) id : string ref, + int parent : @py_Bytes ref, + int idx : int ref); + +py_cmpops(unique int id : @py_cmpop, + int kind: int ref, + int parent : @py_cmpop_list ref, + int idx : int ref); + +py_cmpop_lists(unique int id : @py_cmpop_list, + unique int parent : @py_Compare ref); + +py_comprehensions(unique int id : @py_comprehension, + int parent : @py_comprehension_list ref, + int idx : int ref); + +py_comprehension_lists(unique int id : @py_comprehension_list, + unique int parent : @py_ListComp ref); + +py_dict_items(unique int id : @py_dict_item, + int kind: int ref, + int parent : @py_dict_item_list ref, + int idx : int ref); + +py_dict_item_lists(unique int id : @py_dict_item_list, + unique int parent : @py_dict_item_list_parent ref); + +py_exprs(unique int id : @py_expr, + int kind: int ref, + int parent : @py_expr_parent ref, + int idx : int ref); + +py_expr_contexts(unique int id : @py_expr_context, + int kind: int ref, + unique int parent : @py_expr_context_parent ref); + +py_expr_lists(unique int id : @py_expr_list, + int parent : @py_expr_list_parent ref, + int idx : int ref); + +py_ints(int id : int ref, + unique int parent : @py_ImportExpr ref); + +py_locations(unique int id : @location ref, + unique int parent : @py_location_parent ref); + +py_numbers(varchar(1) id : string ref, + int parent : @py_Num ref, + int idx : int ref); + +py_operators(unique int id : @py_operator, + int kind: int ref, + unique int parent : @py_BinaryExpr ref); + +py_parameter_lists(unique int id : @py_parameter_list, + unique int parent : @py_Function ref); + +py_patterns(unique int id : @py_pattern, + int kind: int ref, + int parent : @py_pattern_parent ref, + int idx : int ref); + +py_pattern_lists(unique int id : @py_pattern_list, + int parent : @py_pattern_list_parent ref, + int idx : int ref); + +py_stmts(unique int id : @py_stmt, + int kind: int ref, + int parent : @py_stmt_list ref, + int idx : int ref); + +py_stmt_lists(unique int id : @py_stmt_list, + int parent : @py_stmt_list_parent ref, + int idx : int ref); + +py_strs(varchar(1) id : string ref, + int parent : @py_str_parent ref, + int idx : int ref); + +py_str_lists(unique int id : @py_str_list, + unique int parent : @py_str_list_parent ref); + +py_unaryops(unique int id : @py_unaryop, + int kind: int ref, + unique int parent : @py_UnaryExpr ref); + +py_variables(int id : @py_variable ref, + unique int parent : @py_variable_parent ref); + +case @py_boolop.kind of + 0 = @py_And +| 1 = @py_Or; + +case @py_cmpop.kind of + 0 = @py_Eq +| 1 = @py_Gt +| 2 = @py_GtE +| 3 = @py_In +| 4 = @py_Is +| 5 = @py_IsNot +| 6 = @py_Lt +| 7 = @py_LtE +| 8 = @py_NotEq +| 9 = @py_NotIn; + +case @py_dict_item.kind of + 0 = @py_DictUnpacking +| 1 = @py_KeyValuePair +| 2 = @py_keyword; + +case @py_expr.kind of + 0 = @py_Attribute +| 1 = @py_BinaryExpr +| 2 = @py_BoolExpr +| 3 = @py_Bytes +| 4 = @py_Call +| 5 = @py_ClassExpr +| 6 = @py_Compare +| 7 = @py_Dict +| 8 = @py_DictComp +| 9 = @py_Ellipsis +| 10 = @py_FunctionExpr +| 11 = @py_GeneratorExp +| 12 = @py_IfExp +| 13 = @py_ImportExpr +| 14 = @py_ImportMember +| 15 = @py_Lambda +| 16 = @py_List +| 17 = @py_ListComp +| 18 = @py_Guard +| 19 = @py_Name +| 20 = @py_Num +| 21 = @py_Repr +| 22 = @py_Set +| 23 = @py_SetComp +| 24 = @py_Slice +| 25 = @py_Starred +| 26 = @py_Str +| 27 = @py_Subscript +| 28 = @py_Tuple +| 29 = @py_UnaryExpr +| 30 = @py_Yield +| 31 = @py_YieldFrom +| 32 = @py_TemplateDottedNotation +| 33 = @py_Filter +| 34 = @py_PlaceHolder +| 35 = @py_Await +| 36 = @py_Fstring +| 37 = @py_FormattedValue +| 38 = @py_AssignExpr +| 39 = @py_SpecialOperation; + +case @py_expr_context.kind of + 0 = @py_AugLoad +| 1 = @py_AugStore +| 2 = @py_Del +| 3 = @py_Load +| 4 = @py_Param +| 5 = @py_Store; + +case @py_operator.kind of + 0 = @py_Add +| 1 = @py_BitAnd +| 2 = @py_BitOr +| 3 = @py_BitXor +| 4 = @py_Div +| 5 = @py_FloorDiv +| 6 = @py_LShift +| 7 = @py_Mod +| 8 = @py_Mult +| 9 = @py_Pow +| 10 = @py_RShift +| 11 = @py_Sub +| 12 = @py_MatMult; + +case @py_pattern.kind of + 0 = @py_MatchAsPattern +| 1 = @py_MatchOrPattern +| 2 = @py_MatchLiteralPattern +| 3 = @py_MatchCapturePattern +| 4 = @py_MatchWildcardPattern +| 5 = @py_MatchValuePattern +| 6 = @py_MatchSequencePattern +| 7 = @py_MatchStarPattern +| 8 = @py_MatchMappingPattern +| 9 = @py_MatchDoubleStarPattern +| 10 = @py_MatchKeyValuePattern +| 11 = @py_MatchClassPattern +| 12 = @py_MatchKeywordPattern; + +case @py_stmt.kind of + 0 = @py_Assert +| 1 = @py_Assign +| 2 = @py_AugAssign +| 3 = @py_Break +| 4 = @py_Continue +| 5 = @py_Delete +| 6 = @py_ExceptStmt +| 7 = @py_ExceptGroupStmt +| 8 = @py_Exec +| 9 = @py_Expr_stmt +| 10 = @py_For +| 11 = @py_Global +| 12 = @py_If +| 13 = @py_Import +| 14 = @py_ImportStar +| 15 = @py_MatchStmt +| 16 = @py_Case +| 17 = @py_Nonlocal +| 18 = @py_Pass +| 19 = @py_Print +| 20 = @py_Raise +| 21 = @py_Return +| 22 = @py_Try +| 23 = @py_While +| 24 = @py_With +| 25 = @py_TemplateWrite +| 26 = @py_AnnAssign; + +case @py_unaryop.kind of + 0 = @py_Invert +| 1 = @py_Not +| 2 = @py_UAdd +| 3 = @py_USub; + +@py_Bytes_or_Str = @py_Bytes | @py_Str; + +@py_Function_parent = @py_DictComp | @py_FunctionExpr | @py_GeneratorExp | @py_Lambda | @py_ListComp | @py_SetComp; + +@py_arguments_parent = @py_FunctionExpr | @py_Lambda; + +@py_ast_node = @py_Class | @py_Function | @py_Module | @py_StringPart | @py_comprehension | @py_dict_item | @py_expr | @py_pattern | @py_stmt; + +@py_bool_parent = @py_For | @py_Function | @py_Print | @py_With | @py_expr | @py_pattern; + +@py_dict_item_list_parent = @py_Call | @py_ClassExpr | @py_Dict; + +@py_expr_context_parent = @py_Attribute | @py_List | @py_Name | @py_PlaceHolder | @py_Starred | @py_Subscript | @py_TemplateDottedNotation | @py_Tuple; + +@py_expr_list_parent = @py_Assign | @py_BoolExpr | @py_Call | @py_ClassExpr | @py_Compare | @py_Delete | @py_Fstring | @py_Function | @py_List | @py_Print | @py_Set | @py_SpecialOperation | @py_Tuple | @py_arguments | @py_comprehension; + +@py_expr_or_stmt = @py_expr | @py_stmt; + +@py_expr_parent = @py_AnnAssign | @py_Assert | @py_Assign | @py_AssignExpr | @py_Attribute | @py_AugAssign | @py_Await | @py_BinaryExpr | @py_Call | @py_Case | @py_Compare | @py_DictComp | @py_DictUnpacking | @py_ExceptGroupStmt | @py_ExceptStmt | @py_Exec | @py_Expr_stmt | @py_Filter | @py_For | @py_FormattedValue | @py_Function | @py_FunctionExpr | @py_GeneratorExp | @py_Guard | @py_If | @py_IfExp | @py_ImportMember | @py_ImportStar | @py_KeyValuePair | @py_ListComp | @py_MatchAsPattern | @py_MatchCapturePattern | @py_MatchClassPattern | @py_MatchKeywordPattern | @py_MatchLiteralPattern | @py_MatchStmt | @py_MatchValuePattern | @py_Print | @py_Raise | @py_Repr | @py_Return | @py_SetComp | @py_Slice | @py_Starred | @py_Subscript | @py_TemplateDottedNotation | @py_TemplateWrite | @py_UnaryExpr | @py_While | @py_With | @py_Yield | @py_YieldFrom | @py_alias | @py_arguments | @py_comprehension | @py_expr_list | @py_keyword | @py_parameter_list; + +@py_location_parent = @py_DictUnpacking | @py_KeyValuePair | @py_StringPart | @py_comprehension | @py_expr | @py_keyword | @py_pattern | @py_stmt; + +@py_parameter = @py_Name | @py_Tuple; + +@py_pattern_list_parent = @py_MatchClassPattern | @py_MatchMappingPattern | @py_MatchOrPattern | @py_MatchSequencePattern; + +@py_pattern_parent = @py_Case | @py_MatchAsPattern | @py_MatchDoubleStarPattern | @py_MatchKeyValuePattern | @py_MatchKeywordPattern | @py_MatchStarPattern | @py_pattern_list; + +@py_scope = @py_Class | @py_Function | @py_Module; + +@py_stmt_list_parent = @py_Case | @py_Class | @py_ExceptGroupStmt | @py_ExceptStmt | @py_For | @py_Function | @py_If | @py_MatchStmt | @py_Module | @py_Try | @py_While | @py_With; + +@py_str_list_parent = @py_Global | @py_Nonlocal; + +@py_str_parent = @py_Attribute | @py_Class | @py_ClassExpr | @py_FormattedValue | @py_Function | @py_FunctionExpr | @py_ImportExpr | @py_ImportMember | @py_Module | @py_SpecialOperation | @py_Str | @py_StringPart | @py_TemplateDottedNotation | @py_keyword | @py_str_list; + +@py_variable_parent = @py_Name | @py_PlaceHolder; + + +/* + * End of auto-generated part + */ + + + +/* Map relative names to absolute names for imports */ +py_absolute_names(int module : @py_Module ref, + varchar(1) relname : string ref, + varchar(1) absname : string ref); + +py_exports(int id : @py_Module ref, + varchar(1) name : string ref); + +/* Successor information */ +py_successors(int predecessor : @py_flow_node ref, + int successor : @py_flow_node ref); + +py_true_successors(int predecessor : @py_flow_node ref, + int successor : @py_flow_node ref); + +py_exception_successors(int predecessor : @py_flow_node ref, + int successor : @py_flow_node ref); + +py_false_successors(int predecessor : @py_flow_node ref, + int successor : @py_flow_node ref); + +py_flow_bb_node(unique int flownode : @py_flow_node, + int realnode : @py_ast_node ref, + int basicblock : @py_flow_node ref, + int index : int ref); + +py_scope_flow(int flow : @py_flow_node ref, + int scope : @py_scope ref, + int kind : int ref); + +py_idoms(unique int node : @py_flow_node ref, + int immediate_dominator : @py_flow_node ref); + +py_ssa_phi(int phi : @py_ssa_var ref, + int arg: @py_ssa_var ref); + +py_ssa_var(unique int id : @py_ssa_var, + int var : @py_variable ref); + +py_ssa_use(int node: @py_flow_node ref, + int var : @py_ssa_var ref); + +py_ssa_defn(unique int id : @py_ssa_var ref, + int node: @py_flow_node ref); + +@py_base_var = @py_variable | @py_ssa_var; + +py_scopes(unique int node : @py_expr_or_stmt ref, + int scope : @py_scope ref); + +py_scope_location(unique int id : @location ref, + unique int scope : @py_scope ref); + +py_flags_versioned(varchar(1) name : string ref, + varchar(1) value : string ref, + varchar(1) version : string ref); + +py_syntax_error_versioned(unique int id : @location ref, + varchar(1) message : string ref, + varchar(1) version : string ref); + +py_comments(unique int id : @py_comment, + varchar(1) text : string ref, + unique int location : @location ref); + +/* Type information support */ + +py_cobjects(unique int obj : @py_cobject); + +py_cobjecttypes(unique int obj : @py_cobject ref, + int typeof : @py_cobject ref); + +py_cobjectnames(unique int obj : @py_cobject ref, + varchar(1) name : string ref); + +/* Kind should be 0 for introspection, > 0 from source, as follows: + 1 from C extension source + */ +py_cobject_sources(int obj : @py_cobject ref, + int kind : int ref); + +py_cmembers_versioned(int object : @py_cobject ref, + varchar(1) name : string ref, + int member : @py_cobject ref, + varchar(1) version : string ref); + +py_citems(int object : @py_cobject ref, + int index : int ref, + int member : @py_cobject ref); + +ext_argtype(int funcid : @py_object ref, + int arg : int ref, + int typeid : @py_object ref); + +ext_rettype(int funcid : @py_object ref, + int typeid : @py_object ref); + +ext_proptype(int propid : @py_object ref, + int typeid : @py_object ref); + +ext_argreturn(int funcid : @py_object ref, + int arg : int ref); + +py_special_objects(unique int obj : @py_cobject ref, + unique varchar(1) name : string ref); + +py_decorated_object(int object : @py_object ref, + int level: int ref); + +@py_object = @py_cobject | @py_flow_node; + +@py_source_element = @py_ast_node | @container; diff --git a/python/ql/lib/upgrades/0565f7466437d52e1dc64a3b930926ab2f60cd64/semmlecode.python.dbscheme b/python/ql/lib/upgrades/0565f7466437d52e1dc64a3b930926ab2f60cd64/semmlecode.python.dbscheme new file mode 100644 index 00000000000..728c6d65e61 --- /dev/null +++ b/python/ql/lib/upgrades/0565f7466437d52e1dc64a3b930926ab2f60cd64/semmlecode.python.dbscheme @@ -0,0 +1,1233 @@ +/* + * This dbscheme is auto-generated by 'semmle/dbscheme_gen.py'. + * WARNING: Any modifications to this file will be lost. + * Relations can be changed by modifying master.py or + * by adding rules to dbscheme.template + */ + +/* This is a dummy line to alter the dbscheme, so we can make a database upgrade + * without actually changing any of the dbscheme predicates. It contains a date + * to allow for such updates in the future as well. + * + * 2020-07-02 + * + * DO NOT remove this comment carelessly, since it can revert the dbscheme back to a + * previously seen state (matching a previously seen SHA), which would make the upgrade + * mechanism not work properly. + */ + +/*- DEPRECATED: External defects and metrics -*/ + +externalDefects( + unique int id : @externalDefect, + varchar(900) queryPath : string ref, + int location : @location ref, + varchar(900) message : string ref, + float severity : float ref +); + +externalMetrics( + unique int id : @externalMetric, + varchar(900) queryPath : string ref, + int location : @location ref, + float value : float ref +); + +/*- External data -*/ + +/** + * External data, loaded from CSV files during snapshot creation. See + * [Tutorial: Incorporating external data](https://help.semmle.com/wiki/display/SD/Tutorial%3A+Incorporating+external+data) + * for more information. + */ +externalData( + int id : @externalDataElement, + string path : string ref, + int column: int ref, + string value : string ref +); + +/*- DEPRECATED: Snapshot date -*/ + +snapshotDate(unique date snapshotDate : date ref); + +/*- Source location prefix -*/ + +/** + * The source location of the snapshot. + */ +sourceLocationPrefix(string prefix : string ref); + +/*- DEPRECATED: Duplicate code -*/ + +duplicateCode( + unique int id : @duplication, + string relativePath : string ref, + int equivClass : int ref +); + +similarCode( + unique int id : @similarity, + string relativePath : string ref, + int equivClass : int ref +); + +@duplication_or_similarity = @duplication | @similarity + +tokens( + int id : @duplication_or_similarity ref, + int offset : int ref, + int beginLine : int ref, + int beginColumn : int ref, + int endLine : int ref, + int endColumn : int ref +); + +/*- DEPRECATED: Version control data -*/ + +svnentries( + unique int id : @svnentry, + string revision : string ref, + string author : string ref, + date revisionDate : date ref, + int changeSize : int ref +) + +svnaffectedfiles( + int id : @svnentry ref, + int file : @file ref, + string action : string ref +) + +svnentrymsg( + unique int id : @svnentry ref, + string message : string ref +) + +svnchurn( + int commit : @svnentry ref, + int file : @file ref, + int addedLines : int ref, + int deletedLines : int ref +) + +/*- Lines of code -*/ + +numlines( + int element_id: @sourceline ref, + int num_lines: int ref, + int num_code: int ref, + int num_comment: int ref +); + +/*- Files and folders -*/ + +/** + * The location of an element. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `file`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ +locations_default( + unique int id: @location_default, + int file: @file ref, + int beginLine: int ref, + int beginColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +files( + unique int id: @file, + string name: string ref +); + +folders( + unique int id: @folder, + string name: string ref +); + +@container = @file | @folder + +containerparent( + int parent: @container ref, + unique int child: @container ref +); + +/*- XML Files -*/ + +xmlEncoding( + unique int id: @file ref, + string encoding: string ref +); + +xmlDTDs( + unique int id: @xmldtd, + string root: string ref, + string publicId: string ref, + string systemId: string ref, + int fileid: @file ref +); + +xmlElements( + unique int id: @xmlelement, + string name: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int fileid: @file ref +); + +xmlAttrs( + unique int id: @xmlattribute, + int elementid: @xmlelement ref, + string name: string ref, + string value: string ref, + int idx: int ref, + int fileid: @file ref +); + +xmlNs( + int id: @xmlnamespace, + string prefixName: string ref, + string URI: string ref, + int fileid: @file ref +); + +xmlHasNs( + int elementId: @xmlnamespaceable ref, + int nsId: @xmlnamespace ref, + int fileid: @file ref +); + +xmlComments( + unique int id: @xmlcomment, + string text: string ref, + int parentid: @xmlparent ref, + int fileid: @file ref +); + +xmlChars( + unique int id: @xmlcharacters, + string text: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int isCDATA: int ref, + int fileid: @file ref +); + +@xmlparent = @file | @xmlelement; +@xmlnamespaceable = @xmlelement | @xmlattribute; + +xmllocations( + int xmlElement: @xmllocatable ref, + int location: @location_default ref +); + +@xmllocatable = @xmlcharacters | @xmlelement | @xmlcomment | @xmlattribute | @xmldtd | @file | @xmlnamespace; + +/*- YAML -*/ + +#keyset[parent, idx] +yaml (unique int id: @yaml_node, + int kind: int ref, + int parent: @yaml_node_parent ref, + int idx: int ref, + string tag: string ref, + string tostring: string ref); + +case @yaml_node.kind of + 0 = @yaml_scalar_node +| 1 = @yaml_mapping_node +| 2 = @yaml_sequence_node +| 3 = @yaml_alias_node +; + +@yaml_collection_node = @yaml_mapping_node | @yaml_sequence_node; + +@yaml_node_parent = @yaml_collection_node | @file; + +yaml_anchors (unique int node: @yaml_node ref, + string anchor: string ref); + +yaml_aliases (unique int alias: @yaml_alias_node ref, + string target: string ref); + +yaml_scalars (unique int scalar: @yaml_scalar_node ref, + int style: int ref, + string value: string ref); + +yaml_errors (unique int id: @yaml_error, + string message: string ref); + +yaml_locations(unique int locatable: @yaml_locatable ref, + int location: @location_default ref); + +@yaml_locatable = @yaml_node | @yaml_error; + +/*- Python dbscheme -*/ + +/* + * Line metrics + */ +py_codelines(int id : @py_scope ref, + int count : int ref); + +py_commentlines(int id : @py_scope ref, + int count : int ref); + +py_docstringlines(int id : @py_scope ref, + int count : int ref); + +py_alllines(int id : @py_scope ref, + int count : int ref); + +/**************************** + Python dbscheme +****************************/ + +@sourceline = @file | @py_Module | @xmllocatable; + +@location = @location_ast | @location_default ; + +locations_ast(unique int id: @location_ast, + int module: @py_Module ref, + int beginLine: int ref, + int beginColumn: int ref, + int endLine: int ref, + int endColumn: int ref); + +file_contents(unique int file: @file ref, string contents: string ref); + +py_module_path(int module: @py_Module ref, int file: @container ref); + +variable(unique int id : @py_variable, + int scope : @py_scope ref, + varchar(1) name : string ref); + +py_line_lengths(unique int id : @py_line, + int file: @py_Module ref, + int line : int ref, + int length : int ref); + +py_extracted_version(int module : @py_Module ref, + varchar(1) version : string ref); + +/* AUTO GENERATED PART STARTS HERE */ + + +/* AnnAssign.location = 0, location */ +/* AnnAssign.value = 1, expr */ +/* AnnAssign.annotation = 2, expr */ +/* AnnAssign.target = 3, expr */ + +/* Assert.location = 0, location */ +/* Assert.test = 1, expr */ +/* Assert.msg = 2, expr */ + +/* Assign.location = 0, location */ +/* Assign.value = 1, expr */ +/* Assign.targets = 2, expr_list */ + +/* AssignExpr.location = 0, location */ +/* AssignExpr.parenthesised = 1, bool */ +/* AssignExpr.value = 2, expr */ +/* AssignExpr.target = 3, expr */ + +/* Attribute.location = 0, location */ +/* Attribute.parenthesised = 1, bool */ +/* Attribute.value = 2, expr */ +/* Attribute.attr = 3, str */ +/* Attribute.ctx = 4, expr_context */ + +/* AugAssign.location = 0, location */ +/* AugAssign.operation = 1, BinOp */ + +/* Await.location = 0, location */ +/* Await.parenthesised = 1, bool */ +/* Await.value = 2, expr */ + +/* BinaryExpr.location = 0, location */ +/* BinaryExpr.parenthesised = 1, bool */ +/* BinaryExpr.left = 2, expr */ +/* BinaryExpr.op = 3, operator */ +/* BinaryExpr.right = 4, expr */ +/* BinaryExpr = AugAssign */ + +/* BoolExpr.location = 0, location */ +/* BoolExpr.parenthesised = 1, bool */ +/* BoolExpr.op = 2, boolop */ +/* BoolExpr.values = 3, expr_list */ + +/* Break.location = 0, location */ + +/* Bytes.location = 0, location */ +/* Bytes.parenthesised = 1, bool */ +/* Bytes.s = 2, bytes */ +/* Bytes.prefix = 3, bytes */ +/* Bytes.implicitly_concatenated_parts = 4, StringPart_list */ + +/* Call.location = 0, location */ +/* Call.parenthesised = 1, bool */ +/* Call.func = 2, expr */ +/* Call.positional_args = 3, expr_list */ +/* Call.named_args = 4, dict_item_list */ + +/* Case.location = 0, location */ +/* Case.pattern = 1, pattern */ +/* Case.guard = 2, expr */ +/* Case.body = 3, stmt_list */ + +/* Class.name = 0, str */ +/* Class.body = 1, stmt_list */ +/* Class = ClassExpr */ + +/* ClassExpr.location = 0, location */ +/* ClassExpr.parenthesised = 1, bool */ +/* ClassExpr.name = 2, str */ +/* ClassExpr.bases = 3, expr_list */ +/* ClassExpr.keywords = 4, dict_item_list */ +/* ClassExpr.inner_scope = 5, Class */ +/* ClassExpr.type_parameters = 6, type_parameter_list */ + +/* Compare.location = 0, location */ +/* Compare.parenthesised = 1, bool */ +/* Compare.left = 2, expr */ +/* Compare.ops = 3, cmpop_list */ +/* Compare.comparators = 4, expr_list */ + +/* Continue.location = 0, location */ + +/* Delete.location = 0, location */ +/* Delete.targets = 1, expr_list */ + +/* Dict.location = 0, location */ +/* Dict.parenthesised = 1, bool */ +/* Dict.items = 2, dict_item_list */ + +/* DictComp.location = 0, location */ +/* DictComp.parenthesised = 1, bool */ +/* DictComp.function = 2, Function */ +/* DictComp.iterable = 3, expr */ + +/* DictUnpacking.location = 0, location */ +/* DictUnpacking.value = 1, expr */ + +/* Ellipsis.location = 0, location */ +/* Ellipsis.parenthesised = 1, bool */ + +/* ExceptGroupStmt.location = 0, location */ +/* ExceptGroupStmt.type = 1, expr */ +/* ExceptGroupStmt.name = 2, expr */ +/* ExceptGroupStmt.body = 3, stmt_list */ + +/* ExceptStmt.location = 0, location */ +/* ExceptStmt.type = 1, expr */ +/* ExceptStmt.name = 2, expr */ +/* ExceptStmt.body = 3, stmt_list */ + +/* Exec.location = 0, location */ +/* Exec.body = 1, expr */ +/* Exec.globals = 2, expr */ +/* Exec.locals = 3, expr */ + +/* ExprStmt.location = 0, location */ +/* ExprStmt.value = 1, expr */ + +/* Filter.location = 0, location */ +/* Filter.parenthesised = 1, bool */ +/* Filter.value = 2, expr */ +/* Filter.filter = 3, expr */ + +/* For.location = 0, location */ +/* For.target = 1, expr */ +/* For.iter = 2, expr */ +/* For.body = 3, stmt_list */ +/* For.orelse = 4, stmt_list */ +/* For.is_async = 5, bool */ + +/* FormattedValue.location = 0, location */ +/* FormattedValue.parenthesised = 1, bool */ +/* FormattedValue.value = 2, expr */ +/* FormattedValue.conversion = 3, str */ +/* FormattedValue.format_spec = 4, JoinedStr */ + +/* Function.name = 0, str */ +/* Function.args = 1, parameter_list */ +/* Function.vararg = 2, expr */ +/* Function.kwonlyargs = 3, expr_list */ +/* Function.kwarg = 4, expr */ +/* Function.body = 5, stmt_list */ +/* Function.is_async = 6, bool */ +/* Function.type_parameters = 7, type_parameter_list */ +/* Function = FunctionParent */ + +/* FunctionExpr.location = 0, location */ +/* FunctionExpr.parenthesised = 1, bool */ +/* FunctionExpr.name = 2, str */ +/* FunctionExpr.args = 3, arguments */ +/* FunctionExpr.returns = 4, expr */ +/* FunctionExpr.inner_scope = 5, Function */ + +/* GeneratorExp.location = 0, location */ +/* GeneratorExp.parenthesised = 1, bool */ +/* GeneratorExp.function = 2, Function */ +/* GeneratorExp.iterable = 3, expr */ + +/* Global.location = 0, location */ +/* Global.names = 1, str_list */ + +/* Guard.location = 0, location */ +/* Guard.parenthesised = 1, bool */ +/* Guard.test = 2, expr */ + +/* If.location = 0, location */ +/* If.test = 1, expr */ +/* If.body = 2, stmt_list */ +/* If.orelse = 3, stmt_list */ + +/* IfExp.location = 0, location */ +/* IfExp.parenthesised = 1, bool */ +/* IfExp.test = 2, expr */ +/* IfExp.body = 3, expr */ +/* IfExp.orelse = 4, expr */ + +/* Import.location = 0, location */ +/* Import.names = 1, alias_list */ + +/* ImportExpr.location = 0, location */ +/* ImportExpr.parenthesised = 1, bool */ +/* ImportExpr.level = 2, int */ +/* ImportExpr.name = 3, str */ +/* ImportExpr.top = 4, bool */ + +/* ImportStar.location = 0, location */ +/* ImportStar.module = 1, expr */ + +/* ImportMember.location = 0, location */ +/* ImportMember.parenthesised = 1, bool */ +/* ImportMember.module = 2, expr */ +/* ImportMember.name = 3, str */ + +/* Fstring.location = 0, location */ +/* Fstring.parenthesised = 1, bool */ +/* Fstring.values = 2, expr_list */ +/* Fstring = FormattedValue */ + +/* KeyValuePair.location = 0, location */ +/* KeyValuePair.value = 1, expr */ +/* KeyValuePair.key = 2, expr */ + +/* Lambda.location = 0, location */ +/* Lambda.parenthesised = 1, bool */ +/* Lambda.args = 2, arguments */ +/* Lambda.inner_scope = 3, Function */ + +/* List.location = 0, location */ +/* List.parenthesised = 1, bool */ +/* List.elts = 2, expr_list */ +/* List.ctx = 3, expr_context */ + +/* ListComp.location = 0, location */ +/* ListComp.parenthesised = 1, bool */ +/* ListComp.function = 2, Function */ +/* ListComp.iterable = 3, expr */ +/* ListComp.generators = 4, comprehension_list */ +/* ListComp.elt = 5, expr */ + +/* MatchStmt.location = 0, location */ +/* MatchStmt.subject = 1, expr */ +/* MatchStmt.cases = 2, stmt_list */ + +/* MatchAsPattern.location = 0, location */ +/* MatchAsPattern.parenthesised = 1, bool */ +/* MatchAsPattern.pattern = 2, pattern */ +/* MatchAsPattern.alias = 3, expr */ + +/* MatchCapturePattern.location = 0, location */ +/* MatchCapturePattern.parenthesised = 1, bool */ +/* MatchCapturePattern.variable = 2, expr */ + +/* MatchClassPattern.location = 0, location */ +/* MatchClassPattern.parenthesised = 1, bool */ +/* MatchClassPattern.class = 2, expr */ +/* MatchClassPattern.class_name = 3, expr */ +/* MatchClassPattern.positional = 4, pattern_list */ +/* MatchClassPattern.keyword = 5, pattern_list */ + +/* MatchDoubleStarPattern.location = 0, location */ +/* MatchDoubleStarPattern.parenthesised = 1, bool */ +/* MatchDoubleStarPattern.target = 2, pattern */ + +/* MatchKeyValuePattern.location = 0, location */ +/* MatchKeyValuePattern.parenthesised = 1, bool */ +/* MatchKeyValuePattern.key = 2, pattern */ +/* MatchKeyValuePattern.value = 3, pattern */ + +/* MatchKeywordPattern.location = 0, location */ +/* MatchKeywordPattern.parenthesised = 1, bool */ +/* MatchKeywordPattern.attribute = 2, expr */ +/* MatchKeywordPattern.value = 3, pattern */ + +/* MatchLiteralPattern.location = 0, location */ +/* MatchLiteralPattern.parenthesised = 1, bool */ +/* MatchLiteralPattern.literal = 2, expr */ + +/* MatchMappingPattern.location = 0, location */ +/* MatchMappingPattern.parenthesised = 1, bool */ +/* MatchMappingPattern.mappings = 2, pattern_list */ + +/* MatchOrPattern.location = 0, location */ +/* MatchOrPattern.parenthesised = 1, bool */ +/* MatchOrPattern.patterns = 2, pattern_list */ + +/* MatchSequencePattern.location = 0, location */ +/* MatchSequencePattern.parenthesised = 1, bool */ +/* MatchSequencePattern.patterns = 2, pattern_list */ + +/* MatchStarPattern.location = 0, location */ +/* MatchStarPattern.parenthesised = 1, bool */ +/* MatchStarPattern.target = 2, pattern */ + +/* MatchValuePattern.location = 0, location */ +/* MatchValuePattern.parenthesised = 1, bool */ +/* MatchValuePattern.value = 2, expr */ + +/* MatchWildcardPattern.location = 0, location */ +/* MatchWildcardPattern.parenthesised = 1, bool */ + +/* Module.name = 0, str */ +/* Module.hash = 1, str */ +/* Module.body = 2, stmt_list */ +/* Module.kind = 3, str */ + +/* Name.location = 0, location */ +/* Name.parenthesised = 1, bool */ +/* Name.variable = 2, variable */ +/* Name.ctx = 3, expr_context */ +/* Name = ParameterList */ + +/* Nonlocal.location = 0, location */ +/* Nonlocal.names = 1, str_list */ + +/* Num.location = 0, location */ +/* Num.parenthesised = 1, bool */ +/* Num.n = 2, number */ +/* Num.text = 3, number */ + +/* ParamSpec.location = 0, location */ +/* ParamSpec.name = 1, expr */ + +/* Pass.location = 0, location */ + +/* PlaceHolder.location = 0, location */ +/* PlaceHolder.parenthesised = 1, bool */ +/* PlaceHolder.variable = 2, variable */ +/* PlaceHolder.ctx = 3, expr_context */ + +/* Print.location = 0, location */ +/* Print.dest = 1, expr */ +/* Print.values = 2, expr_list */ +/* Print.nl = 3, bool */ + +/* Raise.location = 0, location */ +/* Raise.exc = 1, expr */ +/* Raise.cause = 2, expr */ +/* Raise.type = 3, expr */ +/* Raise.inst = 4, expr */ +/* Raise.tback = 5, expr */ + +/* Repr.location = 0, location */ +/* Repr.parenthesised = 1, bool */ +/* Repr.value = 2, expr */ + +/* Return.location = 0, location */ +/* Return.value = 1, expr */ + +/* Set.location = 0, location */ +/* Set.parenthesised = 1, bool */ +/* Set.elts = 2, expr_list */ + +/* SetComp.location = 0, location */ +/* SetComp.parenthesised = 1, bool */ +/* SetComp.function = 2, Function */ +/* SetComp.iterable = 3, expr */ + +/* Slice.location = 0, location */ +/* Slice.parenthesised = 1, bool */ +/* Slice.start = 2, expr */ +/* Slice.stop = 3, expr */ +/* Slice.step = 4, expr */ + +/* SpecialOperation.location = 0, location */ +/* SpecialOperation.parenthesised = 1, bool */ +/* SpecialOperation.name = 2, str */ +/* SpecialOperation.arguments = 3, expr_list */ + +/* Starred.location = 0, location */ +/* Starred.parenthesised = 1, bool */ +/* Starred.value = 2, expr */ +/* Starred.ctx = 3, expr_context */ + +/* Str.location = 0, location */ +/* Str.parenthesised = 1, bool */ +/* Str.s = 2, str */ +/* Str.prefix = 3, str */ +/* Str.implicitly_concatenated_parts = 4, StringPart_list */ + +/* StringPart.text = 0, str */ +/* StringPart.location = 1, location */ +/* StringPart = StringPartList */ +/* StringPartList = BytesOrStr */ + +/* Subscript.location = 0, location */ +/* Subscript.parenthesised = 1, bool */ +/* Subscript.value = 2, expr */ +/* Subscript.index = 3, expr */ +/* Subscript.ctx = 4, expr_context */ + +/* TemplateDottedNotation.location = 0, location */ +/* TemplateDottedNotation.parenthesised = 1, bool */ +/* TemplateDottedNotation.value = 2, expr */ +/* TemplateDottedNotation.attr = 3, str */ +/* TemplateDottedNotation.ctx = 4, expr_context */ + +/* TemplateWrite.location = 0, location */ +/* TemplateWrite.value = 1, expr */ + +/* Try.location = 0, location */ +/* Try.body = 1, stmt_list */ +/* Try.orelse = 2, stmt_list */ +/* Try.handlers = 3, stmt_list */ +/* Try.finalbody = 4, stmt_list */ + +/* Tuple.location = 0, location */ +/* Tuple.parenthesised = 1, bool */ +/* Tuple.elts = 2, expr_list */ +/* Tuple.ctx = 3, expr_context */ +/* Tuple = ParameterList */ + +/* TypeAlias.location = 0, location */ +/* TypeAlias.name = 1, expr */ +/* TypeAlias.type_parameters = 2, type_parameter_list */ +/* TypeAlias.value = 3, expr */ + +/* TypeVar.location = 0, location */ +/* TypeVar.name = 1, expr */ +/* TypeVar.bound = 2, expr */ + +/* TypeVarTuple.location = 0, location */ +/* TypeVarTuple.name = 1, expr */ + +/* UnaryExpr.location = 0, location */ +/* UnaryExpr.parenthesised = 1, bool */ +/* UnaryExpr.op = 2, unaryop */ +/* UnaryExpr.operand = 3, expr */ + +/* While.location = 0, location */ +/* While.test = 1, expr */ +/* While.body = 2, stmt_list */ +/* While.orelse = 3, stmt_list */ + +/* With.location = 0, location */ +/* With.context_expr = 1, expr */ +/* With.optional_vars = 2, expr */ +/* With.body = 3, stmt_list */ +/* With.is_async = 4, bool */ + +/* Yield.location = 0, location */ +/* Yield.parenthesised = 1, bool */ +/* Yield.value = 2, expr */ + +/* YieldFrom.location = 0, location */ +/* YieldFrom.parenthesised = 1, bool */ +/* YieldFrom.value = 2, expr */ + +/* Alias.value = 0, expr */ +/* Alias.asname = 1, expr */ +/* Alias = AliasList */ +/* AliasList = Import */ + +/* Arguments.kw_defaults = 0, expr_list */ +/* Arguments.defaults = 1, expr_list */ +/* Arguments.annotations = 2, expr_list */ +/* Arguments.varargannotation = 3, expr */ +/* Arguments.kwargannotation = 4, expr */ +/* Arguments.kw_annotations = 5, expr_list */ +/* Arguments = ArgumentsParent */ +/* boolean = BoolParent */ +/* Boolop = BoolExpr */ +/* string = Bytes */ +/* Cmpop = CmpopList */ +/* CmpopList = Compare */ + +/* Comprehension.location = 0, location */ +/* Comprehension.iter = 1, expr */ +/* Comprehension.target = 2, expr */ +/* Comprehension.ifs = 3, expr_list */ +/* Comprehension = ComprehensionList */ +/* ComprehensionList = ListComp */ +/* DictItem = DictItemList */ +/* DictItemList = DictItemListParent */ + +/* Expr.location = 0, location */ +/* Expr.parenthesised = 1, bool */ +/* Expr = ExprParent */ +/* ExprContext = ExprContextParent */ +/* ExprList = ExprListParent */ +/* int = ImportExpr */ + +/* Keyword.location = 0, location */ +/* Keyword.value = 1, expr */ +/* Keyword.arg = 2, str */ +/* Location = LocationParent */ +/* string = Num */ +/* Operator = BinaryExpr */ +/* ParameterList = Function */ + +/* Pattern.location = 0, location */ +/* Pattern.parenthesised = 1, bool */ +/* Pattern = PatternParent */ +/* PatternList = PatternListParent */ + +/* Stmt.location = 0, location */ +/* Stmt = StmtList */ +/* StmtList = StmtListParent */ +/* string = StrParent */ +/* StringList = StrListParent */ + +/* TypeParameter.location = 0, location */ +/* TypeParameter = TypeParameterList */ +/* TypeParameterList = TypeParameterListParent */ +/* Unaryop = UnaryExpr */ +/* Variable = VariableParent */ +py_Classes(unique int id : @py_Class, + unique int parent : @py_ClassExpr ref); + +py_Functions(unique int id : @py_Function, + unique int parent : @py_Function_parent ref); + +py_Modules(unique int id : @py_Module); + +py_StringParts(unique int id : @py_StringPart, + int parent : @py_StringPart_list ref, + int idx : int ref); + +py_StringPart_lists(unique int id : @py_StringPart_list, + unique int parent : @py_Bytes_or_Str ref); + +py_aliases(unique int id : @py_alias, + int parent : @py_alias_list ref, + int idx : int ref); + +py_alias_lists(unique int id : @py_alias_list, + unique int parent : @py_Import ref); + +py_arguments(unique int id : @py_arguments, + unique int parent : @py_arguments_parent ref); + +py_bools(int parent : @py_bool_parent ref, + int idx : int ref); + +py_boolops(unique int id : @py_boolop, + int kind: int ref, + unique int parent : @py_BoolExpr ref); + +py_bytes(varchar(1) id : string ref, + int parent : @py_Bytes ref, + int idx : int ref); + +py_cmpops(unique int id : @py_cmpop, + int kind: int ref, + int parent : @py_cmpop_list ref, + int idx : int ref); + +py_cmpop_lists(unique int id : @py_cmpop_list, + unique int parent : @py_Compare ref); + +py_comprehensions(unique int id : @py_comprehension, + int parent : @py_comprehension_list ref, + int idx : int ref); + +py_comprehension_lists(unique int id : @py_comprehension_list, + unique int parent : @py_ListComp ref); + +py_dict_items(unique int id : @py_dict_item, + int kind: int ref, + int parent : @py_dict_item_list ref, + int idx : int ref); + +py_dict_item_lists(unique int id : @py_dict_item_list, + unique int parent : @py_dict_item_list_parent ref); + +py_exprs(unique int id : @py_expr, + int kind: int ref, + int parent : @py_expr_parent ref, + int idx : int ref); + +py_expr_contexts(unique int id : @py_expr_context, + int kind: int ref, + unique int parent : @py_expr_context_parent ref); + +py_expr_lists(unique int id : @py_expr_list, + int parent : @py_expr_list_parent ref, + int idx : int ref); + +py_ints(int id : int ref, + unique int parent : @py_ImportExpr ref); + +py_locations(unique int id : @location ref, + unique int parent : @py_location_parent ref); + +py_numbers(varchar(1) id : string ref, + int parent : @py_Num ref, + int idx : int ref); + +py_operators(unique int id : @py_operator, + int kind: int ref, + unique int parent : @py_BinaryExpr ref); + +py_parameter_lists(unique int id : @py_parameter_list, + unique int parent : @py_Function ref); + +py_patterns(unique int id : @py_pattern, + int kind: int ref, + int parent : @py_pattern_parent ref, + int idx : int ref); + +py_pattern_lists(unique int id : @py_pattern_list, + int parent : @py_pattern_list_parent ref, + int idx : int ref); + +py_stmts(unique int id : @py_stmt, + int kind: int ref, + int parent : @py_stmt_list ref, + int idx : int ref); + +py_stmt_lists(unique int id : @py_stmt_list, + int parent : @py_stmt_list_parent ref, + int idx : int ref); + +py_strs(varchar(1) id : string ref, + int parent : @py_str_parent ref, + int idx : int ref); + +py_str_lists(unique int id : @py_str_list, + unique int parent : @py_str_list_parent ref); + +py_type_parameters(unique int id : @py_type_parameter, + int kind: int ref, + int parent : @py_type_parameter_list ref, + int idx : int ref); + +py_type_parameter_lists(unique int id : @py_type_parameter_list, + unique int parent : @py_type_parameter_list_parent ref); + +py_unaryops(unique int id : @py_unaryop, + int kind: int ref, + unique int parent : @py_UnaryExpr ref); + +py_variables(int id : @py_variable ref, + unique int parent : @py_variable_parent ref); + +case @py_boolop.kind of + 0 = @py_And +| 1 = @py_Or; + +case @py_cmpop.kind of + 0 = @py_Eq +| 1 = @py_Gt +| 2 = @py_GtE +| 3 = @py_In +| 4 = @py_Is +| 5 = @py_IsNot +| 6 = @py_Lt +| 7 = @py_LtE +| 8 = @py_NotEq +| 9 = @py_NotIn; + +case @py_dict_item.kind of + 0 = @py_DictUnpacking +| 1 = @py_KeyValuePair +| 2 = @py_keyword; + +case @py_expr.kind of + 0 = @py_Attribute +| 1 = @py_BinaryExpr +| 2 = @py_BoolExpr +| 3 = @py_Bytes +| 4 = @py_Call +| 5 = @py_ClassExpr +| 6 = @py_Compare +| 7 = @py_Dict +| 8 = @py_DictComp +| 9 = @py_Ellipsis +| 10 = @py_FunctionExpr +| 11 = @py_GeneratorExp +| 12 = @py_IfExp +| 13 = @py_ImportExpr +| 14 = @py_ImportMember +| 15 = @py_Lambda +| 16 = @py_List +| 17 = @py_ListComp +| 18 = @py_Guard +| 19 = @py_Name +| 20 = @py_Num +| 21 = @py_Repr +| 22 = @py_Set +| 23 = @py_SetComp +| 24 = @py_Slice +| 25 = @py_Starred +| 26 = @py_Str +| 27 = @py_Subscript +| 28 = @py_Tuple +| 29 = @py_UnaryExpr +| 30 = @py_Yield +| 31 = @py_YieldFrom +| 32 = @py_TemplateDottedNotation +| 33 = @py_Filter +| 34 = @py_PlaceHolder +| 35 = @py_Await +| 36 = @py_Fstring +| 37 = @py_FormattedValue +| 38 = @py_AssignExpr +| 39 = @py_SpecialOperation; + +case @py_expr_context.kind of + 0 = @py_AugLoad +| 1 = @py_AugStore +| 2 = @py_Del +| 3 = @py_Load +| 4 = @py_Param +| 5 = @py_Store; + +case @py_operator.kind of + 0 = @py_Add +| 1 = @py_BitAnd +| 2 = @py_BitOr +| 3 = @py_BitXor +| 4 = @py_Div +| 5 = @py_FloorDiv +| 6 = @py_LShift +| 7 = @py_Mod +| 8 = @py_Mult +| 9 = @py_Pow +| 10 = @py_RShift +| 11 = @py_Sub +| 12 = @py_MatMult; + +case @py_pattern.kind of + 0 = @py_MatchAsPattern +| 1 = @py_MatchOrPattern +| 2 = @py_MatchLiteralPattern +| 3 = @py_MatchCapturePattern +| 4 = @py_MatchWildcardPattern +| 5 = @py_MatchValuePattern +| 6 = @py_MatchSequencePattern +| 7 = @py_MatchStarPattern +| 8 = @py_MatchMappingPattern +| 9 = @py_MatchDoubleStarPattern +| 10 = @py_MatchKeyValuePattern +| 11 = @py_MatchClassPattern +| 12 = @py_MatchKeywordPattern; + +case @py_stmt.kind of + 0 = @py_Assert +| 1 = @py_Assign +| 2 = @py_AugAssign +| 3 = @py_Break +| 4 = @py_Continue +| 5 = @py_Delete +| 6 = @py_ExceptStmt +| 7 = @py_ExceptGroupStmt +| 8 = @py_Exec +| 9 = @py_Expr_stmt +| 10 = @py_For +| 11 = @py_Global +| 12 = @py_If +| 13 = @py_Import +| 14 = @py_ImportStar +| 15 = @py_MatchStmt +| 16 = @py_Case +| 17 = @py_Nonlocal +| 18 = @py_Pass +| 19 = @py_Print +| 20 = @py_Raise +| 21 = @py_Return +| 22 = @py_Try +| 23 = @py_While +| 24 = @py_With +| 25 = @py_TemplateWrite +| 26 = @py_AnnAssign +| 27 = @py_TypeAlias; + +case @py_type_parameter.kind of + 0 = @py_ParamSpec +| 1 = @py_TypeVar +| 2 = @py_TypeVarTuple; + +case @py_unaryop.kind of + 0 = @py_Invert +| 1 = @py_Not +| 2 = @py_UAdd +| 3 = @py_USub; + +@py_Bytes_or_Str = @py_Bytes | @py_Str; + +@py_Function_parent = @py_DictComp | @py_FunctionExpr | @py_GeneratorExp | @py_Lambda | @py_ListComp | @py_SetComp; + +@py_arguments_parent = @py_FunctionExpr | @py_Lambda; + +@py_ast_node = @py_Class | @py_Function | @py_Module | @py_StringPart | @py_comprehension | @py_dict_item | @py_expr | @py_pattern | @py_stmt | @py_type_parameter; + +@py_bool_parent = @py_For | @py_Function | @py_Print | @py_With | @py_expr | @py_pattern; + +@py_dict_item_list_parent = @py_Call | @py_ClassExpr | @py_Dict; + +@py_expr_context_parent = @py_Attribute | @py_List | @py_Name | @py_PlaceHolder | @py_Starred | @py_Subscript | @py_TemplateDottedNotation | @py_Tuple; + +@py_expr_list_parent = @py_Assign | @py_BoolExpr | @py_Call | @py_ClassExpr | @py_Compare | @py_Delete | @py_Fstring | @py_Function | @py_List | @py_Print | @py_Set | @py_SpecialOperation | @py_Tuple | @py_arguments | @py_comprehension; + +@py_expr_or_stmt = @py_expr | @py_stmt; + +@py_expr_parent = @py_AnnAssign | @py_Assert | @py_Assign | @py_AssignExpr | @py_Attribute | @py_AugAssign | @py_Await | @py_BinaryExpr | @py_Call | @py_Case | @py_Compare | @py_DictComp | @py_DictUnpacking | @py_ExceptGroupStmt | @py_ExceptStmt | @py_Exec | @py_Expr_stmt | @py_Filter | @py_For | @py_FormattedValue | @py_Function | @py_FunctionExpr | @py_GeneratorExp | @py_Guard | @py_If | @py_IfExp | @py_ImportMember | @py_ImportStar | @py_KeyValuePair | @py_ListComp | @py_MatchAsPattern | @py_MatchCapturePattern | @py_MatchClassPattern | @py_MatchKeywordPattern | @py_MatchLiteralPattern | @py_MatchStmt | @py_MatchValuePattern | @py_ParamSpec | @py_Print | @py_Raise | @py_Repr | @py_Return | @py_SetComp | @py_Slice | @py_Starred | @py_Subscript | @py_TemplateDottedNotation | @py_TemplateWrite | @py_TypeAlias | @py_TypeVar | @py_TypeVarTuple | @py_UnaryExpr | @py_While | @py_With | @py_Yield | @py_YieldFrom | @py_alias | @py_arguments | @py_comprehension | @py_expr_list | @py_keyword | @py_parameter_list; + +@py_location_parent = @py_DictUnpacking | @py_KeyValuePair | @py_StringPart | @py_comprehension | @py_expr | @py_keyword | @py_pattern | @py_stmt | @py_type_parameter; + +@py_parameter = @py_Name | @py_Tuple; + +@py_pattern_list_parent = @py_MatchClassPattern | @py_MatchMappingPattern | @py_MatchOrPattern | @py_MatchSequencePattern; + +@py_pattern_parent = @py_Case | @py_MatchAsPattern | @py_MatchDoubleStarPattern | @py_MatchKeyValuePattern | @py_MatchKeywordPattern | @py_MatchStarPattern | @py_pattern_list; + +@py_scope = @py_Class | @py_Function | @py_Module; + +@py_stmt_list_parent = @py_Case | @py_Class | @py_ExceptGroupStmt | @py_ExceptStmt | @py_For | @py_Function | @py_If | @py_MatchStmt | @py_Module | @py_Try | @py_While | @py_With; + +@py_str_list_parent = @py_Global | @py_Nonlocal; + +@py_str_parent = @py_Attribute | @py_Class | @py_ClassExpr | @py_FormattedValue | @py_Function | @py_FunctionExpr | @py_ImportExpr | @py_ImportMember | @py_Module | @py_SpecialOperation | @py_Str | @py_StringPart | @py_TemplateDottedNotation | @py_keyword | @py_str_list; + +@py_type_parameter_list_parent = @py_ClassExpr | @py_Function | @py_TypeAlias; + +@py_variable_parent = @py_Name | @py_PlaceHolder; + + +/* + * End of auto-generated part + */ + + + +/* Map relative names to absolute names for imports */ +py_absolute_names(int module : @py_Module ref, + varchar(1) relname : string ref, + varchar(1) absname : string ref); + +py_exports(int id : @py_Module ref, + varchar(1) name : string ref); + +/* Successor information */ +py_successors(int predecessor : @py_flow_node ref, + int successor : @py_flow_node ref); + +py_true_successors(int predecessor : @py_flow_node ref, + int successor : @py_flow_node ref); + +py_exception_successors(int predecessor : @py_flow_node ref, + int successor : @py_flow_node ref); + +py_false_successors(int predecessor : @py_flow_node ref, + int successor : @py_flow_node ref); + +py_flow_bb_node(unique int flownode : @py_flow_node, + int realnode : @py_ast_node ref, + int basicblock : @py_flow_node ref, + int index : int ref); + +py_scope_flow(int flow : @py_flow_node ref, + int scope : @py_scope ref, + int kind : int ref); + +py_idoms(unique int node : @py_flow_node ref, + int immediate_dominator : @py_flow_node ref); + +py_ssa_phi(int phi : @py_ssa_var ref, + int arg: @py_ssa_var ref); + +py_ssa_var(unique int id : @py_ssa_var, + int var : @py_variable ref); + +py_ssa_use(int node: @py_flow_node ref, + int var : @py_ssa_var ref); + +py_ssa_defn(unique int id : @py_ssa_var ref, + int node: @py_flow_node ref); + +@py_base_var = @py_variable | @py_ssa_var; + +py_scopes(unique int node : @py_expr_or_stmt ref, + int scope : @py_scope ref); + +py_scope_location(unique int id : @location ref, + unique int scope : @py_scope ref); + +py_flags_versioned(varchar(1) name : string ref, + varchar(1) value : string ref, + varchar(1) version : string ref); + +py_syntax_error_versioned(unique int id : @location ref, + varchar(1) message : string ref, + varchar(1) version : string ref); + +py_comments(unique int id : @py_comment, + varchar(1) text : string ref, + unique int location : @location ref); + +/* Type information support */ + +py_cobjects(unique int obj : @py_cobject); + +py_cobjecttypes(unique int obj : @py_cobject ref, + int typeof : @py_cobject ref); + +py_cobjectnames(unique int obj : @py_cobject ref, + varchar(1) name : string ref); + +/* Kind should be 0 for introspection, > 0 from source, as follows: + 1 from C extension source + */ +py_cobject_sources(int obj : @py_cobject ref, + int kind : int ref); + +py_cmembers_versioned(int object : @py_cobject ref, + varchar(1) name : string ref, + int member : @py_cobject ref, + varchar(1) version : string ref); + +py_citems(int object : @py_cobject ref, + int index : int ref, + int member : @py_cobject ref); + +ext_argtype(int funcid : @py_object ref, + int arg : int ref, + int typeid : @py_object ref); + +ext_rettype(int funcid : @py_object ref, + int typeid : @py_object ref); + +ext_proptype(int propid : @py_object ref, + int typeid : @py_object ref); + +ext_argreturn(int funcid : @py_object ref, + int arg : int ref); + +py_special_objects(unique int obj : @py_cobject ref, + unique varchar(1) name : string ref); + +py_decorated_object(int object : @py_object ref, + int level: int ref); + +@py_object = @py_cobject | @py_flow_node; + +@py_source_element = @py_ast_node | @container; diff --git a/python/ql/lib/upgrades/0565f7466437d52e1dc64a3b930926ab2f60cd64/upgrade.properties b/python/ql/lib/upgrades/0565f7466437d52e1dc64a3b930926ab2f60cd64/upgrade.properties new file mode 100644 index 00000000000..a5be17b79eb --- /dev/null +++ b/python/ql/lib/upgrades/0565f7466437d52e1dc64a3b930926ab2f60cd64/upgrade.properties @@ -0,0 +1,2 @@ +description: Add support for type parameters and type alias statements +compatibility: backwards From f67c68da9acfab5d705d9a47cdbc0e27f7dbdde7 Mon Sep 17 00:00:00 2001 From: Taus Date: Fri, 3 Nov 2023 22:50:38 +0000 Subject: [PATCH 024/202] Python: Make `TypeParameter` extend `AstNode` With `AstNode` defined as a union of other classes, we don't get this for free. (Compare with `DictItem`, which is in a similar situation.) --- python/ql/lib/semmle/python/AstExtended.qll | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/python/ql/lib/semmle/python/AstExtended.qll b/python/ql/lib/semmle/python/AstExtended.qll index 1447656543c..f02177fb78f 100644 --- a/python/ql/lib/semmle/python/AstExtended.qll +++ b/python/ql/lib/semmle/python/AstExtended.qll @@ -222,9 +222,16 @@ class StringList extends StringList_ { } class AliasList extends AliasList_ { } /** A generic type parameter, as seen in function, class, and type alias definitions. */ -class TypeParameter extends TypeParameter_ { +class TypeParameter extends TypeParameter_, AstNode { /** Gets a textual representation of this element */ override string toString() { result = TypeParameter_.super.toString() } + + override AstNode getAChildNode() { none() } + + override Scope getScope() { none() } + + /** Gets the location of this element */ + override Location getLocation() { result = TypeParameter_.super.getLocation() } } /** A list of type parameters */ From 75e6de83115ad397b720cbfd3c17d458ef925a3f Mon Sep 17 00:00:00 2001 From: Taus Date: Fri, 3 Nov 2023 22:53:59 +0000 Subject: [PATCH 025/202] Python: Add test --- .../test/library-tests/PEP695/test.expected | 18 ++++++++++ python/ql/test/library-tests/PEP695/test.py | 5 +++ python/ql/test/library-tests/PEP695/test.ql | 36 +++++++++++++++++++ 3 files changed, 59 insertions(+) create mode 100644 python/ql/test/library-tests/PEP695/test.expected create mode 100644 python/ql/test/library-tests/PEP695/test.py create mode 100644 python/ql/test/library-tests/PEP695/test.ql diff --git a/python/ql/test/library-tests/PEP695/test.expected b/python/ql/test/library-tests/PEP695/test.expected new file mode 100644 index 00000000000..02cb326cfe1 --- /dev/null +++ b/python/ql/test/library-tests/PEP695/test.expected @@ -0,0 +1,18 @@ +type_vars_without_bound +| test.py:1:8:1:9 | TypeVar | T1 | TypeAlias T | +| test.py:3:7:3:8 | TypeVar | T6 | Function f | +| test.py:5:9:5:11 | TypeVar | T10 | Class C | +type_vars_with_bound +| test.py:1:12:1:17 | TypeVar | T2 | E1 | TypeAlias T | +| test.py:3:11:3:16 | TypeVar | T7 | E2 | Function f | +| test.py:5:14:5:20 | TypeVar | T11 | E3 | Class C | +type_var_tuples +| test.py:1:20:1:22 | TypeVarTuple | T3 | TypeAlias T | +| test.py:3:19:3:21 | TypeVarTuple | T8 | Function f | +| test.py:5:23:5:26 | TypeVarTuple | T12 | Class C | +param_specs +| test.py:1:25:1:28 | ParamSpec | T4 | TypeAlias T | +| test.py:3:24:3:27 | ParamSpec | T9 | Function f | +| test.py:5:29:5:33 | ParamSpec | T13 | Class C | +type_aliases +| test.py:1:1:1:34 | TypeAlias | T | T5 | diff --git a/python/ql/test/library-tests/PEP695/test.py b/python/ql/test/library-tests/PEP695/test.py new file mode 100644 index 00000000000..844ba4930ed --- /dev/null +++ b/python/ql/test/library-tests/PEP695/test.py @@ -0,0 +1,5 @@ +type T[T1, T2: E1, *T3, **T4] = T5 + +def f[T6, T7: E2, *T8, **T9](): ... + +class C[T10, T11: E3, *T12, **T13]: ... diff --git a/python/ql/test/library-tests/PEP695/test.ql b/python/ql/test/library-tests/PEP695/test.ql new file mode 100644 index 00000000000..0c9d7791029 --- /dev/null +++ b/python/ql/test/library-tests/PEP695/test.ql @@ -0,0 +1,36 @@ +import python + +string pretty_name(AstNode n) { + result = "Function " + n.(Function).getName() + or + result = "Class " + n.(ClassExpr).getName() + or + result = "TypeAlias " + n.(TypeAlias).getName().getId() +} + +query predicate type_vars_without_bound(TypeVar tv, string name, string parent) { + tv.getName().getId() = name and + not exists(tv.getBound()) and + parent = pretty_name(tv.getParent().getParent()) +} + +query predicate type_vars_with_bound(TypeVar tv, string name, string bound, string parent) { + tv.getName().getId() = name and + bound = tv.getBound().(Name).getId() and + parent = pretty_name(tv.getParent().getParent()) +} + +query predicate type_var_tuples(TypeVarTuple tvt, string name, string parent) { + tvt.getName().getId() = name and + parent = pretty_name(tvt.getParent().getParent()) +} + +query predicate param_specs(ParamSpec ps, string name, string parent) { + ps.getName().getId() = name and + parent = pretty_name(ps.getParent().getParent()) +} + +query predicate type_aliases(TypeAlias ta, string name, string value) { + ta.getName().getId() = name and + value = ta.getValue().(Name).getId() +} From 637c52d10a8c9715114aa99e2daa277d9373f12b Mon Sep 17 00:00:00 2001 From: amammad <77095239+amammad@users.noreply.github.com> Date: Mon, 6 Nov 2023 19:03:55 +0100 Subject: [PATCH 026/202] separate each new FileSystemAccess packages. --- .../lib/semmle/python/frameworks/Aiofile.qll | 42 +++++++++++++++ .../lib/semmle/python/frameworks/Aiofiles.qll | 28 ++++++++++ .../{FileSystemAccess.qll => Anyio.qll} | 51 ++----------------- .../semmle/python/frameworks/Starlette.qll | 15 ------ .../ql/lib/semmle/python/frameworks/baize.qll | 35 +++++++++++++ 5 files changed, 110 insertions(+), 61 deletions(-) create mode 100644 python/ql/lib/semmle/python/frameworks/Aiofile.qll create mode 100644 python/ql/lib/semmle/python/frameworks/Aiofiles.qll rename python/ql/lib/semmle/python/frameworks/{FileSystemAccess.qll => Anyio.qll} (52%) create mode 100644 python/ql/lib/semmle/python/frameworks/baize.qll diff --git a/python/ql/lib/semmle/python/frameworks/Aiofile.qll b/python/ql/lib/semmle/python/frameworks/Aiofile.qll new file mode 100644 index 00000000000..62a561ebc0d --- /dev/null +++ b/python/ql/lib/semmle/python/frameworks/Aiofile.qll @@ -0,0 +1,42 @@ +/** + * Provides classes modeling security-relevant aspects of the `aiofile` PyPI package. + * + * See https://pypi.org/project/aiofile. + */ + +private import python +private import semmle.python.dataflow.new.DataFlow +private import semmle.python.dataflow.new.RemoteFlowSources +private import semmle.python.dataflow.new.TaintTracking +private import semmle.python.Concepts +private import semmle.python.ApiGraphs + +/** + * Provides models for the `aiofile` PyPI package. + * + * See https://pypi.org/project/aiofile. + */ +private module Aiofile { + /** + * A call to the `async_open` function or `AIOFile` constructor from `aiofile` as a sink for Filesystem access. + */ + class FileResponseCall extends FileSystemAccess::Range, API::CallNode { + string methodName; + + FileResponseCall() { + this = API::moduleImport("aiofile").getMember("async_open").getACall() and + methodName = "async_open" + or + this = API::moduleImport("aiofile").getMember("AIOFile").getACall() and + methodName = "AIOFile" + } + + override DataFlow::Node getAPathArgument() { + result = this.getParameter(0, "file_specifier").asSink() and + methodName = "async_open" + or + result = this.getParameter(0, "filename").asSink() and + methodName = "AIOFile" + } + } +} diff --git a/python/ql/lib/semmle/python/frameworks/Aiofiles.qll b/python/ql/lib/semmle/python/frameworks/Aiofiles.qll new file mode 100644 index 00000000000..c65b9993e89 --- /dev/null +++ b/python/ql/lib/semmle/python/frameworks/Aiofiles.qll @@ -0,0 +1,28 @@ +/** + * Provides classes modeling security-relevant aspects of the `aiofiles` PyPI package. + * + * See https://pypi.org/project/aiofiles. + */ + +private import python +private import semmle.python.dataflow.new.DataFlow +private import semmle.python.dataflow.new.RemoteFlowSources +private import semmle.python.dataflow.new.TaintTracking +private import semmle.python.Concepts +private import semmle.python.ApiGraphs + +/** + * Provides models for the `aiofiles` PyPI package. + * + * See https://pypi.org/project/aiofiles. + */ +private module Aiofiles { + /** + * A call to the `open` function from `aiofiles` as a sink for Filesystem access. + */ + class FileResponseCall extends FileSystemAccess::Range, API::CallNode { + FileResponseCall() { this = API::moduleImport("aiofiles").getMember("open").getACall() } + + override DataFlow::Node getAPathArgument() { result = this.getParameter(0, "file").asSink() } + } +} diff --git a/python/ql/lib/semmle/python/frameworks/FileSystemAccess.qll b/python/ql/lib/semmle/python/frameworks/Anyio.qll similarity index 52% rename from python/ql/lib/semmle/python/frameworks/FileSystemAccess.qll rename to python/ql/lib/semmle/python/frameworks/Anyio.qll index 9c936e4075d..d1e21764e9a 100644 --- a/python/ql/lib/semmle/python/frameworks/FileSystemAccess.qll +++ b/python/ql/lib/semmle/python/frameworks/Anyio.qll @@ -1,5 +1,7 @@ /** - * Provides classes modeling security-relevant aspects of the I/O file write or file read operations + * Provides classes modeling security-relevant aspects of the `anyio` PyPI package. + * + * See https://pypi.org/project/anyio. */ private import python @@ -9,53 +11,10 @@ private import semmle.python.dataflow.new.TaintTracking private import semmle.python.Concepts private import semmle.python.ApiGraphs -/** - * Provides models for the `aiofile` PyPI package. - * See https://github.com/agronholm/anyio. - */ -private module Aiofile { - /** - * A call to the `async_open` function or `AIOFile` constructor from `aiofile` as a sink for Filesystem access. - */ - class FileResponseCall extends FileSystemAccess::Range, API::CallNode { - string methodName; - - FileResponseCall() { - this = API::moduleImport("aiofile").getMember("async_open").getACall() and - methodName = "async_open" - or - this = API::moduleImport("aiofile").getMember("AIOFile").getACall() and - methodName = "AIOFile" - } - - override DataFlow::Node getAPathArgument() { - result = this.getParameter(0, "file_specifier").asSink() and - methodName = "async_open" - or - result = this.getParameter(0, "filename").asSink() and - methodName = "AIOFile" - } - } -} - -/** - * Provides models for the `aiofiles` PyPI package. - * See https://github.com/Tinche/aiofiles. - */ -private module Aiofiles { - /** - * A call to the `open` function from `aiofiles` as a sink for Filesystem access. - */ - class FileResponseCall extends FileSystemAccess::Range, API::CallNode { - FileResponseCall() { this = API::moduleImport("aiofiles").getMember("open").getACall() } - - override DataFlow::Node getAPathArgument() { result = this.getParameter(0, "file").asSink() } - } -} - /** * Provides models for the `anyio` PyPI package. - * See https://github.com/agronholm/anyio. + * + * See https://pypi.org/project/anyio. */ private module Anyio { /** diff --git a/python/ql/lib/semmle/python/frameworks/Starlette.qll b/python/ql/lib/semmle/python/frameworks/Starlette.qll index ec41376cf67..bd41401733d 100644 --- a/python/ql/lib/semmle/python/frameworks/Starlette.qll +++ b/python/ql/lib/semmle/python/frameworks/Starlette.qll @@ -175,19 +175,4 @@ module Starlette { override DataFlow::Node getAPathArgument() { result = this.getParameter(0, "path").asSink() } } - - /** - * A call to the `baize.asgi.FileResponse` constructor as a sink for Filesystem access. - * - * it is not contained to Starlette source code but it is mentioned in documents as an alternative to Starlette FileResponse - */ - class BaizeFileResponseCall extends FileSystemAccess::Range, API::CallNode { - BaizeFileResponseCall() { - this = API::moduleImport("baize").getMember("asgi").getMember("FileResponse").getACall() - } - - override DataFlow::Node getAPathArgument() { - result = this.getParameter(0, "filepath").asSink() - } - } } diff --git a/python/ql/lib/semmle/python/frameworks/baize.qll b/python/ql/lib/semmle/python/frameworks/baize.qll new file mode 100644 index 00000000000..907dbb6b86b --- /dev/null +++ b/python/ql/lib/semmle/python/frameworks/baize.qll @@ -0,0 +1,35 @@ +/** + * Provides classes modeling security-relevant aspects of the `baize` PyPI package. + * + * See https://pypi.org/project/baize. + */ + +private import python +private import semmle.python.dataflow.new.DataFlow +private import semmle.python.dataflow.new.TaintTracking +private import semmle.python.Concepts +private import semmle.python.ApiGraphs +private import semmle.python.frameworks.internal.InstanceTaintStepsHelper +private import semmle.python.frameworks.Stdlib + +/** + * Provides models for `baize` PyPI package. + * + * See https://pypi.org/project/baize. + */ +module Starlette { + /** + * A call to the `baize.asgi.FileResponse` constructor as a sink for Filesystem access. + * + * it is not contained to Starlette source code but it is mentioned in documents as an alternative to Starlette FileResponse + */ + class BaizeFileResponseCall extends FileSystemAccess::Range, API::CallNode { + BaizeFileResponseCall() { + this = API::moduleImport("baize").getMember("asgi").getMember("FileResponse").getACall() + } + + override DataFlow::Node getAPathArgument() { + result = this.getParameter(0, "filepath").asSink() + } + } +} From 315bdc2b48712455f8f524804e6eeb837cf8558d Mon Sep 17 00:00:00 2001 From: amammad <77095239+amammad@users.noreply.github.com> Date: Mon, 6 Nov 2023 19:13:57 +0100 Subject: [PATCH 027/202] add tests for new frameworks --- .../FileSystemAccess/ConceptsTest.expected | 2 -- .../FileSystemAccess/Query.expected | 0 .../frameworks/FileSystemAccess/Query.ql | 20 ------------------- .../frameworks/aiofile/ConceptsTest.expected | 1 + .../ConceptsTest.ql | 0 .../FileSystemAccess.py} | 0 .../frameworks/aiofiles/ConceptsTest.expected | 1 + .../frameworks/aiofiles/ConceptsTest.ql | 2 ++ .../FileSystemAccess.py} | 0 .../frameworks/anyio/ConceptsTest.expected | 1 + .../frameworks/anyio/ConceptsTest.ql | 2 ++ .../anyio.py => anyio/FileSystemAccess.py} | 0 .../frameworks/baize/ConceptsTest.expected | 1 + .../frameworks/baize/ConceptsTest.ql | 2 ++ .../FileSystemAccess.py} | 3 +-- .../frameworks/cherrypy/ConceptsTest.expected | 1 + .../frameworks/cherrypy/ConceptsTest.ql | 2 ++ .../FileSystemAccess.py} | 0 .../frameworks/sanic/ConceptsTest.expected | 1 + .../frameworks/sanic/ConceptsTest.ql | 2 ++ .../sanic.py => sanic/FileSystemAccess.py} | 0 .../starlette/ConceptsTest.expected | 1 + .../frameworks/starlette/ConceptsTest.ql | 2 ++ .../frameworks/starlette/FileSystemAccess.py | 3 +++ 24 files changed, 23 insertions(+), 24 deletions(-) delete mode 100644 python/ql/test/library-tests/frameworks/FileSystemAccess/ConceptsTest.expected delete mode 100644 python/ql/test/library-tests/frameworks/FileSystemAccess/Query.expected delete mode 100644 python/ql/test/library-tests/frameworks/FileSystemAccess/Query.ql create mode 100644 python/ql/test/library-tests/frameworks/aiofile/ConceptsTest.expected rename python/ql/test/library-tests/frameworks/{FileSystemAccess => aiofile}/ConceptsTest.ql (100%) rename python/ql/test/library-tests/frameworks/{FileSystemAccess/aiofile.py => aiofile/FileSystemAccess.py} (100%) create mode 100644 python/ql/test/library-tests/frameworks/aiofiles/ConceptsTest.expected create mode 100644 python/ql/test/library-tests/frameworks/aiofiles/ConceptsTest.ql rename python/ql/test/library-tests/frameworks/{FileSystemAccess/aiofiles.py => aiofiles/FileSystemAccess.py} (100%) create mode 100644 python/ql/test/library-tests/frameworks/anyio/ConceptsTest.expected create mode 100644 python/ql/test/library-tests/frameworks/anyio/ConceptsTest.ql rename python/ql/test/library-tests/frameworks/{FileSystemAccess/anyio.py => anyio/FileSystemAccess.py} (100%) create mode 100644 python/ql/test/library-tests/frameworks/baize/ConceptsTest.expected create mode 100644 python/ql/test/library-tests/frameworks/baize/ConceptsTest.ql rename python/ql/test/library-tests/frameworks/{FileSystemAccess/starlette.py => baize/FileSystemAccess.py} (54%) create mode 100644 python/ql/test/library-tests/frameworks/cherrypy/ConceptsTest.expected create mode 100644 python/ql/test/library-tests/frameworks/cherrypy/ConceptsTest.ql rename python/ql/test/library-tests/frameworks/{FileSystemAccess/cherrypy.py => cherrypy/FileSystemAccess.py} (100%) create mode 100644 python/ql/test/library-tests/frameworks/sanic/ConceptsTest.expected create mode 100644 python/ql/test/library-tests/frameworks/sanic/ConceptsTest.ql rename python/ql/test/library-tests/frameworks/{FileSystemAccess/sanic.py => sanic/FileSystemAccess.py} (100%) create mode 100644 python/ql/test/library-tests/frameworks/starlette/ConceptsTest.expected create mode 100644 python/ql/test/library-tests/frameworks/starlette/ConceptsTest.ql create mode 100644 python/ql/test/library-tests/frameworks/starlette/FileSystemAccess.py diff --git a/python/ql/test/library-tests/frameworks/FileSystemAccess/ConceptsTest.expected b/python/ql/test/library-tests/frameworks/FileSystemAccess/ConceptsTest.expected deleted file mode 100644 index 8ec8033d086..00000000000 --- a/python/ql/test/library-tests/frameworks/FileSystemAccess/ConceptsTest.expected +++ /dev/null @@ -1,2 +0,0 @@ -testFailures -failures diff --git a/python/ql/test/library-tests/frameworks/FileSystemAccess/Query.expected b/python/ql/test/library-tests/frameworks/FileSystemAccess/Query.expected deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/python/ql/test/library-tests/frameworks/FileSystemAccess/Query.ql b/python/ql/test/library-tests/frameworks/FileSystemAccess/Query.ql deleted file mode 100644 index 5f89e028f04..00000000000 --- a/python/ql/test/library-tests/frameworks/FileSystemAccess/Query.ql +++ /dev/null @@ -1,20 +0,0 @@ -import python -import semmle.python.dataflow.new.DataFlow -import semmle.python.Concepts -import TestUtilities.InlineExpectationsTest -private import semmle.python.dataflow.new.internal.PrintNode - -module FileSystemAccessTest implements TestSig { - string getARelevantTag() { result = "getAPathArgument" } - - predicate hasActualResult(Location location, string element, string tag, string value) { - exists(location.getFile().getRelativePath()) and - exists(FileSystemAccess a, DataFlow::Node path | - path = a.getAPathArgument() and - location = a.getLocation() and - element = path.toString() and - value = prettyNodeForInlineTest(path) and - tag = "getAPathArgument" - ) - } -} diff --git a/python/ql/test/library-tests/frameworks/aiofile/ConceptsTest.expected b/python/ql/test/library-tests/frameworks/aiofile/ConceptsTest.expected new file mode 100644 index 00000000000..1822a89c5eb --- /dev/null +++ b/python/ql/test/library-tests/frameworks/aiofile/ConceptsTest.expected @@ -0,0 +1 @@ +ERROR: Could not resolve module semmle.python.frameworks.FileSystemAccess (/home/am/CodeQL-home/codeql-repo-amammad/python/ql/lib/semmle/python/Frameworks.qll:25,16-57) diff --git a/python/ql/test/library-tests/frameworks/FileSystemAccess/ConceptsTest.ql b/python/ql/test/library-tests/frameworks/aiofile/ConceptsTest.ql similarity index 100% rename from python/ql/test/library-tests/frameworks/FileSystemAccess/ConceptsTest.ql rename to python/ql/test/library-tests/frameworks/aiofile/ConceptsTest.ql diff --git a/python/ql/test/library-tests/frameworks/FileSystemAccess/aiofile.py b/python/ql/test/library-tests/frameworks/aiofile/FileSystemAccess.py similarity index 100% rename from python/ql/test/library-tests/frameworks/FileSystemAccess/aiofile.py rename to python/ql/test/library-tests/frameworks/aiofile/FileSystemAccess.py diff --git a/python/ql/test/library-tests/frameworks/aiofiles/ConceptsTest.expected b/python/ql/test/library-tests/frameworks/aiofiles/ConceptsTest.expected new file mode 100644 index 00000000000..1822a89c5eb --- /dev/null +++ b/python/ql/test/library-tests/frameworks/aiofiles/ConceptsTest.expected @@ -0,0 +1 @@ +ERROR: Could not resolve module semmle.python.frameworks.FileSystemAccess (/home/am/CodeQL-home/codeql-repo-amammad/python/ql/lib/semmle/python/Frameworks.qll:25,16-57) diff --git a/python/ql/test/library-tests/frameworks/aiofiles/ConceptsTest.ql b/python/ql/test/library-tests/frameworks/aiofiles/ConceptsTest.ql new file mode 100644 index 00000000000..b557a0bccb6 --- /dev/null +++ b/python/ql/test/library-tests/frameworks/aiofiles/ConceptsTest.ql @@ -0,0 +1,2 @@ +import python +import experimental.meta.ConceptsTest diff --git a/python/ql/test/library-tests/frameworks/FileSystemAccess/aiofiles.py b/python/ql/test/library-tests/frameworks/aiofiles/FileSystemAccess.py similarity index 100% rename from python/ql/test/library-tests/frameworks/FileSystemAccess/aiofiles.py rename to python/ql/test/library-tests/frameworks/aiofiles/FileSystemAccess.py diff --git a/python/ql/test/library-tests/frameworks/anyio/ConceptsTest.expected b/python/ql/test/library-tests/frameworks/anyio/ConceptsTest.expected new file mode 100644 index 00000000000..1822a89c5eb --- /dev/null +++ b/python/ql/test/library-tests/frameworks/anyio/ConceptsTest.expected @@ -0,0 +1 @@ +ERROR: Could not resolve module semmle.python.frameworks.FileSystemAccess (/home/am/CodeQL-home/codeql-repo-amammad/python/ql/lib/semmle/python/Frameworks.qll:25,16-57) diff --git a/python/ql/test/library-tests/frameworks/anyio/ConceptsTest.ql b/python/ql/test/library-tests/frameworks/anyio/ConceptsTest.ql new file mode 100644 index 00000000000..b557a0bccb6 --- /dev/null +++ b/python/ql/test/library-tests/frameworks/anyio/ConceptsTest.ql @@ -0,0 +1,2 @@ +import python +import experimental.meta.ConceptsTest diff --git a/python/ql/test/library-tests/frameworks/FileSystemAccess/anyio.py b/python/ql/test/library-tests/frameworks/anyio/FileSystemAccess.py similarity index 100% rename from python/ql/test/library-tests/frameworks/FileSystemAccess/anyio.py rename to python/ql/test/library-tests/frameworks/anyio/FileSystemAccess.py diff --git a/python/ql/test/library-tests/frameworks/baize/ConceptsTest.expected b/python/ql/test/library-tests/frameworks/baize/ConceptsTest.expected new file mode 100644 index 00000000000..1822a89c5eb --- /dev/null +++ b/python/ql/test/library-tests/frameworks/baize/ConceptsTest.expected @@ -0,0 +1 @@ +ERROR: Could not resolve module semmle.python.frameworks.FileSystemAccess (/home/am/CodeQL-home/codeql-repo-amammad/python/ql/lib/semmle/python/Frameworks.qll:25,16-57) diff --git a/python/ql/test/library-tests/frameworks/baize/ConceptsTest.ql b/python/ql/test/library-tests/frameworks/baize/ConceptsTest.ql new file mode 100644 index 00000000000..b557a0bccb6 --- /dev/null +++ b/python/ql/test/library-tests/frameworks/baize/ConceptsTest.ql @@ -0,0 +1,2 @@ +import python +import experimental.meta.ConceptsTest diff --git a/python/ql/test/library-tests/frameworks/FileSystemAccess/starlette.py b/python/ql/test/library-tests/frameworks/baize/FileSystemAccess.py similarity index 54% rename from python/ql/test/library-tests/frameworks/FileSystemAccess/starlette.py rename to python/ql/test/library-tests/frameworks/baize/FileSystemAccess.py index 5982a937cba..d2808292acf 100644 --- a/python/ql/test/library-tests/frameworks/FileSystemAccess/starlette.py +++ b/python/ql/test/library-tests/frameworks/baize/FileSystemAccess.py @@ -1,5 +1,4 @@ -from starlette.responses import FileResponse from baize.asgi import FileResponse as baizeFileResponse baizeFileResponse("file") # $ getAPathArgument="file" -FileResponse("file") # $ getAPathArgument="file" +FileSystemAccess \ No newline at end of file diff --git a/python/ql/test/library-tests/frameworks/cherrypy/ConceptsTest.expected b/python/ql/test/library-tests/frameworks/cherrypy/ConceptsTest.expected new file mode 100644 index 00000000000..1822a89c5eb --- /dev/null +++ b/python/ql/test/library-tests/frameworks/cherrypy/ConceptsTest.expected @@ -0,0 +1 @@ +ERROR: Could not resolve module semmle.python.frameworks.FileSystemAccess (/home/am/CodeQL-home/codeql-repo-amammad/python/ql/lib/semmle/python/Frameworks.qll:25,16-57) diff --git a/python/ql/test/library-tests/frameworks/cherrypy/ConceptsTest.ql b/python/ql/test/library-tests/frameworks/cherrypy/ConceptsTest.ql new file mode 100644 index 00000000000..b557a0bccb6 --- /dev/null +++ b/python/ql/test/library-tests/frameworks/cherrypy/ConceptsTest.ql @@ -0,0 +1,2 @@ +import python +import experimental.meta.ConceptsTest diff --git a/python/ql/test/library-tests/frameworks/FileSystemAccess/cherrypy.py b/python/ql/test/library-tests/frameworks/cherrypy/FileSystemAccess.py similarity index 100% rename from python/ql/test/library-tests/frameworks/FileSystemAccess/cherrypy.py rename to python/ql/test/library-tests/frameworks/cherrypy/FileSystemAccess.py diff --git a/python/ql/test/library-tests/frameworks/sanic/ConceptsTest.expected b/python/ql/test/library-tests/frameworks/sanic/ConceptsTest.expected new file mode 100644 index 00000000000..1822a89c5eb --- /dev/null +++ b/python/ql/test/library-tests/frameworks/sanic/ConceptsTest.expected @@ -0,0 +1 @@ +ERROR: Could not resolve module semmle.python.frameworks.FileSystemAccess (/home/am/CodeQL-home/codeql-repo-amammad/python/ql/lib/semmle/python/Frameworks.qll:25,16-57) diff --git a/python/ql/test/library-tests/frameworks/sanic/ConceptsTest.ql b/python/ql/test/library-tests/frameworks/sanic/ConceptsTest.ql new file mode 100644 index 00000000000..b557a0bccb6 --- /dev/null +++ b/python/ql/test/library-tests/frameworks/sanic/ConceptsTest.ql @@ -0,0 +1,2 @@ +import python +import experimental.meta.ConceptsTest diff --git a/python/ql/test/library-tests/frameworks/FileSystemAccess/sanic.py b/python/ql/test/library-tests/frameworks/sanic/FileSystemAccess.py similarity index 100% rename from python/ql/test/library-tests/frameworks/FileSystemAccess/sanic.py rename to python/ql/test/library-tests/frameworks/sanic/FileSystemAccess.py diff --git a/python/ql/test/library-tests/frameworks/starlette/ConceptsTest.expected b/python/ql/test/library-tests/frameworks/starlette/ConceptsTest.expected new file mode 100644 index 00000000000..1822a89c5eb --- /dev/null +++ b/python/ql/test/library-tests/frameworks/starlette/ConceptsTest.expected @@ -0,0 +1 @@ +ERROR: Could not resolve module semmle.python.frameworks.FileSystemAccess (/home/am/CodeQL-home/codeql-repo-amammad/python/ql/lib/semmle/python/Frameworks.qll:25,16-57) diff --git a/python/ql/test/library-tests/frameworks/starlette/ConceptsTest.ql b/python/ql/test/library-tests/frameworks/starlette/ConceptsTest.ql new file mode 100644 index 00000000000..b557a0bccb6 --- /dev/null +++ b/python/ql/test/library-tests/frameworks/starlette/ConceptsTest.ql @@ -0,0 +1,2 @@ +import python +import experimental.meta.ConceptsTest diff --git a/python/ql/test/library-tests/frameworks/starlette/FileSystemAccess.py b/python/ql/test/library-tests/frameworks/starlette/FileSystemAccess.py new file mode 100644 index 00000000000..d7dff980967 --- /dev/null +++ b/python/ql/test/library-tests/frameworks/starlette/FileSystemAccess.py @@ -0,0 +1,3 @@ +from starlette.responses import FileResponse + +FileResponse("file") # $ getAPathArgument="file" From ad756d59c8f0b10fe292963ada84832bc409caa9 Mon Sep 17 00:00:00 2001 From: amammad <77095239+amammad@users.noreply.github.com> Date: Mon, 6 Nov 2023 19:17:50 +0100 Subject: [PATCH 028/202] put new frameworks in Frameworks.qll and fix some mistakes of Baize --- python/ql/lib/semmle/python/Frameworks.qll | 5 ++++- .../ql/lib/semmle/python/frameworks/{baize.qll => Baize.qll} | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) rename python/ql/lib/semmle/python/frameworks/{baize.qll => Baize.qll} (98%) diff --git a/python/ql/lib/semmle/python/Frameworks.qll b/python/ql/lib/semmle/python/Frameworks.qll index e773735fbbc..801a51008ec 100644 --- a/python/ql/lib/semmle/python/Frameworks.qll +++ b/python/ql/lib/semmle/python/Frameworks.qll @@ -5,11 +5,15 @@ // If you add modeling of a new framework/library, remember to add it to the docs in // `docs/codeql/reusables/supported-frameworks.rst` private import semmle.python.frameworks.Aioch +private import semmle.python.frameworks.Aiofile +private import semmle.python.frameworks.Aiofiles private import semmle.python.frameworks.Aiohttp private import semmle.python.frameworks.Aiomysql private import semmle.python.frameworks.Aiopg private import semmle.python.frameworks.Aiosqlite +private import semmle.python.frameworks.Anyio private import semmle.python.frameworks.Asyncpg +private import semmle.python.frameworks.Baize private import semmle.python.frameworks.BSon private import semmle.python.frameworks.CassandraDriver private import semmle.python.frameworks.Cherrypy @@ -22,7 +26,6 @@ private import semmle.python.frameworks.Dill private import semmle.python.frameworks.Django private import semmle.python.frameworks.Fabric private import semmle.python.frameworks.FastApi -private import semmle.python.frameworks.FileSystemAccess private import semmle.python.frameworks.Flask private import semmle.python.frameworks.FlaskAdmin private import semmle.python.frameworks.FlaskSqlAlchemy diff --git a/python/ql/lib/semmle/python/frameworks/baize.qll b/python/ql/lib/semmle/python/frameworks/Baize.qll similarity index 98% rename from python/ql/lib/semmle/python/frameworks/baize.qll rename to python/ql/lib/semmle/python/frameworks/Baize.qll index 907dbb6b86b..0da77938229 100644 --- a/python/ql/lib/semmle/python/frameworks/baize.qll +++ b/python/ql/lib/semmle/python/frameworks/Baize.qll @@ -17,7 +17,7 @@ private import semmle.python.frameworks.Stdlib * * See https://pypi.org/project/baize. */ -module Starlette { +module Baize { /** * A call to the `baize.asgi.FileResponse` constructor as a sink for Filesystem access. * From e8eff78799536508e22f59f0ac60fbfe5d6980dc Mon Sep 17 00:00:00 2001 From: amammad <77095239+amammad@users.noreply.github.com> Date: Mon, 6 Nov 2023 19:19:36 +0100 Subject: [PATCH 029/202] fix tests because of error in Frameworks.qll --- .../library-tests/frameworks/aiofile/ConceptsTest.expected | 3 ++- .../library-tests/frameworks/aiofiles/ConceptsTest.expected | 3 ++- .../test/library-tests/frameworks/anyio/ConceptsTest.expected | 3 ++- .../test/library-tests/frameworks/baize/ConceptsTest.expected | 3 ++- .../library-tests/frameworks/cherrypy/ConceptsTest.expected | 3 ++- .../test/library-tests/frameworks/sanic/ConceptsTest.expected | 3 ++- .../library-tests/frameworks/starlette/ConceptsTest.expected | 3 ++- 7 files changed, 14 insertions(+), 7 deletions(-) diff --git a/python/ql/test/library-tests/frameworks/aiofile/ConceptsTest.expected b/python/ql/test/library-tests/frameworks/aiofile/ConceptsTest.expected index 1822a89c5eb..8ec8033d086 100644 --- a/python/ql/test/library-tests/frameworks/aiofile/ConceptsTest.expected +++ b/python/ql/test/library-tests/frameworks/aiofile/ConceptsTest.expected @@ -1 +1,2 @@ -ERROR: Could not resolve module semmle.python.frameworks.FileSystemAccess (/home/am/CodeQL-home/codeql-repo-amammad/python/ql/lib/semmle/python/Frameworks.qll:25,16-57) +testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/aiofiles/ConceptsTest.expected b/python/ql/test/library-tests/frameworks/aiofiles/ConceptsTest.expected index 1822a89c5eb..8ec8033d086 100644 --- a/python/ql/test/library-tests/frameworks/aiofiles/ConceptsTest.expected +++ b/python/ql/test/library-tests/frameworks/aiofiles/ConceptsTest.expected @@ -1 +1,2 @@ -ERROR: Could not resolve module semmle.python.frameworks.FileSystemAccess (/home/am/CodeQL-home/codeql-repo-amammad/python/ql/lib/semmle/python/Frameworks.qll:25,16-57) +testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/anyio/ConceptsTest.expected b/python/ql/test/library-tests/frameworks/anyio/ConceptsTest.expected index 1822a89c5eb..8ec8033d086 100644 --- a/python/ql/test/library-tests/frameworks/anyio/ConceptsTest.expected +++ b/python/ql/test/library-tests/frameworks/anyio/ConceptsTest.expected @@ -1 +1,2 @@ -ERROR: Could not resolve module semmle.python.frameworks.FileSystemAccess (/home/am/CodeQL-home/codeql-repo-amammad/python/ql/lib/semmle/python/Frameworks.qll:25,16-57) +testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/baize/ConceptsTest.expected b/python/ql/test/library-tests/frameworks/baize/ConceptsTest.expected index 1822a89c5eb..8ec8033d086 100644 --- a/python/ql/test/library-tests/frameworks/baize/ConceptsTest.expected +++ b/python/ql/test/library-tests/frameworks/baize/ConceptsTest.expected @@ -1 +1,2 @@ -ERROR: Could not resolve module semmle.python.frameworks.FileSystemAccess (/home/am/CodeQL-home/codeql-repo-amammad/python/ql/lib/semmle/python/Frameworks.qll:25,16-57) +testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/cherrypy/ConceptsTest.expected b/python/ql/test/library-tests/frameworks/cherrypy/ConceptsTest.expected index 1822a89c5eb..8ec8033d086 100644 --- a/python/ql/test/library-tests/frameworks/cherrypy/ConceptsTest.expected +++ b/python/ql/test/library-tests/frameworks/cherrypy/ConceptsTest.expected @@ -1 +1,2 @@ -ERROR: Could not resolve module semmle.python.frameworks.FileSystemAccess (/home/am/CodeQL-home/codeql-repo-amammad/python/ql/lib/semmle/python/Frameworks.qll:25,16-57) +testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/sanic/ConceptsTest.expected b/python/ql/test/library-tests/frameworks/sanic/ConceptsTest.expected index 1822a89c5eb..8ec8033d086 100644 --- a/python/ql/test/library-tests/frameworks/sanic/ConceptsTest.expected +++ b/python/ql/test/library-tests/frameworks/sanic/ConceptsTest.expected @@ -1 +1,2 @@ -ERROR: Could not resolve module semmle.python.frameworks.FileSystemAccess (/home/am/CodeQL-home/codeql-repo-amammad/python/ql/lib/semmle/python/Frameworks.qll:25,16-57) +testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/starlette/ConceptsTest.expected b/python/ql/test/library-tests/frameworks/starlette/ConceptsTest.expected index 1822a89c5eb..8ec8033d086 100644 --- a/python/ql/test/library-tests/frameworks/starlette/ConceptsTest.expected +++ b/python/ql/test/library-tests/frameworks/starlette/ConceptsTest.expected @@ -1 +1,2 @@ -ERROR: Could not resolve module semmle.python.frameworks.FileSystemAccess (/home/am/CodeQL-home/codeql-repo-amammad/python/ql/lib/semmle/python/Frameworks.qll:25,16-57) +testFailures +failures From 6c50c2bfe652725e9cba455248d1e2e31b634837 Mon Sep 17 00:00:00 2001 From: Rasmus Wriedt Larsen Date: Mon, 6 Nov 2023 14:27:29 +0100 Subject: [PATCH 030/202] Python: Highlight missing flow for class attributes --- .../experimental/dataflow/fieldflow/test.py | 98 +++++++++++++++++++ 1 file changed, 98 insertions(+) diff --git a/python/ql/test/experimental/dataflow/fieldflow/test.py b/python/ql/test/experimental/dataflow/fieldflow/test.py index c090aea2089..4edeb23f218 100644 --- a/python/ql/test/experimental/dataflow/fieldflow/test.py +++ b/python/ql/test/experimental/dataflow/fieldflow/test.py @@ -237,6 +237,104 @@ def test_field_on_compound_arg(cond_true=True, cond_false=False): SINK(y.attr) # $ MISSING: flow SINK_F(z.attr) # $ MISSING: flow +# ------------------------------------------------------------------------------ +# Content in class attribute +# ------------------------------------------------------------------------------ + +class WithTuple: + my_tuple = (SOURCE, NONSOURCE) + + def test_inst(self): + SINK(self.my_tuple[0]) # $ MISSING: flow + SINK_F(self.my_tuple[1]) + + @classmethod + def test_cm(cls): + SINK(cls.my_tuple[0]) # $ MISSING: flow + SINK_F(cls.my_tuple[1]) + + +@expects(2*4) # $ unresolved_call=expects(..) unresolved_call=expects(..)(..) +def test_WithTuple(): + SINK(WithTuple.my_tuple[0]) # $ MISSING: flow="SOURCE, l:-7 -> WithTuple.my_tuple[0]" + SINK_F(WithTuple.my_tuple[1]) + + WithTuple.test_cm() + + inst = WithTuple() + inst.test_inst() + + SINK(inst.my_tuple[0]) # $ MISSING: flow="SOURCE, l:-18 -> inst.my_tuple[0]" + SINK_F(inst.my_tuple[1]) + + +@expects(4) # $ unresolved_call=expects(..) unresolved_call=expects(..)(..) +def test_inst_override(): + inst = WithTuple() + + # setting attribute on instance does not override class attribute, it's only on the + # instance! + inst.my_tuple = (NONSOURCE, SOURCE) + + SINK_F(inst.my_tuple[0]) + SINK(inst.my_tuple[1]) # $ flow="SOURCE, l:-3 -> inst.my_tuple[1]" + + SINK(WithTuple.my_tuple[0]) # $ MISSING: flow="SOURCE, l:-27 -> WithTuple.my_tuple[0]" + SINK_F(WithTuple.my_tuple[1]) + + +class WithTuple2: + my_tuple = (NONSOURCE,) + +def set_to_source(): + WithTuple2.my_tuple = (SOURCE,) + +@expects(4) # $ unresolved_call=expects(..) unresolved_call=expects(..)(..) +def test_class_override(): + inst = WithTuple2() + SINK_F(WithTuple2.my_tuple[0]) + SINK_F(inst.my_tuple[0]) + + set_to_source() + + SINK(WithTuple2.my_tuple[0]) # $ MISSING: flow="SOURCE, l:-10 -> WithTuple2.my_tuple[0]" + SINK(inst.my_tuple[0]) # $ MISSING: flow="SOURCE, l:-11 -> inst.my_tuple[0]" + +# -------------------------------------- +# unique classes from functions +# -------------------------------------- +def make_class(): + # a fresh class is returned each time this function is called + class C: + my_tuple = (NONSOURCE,) + return C + +@expects(8) # $ unresolved_call=expects(..) unresolved_call=expects(..)(..) +def test_unique_class(): + # This test highlights that if we use the _ClassExpr_ itself as the target/source + # for jumpsteps, we will end up with spurious flow (that is, we will think that + # x_cls and y_cls are the same, so by updating .my_tuple on x_cls we might propagate + # that to y_cls as well -- it might not matter too much in reality, but certainly an + # interesting corner case) + x_cls = make_class() + y_cls = make_class() + + assert x_cls != y_cls + + x_inst = x_cls() + y_inst = y_cls() + + SINK_F(x_cls.my_tuple[0]) + SINK_F(x_inst.my_tuple[0]) + SINK_F(y_cls.my_tuple[0]) + SINK_F(y_inst.my_tuple[0]) + + x_cls.my_tuple = (SOURCE,) + SINK(x_cls.my_tuple[0]) # $ flow="SOURCE, l:-1 -> x_cls.my_tuple[0]" + SINK(x_inst.my_tuple[0]) # $ MISSING: flow="SOURCE, l:-2 -> x_inst.my_tuple[0]" + SINK_F(y_cls.my_tuple[0]) + SINK_F(y_inst.my_tuple[0]) + # ------------------------------------------------------------------------------ # Crosstalk test -- using different function based on conditional # ------------------------------------------------------------------------------ From 6568332e3d24238854eeb63c514457e929ed0190 Mon Sep 17 00:00:00 2001 From: Rasmus Wriedt Larsen Date: Tue, 7 Nov 2023 11:21:01 +0100 Subject: [PATCH 031/202] Python: Add basic flow for class attributes --- .../dataflow/new/internal/DataFlowPrivate.qll | 25 ++++++++++++++++--- .../experimental/dataflow/fieldflow/test.py | 17 ++++++++++--- 2 files changed, 34 insertions(+), 8 deletions(-) diff --git a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowPrivate.qll b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowPrivate.qll index 32a2d4a27db..a4be719c8aa 100644 --- a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowPrivate.qll +++ b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowPrivate.qll @@ -846,10 +846,27 @@ predicate comprehensionStoreStep(CfgNode nodeFrom, Content c, CfgNode nodeTo) { * ``` * data flows from `x` to the attribute `foo` of (the post-update node for) `obj`. */ -predicate attributeStoreStep(Node nodeFrom, AttributeContent c, PostUpdateNode nodeTo) { - exists(AttrWrite write | - write.accesses(nodeTo.getPreUpdateNode(), c.getAttribute()) and - nodeFrom = write.getValue() +predicate attributeStoreStep(Node nodeFrom, AttributeContent c, Node nodeTo) { + exists(Node object | + // normally we target any PostUpdateNode. However, for class definitions the class + // is only constructed after evaluating its' entire scope, so in terms of python + // evaluations there is no post or pre update nodes, just one node for the class + // expression. Therefore we target the class expression directly. + // + // Note: Due to the way we handle decorators, using a class decorator will result in + // there being a post-update node for the class (argument to the decorator). We do + // not want to differentiate between these two cases, so still target the class + // expression directly. + object = nodeTo.(PostUpdateNode).getPreUpdateNode() and + not object.asExpr() instanceof ClassExpr + or + object = nodeTo and + object.asExpr() instanceof ClassExpr + | + exists(AttrWrite write | + write.accesses(object, c.getAttribute()) and + nodeFrom = write.getValue() + ) ) } diff --git a/python/ql/test/experimental/dataflow/fieldflow/test.py b/python/ql/test/experimental/dataflow/fieldflow/test.py index 4edeb23f218..8e1f95578ab 100644 --- a/python/ql/test/experimental/dataflow/fieldflow/test.py +++ b/python/ql/test/experimental/dataflow/fieldflow/test.py @@ -248,15 +248,24 @@ class WithTuple: SINK(self.my_tuple[0]) # $ MISSING: flow SINK_F(self.my_tuple[1]) + def test_inst_no_call(self): + SINK(self.my_tuple[0]) # $ MISSING: flow + SINK_F(self.my_tuple[1]) + @classmethod def test_cm(cls): - SINK(cls.my_tuple[0]) # $ MISSING: flow + SINK(cls.my_tuple[0]) # $ flow="SOURCE, l:-12 -> cls.my_tuple[0]" + SINK_F(cls.my_tuple[1]) + + @classmethod + def test_cm_no_call(cls): + SINK(cls.my_tuple[0]) # $ MISSING: flow="SOURCE, l:-8 -> cls.my_tuple[0]" SINK_F(cls.my_tuple[1]) @expects(2*4) # $ unresolved_call=expects(..) unresolved_call=expects(..)(..) def test_WithTuple(): - SINK(WithTuple.my_tuple[0]) # $ MISSING: flow="SOURCE, l:-7 -> WithTuple.my_tuple[0]" + SINK(WithTuple.my_tuple[0]) # $ flow="SOURCE, l:-23 -> WithTuple.my_tuple[0]" SINK_F(WithTuple.my_tuple[1]) WithTuple.test_cm() @@ -264,7 +273,7 @@ def test_WithTuple(): inst = WithTuple() inst.test_inst() - SINK(inst.my_tuple[0]) # $ MISSING: flow="SOURCE, l:-18 -> inst.my_tuple[0]" + SINK(inst.my_tuple[0]) # $ MISSING: flow SINK_F(inst.my_tuple[1]) @@ -279,7 +288,7 @@ def test_inst_override(): SINK_F(inst.my_tuple[0]) SINK(inst.my_tuple[1]) # $ flow="SOURCE, l:-3 -> inst.my_tuple[1]" - SINK(WithTuple.my_tuple[0]) # $ MISSING: flow="SOURCE, l:-27 -> WithTuple.my_tuple[0]" + SINK(WithTuple.my_tuple[0]) # $ flow="SOURCE, l:-46 -> WithTuple.my_tuple[0]" SINK_F(WithTuple.my_tuple[1]) From 5bee44dcfee95a6e748f496bda865a5c000b9a3f Mon Sep 17 00:00:00 2001 From: Rasmus Wriedt Larsen Date: Tue, 7 Nov 2023 11:27:11 +0100 Subject: [PATCH 032/202] Python: add change-note --- python/ql/lib/change-notes/2023-11-07-class-attribute-flow.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 python/ql/lib/change-notes/2023-11-07-class-attribute-flow.md diff --git a/python/ql/lib/change-notes/2023-11-07-class-attribute-flow.md b/python/ql/lib/change-notes/2023-11-07-class-attribute-flow.md new file mode 100644 index 00000000000..a7f2d515549 --- /dev/null +++ b/python/ql/lib/change-notes/2023-11-07-class-attribute-flow.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Added basic flow for attributes defined on classes, when the attribute lookup is on a direct reference to that class (so not instance, cls parameter, or self parameter). Example: class definition `class Foo: my_tuples = (dangerous, safe)` and usage `SINK(Foo.my_tuples[0])`. From 5433907c331a1dd0d7bb7a28df7114cd1ccf9c91 Mon Sep 17 00:00:00 2001 From: Rasmus Wriedt Larsen Date: Tue, 7 Nov 2023 15:49:14 +0100 Subject: [PATCH 033/202] Python: Accept more test changes All are for the better :tada: --- python/ql/test/experimental/dataflow/coverage/test.py | 4 ++-- python/ql/test/experimental/dataflow/match/test.py | 2 +- .../test/library-tests/PointsTo/new/ImpliesDataflow.expected | 4 ---- 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/python/ql/test/experimental/dataflow/coverage/test.py b/python/ql/test/experimental/dataflow/coverage/test.py index 9a26b8dd69f..48e56200f2b 100644 --- a/python/ql/test/experimental/dataflow/coverage/test.py +++ b/python/ql/test/experimental/dataflow/coverage/test.py @@ -338,9 +338,9 @@ class C: @expects(2) def test_attribute_reference(): - SINK(C.a) #$ MISSING:flow="SOURCE, l:-4 -> C.a" + SINK(C.a) # $ flow="SOURCE, l:-5 -> C.a" c = C() - SINK(c.a) #$ MISSING:flow="SOURCE, l:-6 -> c.a" + SINK(c.a) # $ MISSING: flow="SOURCE, l:-7 -> c.a" # overriding __getattr__ should be tested by the class coverage tests diff --git a/python/ql/test/experimental/dataflow/match/test.py b/python/ql/test/experimental/dataflow/match/test.py index fb58306104e..abdeaa2ee7c 100644 --- a/python/ql/test/experimental/dataflow/match/test.py +++ b/python/ql/test/experimental/dataflow/match/test.py @@ -64,7 +64,7 @@ class Unsafe: def test_value_pattern(): match SOURCE: case Unsafe.VALUE as x: - SINK(x) #$ flow="SOURCE, l:-2 -> x" MISSING: flow="SOURCE, l:-5 -> x" + SINK(x) #$ flow="SOURCE, l:-2 -> x" flow="SOURCE, l:-5 -> x" @expects(2) def test_sequence_pattern_tuple(): diff --git a/python/ql/test/library-tests/PointsTo/new/ImpliesDataflow.expected b/python/ql/test/library-tests/PointsTo/new/ImpliesDataflow.expected index 0c2bd1b4ce0..96663031d9a 100644 --- a/python/ql/test/library-tests/PointsTo/new/ImpliesDataflow.expected +++ b/python/ql/test/library-tests/PointsTo/new/ImpliesDataflow.expected @@ -3,9 +3,5 @@ | code/l_calls.py:12:1:12:20 | ControlFlowNode for ClassExpr | code/l_calls.py:16:16:16:18 | ControlFlowNode for cls | | code/l_calls.py:12:1:12:20 | ControlFlowNode for ClassExpr | code/l_calls.py:24:13:24:22 | ControlFlowNode for Attribute() | | code/l_calls.py:12:1:12:20 | ControlFlowNode for ClassExpr | code/l_calls.py:25:16:25:16 | ControlFlowNode for a | -| code/l_calls.py:33:5:33:23 | ControlFlowNode for FunctionExpr | code/l_calls.py:39:1:39:3 | ControlFlowNode for Attribute | -| code/l_calls.py:48:5:48:30 | ControlFlowNode for FunctionExpr | code/l_calls.py:53:1:53:3 | ControlFlowNode for Attribute | -| code/q_super.py:48:5:48:17 | ControlFlowNode for ClassExpr | code/q_super.py:51:25:51:29 | ControlFlowNode for Attribute | -| code/q_super.py:63:5:63:17 | ControlFlowNode for ClassExpr | code/q_super.py:66:19:66:23 | ControlFlowNode for Attribute | | code/t_type.py:3:1:3:16 | ControlFlowNode for ClassExpr | code/t_type.py:6:1:6:9 | ControlFlowNode for type() | | code/t_type.py:3:1:3:16 | ControlFlowNode for ClassExpr | code/t_type.py:13:5:13:13 | ControlFlowNode for type() | From 9b0ad8295e374ea38969efb3474d42d1b26d26dd Mon Sep 17 00:00:00 2001 From: Rasmus Wriedt Larsen Date: Wed, 8 Nov 2023 14:58:40 +0100 Subject: [PATCH 034/202] Python: Add test of nested classes --- .../ql/test/experimental/dataflow/fieldflow/test.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/python/ql/test/experimental/dataflow/fieldflow/test.py b/python/ql/test/experimental/dataflow/fieldflow/test.py index 8e1f95578ab..409e4c19a4b 100644 --- a/python/ql/test/experimental/dataflow/fieldflow/test.py +++ b/python/ql/test/experimental/dataflow/fieldflow/test.py @@ -309,6 +309,17 @@ def test_class_override(): SINK(WithTuple2.my_tuple[0]) # $ MISSING: flow="SOURCE, l:-10 -> WithTuple2.my_tuple[0]" SINK(inst.my_tuple[0]) # $ MISSING: flow="SOURCE, l:-11 -> inst.my_tuple[0]" + +class Outer: + src = SOURCE + class Inner: + src = SOURCE + +@expects(2) # $ unresolved_call=expects(..) unresolved_call=expects(..)(..) +def test_nested_class(): + SINK(Outer.src) # $ flow="SOURCE, l:-6 -> Outer.src" + SINK(Outer.Inner.src) # $ flow="SOURCE, l:-5 -> Outer.Inner.src" + # -------------------------------------- # unique classes from functions # -------------------------------------- From b3feb4d7e9166a5ced6c8c18e495c729d32f9599 Mon Sep 17 00:00:00 2001 From: Rasmus Wriedt Larsen Date: Fri, 10 Nov 2023 15:57:00 +0100 Subject: [PATCH 035/202] Update python/ql/lib/semmle/python/dataflow/new/internal/DataFlowPrivate.qll Co-authored-by: yoff --- .../lib/semmle/python/dataflow/new/internal/DataFlowPrivate.qll | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowPrivate.qll b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowPrivate.qll index 54c4d919f6f..3df487e939a 100644 --- a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowPrivate.qll +++ b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowPrivate.qll @@ -848,7 +848,7 @@ predicate comprehensionStoreStep(CfgNode nodeFrom, Content c, CfgNode nodeTo) { */ predicate attributeStoreStep(Node nodeFrom, AttributeContent c, Node nodeTo) { exists(Node object | - // normally we target any PostUpdateNode. However, for class definitions the class + // Normally we target a PostUpdateNode. However, for class definitions the class // is only constructed after evaluating its' entire scope, so in terms of python // evaluations there is no post or pre update nodes, just one node for the class // expression. Therefore we target the class expression directly. From 5fc8a004877ed89b3f5ae6238fddd6f7bd8a60bb Mon Sep 17 00:00:00 2001 From: Rasmus Wriedt Larsen Date: Fri, 10 Nov 2023 15:58:20 +0100 Subject: [PATCH 036/202] Python: Rename test function --- python/ql/test/experimental/dataflow/fieldflow/test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/ql/test/experimental/dataflow/fieldflow/test.py b/python/ql/test/experimental/dataflow/fieldflow/test.py index 409e4c19a4b..1ce049917f0 100644 --- a/python/ql/test/experimental/dataflow/fieldflow/test.py +++ b/python/ql/test/experimental/dataflow/fieldflow/test.py @@ -299,7 +299,7 @@ def set_to_source(): WithTuple2.my_tuple = (SOURCE,) @expects(4) # $ unresolved_call=expects(..) unresolved_call=expects(..)(..) -def test_class_override(): +def test_global_flow_to_class_attribute(): inst = WithTuple2() SINK_F(WithTuple2.my_tuple[0]) SINK_F(inst.my_tuple[0]) From cfdeb0edf5589697c17f066b0229a614379bc4de Mon Sep 17 00:00:00 2001 From: Taus Date: Mon, 13 Nov 2023 15:19:54 +0000 Subject: [PATCH 037/202] Python: Define `getScope` and `getAChildNode` for new nodes --- python/ql/lib/semmle/python/AstExtended.qll | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/python/ql/lib/semmle/python/AstExtended.qll b/python/ql/lib/semmle/python/AstExtended.qll index f02177fb78f..d25c432b47e 100644 --- a/python/ql/lib/semmle/python/AstExtended.qll +++ b/python/ql/lib/semmle/python/AstExtended.qll @@ -228,7 +228,11 @@ class TypeParameter extends TypeParameter_, AstNode { override AstNode getAChildNode() { none() } - override Scope getScope() { none() } + override Scope getScope() { + // `TypeParameter`s are children of `TypeParameterList`s which are children of `Function`s, `ClassExpr`s, and `TypeAlias`es. + // For `TypeAlias`, this is not quite right. Instead, `TypeAlias`es should define their own scopes, cf. https://docs.python.org/3.12/reference/executionmodel.html#annotation-scopes + result = this.getParent().getParent().(AstNode).getScope() + } /** Gets the location of this element */ override Location getLocation() { result = TypeParameter_.super.getLocation() } @@ -249,14 +253,20 @@ class TypeAlias extends TypeAlias_, Stmt { /** A type variable, with an optional bound, such as `T1` and `T2` in `type T[T1, T2: T3] = T4`. */ class TypeVar extends TypeVar_, TypeParameter { override Name getName() { result = super.getName() } + + override Expr getAChildNode() { result in [this.getName(), this.getBound()] } } /** A type var tuple parameter, such as `*T1` in `type T[*T1] = T2`. */ class TypeVarTuple extends TypeVarTuple_, TypeParameter { override Name getName() { result = super.getName() } + + override Expr getAChildNode() { result = this.getName() } } /** A param spec parameter, such as `**T1` in `type T[**T1] = T2`. */ class ParamSpec extends ParamSpec_, TypeParameter { override Name getName() { result = super.getName() } + + override Expr getAChildNode() { result = this.getName() } } From 458baeff32213208b599cb835fc0223b95ea8a2d Mon Sep 17 00:00:00 2001 From: Sam Browning <106113886+sabrowning1@users.noreply.github.com> Date: Mon, 13 Nov 2023 15:59:51 -0500 Subject: [PATCH 038/202] Add content on queries panel and language selector --- .../analyzing-your-projects.rst | 57 ++++++++++++++++-- .../choose-language-filter.png | Bin 0 -> 61798 bytes .../create-query-icon.png | Bin 0 -> 41962 bytes .../run-local-queries-icon.png | Bin 0 -> 47918 bytes .../run-local-query-icon.png | Bin 0 -> 70900 bytes 5 files changed, 53 insertions(+), 4 deletions(-) create mode 100644 docs/codeql/images/codeql-for-visual-studio-code/choose-language-filter.png create mode 100644 docs/codeql/images/codeql-for-visual-studio-code/create-query-icon.png create mode 100644 docs/codeql/images/codeql-for-visual-studio-code/run-local-queries-icon.png create mode 100644 docs/codeql/images/codeql-for-visual-studio-code/run-local-query-icon.png 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..7072bebb1b8 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,46 @@ 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, as well as 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 query +------------------------ + +You can generate a query template for a specific language from the queries panel, helping you quickly create a custom query. + +#. 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. Selecting a language will autogenerate a folder labeled "codeql-custom-queries-LANGUAGE", which will contain a query template labeled "example.ql". +#. In the template file, 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. +#. 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 +93,23 @@ For more information, see ":doc:`Troubleshooting CodeQL for Visual Studio Code < Running multiple queries -------------------------- +Using a couple different methods, you can quickly run multiple queries against your code. + +Running all queries in a directory +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +You can easily run a directory of queries using the query selector. + +#. 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. @@ -114,7 +163,7 @@ This is helpful if you want to test your query on multiple codebases, or find a Viewing previous queries -------------------------- -To see the queries that you have run in the current session, open the Query History view. +To see the queries that you have run in the current session, open the Query History view. You can filter the Query History view by language. For more information, see ":ref:`Filtering databases and queries by language `." .. image:: ../images/codeql-for-visual-studio-code/query-history.png :width: 350 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 0000000000000000000000000000000000000000..8f26d5f5724ba22a392ab55409d6509a0e1629fb GIT binary patch literal 61798 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..eadb948522cf79609b0b67644e305db7982591cd GIT binary patch literal 41962 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 z zGd^~jDjaf5?UT0)^iG9G`EHaGj#sGAUf~rkQZwkuu=*iN7guu<_{Mdy!gHOR;E<<} zu?9HCctH>ZB7&xr~(%Ha?BhF zkZ&V*1F?fv5;!<3#dXMXD9A42H8J2cEj-W+zWz2^rDF`C&L@c(hG3){-@m6)hJLie zCuI}P$<8g$M7E5Zy4~*CFRQh;#4_c=?~L^5ku$37 zD|NKF9%Rg{LT~RB3>Q|lTy6Dxax1Xc9K9Ox+Ks5czWapTdX5heMY(zI5gYlyrXe}S zA2}nc2Y!uN?)TTFalaN=#_cG3my)K1nz%5=b0v2Hvs+}yb)~+Fbbyzu6Zba!eXo9w zEo#wRRXDOCYS38o3s24uP2g*jWqZwi=7+G(*VOfJvs?L+_~#};VY6*{Oqrf)WDE|W z1pb@0r~C_=9hcZzd0x&%Q4vX0JKCDKNkhW!-Z_m&MR)y5|NdYQZHzuI@pc;ZXC{WJ z9Cr#Ty$lUIAJU#1uJU!RO7|D-YCkk#-$Tn41~nZ>@Z95SqqLk8M5rT9nAky8;kv7V53P z^M78Q7su<`7u(r0Yi8E0^2mQacO> z_kh<(KtNVZK!8}*+Txv&sR10Es9%&aqKbSEUb1?4DDV3_2$>(}5jGG)vG`Gm8V4tw(4@=X0zUWlXx~5 zXJfe2c=y9JRj_DeK;GR@3R;}5PYB<-$g;nQ$=taYi14I@-Kypu$vazHgbxNeS1wKt zcZr9O^BNVlQm$?)-~T+lrvVrG{_}{_y;;uB=yyLTTMI4m!+nO#n~JB2`s>_N(|ttT z9+1f@A4~&f)eJuAGhNbC#i)i$&1_x#%ydT<_JOnUa{}^fg^TC*IQt0vaHBskF4k68 z4~V6`C!b7zCXU`@8us|sbD8k&yoB60f-P{>CJYzK%jZcM!vwpL?7E?Msttcm6kU?1 z?!9~VJH-$9LWf;>W+K|KEP)cXTPx$h&Wz8F9D%5lz}>JRs9?%NXEuUNsi zJ!kpAsuKJ3aoYD0CWJ4hpBGX1vQbc`_As{i8$N4e;AEFfkqm?=p7L)ow$o;L@eE@2 zU5dNS#jLz|iF;mLeroE&ou!tDn}YD_p6&q&pYDtHJPZz;m3AK*(@q@2QW9U&_HY%W z%QcLyeV^xdtlbJI1)e?2FJbsf^C+I7icF#S?U|jvh)3CeAyorddeDn=5 z-NMMejbvV3p_rF#9EeKvfp74YjBc9OeJ6JxU^8N(2s5sP6|v}xJs`P{CE)i(@TmsT zNk`)zlH-x@*ki-*$pQzb<}!}_KVERY(4erzHkZQc$G*W?Rr&Vt$Q!p-^yU?Q4cVw| z+g(ed9JDAa0u7?c<)Uxs*eBk}bHsg+cDk=9R}`@3uit&M(@ID=!sYgn%6O*E*TeFv z^32<)hc#|uiJS^H+RolRJh|LXITAQ_DtUM_g{A(HpjEAOWb)qjBPH}7lVSyTOxl7a z_I_?U)2eF<%H}Itla~7>k4^8^w`f^njC$*RXJ$pD_e8TKnDxxhMr?q)`c7~fNQ{J> zM#3zJ{z{k@gQNYi4snwx29{?#Nss80a6cqWWX8L3A(78%!X9=jWj zn{#-A7Pzdyjkn~nT%9c{Dmc+z25)su@s#|d^b}R-#t~8u6bqhiwQ(;ACVm>Ra;fnW z*h5GRkm)pBl=%7Zl)eGY;!E)o`cL=Er=H?3i6=1|kW5=y`N?%q(mu*cPx7(yv!b3r z&=(29L`R>iVRC)fk|ckJosAuX@doPzQwEd6FXZ#x7g%B;`Xc+!g~C`f`60+gTt?^{ zFE&teeGmD>RC`oTtRatNMl0br>O1fx(G0B_#jV*W3%V%GneIY7!6oh@IA)Vg}9zB{^-HP7a z8EGuK5DO{7&y2~a<}cRTP3A7L$S2C+5%P$*R=sKpQzLB@u@;FA=49Qkx?}v-1jFRz z+}i}cgfAb`!gM~Tbz3$rK5pYCB_Q?4FwGbfrU-NnGU{yVgkK)(qzFnGsoaosrgtM~ z^qIHNeT!vG@@mR>*nEF#w3qpdZSn^9h|4=1rcbJ$ri{zqmAl*M9h9yy^_%otsE5)$ z!c)aFp;M!qS65RdSEa8gsCIn^HR-6LuF5N|Gm)x1E>AYqG;sU+>3v&CPwCYA5uJeP zx~X?lN|Rbu0h3l)8-df-yaN7 zWhe)l6I^{A`ub|Zs(zV(LMr=Zwv)7!ba9edQtbflz=TE){TKRj%_kaKwbQlxnr~|7 zZ8K_v?9_jZZy%4%wP|i^ZOw1#?1Zh!Z47mM(-mZjemUTR#d(+0(1q~e^2h3q;t#uT zTMQO1yU%v#<_9}ff)+!jxYxo$a?!gC^JS_T=H7gD2(YM5@gwRg?%hpmj^i2h@V$}G zddQSe>wCu7@{0GF<%{oJeF3i{?5HtNA0X2{G({hNAdWPRVaqeg%*s?lUc=K)r|;aI zE6e}h@rVC6`l{y%eMRq1e4RdiePDvDj2wcxfN}k@m4*M=5HlXZQx^NN$@(z7u-5K# zN{o(RHC#J}X=-Qd!=XpIlD3jU{ShkJlaEUattx87K%dNaAht6EG)KHmA{Kiutso&O zRUqw}f)iW8nCmk8!-}a(Q+!+o@5P(UPzaX1eddEe^e4^lTxIgqjm0*Dkd?5rq-$Qv zdFbx6FGq}$TagoplV*}ZVbT|^eoG2g_lKu8qBgEH@Eqt)?hU3?$4~T~EEccueEr#@ z61PV?LSdu$&LUb{$w?{Y1KA|8V-!JrBin_Ww8FqZ;+NUXSvMzfCnKjIekq;c60!wK z4`cW2ZfOOQ&E)OZPG48tt!f-a?m%9qrKZWEUUyfE6_7QH65^cUDdM=rhO@4IQwYj! z%{3b_&8AB}u3)V>t=>4b-8o!)OwP16;P^6v&1Q>MU+KJHZR%Y)e*aD!HlyK$M(=E5 zZS$Z_Vzu@B%$e9h0^TF~*z)f~49}ZKBXgoZOVr^xGt4$1X}?ezZJIRLJMUN!cY@;g zJ?rc3YocAGuRYBlDc*7?(1qCB znt2^Du0iQQx6lw>rc_qtqS;>e>1b^$rue4pxk=lR{|A4!sQXa?Gz%6hW({RM9`dkv zZC?!%c+4GISVW>UQ~GNoKav>mhU;Z6)|3G!YW*NpRYby!P z=3pnJupO9P3>Wgz1_&AIEN zT(-tw=`$(2{k0M`>drD(T4!$F7m6N}m!-usjTfihEr@35%Y^ez?QVxlR$rDGxKNX2 zQzCg@yQ^LGpG}p{f1eLtUrsq`z-T<3Ro>6;Oo?JB)F!;{yD6@^wz}dfZZE#C&ES-A z@@`#yqWbIIp}QvwtBn_zO^4p|zM4djiPU+>+?>yydhv&2?6l3ASlm!=>>XZOSjx6z z+UPgKKPq@Hd>^jZ0iIXt{)hX6hLL;w2Pp-_`%L){Ja0a(8VagfA*SM8H+LO=X-=Sr zJGSucV#q0uM&V_~{op9`p|0k^L|S?LwgwfQpd;EO*3oM&27=235+0jtjFUmS(7ZaY zlo^jZx)-hirH|;60i`fCP!W44B?U(fz9YdQ+<5|b4}7}=KHPVn{{1d|hZ64YukG+~ zaK1)x2!HmG27hn=g@VuRF~9%9r^5fY2Yh7e-M`3Tb7RB%-0u5MGF`t><5DIoD^`XB%eK8)mI@4UWv$+0isrTS=$n z+2lzku$WcRX*EoS_G9H})>my=p6##3!D8o$;qD;u!og#F;PppdiKLPz?~odPhVXBz z5lN_gJb9nS^Z)jPLx9K-8_rajL|wBp8C-SV{()~HwuR^eB1n?B~5XxVb7YPabkOFwYAE2R3BUT0<|-4oBhoq=&mwMgSFg6 zUzrp5uP4AAh4Pka?#~;hxD`mm&{HLD-o*3gN)ikkkL9T*vD=}{zU}bGH9MJes7Ar1 z#;FNP&&zSbf43v_+Wh>_tz>%tYQf{?YR>hI#k{Eu=boVFy8Dn2{%Rf#6w$r_vjZ(^hA< zH9cjRVg{S8EN{MoSyb6=jcX7*b3a|Q-+;#4_kUmWVfy_@R*=}D^XZ~5Y&nDnji-uQ zF;8VIPmy&0GKd!X@Cmb}`jcn|ZSx6DhosxN!-G~-zg;HL-{cK%g~hR5;?1?+O{&!F zeiciW`8L^ZTy?xq{Z0LnKaFYIr-zuU%q&5g$_T$lPiPRrH8ZBc@^<>#VGl)0Y~+Yi zp;|2kWt7|ptXcb=SvFbnj-N9Y&6N%dZWCG3NygJ#=M&A>V{~^Us2ac!+Kx9V@_Szh zZo+=bAf}d66_-LX_N_CKw%buuE=&N8tzAKw$FitlUtGP$GEFLuku3e8$HAmt$kh4K z)?8sEGgWCltSUjBy%mI|qN{KBGm&YG1;{-PnESjd?4JO0<-#gXmw0-jPr#RYf$Cj~O)sGspwpWQeeE1^{$6S+) zBE_}Lqy10qkflZfJyqs^np9%HDZibeRS0bWHRgJieKp!j~laQh5udbDCrRV3u7GEwOYUvO({{OigI*c7hZ|V4&*`nXv@NA72mIpn3Q+E~Wp38R0SzN(cH0JBhN%=yKHmp)n zn!8jG?X`R0bjn83_!4aWL3J9`7PhWH;Da;FE&JbiCxS;wm~8g&m?<*|==scKwbULv zc61_q4Uc8kcz%7cs~0^&z38-_wEn;t%-;$(P{CgH;j)w~z|v@G3x?Ge7?f$4W%vZO zCc}jS@W>Q3$GKI{T${xdQE-P@6`P%pHq&N#BHYdoU%Bb}MYft0H;!}VDHm(W3gY!P z2tE&RKG}i!=X&7uHhkWD_G=ENBX@i7rtQC&=EghLL5hiD+^Dvva_b?B`ACFlR5_F* zN9w@P!Dxm8t!_c!iuk~bbEnyLi_SqVEk_#Jpn3l>u{`&IoTu6!v=3HJcMQ5;O6U8nSMSU5-aIObvmD+A+d0Vt9sw<%8P#Jf_wdI z!g@p&w%0y{Qn3>i1xoSd_c-1c;6+Qu*LJl^R;(~&oM&{XDLa09&iZZfQX$)BiS7zo zmtmXqHEGjoSj!w9Wrc3&_;ZnFeVuK?jfTh7(N5;m<`~&koEDAra}h$POo^@wnGixQ zFA?r{??b}``I}oCC?Ck_2u3TiorxamQ8s)mdb>7g9>SFyLK~q*IMHe7w`4(H->^&l zljsj*L8b^T&A>l!VX2nZ8VYj|9m1B~7Bxc+<X zvG+03k;#dbZjwKis*fsdszqpfK> zjsuwnT83lsMU#IaJYFTtZZqAUyp30JwiuyHtU9d-Csgk*%FZ|BhXs=tv|aavigeH) zy=*aW*b|OnkU18Vn5m_X_^$^S5hevxTeXSX7zhz?)+K_)kbbYrsmxg2djmL7tNs4R zztP7n_D=l?kSZ0YfZ8vJ{p%q><9R!!d#T1E<2ZjG2`W~%E&NO`s!@ALz^2vYdM0U^h5i?+hgKr=;!b4XXG_NE60qC8q>8}Tw3QRqYB}5( zVH!qH`bB1bu?SNVS<{$?u3!QafW8MGZ8;sRO#v(#TYCKi>EC6edg{Vfx!(2122w`# z#V}Maw)xIP)2WxOHZuOtNngQt*!Rp}heC2?%CH&*xgCFg*UyKb{cVOf6%N547VdCo zjUV^#rNViV5P#rTMfkRX^>;^o>^nHUrp^id_x^6exdS$le2|X$*K-L-I3^6crtn`i z{&igyRttYzp+&S4-+%1D^8sczRT0Ii{`+g&yT7N^?IV&Eh2P+K!SSVqHG$*KGs1tn zV+j-Mp%};|e&ur7U%@(Ne?In>D}KJFfh6&!yUen zBLCe2=UG6)`>eOXIZ5*V->%S4<`q7Xedq3ci1hD%Ld^l~8j*@U{zv_yvEQN_L^r?9 zLj1eiuoM`Qw%A#2f6oxQdOL3S@%s<|bz&WI$x4!WYX$n>;=WsHCcXHCdpst74_n+Wi;r0As0vj zjpGGl54M?KjE3>x33GST#ZLWq?x}V_HOv9YD9=;OucH?5MXStCac4I_y4Y=Ac*6Yt zd$I@U{^OMhnNC_40E%Wnao$Ll0z_-4;b1^xwKs~!&@j>J6M;<>iZcOtfm07 zn{xv!odaqco#PtzEmR*X)?S#qKHn;~pR=1d6ZxWuGB3f$)X@& zklTyCME0t>rRH<&PgyNfgNS&zHE5OVUfMXWMk!lY;?pc24DwV14BGB2_@|4A={>DW zuRnCsef5Tjr2-=3iA4!lX)-bJ#+Sux8bLg+*mWgLgj|6VD(SphZaA2H469z4{)mk2 zdi4DXef5la{k=2pv^{ap+rl}BQUqXCWs?1L4>KOsfU>4t)Yb8f#TOg0Ov!UA$9r$m zTaKSnMK%Q{chF=TW+yuv3r>kgQBMIDl_;A=yZx+HZ{*REpK{_d7X{JpfrJqNC(Txx z6B=U;PmyE`DPn<&zP6a>RCaF&1mtqeep1KRF+^{z5B_G*nCn{|SJ4)H;Gr}GKWOt`08=P!d zIba)r{dH|GN6Jh4)d~{iTY_f-E2`h|S8)$fq)&7JtW#L!u0hxY+un?Z>k~Van zS!tdt+gmE4Sqb=iY-i*)mQ_u${_w-6EP;|jze+oBwB~JDjfQlH=VtU@R1f5;adfGqFUX&wu2s!RxcL0ROhm8 zpF;OVgDpU;R`aD)ne|jTmS06bnXDi=6FJ>hklW0F} z#5eMk#k2%GrF$n`1P&UZXcQ1GUqIFCR_$O@f!DNZ6_m5DjegHNUdXK=f+9bJ?|d|- zTnMncc}R-z!A5qy23&9{DzYI2i-Ph|zbm6wqWR8Xnw7&b#O z%kyLF{FeE_j^ziEI3^4`8hX?7j~lzwgrj@jp8+Z}M<@{$lR4rH80N+OIhi=d4t-3{ zwOBn3t&uFLq$Pr#X4Zk{v2cH?P0I~7(11R=;sSo8Up;4^Fz0>&J5!XM!<=`vY5}lSJR5_UW$$JJ;;(uC;$|$s9`$N@FdPK z*$5N>JEziX(tDh=JXeSErz|9N4AySLRG>Zo$-C$CF1xi3i@4%nB?kC(pl=9lLYE;6 zO>TP9c9SJKx9m1{u>0e0F{qvNLyQ9_W5>&zE+P-xzWKZNABd{uMtWH<`ryY$vsG3k z#3(Y1jqJ=f*7rnA2Pj8pDxAATK`Qpc&koi(R{I#vCUWH3Zec=oHlvoN&pL7dt(VTw ze2=3WjY4QF6tdC-6I%3dI$c7o9xW>2nnkCh2+zwu=~`s^pT$55%T({}R=s9;4}4eVv7K0 z@tu@mU4&{*%jeaK;#g`XZ*NT$JDhZwp_$8GBL11rLZGx$5|b_3Z;s|VQAd?M(6a6! zqkmsb8*#AqweNJaLU1leE+bWYPTS_|>m6>>N(EuSEcQVG`Y>nN_7DL1kb59ZVL3;m z%_nk`68lO|SWu}AMmS!ELQbkRC6Q&yXaH(X^V=S+Rb1uaa-@_=(t8kEEf?792~+m9 zRMrIljmHvr^cs(75;*^ibAEWrNaQ`71z$DB=&oa+dxV*s)q@dXf3_OKVF2lCRimdz z8Jcf-kD8!e7EBm&tV+%5n9dcJmr+Zpv;xNPZhWX6lk2`z&D;+%bGDm?%l$sSu&v_e z`J~y52W;n}8wZSr1J6<((E9a$#z!m%Pl(TnEPdUo6`4Yib0XZ06VI2xUL{pF%NT8O z!0>Cl!OdwGPpfL?pHVs7 zu0V8e6w8fqe_Y){wIUriKe?bxMdBH$nx_{64qkUPb7jiT6Dwr=>`C z)U{0TXF~`I`-53CJ$d6`(r7by3|fhwvWyrp?-aL)o=Nz0w;rD~-^@{|mZ@bi@>WVm z_@R9wth)5+D&`6*OFZ70n{m4=kI{0bTH9b^FYPFoO+a~`8Oo29q_jMk8jY33m8LW0 zvfF6(y~T5pw)%zpmwWgKPSe%7SD(2B!#s%ZX+(?CarwrqzWxM=+hFSrdFC@3wD-1b zK01*4d4ZYg!ndnx{3rY01ki;jOV^WK%mpu~v#mA}h!%XC@C}pfqD@F}ZGO%lxl8WN zr{JiYW$^yNGH18yG*5-Ul`27Y_M{i&6C_u%GocJ8MTN+NBskHl6|3;usiC&VRi#Yb z@lp~VHVz6Ijxd#0eN$|7k%8x-c-~+P7Nvz%am$%2RSlq5Xa0SZG?uL2Yc|Cm2Pu)S z{!GunYWyq`K`wP!$dN=*=f*Y4+J9P>~GzH=gPi zBBnS;H!i}`k939~LL>M4kW&ze)xmy9LS}NbId;vmbPnd3$ZTI)x5T7Bp7h0fUGFkS z0dE)e8}nJ#Y}39ls&SjjjEqOC-G`k|Eq<`XNG7rlsTvu$1&)1+l&WOd(sL||mpNUS zMCZ8-%{NQIBw!JnpVxxCLR?TvHz}wkqaI}XJwZPpMNSbuwNO7rXH;PnXkj?WGVbAE z%Ah}M6s?WukbU*sjy9upzkB#GK?Y-ST<;eVt!3-a=lgvOq><~J-|Hody;n<6hd+`r-5&;8cLr_`iFtXi{r2Mf_QE08iQ=1qRCb0Yb(Su5Wc{$Xt&W{R#;HQ)!{Llfct$AkC6+OVKu*g>`ECcJ`OoP*b z=}@}R<0rUt|JdI!U#dnNqk;IgB#_h{w!Wo#!>VS?U#-hlnX1m{_!1@pM|0)Pfc)`lE9_r45{GhnGJ-W~PHDKn9!Tcdu;!a<@;-e&15mq;0Rm;sH{hG0 zlx&=?G^yW&SYrNrDB;MFHDtTN1RQGX14*Q@CR6U?1*$9#I~o_jQ85E^0RRBCTi^$7 z$ap7%Y_BuuX+l9X7F|#ZsD#IJ4hvI2X~P`)Zz2BGtv%S3uO#N#*x1G^O_XOq-SM8f z+Up`>v04&L;B+bj*p0mV1R0j1QL5`xpTukwu9&CL1KKwzRIjcA%%R?uD#zHRKlWAA z6Xm~`3g_vHL0P|5R6kEB@wiXqsSyKp{t~z_u%x_3JwHF1&^7~jg~jFAbf(5iFEoYn zIYrVvRJ_Rwqmfzb+C;|}z?7)mU+v>SHB3LxbtPX_B7xStkhq1vIT^uaDIV9gFJ!z+ z{~P{B+urA*jyWQsG?ZSGzV7yRrJVZ{q zH!YDxZ}6vLLOpqFm$+}cgH6VqN17@kS5~7zH*a+ZXwMU`8AA57-OoC}8vmnyIsQY7 zs$tUVak=?q$(MQXI|3Q%$&aM~2KyO;l~NA?%GNeSp^c@lO~!4<7nHS}$bM+x?d;6e z*So-~qwF{y`%P#u+EM-CO^gWad-M^ zgB1adWBVn?*-C_z{~1_Z-!d5v1j?6LPEGq0n`AsI(8q+0WXmi*$z=I&u2NCR77Xr3 z-<4`~KAO#}96SKyN`?)NO7K=CE{TyVrK@E2Z>J~$Wg3^W0Vaq5G5mMIcK zC>?hAbsM-J+&%yKo1VJ-sVeG}S50E2=YSJRO5|@~uys;S*5XIv$&j2VF2SLAN@i<{f4qQT%L(b&XC~aKC=^EhmR|Q8Q*v}aM&zP zBWzas7w?8-mk)-IR|S_hfaxfyym!9Na}zgCwOuhH?OCa^t39sYlbf9!Kkkk?T@$GZ zYa2sP^SZ2u^pDbO)*&oh=y#_5R0i|kO1ui)CrYwWA(HBc>yd>74+;*vWU%EKu8^T@ z4Fk+=oN!BDXg3qkj~xP|?cc&!W-#ydjYV=@6LwW*2G$jkfs=lAANvO4E%i-!rS}PN z#90HQjRbj9P68W`QwzYPs_*fo#q88=(MP1GNV8oXj(D$WJ8zKH|40vz)H-t(nO0Yo zWw=Ql!XZ09hHZJRDCfvNe=pZtTxG-wFiMtNoz4(C^w!-m2ztgg>{GTmS6@9tvDvrL z6;#lCOL_+VYpAKe6jsm2Z%qz$1mMqriEoClVd*Jv`Wnq=cHjEyXkvyBkzmCf8oT8} zL{~j)9dPhb*?lmX%cgPta$usG!9Z1=ER)q&s8s*;8nB7S38M1Y5<#(AB%v=nx9%NI zL(m!0xqk!f#BIRj(G3wd0Fjx##q#Spt2Zg>zULnPRi+Jqbn~fV{aSluU*4)+^*|8* z63B?#YdGKF#FujJ9ds%7JzRp`3XhCR%;V-_Va`a6!267V@p!N@EtVch7Vlqib)sTab~Fc18yQDE`&sjB z;aN9)7_w@mvEsLf67zRZI94O&HEIY{Ul@qR^LSjRppQg`3q*&EodMaRPD?oO5hkq* zk=x;r(I(s3yGqj;U==CznQD1l*+txw?HvNC35}-6*z!Sc4)ct%nqGfO3FvXwCieVb zK368Fz{s2VTvT?+K{&3elbN!Or%M6!D^WOQwwJ`zKU^#A`0&h%zis#?6olzQ9jIw? zahl#kXJyoG7#_WR%PZ?KTVrK^b9FKU{Q0e5X+^fmLL&CX8w<*tM4JKR&0Gc{D4<==m2*WuKcf7F5kc7F~JsMmkjY?mp89~V_?son4EQ3y_ zLCz7}iL!KBpEwNFtA+*uLjT)R9a)X}*wFLE8g_f}uoqwch zoN>3Myn{vrwf1IuT>r=jiLVk8ee$WQ*O7u_RiZZVIxOdR9Zvq5eKn@uoP>)ltFU#o(<5MDK zi{d=!XL3>$n>qku6K9EN5CI2E`kV~+Sv!5>A>>5Eg?0pHL^$N+^%N#D%FSnmZQ(@H zSGU!n{^PQ-c_99E9|dWV&00V5P9^?GKtp7sAjie2E0uEDX12}aH#`SNR+^QZySO|& zN*-g#Dy4!v+n3i6s*iie1I|tC&wB!J6t5mBy1~jLkB))9Sv`~?!V$0wkdB*N(eFwl z3g0o_H$xK{pK|?3pFiz^OUkFhC?9=|m9ZFl&CTN@O+e_!fsKssC6-*VC+JawODK9V zU7?T@VcEJ%s@15lN)ua)ubOy?l{I+Kmx2;ON;a^od^pJD1YlcXIg;_2CXf3*4a8Yj ztRd$<5W)gzintQ?BAIZ%ame`c$1R*~YC0J(3>_m-Ih+eJxR_8)2QmLY~kS!G38*{~`!o-8Swi^;}Ox5k$AwVRS9vil|wj3qLgRlBb z&+Sm-O3)%iuKN|83Hno({?;2AIj5vnvU^8h0jK{Ka;MVs7a(rALBdf-g+{|eM@4b4 zAs&y0={CD0$T{QOwBzcG(GzK%&nfSxMZ;yR0=#Y0n?S3-Ul6n|ilxb*c(PA<(i=A& zsf#CZ$yjo%mgmYIS*>#Q=>TWEE8sZx7E)mLR=3{kAxRV;YQEd?KB~fEfm=CHVim;3 zJK1wr_2~peBpTp0?j;pB30S`v<`|i5@Or%S#? zek&~`3G8~*FdGfGU%C7o&^|Lu+5a_M-YS{4-S;7Q75~}SFYsi~WhXP0a{O(U5FRg4 zok(9F2p`yfWX#>`&WkrjrcnX%vm(6+_7O$#UI~PdP+-!J;_@!FMyE@d?*R&v_6^r? z?8-wTy7Ov^d`H?Lhj9kjo7twTw32ipaUze)(gWrjASVzoug84xe(-xS4Q04pOx2a{ zU8O}+79}rXWy$Mr?Dw^x;?qAkmo`ih8mejtvx5(aHI{*%xJLPOtB>Gh4EpBwtUNMs zI*5MV=9XGduo4#rPjt!s}9&*WjPF1mzXzQvKW{A3AsrkhUd981)uIf)bZs)f6 zI|4>YUTHjV8>d9gv@aHUu7%Phje_H_2=plLK_uKDB$XQZ@}img?uSDnn7wLQotf@9 zO&tOJbuYq!d&(w4N2Lf6JVIjvc$$dgoW9pvMf@jNc6SmvDo&In@+cB5z0~KWn0>uC zN38c&W3+d0#9(QW;ZW8zZl#>*NFP ze|eC^;ZQUOM00Y)$9}ZSL*rJZqbCgGO|md61(oMimFIh@(9K_o96DhhW@zL&(nEjw zO`+cEDp^sS3y6PN(}HgK&Gkin?M2zNp5L$e#QOyqXQqTNKD>bHye)$#5b{Xh)9K*r z8~HkIX(h4BEjl}tiSVEciZ*RbDzg3A@jbUPoE~bjrZO!&gGYqT+mt?(&ny@@k1f?u zyd#OJokO zjweg7(dH)N!`_UcqpJ!j%6!>xyK~UC+Uj35xc)mE3Fu`N#p-($HS&v}ZRm4EB2?~W zlDG0Lm1eM_3lQ$nKO5BB4a+F#DB807Nk0yAsE;JNdKJ9-a&as3fEu-;T3YOjD7kQI zG$T}2{CYp8836_A@NG|-$2{r%atFhg^9w=ch2ZA%GBvFzEK(729(ykNncaqiV2&}7 zi)UmyMT@o#Rx66a<1VUXM{{FX)zNOa+L&z`p1o3!+lozgkS~s4%?$oYp$eyWO z@PO5o2koB8ga{ATswKs${cxt(7p$fQYbz#l2AP3x-4(T~d?P=@qsx|kR#p4o$nG@_p{f45D<@tgz9wO0Bu&J?-gnZ+&}=I* zf7WoRWl$=cu*j2mz8sy4&2*`{=%;(I>L7iOs+gw=C52?QpN90FQFg_|P+2vt&i;F) z?Sc2JOp2~6R3PJtIFX2B0m4f2*;RMDktrIYi0cZDwZv=XC57pvC}_^&ijO1CnFcF2 zzn^^gbTJ(A1XdaOW7|Hdk3dF0>Ii0Z-6KpAYG8XChujtJbzmXT!U(}VyRD0iLa8bY zPA*7gouYdYSd>FV3RHX`v=R9DxP2nPVT=fm&gSAL4Rwr|0pom)KMB#6q;ZafSU4`- z90^SV51PFA7Fmpj?xMWiXmf$}{9Vn3Ex~lS6F;xnuKa|QGh>f3htqH`8pF5}#_ZBw zxvl_d0r3}QC>M^2e!W6G5l4*MkvLb0F24i?fK+rX(njZnVIinQxog?^JQ&uaL-Wll zO6b}H+LaC2j{^M{)|Ve`#s!o1A3_|gN@bl{G$hbGZ|zUjX=YujsPmn^x}4o=S_gNY zl4P;ke!&M54L^*Gra~n8F3YHUN$4dE+hB_yRzgX`Y=VzHI@OK`^3neUDuysA%iVUT ztGrYw8DHsNg>6ig8i15)t#Dbp%C1g{6_pyncif^qNpf5y6@x86P)> zh#Lx-Aajj)@y8i0O^u{94O;6WcS!{$C%Kzyg7lIQmISjiZQVq(DxIFMN4HSS2>1Lg z%*&WRAJY3y_{*q35xynRA*@TEKmQ~_5v2{tyiNt#&Z(;~|2Jk-5$+Kl1&k2xN@WR` zE`NSm$^b8C`y;3B=f13lFOoD1J+Q4A!=R8GVL&*-UIrV=g?@{U;&wZ)k>!~#OAnPe zU(Ei=gH0}JiN+!HivIkUjOW=3rYs7SQ`YU#W2plW7VD`Lk)m*Z1}qpc-*-b;sn5tO z+8gzI!dpjZ1W_p?eLjf%4L$qgdg^XOX1wjtF|Y={N^PW=T%<#tbgQiFa+1S5+bQLB zGW=_kjTr_{n!?j?|5D$-+8RhD2lJK&2v7~0(5*TR&5P36QD6~_1J==y-{ts^@L&Ni)U;CgjazMP+`3w@ zZ-#yM&D8R!{~Imge<^{o6y7kJNb444B2P-h#LGmg#H-@ZkN=6COH!$#xV=EOt0V3r z3>)BA`b_*M(fBJvvw}g%=u-xQBs&#PLyUVPspuVRoBveL-+-183CAzS;a0J9IoY}M zoWT1O$b<+dFaAal;1I;oZUccP;{`@t&ujvt=+wvM)PVB}6oPP-2(opKHqn2*gWwtX z>ESd`<1`&p3G64oJml{pq2|OWB`2Ln{$tSrWiV9`vpd!YVrW9-Fl(jM=xm4B-4(9^ zk{EvQop1j(28Td`tS_0iJzkgqtJ^9nI-ygqngm|7ln4#UuZ#a}+K?sib|zW_kZ!29 z6iqq40@PJ;7B=C3i3#HGNRfS`Ljh&NO}C8k^BGVATmI+gP%;F@suemd5F;hEbc%Mh ziv1H922AGX?N2a{m49J;;!sV5UV{nSSSc3l9EIHQa_em8;H!(1H$G*<+zW#|Hw`Uc zK@wR7ysuyeV%7J|z5Rb*tY^3=v7QU11j(~bjS2)D-ObB`!D{Iwb~YcG3%6>snRm@s z#|d9!U$p@NPcs_+yeHtxO_XGj99 zG^ytEO`4}n?*i#mN?KGQV=7V9il#swsREdVVvNP-&%h%K12Gq}y+VV%Sd+0l1COgM zZSTj%8>hWA#r>5IWgs~_o-IR^Z3}qvXfW`_s}TqlBpCr^cc}@Nh^7@Q`@|NY2VyJU z`ykri97M>)UZc#fG|K0Fe@dDIwlYxI407+1dcuEBHzi7(q2pbKNo*rd=Ly2OEG3e? zwL*OzC~t7-ikr^!dY6GG-3OK2Oj{~S zb~~P`((OP|R*Jrzm-mmB$nHOQ^!7IS3^CBF90KnwDBq0A%LE<8{%6gq-Fgvt1q5m3C=n#x+<-!R+ctcR{ytM-qz8Cqkn#(irsI!!?vCcjG(RzZ7pYKqV2WhJ zkw|5JY5`H7r;g$#GD|Bx5eKHHAcIp4233tUcx|G;+_mOI^&{h(O#b_1q=?Tfd1WOj zcvi`*52q@OB2X!C<}c!uxqdHapj2SpX=sobp6T5$tumcrjMXVKY-G@=`F2S4nb~-> zTQOoEyyq~U84uiVVcDHq$Up3dWj)UK-&44a>6yCMlbM=ZzXfkp4f0&*s}(^W;LeMX z4DRW7bj2(5_X_sy^;C(l{Vv?REEwH>!3Qx9BXrToB6ugy-++j9g*3@C4{PAPiXD*| z4Bxn%0jW76PvH5VLyU-Jr7yZLkZ=&;bu7%;rZVM$$Hz0#&~(#7FV;uBVE{rShduC` z79gI0%0VpjX1Lr?=Auvg8Y`@@RLgPEXJAXSl>Nvr8obj|OY0*rOvN>nPW-cn`rD9Q zt?%D}guFB-J|JB@+n%B4)W zHcVmd&RS{w_p)VsGq}bNEL}>IyV$2FG<=zVOX#V@w}D8c*PEF>AG~5+dMuELwHe~_ zb@`P*0vGoRBv!(6u_EP6C7VMa;uh}5+V_J@Whi$HXrXKcKR4QwO1k-TZCc5u^`7*# z#^p3^evM-i!T&G*4!Io+I21v+pIX4PDe$1pWnst-u=@bB{rfSF0OOBu=U!t%-Qha6*$UzwiNVJ`il>oO%9V{~W zdtwaE0LM;E+r0^1x?{@3y6+)omX;>cQGnFQW)ZCJ3}VR{pY0Bl?Q&#AO-PgSnR_-5A9 z8>|rB4HQ+0GMViiSWcP?AkzShuWgkOn^gkG@1A^GWs6>3C?G+?W|Q^s8S6J@X;mty z!mpS>df%q|QoEo1j9GQZzoZ-uQY1*eR`kaE}8gOj%ewe_)FK^ChSw$H0zDh+ft6 zS(i)L@4j6FZfm`mFaESy^_*mvbTA=T9WS1gs+n@3ngM7Bx;o+ANc=44j}?XC$v6|U zUIkvsL3;9-ToxdNiDh8jG0ocaY!!jP(`}krzT^Nzz2c5vk(-1CCc{9~=RJFv2v0h2 zU~#W%cu$;T)Yg<nh1Vh+e->~o5jcijtdrhHmVC&kj!}8VtH%F$;bQ8tjKg9Jz3{|lXXH%LM=GM4`b z-QGdMi3Fqc9+?Q&KgfFr*zOihNdE(-d`Ld{l*yjv{IkW0TL{IQ?*6~s1>9}gPq}{< zJn!v^{-3SuS)5vFz~_?#4ruYIL^I(muOyMG5FPRT9H>s z`iZ>2;D-IdV^hG{d~47fSqfIp+n2!JF}>?AxqZzIK+KrY8v3SFU6ZLYDDYQASWG8N zQU`#_V-CFMauD(OHt%}yl{n?^V+RUFHqW;XzT5n*$$UfYSdr$8F#ys4OqYT|JGDJk zZU)d?htB7~=iUgxtV>AsE8!A}SdVv<#Gy^3=b}TdKxEwpo;fwSDfGL#SjaVR&KCY8X9nGp_pvWnAh z`FMCr?E6P-=@K9@y@^e9Kl~xm(dvU*2<%>vH>g(yg>&v;IhbQWt>V27s9pxL-0X6- z)&|*<)Hi^zArmU+D}AMk=sg9Crnl>F%@6?bl@Q)AdZ!o$?RjbTjThOhVD*pvHX~$jgcSpw zeUqiv6->X1E3Yk#C+)Wn0`yDe|J6a_P#Jik&DFU^mlGrdYapW>gZRy4^Uak-Hm5sC zv{f1O;k_ZFlOVL|e+AaZu+5gUc8R@9teRUp#b5`-RVT-kwatclGp9#G0stz!_jL=z zN{uFpl3Xf`$EdS8&#hrI)#&?fgnyF<`!cDL;637MP>m>WUZbiCD0Rt8vyr_QLc_DJ z_>2dO;y457@2nW0y?9lvZp*aK_Rx^un}@ym|F1HPn+P+Rw6EJ6s|vn)t2%;;Mw4$)^PS|+sJ+i zk9AB@VEhGbA?}*waibsXj?TTC8~Xa9zW9r(NHP+tJFO`++H8W<4D&xEcFD|4SuP!3 zkx3BXr@c^hTW%wWG@%wM`S6X~)JF?^mrPE_EbcDpci+n8xN`f_ zRyuqw{cx<3Kr5u;WiW>2jrCQLTwTcQJN|>!DDS6{SBu-LL1V#V)Wzn&G$~z_%CJZK za6q}P%Z^8iDx@I2-v@xZ*9&Zl8u3QYkb2X!KQBpsdLhGF2H_lXcpkekWo{m40qkJ& z9_*m+9qz6qim06><7g0^IPRE*LNWZ?MbcLhWOMn9(aLHyqVNDurt~D#ZqGMSRPuFQ z)g0w^3#ylHTE@22-IktG;E@U@^hO>pjGTKljCUU*RaLZsZtDcO zz%)Bb2>l2b@^mFcbtRv_p`;N=yf5$nG*EN6$n@?tv^dQ*=xcAKUR}&1Bz`XCD2{8C zX$frpkH@1 z)3+sC=9Iq&VymK?4a-&NP45bD_S^{T0O= zE^1-=!aK_Pu)wIzmFwT66sF8%4(ItgaJnH<#SDymk2;a{-|?9NVIoQudnvQ$Eo`7^ zC#IZBoz;{mQ)TFgmfBw0v2Md&Xu3yvTo(br7}A&|GeUf5F1b&Y>MB8mDcz@(QL3E2 z2tBo(us;LZl4ro^X$=|Q*1V%`H#Jm9RRcwGLF?_(Y?+v!S85+PV5S(Uqm`ypV*{^%Dwfgw+5}p$2=!zet^Bp;< zkqtw^8oiOuT%qnQfrbs3+_`LL6-q@j!X8ifWrgDSljGeb&Sm}$$RAzMDz;%yXlX*4 zS1PE{2LTk|T^J~QyX*KAha}~z8ga4`9^a8=4{>w}eZw{!33a&OCnvhvI+>PjWYJJ& zRFePrbmo^sQUa zYfMd%$0zfZSK2Q<%q&sPC%d$jH*je|Yqw-1+qLY=ueUagsyEzP`z#G2Vy@`lC~dl> z&HMeN7Vnb9P?3Rsz(vDjjVsh5j_9cO(vB*98Q>#rdLT2Iewc$iNu5`Lg`T+R{10kFqF`L#l8tDMr^&# z3>FoO?$^~8jgb$r+i2JGq%zNCPvm4P zjkArbuZXR$r10gC0gEO5kdz@ei_ePfj*ynXJl;^*Q_9&8+cNK?(loK?9IBVJb+p<= z%Lj*qYBc1tb)ZAd`r29E{xS;-bDQXHhOio&rTi?n<}veu(>L#>Zz%jBJCQH&T*B}# z_UU2@gGpE7caDA#6hG#m03~IsnPhF^D;UX7GZ@s(3U7TKms>OcBZTr? z)sm=E&4b%v>oRGgZt3#Jivt4sz5)?0liKIkTow;`9JF+Yb&J%L#2F$7u6(2qnb0b4 zT&nY?YX zfSTJj4gEZgSHs_LmcsO;g8UM2`Y(YqswGt>2Slm{xhYwZ&*pS}fC|AF`}J zV@w-yrT=Y61e4as67!Lgk-cc;h-Q(YeOov2>Bs*dd?|8Is`a&Ajx7-JlEyky%P;5O zZyE#{{-^&xN&EG2#>sdW6TiMK^tjfE>AbC1Bi&A5fprXy>f*yPjLFG0JdN4 zXbCHoEscS$QtkuHg)g)2Q>s}5<_=pAFDS2m^Wx#kdH9R3)Nh2}HixCZrj~UW6=xXF2bY0)SuWG%!RHl+4-!V0DkoRm&GWgX`-a{`IBC(V z2)j|wQ7b?6*Kp!qtplcqu`Ok;&DX+slb?!; zt@l%?O3Y%cICX@g-tv&=l8*UCZrU%)o7J&9!`6D@YMU=pe1)L@vv}`;mUf>zS?pW# zM)jAsKttJoy3yA^(Ww3+nfuWZPt#27IqaUz*|Wa&L||{0dI7}61jAL(x24H5cgDAs zjykuoI6X`FwYt!!dRKgenDUxaS)A+J((Uw`knVG{U8ye+W7YB*hvFQ!!o91jAmY}P zlM6&Vrx$NLoQya7wFKD(`iM-_;^)q4I>i~5W0EbH9yIlXMFXngz2r_V3k{bwsK5Jt zd|Ox*#iB)8DDmaV_hg_* zPpRPXloUw1+7KP{i&x0=UtF$Sv46`j=NXSgVGtUX9fvJZa$>ZCigA0Zs(vfQ1_fzY z97`{{AD46u-lPv&h9NcpE#e|l%mMQ=Y?u^4uhq+1()uaLZ~GR@E>o>zb4iY##(0Ta zKaD$%g6E~y0)K#I-4bb9(PjX$d%1ht04NKt$CDDJli9RCKTB;+#Um4<8xQbqw0g8 znZlFm#qH=?{b?QNp0c-Du&;)#?R>5*-l64UNzk9imE`wa8e*f0thf&m6WbZ)JVBMWHcgX$v8Zv}tJ_or&<7p6i_1tmsU4>123D;=!_NU4Q|E0Ds zyyODc(#yh~N+T;9de3Icx>3$uO`I}eTc7FJZsE&aHF$-{jXXIR%+gBa11{cZWeIXv z8oYreZU>-srO_s67g;-MP_Ux?-V22+(TDK;7{YiQIq$yXmGRfh5VOdzh^)9P zyVbE(KT{+h!?o0L8dC-d?h*cka8ZD5-$yc$?lM|cE^+-1;IKKk6#O0kxQr93!!nHU zQNrS4jW%x+D64yDU&CS4Hl{fpX+&gHa8Iwm5a=-#CKL}?lT!J&b|}_(qO zZk2us>+oQ!AS1Z~6}HNrx+l3qOoPc9M9WiP zGuM?$NU;G!!wGRh{jZsz2(n2}Z%mfOX?k$XQ-!ti9cZC0R6{;X%-29` z!ZJYKORXFZ#^NP3E|9$9i#OS=gl>O1e}3nhP;0PvP~cj4^Pm&(f|a&Af^Pd;c6i*a zUpo{2?ogQ23ig%03rk?mW>L3zNb>50u~XBXx12*$*&})Sx7CECyAX1Du4)<46K@sH zWP|0x9?XI2{j1Y}QA)CRRZfz;_MAG<+D(G28fJreofl^Q zX|cZ{4cOS>1Bc>HLvO@h5Rp#k&trE3`gx-QEXmzB<1tz0H(nOCR?$dWiA$3vl?BqO6X<7g&m1X%^yfZnjlg|s&W_kC z$2Wjn)%!NyOkMi0jC=A8(9EB8G=Z^#5M^dj|Ud z{i?11dsUEh!Dr+A&)cVgc&7h1Tm!6w?VNAL|J||*LWlgH9~6mpn*L7!2hedYsQ>e< zASLF1u3dpO^T7whg4gfCrDA}X!Vo_T45b3+9GRn}6opW%aDaTZBrmevXKBRHEVZ-% zxk3RLx55o@WXS)#9)+Lq26cXpVpAV83n$QN{ZHtQ($3qltN*=t_}KW=?~gIkc)}*A z>5E661tfrKnoP7vNo1Kb)FZ_vo%KBSizf5uk6upr9rUTLgVUwgMT|a+-A;tGIr|Ae zdQE5wz0gd8et@ueF+}`IK1dW8o81v`sQMK^;w6v=zz?w+(DN07D~3DO763qdV5IiN zk$lHN6*V0rs3Fd-g{y;x1hM*bAGt6HAb~AUAu{r2+|>GIKF2)xJ0_9n?(j`-NvSae zQsi{ZP-A}y5EJwe4G9hvjj7@6!DQiJ40r0H%;czt`ajqgo_^am#nJv1?uY{ zzv=R%?>TXDJ7w#AC|=5os@h#PW(g;ek2 z;>>mT;zkgJofi%=P@g5JaWs=Mu8 zV5~z?EK6#UWEfq}9z4AXzS0jC=|M==2}@M+^=B=Aym_8oQpgW9IWs_ZN6Gy_?vHL& zn;fd#Yf|{0VRAezlf=}SDfr&BGnajSgm}%ySs4&wvuU{)$K*LU6xk`U(~}TM>@!t! zq;K6c?;o!}XIe{pR8^rY5OBs}#|WXc?cbxFE~Ay1TEO44tXz5kDONtRvA5W@!)+sp zf~T%U{!SDrAr@lrQ=+RzX)F9XJUFmuu-n_1lbZ{-Q44~@obC;+X)Pwz<)_-Jl0Iu868SDLp{c_qrZ5Puev!d6Dxr&;{tDHsbogt&V7$c+WZL_7d?%BHMlU- zeWlwn_o4E<+34RL`MmHmPn)e*;Gi@OXq1Y;R9#6miq63F?(*X|jZB3~JQR-OXuP1S zh@)cm>1(PC$oatkXJe)u!lpTt)(SArrEOZN{Wa?3Vzx4L#bxo^9j(F#vSDG*yfm2} zB*xMPhYF9w4HhCft{Pay;VfqQMYEGJ5W#|?+6Vt54zoAT;~aT);&8s)TWP># zgrdS6=jU70{rKl~g7zoG?=26PFJJfoyVBIf*e61>;`Pv2MJ+^MHYFbB;}Mtx&_$-M z?Su5-AQz#u?VG?>mk><8$Y!)fcoVkt>!N}Q*Yv$~fC&{Y8C$qy7<|MZ8Z!LpWlJ1a zCk(i&U$9o7)N_6!7LcTCA1~%@70nsORc{S4O{@ZSwfJ=@pXngPi4gzA>_=Wg!UuHQ zxL>w>md2#FlZ954{Wbf^m>gaT+7vB*D@9MBvG-!RTfkE3t}!TZqJi!8OdsDt8!4`PJ|QO$8{8~ zkC2~jYYVPr7QyYc6Nue%3Dk3TXnE@oy=VSbQ76z_2%DvRlrc=>O*t4K5#s9k=tE^ghb|WeNrTLhCb&EIZwCkM*R7>vgGOrPVp(F?sN-tJ;W;&a44wJvn zlt-UItHgXK^1o>P8T3YH{HXvk&Ms%$_!&jetexNZ37ICV8q4z^&WIU4{#Wl(5SuPc39WY@kz+6Rv%s#HgAz%Nz_P zOd*))%aeY>>QQp94*inglPZV^xH|P==qRQ-E!C3EUoo9O918w5jsHIFP)Y>#fbOpd zY+l#;7;eCdc+)Lq$8?VSG8=~(&gY(dAChuH5OgTv_M<97_{=@j~f+PpPKE_P4(9Bw5W>p zlt}9k3G3T0CLI$nP|W->=cYhT>)=9$L{TBp+d3LOQ1dy&s@#>H(w$(4D6o9U&9AL$ z_vBzxZDz6%n6xpBzg!!l#vzcX^ik@)!=|*Hp_=^=$#`y4a=gOuO5dm}N+mu%4uZDn z#EPKuLeQMVoK{5n&7K{O+67*$UFJWY%s&7O17)y1?i6SjWu)7A zE@@3fNTyD;RD)BV_P&2Sf><+zF%sl3wWSb$&Qk^j3vsOW%p+eT0K4R(yLU(acFMqO zJ;XL_U=VkqpAu$idX?9__Nvcmfbkqlez;`B9JI$zo5~`KNj@mG4gdF#oUu~eT88lV zK{5UKn{&PD9iJ6!-yf?+=X6MtIR-iA+M<}Y1rHoyq_93ql^Y1LBmUQZ5lB#Y7O^?` z`o`-`v1|9eEzXLQAV!zKc`Jf`^*<}z9DQ&I?TY%>FWdvW`B#=f(=*KyoIiLM30t3z zwe{cINO1g4O@W?|g`yIE)IX;6R*t+9{Ej-PY^c0mQ5faxk~;nVKA7Vl0Z(!H1@SSm z@qI1+e5D}aOiiI0kRFfJvV5dPW9V}Q+}wU~??g=FK+0AEo@p)6IO(V}ACw{D{}#_h zXwzleLXw@(Dj}TJ`q5|{KNcA(n|5zU00~c`iuK?&0q*@1#v!+Esm%K4GOEK z_m+?#ATMMI_~d{5PtMpso$&OX_mk|fAixI(Vmtz^d2*Bk(i#IhAR^M*f_ZXUONdx- zlj7Ho?-Hmv$&9#6zEC>kAaX#RU+Ih5Z?)!5d*WUClT}2yk3~FirL{g$8;lA18F$a4 zlhIS+PJ*Z5{Ko#ES?&NXTNS}DQ&QqDL|Hyp_6712)nVt5aUtWR9h9>EDtpr?gLm)u z>-A)&3byxo43bB*oEo?N*V|n=ASCT_K}{7U28kLw)^2o33&+q<637bWOHVbV@>dLo zy_%mIvUW#8QvenEy6ptwrbpWXP|Y_W)prIXx-cBta(XYx78vvLl~UqXNSdHgMr~T9 z1EZeCjsy@jI-d<<$t}V=@kKzc(XL0y_DL$#`)LP>1x261U|_pO@~03^4HFt9Y0abG zhSb*)3g@I8z1kWZ5s6ckhd<`@9c%1vCv+5XxzPS#ltZ`sI1d$=dmh%vhDqnK?$QC4h5Y58_Kh++gb~~j>b#bu4)$t zCcT;}X(Us43j$Pzpoy~@TtJnBj>R0*-mK(0daF9gGpwH<`-f4>tLK9j?$0%56A;9I6{bGL8sT;%wt!-d^7!M=tyN%C(eJ3#R(oI&!wCZ4`*lx?B=Fpt2 z$&f3gOVS%%Z^Up*vzAtpb9pqRq`};eBWMK{?-9rEFTuJL5%M8)ueYE)D^fS5!D$ZC ze#q^*6+JoT*6q$ly-=%#_04`EyL9?>lo@>anX>LxMVgu%HAY;b z`Gy+}?nm7+vIr{OpdlCv>9{->Uy%%tRPzG&Ub|eoD$Rj zc5f*rPr+o0C{^_KOMj6)p+p4?4pQF&h2)ffxmF%R`LrO!?XS6b>OX&d3JxBL4A^c! z{R8vzX+cJt?{?$NnZI8ceg?GsQ32b;HsJ{VlbKV|O0Gjzcq01mRzi6a37S1IX=~RB z2MZv@3nISh1r?R8-R(*-86kSf8?fBK=@Q}jA;e+{WHFb?f3uQ8t=I(pd{Yu(X4h0a zKOqhxs6rEXKdyoJ(w6=V?M<&qX~{>`upiu4g}kM(19*X4Hq$aL5GKJKO}T3~-<=Oz zQGfBkTX(f9j zV`kM|dHx%3_%%l5pefYGF#<%HsxNI z#0uwf?XN>DBPF+7z1mSj^36Bg$lhBXuJVhow(rd>XYKuzKQZ0JdgxOI2l*^DAB+rF zv8v$4J~JZ5kJFK@(6~1->Aw3(NPVXt_(=<;d%Sk@h6o(r@^D5B#{%L)aRYmIiyEaUcngXtaA9XOFWSfyB;O3nC^ca2I&F(86gX7azH|vp0zj@5gxK z@iZ3^#|2ylsa(#hthfyNk52@X!&@QEbO5$*io$dlhfVEKA}&xoOgqyB>PNmf&sKr} zSE{+XORfH9xw_R}&QkanucONF>5I;OgWU$#7;_HPB^YzcTV&Vw+?U`OB;ua6Ewhtk zG&7fJr0_y9Xr8YnjaSnt2<0}DU{d>I3%C0le14-#qVV&i!5y0CqO>zK+{P_=d3v>{ zBi=Vn+AY-lL7*m@E64;>L0r8>pin_IJ4}ygpS={+S(-JFnqqt_-;Sz0_Quw0z%}Xf`!_NcA8v?3hz!f zpwnK1HGb-_1}0HN>f;~db?AMjG_))%vb{MvOo;u`w@yGG9YhRvW#VMHgT{|~XS66Br6>Y1u-Q~?orf?q)l{|B zr8&a@p3TfYZMg|HN=l%-?&j8WrwyqyQ=<`4q7g~BqT4#r&pPk{bCrrA%q<)*l~V6l zlm*%Tx06JjDen@rWMf9wgTyA2yS^ZOn@0ChBZf^{bjZPvRosI9Bx zBNuvXtzt;%W{6^h~P4N~W!}9|q|;dO6~+6@CJFEQzoP&3p4l zfRRDbh2E`vF)85nKFg-Ib)2Ak&EClq+utsqJ5W3t!W3u~Rp)ki`}Xh4X5OQTdchx( z_6mojRd#`vIn4PYd4X!LZ`boNV9oh_mDrAdeDjWUl%q26u@q4qtv z=r?lu?8TIL+4CIXsQ{g}K(e8J-`VL?-0ZT#%hD_tZc76du$kSLS+ZQOauyS>_jY!( zN`coCg6xB4>Y)Cm{Lip=I`S&G>>YA5BO+4PST64k_D+Iq!@2zSb7rxmw?*mi z$6I!R*gKe53YE$8SbKZLf?54`i0g1s=sefnL&lH&=lmsXG5RTgU{5Hg9BFJp06b)4C^}u<+^#?zx>clBqqdFNTaOO3$ZM@A<;9 zH|^rpwC_cCw;Dd!Kl!296~&FE*@?b=Gm!qN5TQuMC3j3yCu`-aUM5~4LL>eCLvzwe zwlUshEO>o49-GZ;hkU-yXSrlY)(b2%RSQ0>(Q9x{urMv@;awl7{&}T4#@8MH7h}Dki*UtKKw> zvCkz-E0=IRc>#fi$+|9F)!%`Zb4ehn2s2qhB$_kKjr!t6)9_fY%fYY&DmLa_6G;;5 zE{{R<=NT7rOi`hq?P65#E&5#_yU+G+Xh(t!qmM5ov>5-c7Fh@tmT{07nwe-c_0l=2 zzP50N@14Kk1T?#zGirDR zlaM`U${s;ylLao5jAU&6Xm25nucppF0x-rbx!DP^E#l`-8nxLbC1(p7oEl3!M97*! znYXK*Y;mT}w%j>+2n{Li($g2(xBcY9u$F3woP_rB98`W@Rb zg;Pm1ffsK`0o(FDWVRBd4OgVTz`ANzct*{*h%?KrrolotZRqlx=Wv$y?71AnuPR8} z?t&_PvJ};OHr!~@N^}efA*}8@Cv}l3zgXzo*L_C2=o-1#*Cod?m~NR0ci)oZ<(PRp z_RZh!s`I5R_B+=M(&R+;O#;Z;`39c-Svmx;Xfz0O<}68*cV0dD`B|xwcY9@wVuR}S zb<;P@p$dH9%%%f5A$|oLSAZ-!mYfJN57n&x*#m$x!#OUs3_NIj6{3y5PxpJ(e$I!+ z7#?E0$Rl!#SPH{oT-$i@>w0n2XFGIen%^JzJp->1N)*VkN#0yv^hwvV55xAf2Dbl9 zT^};^{`?~#K_9+NM$&%y>F{p>dJ1@|`Kle}625 zj(wYQpxrF$TIPhvpLOTYf8X5kU|o5aG%fV+v%#-0X4mA}S0Xa0{$1ZY!bBgAhwr!v zeoxll`#lXE+H#W2|MTZ0j0O|m<=c}>P}I%th5G#aeS*{Q`+?qUes}-#eAMZJTf-g~ zY%L5x+*+@kM{?NjYxupxKgYN*MNTEeMgQ+|7v$=?tD_YNb9o_@8&*yi7(r}Vr)`vd$4T8J6-$0E308QH2gLg560=G+oV zDC*^*lquDV_?{YCOb5%E#h0&fH_RfDvl3>v4zG99PhP`M6)aNsJ$}QK7tmqr3FC8G zYX)KW&xe5(nsNyOEO18RQ)Z0<(eqB#biM@W@ah48&!Mu;p~nSur5S6Z!6VXsNUTLEid5ZC?BZ4ME< z0&Fed3cn@@iD}_TkO&Y&>}b1)kXOHBd7-`voY`clQy)z@wK!fm#HK0}?j=WbrF?KX zelVVkA}4T+KscHTMO*78zhN^0q+3QTtexX(y)->?Pr&$d>?6#^`Tz_lf9P*K><)%0 zZ|vF<>VX~3q$UUA2~ulbE@Ya(KTiolAcgQJLE#n(I93}Zgrq+B^g8D@d+QJhE^akp z8PMfZ5UCIWEuo~8l)nxOKflh_;s7<`H{Po&)VpvK_`6{6g=B<6ht~>`i6&M2?lG~k z%t#opj)2pep^-%|CNS`wr2@Gir4C2*ra9j;M?j!&1h6OvKc0?+P?vHT30$w9TKqqR^7 zosj+q^wcOHBD4;yE+;^q3`Z*Lu6$QY+IU}gS`Q;H>AX~ks%v`%ib+<3JmH& zd~44O2x9CKWk^v9LL{b`pIn1nP~jDL@o}5&4vs6bMH3lg`wx8`AmTFw8XOS>qj!RA zU|UYR#>=)Y#!G~W5S61L5UGaa04emTQN@&-hHR=`nuyvgwR{LIOU?KKAev)pq6igc9<5QeG+*D6fPy(k>wt*bEfEsM6&N{9zSkv z=D6b5wGJy*9iqC--4`5R^xGv*0|z>P|1L9eF>*>^%G7nMQSD7aEcwNlGC&IXKl;R6 z$e9DdGE?I$oJvWE64Yd^n58NQqb)|xj6@5p-5924hYg{+wrtEevs+YD|J=!-kUdAU z-ENk{Jy#-koNi}f83g-VOzKyPg+dTr%#y(SoxC6Ozw{E@@87@fb2L4vWGM?>BlaA^ zY_2H2SbOG2oNy0wHwd6QQuFmPtJCX`;Uz}2kV$D@d)%X8w^noC2_NTU^te|gTJa5+ht2h&gfQ(_oQOUCm#g}TfF)Tk!n#q@x1Awn+9UMb`5 zVR+MYAZbyipovUHR%oORVk3t}etIKk*NV0f)o5G^}wp*FydB{c>Bo@4P>*L+iU6cxMZRfg# zHTJYmTN48#riGN+9&kCv?GL}=#cY{H(eBwZgFmiRuA)>9$duJP=- zS{XKIvtP52Nc~WUQ!04Sv7HissxZQwcsv#VOy$h}8swlr+W8zO@fDV625tq_Vi7;C zx{AO}$C?~ksqkRP2(Bx}8U6^5*3RuT?RiUA2|(>I_oZadU;nJuM8R73ymXgRHdGbW z$@XR{Z>%feRY!tg?RE2h1vks`DbhNDFOa3e5aoK!M*q_B#gckXnw)KTRDb)#K1oRW z71f;f;W6+bsn%Urpre37JTY9deQ@}L!`7lk0`8-VdRe1x;}57B=DTSDJZG`pQ*0Oe z6%(6HJ?+-u2*92o!pi#AKy6(G-D>Pp8QP7}+U?bA&=&0Q18_#B414eng8#{>gI(r{f-&@ANd~3W%vl|HD zc7%Ty2pbHl8efiS)mX}Nn$^z5t;#_ueRA73y-b#C_AOIo>N&_{iVFO&T?pafe|?mA zLO+*gi+sM?w<(B1?d|0IICKB>=GXp_%NX?A)&yx2RvEtFd5w zM^05$?Y$A3=-q5M+15QV{G!Zh{lS40gEVj`#R;3T0Nrk8SFl1g@tylJet*aF^7>+n zEqtS0IL8U6i9lfgy~75i8f4d%z5Q^;E{@;B6fsAyp1@tmmf@uULT;EJ#}!KowK8v zRry_T6A@v$xj$LB*BV5`_msF!lmkHLH5`$)bE(C$1bgy|&9y${5avgBZBNc|7FP88 z;=G_1knr_MnSNl6#~cRU^wn9qQ0xi*QxhkTs!0rC$_d3$;dX{ux?8^GP-0}bAwb-+ z_{~^IKCgK>$F%iRIQ{7qfiQcX=JH@Mlex_^X;M;7j9n99IR)3?!;i9gwVh5CxI|x( zgwx^(dQ>75PIu=55=EnXWjD&9V@X9-ZU%9rgzQbnSZV8h$nak}5se*gh0#0?<_d=7dnCL6sMy+5xFRfV6 zZ7R5a;y=H$>uoTnOqUdl2Wc$>V$Y0=9QGZDlB1JOX1+H~%~H#aSBBV!?1yPamNx8d zwx=QHJH*$BcpW)rLh8ODW7s_(;@f{O#t0p|)K`fq;(31~+xL3{t7$TK7EUjM6hm3H zsr~bAgKM5fpDf7JGPW4%_e?5Y+v&LKVcn{L{Hbb9K|38iwbB|pH{(QnqMGkJVs~YX zdKcTO#NCYb9#GUQ)62f5*&enDx+VXq)8ZOl3G*;;WREs|U&ad_&C7uoLZNnxT0GjX zLx?z=uU_{1lw_Tl;CQ}T9)G#rkvOF+9o(zLOhD^Pczaypi}9;|l!34GeTV2WcR!>O zkc>m675iLW&Fv)x?#lRbEri&2ufFKl^Gm$E_|lFsH~*U2XU{+VSq;`bX%arYQMt0! zl8d4?m6&6WnH@#Kqs@84^k`+Zaje$ryEvrGCJEu*iDB);QtH&JEuX#IA|TXOIbpHg z)9lY`_FNAgn54Sokxk{B8&wzu@2H?+=3K z8EsljK1p)?;ZMMckn}mk{>sS<^RfN$$6bR5Mgf!OJ5AIh=6iXhim@%(jR_5d6*=qv zPpl0o9{>7=62kfKkGo?aX%d?38KkYSw>Vv{oZ+En^Fa=QppP@8_ zzx53WCO;}SkcwlAPRNJD#r>By|G&F^D&v7;)QmNN_V0he&nlw|x3@cb{#}evGtyH2 zpPyw3|Gz&gbBXwWKPU9?dQ<`=oF@8m20fRNeK}v`9nX2`4@myI7P6-d?gmf%29#N1 z=Gj1#hXO4jp7rY8yklQ`-Km2E=T=)uk|97H~9JanaQ0N3_+DV zufog_p^+`)e7|w6pEj7&SZ)r^i+ith2sNAkVfp7)vM6Q^CD4^6rCozVSRlgfuBx2x z{Xh3%syo?_}{e`oJX5ZYS$gR zsV4nz$mr7p@Tf0-aflqG;c9@d5UtUGjhQt>ZY&%cGRV46)<6fv7|EAd!aOf-IPgy0 zpO}G2VF->Re8>Li?44_UaKK}W*m)hA@ul3!wkY|mEZq71mN?$h+E401N55VWE7T39 zgk33aG_i3IvP3{ET`L$EnZZ|x@81ggcv^_W3)AFX9qHawg@#{22h=Jed^u>UV_7U!vwL)ikI(x0Un|pQfC_5qu`ii zja|?W8bUbC1C_pg2uqcK91je_Z)xU3C9?5O(`3Tq0WrjEy4u<4pcA>0TWU4N3gk)A zFgWFua&`HI@0`kdc|5`L?|8VN?k`>P`{4>iArmZ?A;7K4L$7uIhY5@%mDWkngwaB- z2!2_$;Mv4QND2f#MwA!z8f*s<;FuGycG&7EwbCn}er?8q3VRnN=>Fu!3OtA50U7?= zlFvj;8N(byLPM$4*FpX^J}7ryB>E`_AatuW+U1X>R#_DiJ#sAd*hfM2#3*M(M3UDF zdSY3G=$RL%ruOD%A3d)2fpC|KV&y;6dr8U`+eB>^(2F-bKjQga458cw?RgZcbQ#W0 zJdnHj70$qpc(Dp?Ji7Eu8rCGgE6}+SnHLnGuA&8hKnPOrw$Tu0;r*O(kvhy=qD`@W5APYzyIkz$OUL?caJJsGjHn3O~+;76GLjUgy&(M31QY{rzSj_ieIg==iwl(fgagM=JYM z561I3DP5ZeHXF4Q|AkZvr9^7#8KLrG6whM@szGcuSznKmaVp<^Bui5DSXl zXaRzhRwX|Tqv^wEM)-c!z{;fzca9F1CS?)0km^T26=FvYIKr^hYX(F&q75ORBLNCw z62rII1Jz5!&- z*ec~$R?26tRJJ>D0zj>TAx0>3o>@IHK7U9Sj4<DgJP=L;U1 zAKZN-ifxB$mY*&&znvE z#k6iHmH@xG9?^6FlPBU5S#LAEzE%Vn2$b>Yf=P@uNXZv)Ksz}g*VwC+(? z(wa8X5uzE0C*!&AurgZx1pmI~0qDA?i^+TatCI;9Q=f_qKpj+h2q={47_U|0yLyXd zVjJ_t#)hV-_e!`g(W!ENK zlD#Z1oS3=eYxL*gt|BO^; z54}kbamf91`?p6hgs*8%cO>Lmep;Ub)!!RE<1%RU1aFh!+#?htvT26qhaNe>v|@WE z0RXs+g9HUBLb2sfj4w>Ajti3p4yYs=)=JM!m1pbK>M}$$v-=g@K=7n7DV#j@{zbwvtbT!?Q$t<)3^S0ML(S!k~f}AMjT&4q>%rn zbhO{6!tsSp)wd?}TpeDid;Bz8=S6nCsIZN22&X0Hyw_mxWKd(-gS7% zl2^s-$w={T@j$5*0k8KwyO1v7xQH!w4ew+9s|$MKHq;)cb{TUkmw9;QY4@z@xWv)z zF}4%k0Mk(ZEQyK+dR|GKohlDIWYXH=cK%b^3y`H$Cv3fbe+>0ldE$!V2-b5i+FqG= zfm|}?csPIRQcrd2V8e2(uW`F81{R@ywO_3lqzj4y)(|0B)9|;jl zoX_Vwm@PUWOeg*GG}q9#D@$KSW5zdP0Z@L|Ct-RW^lL#GQ2P3g(_Gc_a*L7ZG{jjm zo)D!dy-%iyk8_PV!`kh(^_djXvX){olDF7m^C%hqE62dV_)91Zp$Xt?!-5m7B@$h^ zsWVpts^e}ceoU7!D8TaHt^Ktx=pvs|enS1=$001{*Iq2S#F}{9d@kPCtbP9qB#Lq4 z&qY}jOyZF9M$_*;Dq0wE4a$EM`{r)6D0z1i10U9xM>tyr^1AQ9ez`C2aC-j(lS$P3fiV+&S}TB?8Gke>Hf|ECN|E1sTAg(( z8VlVl>$8=qCQ64_|LV~%8=@h_75ePuEQjz>F!hyqL9zERjKrcxLj447FnpJGo z#Gj|aFbV}$D+>*ydtza!!Xd;A5jQ1qriokPLMM~OHuU27 zVpx5%IR)*><)a!;e{Kyun3)v)=%^gz$Bt?`DZX*#6&K1mi<{{9er|Ynr`XP^bE)t| z$c9v<=cfui_&DvTS@E;#AWLQ-p3Zb`+2*Ye2dBTQ{J(1QDgo-%?G*Q=SS5CM*X8R^ z(TB4QGOp(_XIka*QTuinKCLUP;^ffB{&$~GeNKe8_+D(tt zX6lSDw|^Xbu*hd7?tV8ZpttnHqraq1!C5qnJjWN)hx%r(T??nO8X_<5cBq}ibQtio z)p#-gJOC({e7y|wA8iciVfF?qrgRm zLAxt<{PYPrF#KnDtjcY2^rt}m-LH|V<@xL-H9Bpc6XJv_9DngG_-JnzLidxUj5;4S5^|l5&ESG>DR+!nK&?vS zHEX#)B9GtOUja4nknMqEJbiy?@87MWJ`E6d7xW95{te&eK#Ve94&EmV+Q;)1s@10< zux98#ZOQrjcqJ%#5hcR^?{h-K1QI|c?Ur{At2i;*^ zhh6seOW*0`Bwk+ZnVO^bm2SdYDs0!3j4C~d_(7+RzPZp71}##ncdwot)C{;KmyYK> z8jZB?h-7-pvFllbbr zQu0h`(oyo1+t0=b0lC+qCef-%{Rj%>Zaz76_gxGo5K)CgJ0czS z@nx#USGoejISy_Rg5-_l|B-y0z;598+!B*7&(WVh9L|{<#mQaV`$faet?}{6YHIsy zel0w50h;3fuc`Bnr@DXtxN&4<9nrA&;TWNWjAMmkba0H2k&Fn3vXV_h8R3vUGQuHy zMRsOH$lfC>#chk<`*d^vz8?HzJwE3%&ij2`ujlJ^*$-XN@S|T#9rv5|e+q`|lz8_# z>6>M1UVdPOWs`T;lyDlIFBtRh5;wVx1W}sLSxV1kDaRo=`D55CXL{vH{N7$GztEYj zm4+5BjzJ!$Lnl%N!f*Y(g0ygmm|nwCa*hFv&u1&lzU09-n|N`L!WbbvgESclJCu2z zVLd8ab6>?bMN9>W735hEa<&XQSn2}tdR&-S&jsQOo-=l$$Vo@!`Ys?X_8!gM+6TqA zAlzCn3oUF`g65A`;Jhb()-E(5is!dD7VgePWlWH3C?v_+hU5F@AR{*Yf`$=%7v!B- z2{|kPol)Nl=(1P_`g5sTi8l^!W;)b$4@Kiiy_(v)eJT}K=@^i-L0*5p&NREal-l^g zu^J_sxxuf}aNFNaw7RZi4!SQd#L~>0fY|SxfjoUZq_N+6W0oHPD-a190YoI3W)n40 zp#IzM8YRMjeWCwoso3AU3~>Z)*CgEXuy&%za{4%;3$^VHC@(2Pcs(3W3otb*NYJbh z#OnF(t5mnrjiq%NnhYUf?;6!?R@L(WSatwxPC?6wj*9H4fl;-5ZYiE%Geu|POpN7V z2jS|6Bn-u|Zq34?oa?ZzaH`i&ua}FxM&Q93zmD-|H)`+x5~B5GFW<4Hi)(Pu6u6Z> zaiQ2j3QN}H)T8eW=Lv6p++BO~eacg>!fC=@LO=J)t=eC;0*MknHG;;qMk;kmZw3O% zWUE-N?p)TWK2@H$B?5Bt*xc_dK#I3$RW zb8m~y+h3deVTV9NAxzer?ED=Vo2(7)NcvHB@27Dyn+n#N+KKln>4G{!F;`fQ?MLfR z{LAe6OhMN|5RibecI$&Iau45Q71N(R7klZ|c#oWiro$5OzIidKvQs}N3UxQW_4jlx zB#T5h`N2mIWDEDV7NQM=OgaZ1e3Ol73M8R4&b=c2K2NfXK;4ec(U#(Z$vky)3L`A} zbf?wA8yT z(JtmbJgNn0<^5SmeoEeB)ad^$1nEjdFkrFHATx);x1g;`DJ@8eN8Y#svr!(l~9Px3%}9jk?usu71uF6;y-ze#Yr7TcBRNKm3cYU^O*w5?nfK&_N0%jQN6O zfOl3-`LxMm{Z;V7c>shbGM;F0ql8!o=9c=aiNh}EG5_uS`T118iq|}`<+^u7yVU1y zg=GQ{)6hoy;LwKL?lsk#Uhufv{}lZe#_8f{$4^h@9AVukSC3b`V{sJLRuHSP0c-Bl%EkWSFKKY?aG$lpvMB? zvEbNt+s;ll^N!EG-uHS2g~mKvi@kA+7tL{I9M6YK7P^uLPXRInktK&e*{?WrFO~K5 z+UncRxrQGKA1}LxJl)y1^Lj9^W}UwF?PJ_%sGHYPmk{ORMUJqMC(jFF@0mfh|Ee9G^=effUOSXDuwh@K~KTSrdtH8)gb#xJ)Btzo!SKs=`GfoQ+17%?k~fN&DZNzykmkh?&{1C=(;UxJk)n7WE~uGC0Rdq>lX! z9P-ntDldr6obQNzy|+UzXQ0>+1cP|2`?l?{6fVGmS4}A;ka}mbfGz|e3j%co?=GdI zXFa~hnTMAKB6D)feCwXvSuoHf^p%eQ2{PYudda-5=;*+{+!3z8$qf53Y6QNR%r+2n zLhg~-S#QQ{E1kD?)w>kow<)2Kyd*l}YD)@VO5SR$U{tR>es|VHGobU|F0RbFIy)du zR$=NRxx&@BF?Vz0hjUzWyXeZhh#-ju$?q54LR=4b)&=YurQYD4exB3@uk`SoruC+Z zM*O&4avD9=NR3+}ayQ7Qkw+t@sOLJ>5ltK=u719jJfrN^zcii#FS2m#ZMRg+G_&~B2A)JR?&wq51r=CZhAB{E@4V~~*EhGRpW-H6CI zUb!>nqWP1NRo@ni!`(rrg*>eNH_;XF2C2yF`^W9s%07|94w+P$XFam%H$GMK+VFJoBzuNXFybj7V9NXv zWVbrETwf4{f^m?Y3(?>7FQ1Yhk7E8wJz~DYV*!sIQoqWTrfIzVD1#qJJ|)kUGF&t1 zTsxbC*wA#&LP8;>AgH?M`^tW!LJ+8Xw|KN!fA}5xt!DsR)7b7Jm4u}H{jiw}%roz~ zYJWRn7Xs7HuE=}Hua67yIjOpx+_(tTr5P5SX?2v$VfVLAX|GR5T-zU|pq<=9wB=hq|6AqRY z#Xn59uZqTKX4GJNg|m*7g!rxij%7&@6qvTk}e=sAM{uo<`61i zP7+Emf0#NRH2&6!QPcTPanflMAqj#(o$EhlkK?`{zkO&w(3aYMxl74Y^<+%{SJ++Z z{QGYsj0}RVoGAOyWQj^R(+3l{ns8jFjp>L}{lw|;y`ZZETX(#exEY+KW>Au`ola2U z@ZG?to1BBZ`TG<{@&aecYDzZ}}B{Lw9|)!z?#q!{e`f&t6p)aH`EyXEAhi z{dVb;fL}g1WPAEUaPe&0y{ARcc4fEb_pL?=VIwwqHrZP?$2*DABtI7?>qr8mU^F}9 zPW62E(3y%48m1jF5Fn0xC|SFGuw&vTVTY*;{xJ9}C&hrgef4|3tqDor%^1Y|%ix>7 zU^yxzPLXpnPVqY?xr|v#UK!Ub?U#cy^f`Q}7X}Ge*I&v0ykXq8Mqi)8eNr5iGw1hM z&!SwV|M6MZ38IvS;xOXz&W~RD>e~^Owb{oPtKTp7!@?wX(zyIFKMu=A=_;bCaVdsg zsGnSh`k3O0+_MW=z_;4jZfK_8#ywlxKie9bulK0p&gFAQZ`NZI4`x)^^ywxBg>k(6 z9sC08bhxo}#f%WSD9|eKxrK#c4=VAua|5Wt0y?z5m zn84#a*jBljA&a2%I9`HmGM0kBg2E8jvH`8vHJVt zPnVNm`0Zy4VE|~Xbp*e>OtbP;FM`Ax`e=p~`6ujGLIHU#2>n<1z@{_RocdJY$IipE z>I!rz`4(CZZ?y0KPtDFqueKALCiQBGVQ>b_6U`UvR&_&B|GVqQi&sSu?c_)1#sO#% zk@5UCq12Vzd+k|WMMAF@v$eY~IugB&9tc@V{QxJkq~m1Y+F z{hJ?YNg$gM37WnIkZ&OaqRNuh5Ow*J5-8d#dR2P$1!Ak^!gyluoy`Il)LAVWP{miY zi!Qm)8{c=uOZ|;r$&L}VdPFos)7lHEj~$bG{O&G_*;IKt@19+=`wAR`(j?VMK=#TA z)gk@)lSd=Ay%P&h*5Ci1a#w-Q$eKT_oHEne&V;}B&a%;3rshc8%|$E{7X22!xW=0w z{>Lg#^F3?>zScnJ*=f~X2yRweg;)1L2b>p#6U2hAnjx#Rwi0;pdm0vleax<# zXZ1v1D zrg?yWVF5L{EX?UUQSWiPrR~>sM9;w1YVV5IUIN$Dzc+LwLI%3WuNwL||3{&{f=)hq z$5TdFDK%D=#z%>9$dC!!D(w`kxIz@cgZ1Y7M(lS9-yw>5m@w~`AS~&@ony>{U1_|qsqtR zYuYbh&Q;ZPp2PwA(85(99@?OI^-1Q~V2NOaNF<0y*6Hu>*?0s4su^%ZjJ$6(IlKOZ zP_iV1@sp_9y3N%<3o!n9e`I=0j@O1LeX!Bz$Gg{ zf;J4kc?8BT^+%jKuJ8wnKtZTe>AakNKM2qlnIv&&FfQWFX{if=z8N*1UZhrz?~dk+ z7`<_)&{S&BX)w>P$8yLCGjZc=g~vbX=LumJT(K#!A8zDy{4U!oHMrOF_U6!Zwq~HZ z>CNpojA}XO0`r-?dH-O64A=n%X$av_HqcbawZVssB!U6G=rlXs|LLHhi7<30RqHsJ zowf)2_a`pjDLF}6lY1k~*ZVmo@THWc(_5~^P${dQ+BYgYxC?_^Bg;%FGpdsbB@dFf zLfKQm1=0Xh*Y5YG$ZmqbqHm5x_;Y%W$Yp)=Rsx$4@K6p_u8bDmy~$wo4ewCPg1+q5zzSro2%1!A0v3C{ z?WFlIiQST~m=qK~osXyKpaT5s7MJomzfgHyL5DlUi%5y=p0F9T|Jvg#m zA6(r0*W~c8a?}unK$}hiYwYh!*M>=95$ftE-2KY5VT?C+uf=o%iZ)-MXFLknzUbz0 zn%deGw>uS7@CPWvDD{1i(LRfQXjo{H_?T*i<4iJh*3Ae+hV-9_871O# zd*g0S%K#9k^UU5xZmJSQAl$99)UrD)Hm5r z=G?`2V+TlQLIbBUHhl|ZhM+*cVTKs_TltG%wT%KpbCjotcK>1~;Lh=e1@FZlfM=e> z@1H92MNc3+jmTHlQ2S>8eoi%-5U7^|lCOyMgLi3-7Pi@x_x3>=xCfTVaVV&KQi}T6 z&KRs|vokWHNVjgk)3@D*+eGRHF^_A;L=5G}+R)eMb6Z3ni|dX}kvCm`W&TwfIX>my zI0QE?dv9L@kaLTVWEvjz1Ob;BqekVu79o- zI;8hV10p!8=5t>ls)ssKg@B@j(Fj6H!-`|2n<=Qg`(yWjq7@%z6&WvXyTa)PLZ3c> zEW?R+-TVIjIXNj$I)!h=2H^n|**TgbC=YUY1M`jnS;{IVh%PW5Tpc|=+PYot9ud9= zR-?b4gtThKuFF(G3_Ns@P$Foom28n>Le8Y830p=r0J{0`3oO6|J@XlNTxBcm_=_eP z2`c4VWUSjwCJAo!T^cCS0OOuqjm5egJlzCNsII zmt?#PjCYCzz(Ui{E67ASw`G7vM1!%Kiu|_isT2;97qpDZf2)$>p3|;tx5>Ju%r0$! z_O1bA3ozNjN$9OIgvOV^`;(GB&)zYc_nN3lhmvtVARjdOlQCXa`2?d1qAj`F?Qs;1 zM=mS$%4}3MkC$~D4T1o}L4E<%J%W4wPP^~orwF_%{Dp44n6;>Z`8R2JuEm_}*}Z(k zL%aR%;-6$A*!J}2X43lCbai1qR(sPIuf}K{HL1i%ZfZ91Xuo6*06P$Y-Cd9q1XtsS z@ zW4p9J-%up$DF^%c&_q3pkl=Et-&eakAl^e4n*MOHBU-h(DSciMWT!T@vYxiz_xZ5gbFmL+-BCI zaNu3^&u8Rb_nKcEwF zH=z!E%bR%m&;89IcIp36(!)s<5%B1uv__)m(>Z_X5dAW-K+Q;M{;$_mQ1fZ?GeK$& z+{*QUJVVpcEJo1B17=-1;>RzG?}HyboUN%;ysHW=S*{l(kzKhW@B6f9!nd#ek{ zWb@r^jM%<@{%n7?#~!J<8bTxel;J92fo45WT@A%H0Qesi0x;tS$vF)VNQS5 zpu*+F2>*-BT>Ib~V}oT(@8jn(TYNtc!L zcvGE#D!1+yaHX`4C>!96EaOx-o!^TeuncwJeIKmi155zM;Pl90e~}CFQr$&$;isN? zHDL66>_w^+<|sxBE)j@E=|u7MlVDutt|j94*>&OVeJ_&Uw1>R3Vh~k@G$5wKRgYE4 zE`ZKPoxwyi=S$^j@C!b#C8L=hJS($^u$F|35kzK_{@e#q8?X>}pd|$ksABS0Yv0aX zqV$=D^#gWapGSSF#w}m>eIxOll111yBYB~~FSgSf<(Gp0gP^AkGw>6#YY+OBv(5!t zyABsw&I*Nu`_+XQP^xlqdY(IEDW-vfCXXnI&NND*yg`V@L4e3Q&7x8IhYg2v9VTn= zGMM}<-KV;-dkt&QP1#v2$EepUKAbPd2qi@9Ns?@6vG(jf{nsbU9?%UO`^lF%KJ~^B zTu?Lm4#IW|wPBrQ3c>Jc(?of~Pr}f%GORko7qZukGpsWcr)Ublr|Ao^nXWLaaLgBv*c?J^i37%cF_)muCj`W0Fii!4| k;x|0o4TGQQ@ccR7@A?NCjcMnD%#40iWY(Y2fpKC1ONa4 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..dc89f88d0e48972cb74da3dd75b1519ea8a2e3a5 GIT binary patch literal 70900 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 Date: Mon, 13 Nov 2023 16:52:33 -0500 Subject: [PATCH 039/202] Tweak formatting and styling --- .../analyzing-your-projects.rst | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) 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 7072bebb1b8..1684a5988c7 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 @@ -47,7 +47,7 @@ Downloading a database from GitHub Filtering databases and queries by language ------------------------------------------- -Optionally, to see databases containing a specific language, as well as queries written for that language, you can apply a language filter using the language selector. +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**. @@ -59,7 +59,7 @@ Optionally, to see databases containing a specific language, as well as queries Creating a query ------------------------ -You can generate a query template for a specific language from the queries panel, helping you quickly create 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. #. In the sidebar, hover over the **Queries** title bar, then click the **Create query** icon. @@ -68,7 +68,7 @@ You can generate a query template for a specific language from the queries panel :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. Selecting a language will autogenerate a folder labeled "codeql-custom-queries-LANGUAGE", which will contain a query template labeled "example.ql". -#. In the template file, write your custom query, then save the file. Once your query is finished, you can run it from the queries panel. +#. 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 ------------------------ @@ -163,7 +163,7 @@ This is helpful if you want to test your query on multiple codebases, or find a Viewing previous queries -------------------------- -To see the queries that you have run in the current session, open the Query History view. You can filter the Query History view by language. For more information, see ":ref:`Filtering databases and queries by language `." +To see the queries that you have run in the current session, open the Query History view. .. image:: ../images/codeql-for-visual-studio-code/query-history.png :width: 350 @@ -171,6 +171,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**. +Additionally, you can filter the Query History view by language. 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**). From 44935cef63663148dd5fdec9f1018b1e2096af80 Mon Sep 17 00:00:00 2001 From: Sam Browning <106113886+sabrowning1@users.noreply.github.com> Date: Mon, 13 Nov 2023 17:08:31 -0500 Subject: [PATCH 040/202] Tweak for style --- .../codeql-for-visual-studio-code/analyzing-your-projects.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 1684a5988c7..148aa1e533b 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 @@ -171,7 +171,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**. -Additionally, you can filter the Query History view by language. For more information, see ":ref:`Filtering databases and queries by language `." +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**). From e95bfc816e8c257163d676a1672d61825ef9af35 Mon Sep 17 00:00:00 2001 From: Sam Browning <106113886+sabrowning1@users.noreply.github.com> Date: Mon, 13 Nov 2023 17:15:41 -0500 Subject: [PATCH 041/202] Clarify that queries run against selected database --- .../analyzing-your-projects.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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 148aa1e533b..23ee60c5bbb 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 @@ -77,7 +77,7 @@ The `CodeQL repository `__ on GitHub contains You can access any existing queries in your workspace through the queries panel. #. In the sidebar, to expand the queries panel, click the **Queries** title bar. -#. Hover over the desired query, then click the **Run local query** icon. +#. 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 @@ -93,12 +93,12 @@ For more information, see ":doc:`Troubleshooting CodeQL for Visual Studio Code < Running multiple queries -------------------------- -Using a couple different methods, you can quickly run multiple queries against your code. +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 a directory of queries using the query selector. +You can easily run a directory of queries 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. From fa569dcef403167d325d6b18ec2988cd20da4e88 Mon Sep 17 00:00:00 2001 From: Sam Browning <106113886+sabrowning1@users.noreply.github.com> Date: Mon, 13 Nov 2023 17:28:14 -0500 Subject: [PATCH 042/202] Delete requirements.txt --- requirements.txt | 1 - 1 file changed, 1 deletion(-) delete mode 100644 requirements.txt diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index 01e0ca6b827..00000000000 --- a/requirements.txt +++ /dev/null @@ -1 +0,0 @@ -sphinx == 1.8.5 \ No newline at end of file From ed349f7d6b424546b0bb1cf24c3f14ba72bedb01 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Mon, 13 Nov 2023 23:26:16 +0000 Subject: [PATCH 043/202] Improve value flow through arrays --- go/ql/lib/semmle/go/dataflow/internal/ContainerFlow.qll | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go/ql/lib/semmle/go/dataflow/internal/ContainerFlow.qll b/go/ql/lib/semmle/go/dataflow/internal/ContainerFlow.qll index ae352ec71bd..3a0bc45b16e 100644 --- a/go/ql/lib/semmle/go/dataflow/internal/ContainerFlow.qll +++ b/go/ql/lib/semmle/go/dataflow/internal/ContainerFlow.qll @@ -21,7 +21,7 @@ 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() ) From 28160e418c76a0f209e1bc55eb0348eecb23bf61 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Mon, 13 Nov 2023 23:26:30 +0000 Subject: [PATCH 044/202] Update tests --- .../library-tests/semmle/go/dataflow/ArrayConversion/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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..7cb366a50db 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 @@ -21,5 +21,5 @@ func main() { // 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" } From c8779d0d0bd85a8891ab0a4ab63fb674b27502e6 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Mon, 13 Nov 2023 23:56:25 +0000 Subject: [PATCH 045/202] Fix another test No change in alerts, just 3 extra nodes. --- .../semmle/go/frameworks/Beego/ReflectedXss.expected | 7 +++++++ 1 file changed, 7 insertions(+) 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 | From 45faed057c09a9e25512016aecd94edb9329e221 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Tue, 14 Nov 2023 11:25:16 +0000 Subject: [PATCH 046/202] Improve SliceExpr documentation --- go/ql/lib/semmle/go/Expr.qll | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) 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. */ From c950e26b3ee102ed69d85aef5412f102d9f58b32 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Wed, 8 Nov 2023 15:53:10 +0000 Subject: [PATCH 047/202] C++: Rewrite 'cpp/cpp/tainted-arithmetic' away from DefaultTaintTracking. --- .../Security/CWE/CWE-190/ArithmeticTainted.ql | 107 ++++++++++++++---- .../CWE-190/SAMATE/ArithmeticTainted.expected | 9 +- .../semmle/tainted/ArithmeticTainted.expected | 91 ++++++--------- 3 files changed, 120 insertions(+), 87 deletions(-) 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/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/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 | From 475d8da3426e53aad94588bc997b99c75298aec8 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Tue, 14 Nov 2023 13:07:06 +0100 Subject: [PATCH 048/202] Ruby: Include more nodes in `{Hash,Array}LiteralCfgNode` --- .../lib/codeql/ruby/controlflow/CfgNodes.qll | 10 +++---- .../dataflow/hash-flow/hash-flow.expected | 28 +++++++++---------- 2 files changed, 18 insertions(+), 20 deletions(-) diff --git a/ruby/ql/lib/codeql/ruby/controlflow/CfgNodes.qll b/ruby/ql/lib/codeql/ruby/controlflow/CfgNodes.qll index 92619aa6e29..01f0f1726d3 100644 --- a/ruby/ql/lib/codeql/ruby/controlflow/CfgNodes.qll +++ b/ruby/ql/lib/codeql/ruby/controlflow/CfgNodes.qll @@ -960,8 +960,7 @@ module ExprNodes { exists(ConstantReadAccess array | array = this.getReceiver().getExpr() and e.(MethodCall).getMethodName() = "[]" and - array.getName() = "Array" and - array.hasGlobalScope() + array.getModule().getQualifiedName() = "Array" ) } } @@ -975,11 +974,10 @@ module ExprNodes { override string getAPrimaryQlClass() { result = "HashLiteralCfgNode" } HashLiteralCfgNode() { - exists(ConstantReadAccess array | - array = this.getReceiver().getExpr() and + exists(ConstantReadAccess hash | + hash = this.getReceiver().getExpr() and e.(MethodCall).getMethodName() = "[]" and - array.getName() = "Hash" and - array.hasGlobalScope() + hash.getModule().getQualifiedName() = "Hash" ) } diff --git a/ruby/ql/test/library-tests/dataflow/hash-flow/hash-flow.expected b/ruby/ql/test/library-tests/dataflow/hash-flow/hash-flow.expected index 83b756bfccf..79f2565a590 100644 --- a/ruby/ql/test/library-tests/dataflow/hash-flow/hash-flow.expected +++ b/ruby/ql/test/library-tests/dataflow/hash-flow/hash-flow.expected @@ -42,10 +42,10 @@ edges | hash_flow.rb:44:10:44:13 | hash [element 0] | hash_flow.rb:44:10:44:16 | ...[...] | | hash_flow.rb:46:10:46:13 | hash [element :a] | hash_flow.rb:46:10:46:17 | ...[...] | | hash_flow.rb:48:10:48:13 | hash [element a] | hash_flow.rb:48:10:48:18 | ...[...] | -| hash_flow.rb:55:5:55:9 | hash1 [hash-splat position :a] | hash_flow.rb:56:10:56:14 | hash1 [hash-splat position :a] | -| hash_flow.rb:55:13:55:37 | ...[...] [hash-splat position :a] | hash_flow.rb:55:5:55:9 | hash1 [hash-splat position :a] | -| hash_flow.rb:55:21:55:30 | call to taint | hash_flow.rb:55:13:55:37 | ...[...] [hash-splat position :a] | -| hash_flow.rb:56:10:56:14 | hash1 [hash-splat position :a] | hash_flow.rb:56:10:56:18 | ...[...] | +| hash_flow.rb:55:5:55:9 | hash1 [element :a] | hash_flow.rb:56:10:56:14 | hash1 [element :a] | +| hash_flow.rb:55:13:55:37 | ...[...] [element :a] | hash_flow.rb:55:5:55:9 | hash1 [element :a] | +| hash_flow.rb:55:21:55:30 | call to taint | hash_flow.rb:55:13:55:37 | ...[...] [element :a] | +| hash_flow.rb:56:10:56:14 | hash1 [element :a] | hash_flow.rb:56:10:56:18 | ...[...] | | hash_flow.rb:59:5:59:5 | x [element :a] | hash_flow.rb:60:18:60:18 | x [element :a] | | hash_flow.rb:59:13:59:22 | call to taint | hash_flow.rb:59:5:59:5 | x [element :a] | | hash_flow.rb:60:5:60:9 | hash2 [element :a] | hash_flow.rb:61:10:61:14 | hash2 [element :a] | @@ -62,10 +62,10 @@ edges | hash_flow.rb:68:13:68:39 | ...[...] [element :a] | hash_flow.rb:68:5:68:9 | hash4 [element :a] | | hash_flow.rb:68:22:68:31 | call to taint | hash_flow.rb:68:13:68:39 | ...[...] [element :a] | | hash_flow.rb:69:10:69:14 | hash4 [element :a] | hash_flow.rb:69:10:69:18 | ...[...] | -| hash_flow.rb:72:5:72:9 | hash5 [hash-splat position a] | hash_flow.rb:73:10:73:14 | hash5 [hash-splat position a] | -| hash_flow.rb:72:13:72:45 | ...[...] [hash-splat position a] | hash_flow.rb:72:5:72:9 | hash5 [hash-splat position a] | -| hash_flow.rb:72:25:72:34 | call to taint | hash_flow.rb:72:13:72:45 | ...[...] [hash-splat position a] | -| hash_flow.rb:73:10:73:14 | hash5 [hash-splat position a] | hash_flow.rb:73:10:73:19 | ...[...] | +| hash_flow.rb:72:5:72:9 | hash5 [element a] | hash_flow.rb:73:10:73:14 | hash5 [element a] | +| hash_flow.rb:72:13:72:45 | ...[...] [element a] | hash_flow.rb:72:5:72:9 | hash5 [element a] | +| hash_flow.rb:72:25:72:34 | call to taint | hash_flow.rb:72:13:72:45 | ...[...] [element a] | +| hash_flow.rb:73:10:73:14 | hash5 [element a] | hash_flow.rb:73:10:73:19 | ...[...] | | hash_flow.rb:76:5:76:9 | hash6 [element a] | hash_flow.rb:77:10:77:14 | hash6 [element a] | | hash_flow.rb:76:13:76:47 | ...[...] [element a] | hash_flow.rb:76:5:76:9 | hash6 [element a] | | hash_flow.rb:76:26:76:35 | call to taint | hash_flow.rb:76:13:76:47 | ...[...] [element a] | @@ -1015,10 +1015,10 @@ nodes | hash_flow.rb:46:10:46:17 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:48:10:48:13 | hash [element a] | semmle.label | hash [element a] | | hash_flow.rb:48:10:48:18 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:55:5:55:9 | hash1 [hash-splat position :a] | semmle.label | hash1 [hash-splat position :a] | -| hash_flow.rb:55:13:55:37 | ...[...] [hash-splat position :a] | semmle.label | ...[...] [hash-splat position :a] | +| hash_flow.rb:55:5:55:9 | hash1 [element :a] | semmle.label | hash1 [element :a] | +| hash_flow.rb:55:13:55:37 | ...[...] [element :a] | semmle.label | ...[...] [element :a] | | hash_flow.rb:55:21:55:30 | call to taint | semmle.label | call to taint | -| hash_flow.rb:56:10:56:14 | hash1 [hash-splat position :a] | semmle.label | hash1 [hash-splat position :a] | +| hash_flow.rb:56:10:56:14 | hash1 [element :a] | semmle.label | hash1 [element :a] | | hash_flow.rb:56:10:56:18 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:59:5:59:5 | x [element :a] | semmle.label | x [element :a] | | hash_flow.rb:59:13:59:22 | call to taint | semmle.label | call to taint | @@ -1039,10 +1039,10 @@ nodes | hash_flow.rb:68:22:68:31 | call to taint | semmle.label | call to taint | | hash_flow.rb:69:10:69:14 | hash4 [element :a] | semmle.label | hash4 [element :a] | | hash_flow.rb:69:10:69:18 | ...[...] | semmle.label | ...[...] | -| hash_flow.rb:72:5:72:9 | hash5 [hash-splat position a] | semmle.label | hash5 [hash-splat position a] | -| hash_flow.rb:72:13:72:45 | ...[...] [hash-splat position a] | semmle.label | ...[...] [hash-splat position a] | +| hash_flow.rb:72:5:72:9 | hash5 [element a] | semmle.label | hash5 [element a] | +| hash_flow.rb:72:13:72:45 | ...[...] [element a] | semmle.label | ...[...] [element a] | | hash_flow.rb:72:25:72:34 | call to taint | semmle.label | call to taint | -| hash_flow.rb:73:10:73:14 | hash5 [hash-splat position a] | semmle.label | hash5 [hash-splat position a] | +| hash_flow.rb:73:10:73:14 | hash5 [element a] | semmle.label | hash5 [element a] | | hash_flow.rb:73:10:73:19 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:76:5:76:9 | hash6 [element a] | semmle.label | hash6 [element a] | | hash_flow.rb:76:13:76:47 | ...[...] [element a] | semmle.label | ...[...] [element a] | From 15099b3db0d008c90fc02a2e69cfb491b4e9657e Mon Sep 17 00:00:00 2001 From: Sam Browning <106113886+sabrowning1@users.noreply.github.com> Date: Tue, 14 Nov 2023 08:57:52 -0500 Subject: [PATCH 049/202] Update docs/codeql/codeql-for-visual-studio-code/analyzing-your-projects.rst Co-authored-by: Ben Ahmady <32935794+subatoi@users.noreply.github.com> --- .../codeql-for-visual-studio-code/analyzing-your-projects.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 23ee60c5bbb..bcfc52fedff 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 @@ -56,7 +56,7 @@ Optionally, to see databases containing a specific language and queries written :width: 350 :alt: Screenshot of the language selector. The "Select" button for a language filter is outlined in dark orange. -Creating a query +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. From b1dc6099ffade5f457dfef0e141d27ee338a1945 Mon Sep 17 00:00:00 2001 From: Sam Browning <106113886+sabrowning1@users.noreply.github.com> Date: Tue, 14 Nov 2023 09:01:54 -0500 Subject: [PATCH 050/202] Apply feedback from code review --- .../codeql-for-visual-studio-code/analyzing-your-projects.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 bcfc52fedff..5dd1bb11b61 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 @@ -98,7 +98,7 @@ You can quickly run multiple queries against the database you've selected using Running all queries in a directory ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -You can easily run a directory of queries using the queries panel. +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. From 4385b316c0f1a16a0ce32c4431ddb05c1f39ce85 Mon Sep 17 00:00:00 2001 From: Sam Browning <106113886+sabrowning1@users.noreply.github.com> Date: Tue, 14 Nov 2023 09:10:07 -0500 Subject: [PATCH 051/202] Apply feedback from code review --- .../codeql-for-visual-studio-code/analyzing-your-projects.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 5dd1bb11b61..97cc24a601f 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 @@ -67,7 +67,7 @@ You can generate a query template for a specific language from the queries panel :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. Selecting a language will autogenerate a folder labeled "codeql-custom-queries-LANGUAGE", which will contain a query template labeled "example.ql". +#. In the Command Palette, select the target language for your query. Selecting a language will autogenerate a directory labeled `codeql-custom-queries-`, where `` is the name of the selected language. That directory will contain a query template labeled `example.ql`. #. 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 From 6bd7047e415915ea6d50db3a1212e145192dda53 Mon Sep 17 00:00:00 2001 From: Remco Vermeulen Date: Tue, 14 Nov 2023 11:20:51 -0800 Subject: [PATCH 052/202] Restore XssThroughDom.ql's severity --- javascript/ql/src/Security/CWE-079/XssThroughDom.ql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/javascript/ql/src/Security/CWE-079/XssThroughDom.ql b/javascript/ql/src/Security/CWE-079/XssThroughDom.ql index c23ddf168b0..87a76d82227 100644 --- a/javascript/ql/src/Security/CWE-079/XssThroughDom.ql +++ b/javascript/ql/src/Security/CWE-079/XssThroughDom.ql @@ -4,7 +4,7 @@ * can lead to a cross-site scripting vulnerability. * @kind path-problem * @problem.severity warning - * @security-severity 7.8 + * @security-severity 6.1 * @precision high * @id js/xss-through-dom * @tags security From 83d1fc33e11b5a0fe15c4eecce9300a411fe8b33 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Tue, 14 Nov 2023 23:16:32 +0000 Subject: [PATCH 053/202] Add change note --- .../change-notes/2023-11-15-bug-fix-value-flow-in-array.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 go/ql/lib/change-notes/2023-11-15-bug-fix-value-flow-in-array.md diff --git a/go/ql/lib/change-notes/2023-11-15-bug-fix-value-flow-in-array.md b/go/ql/lib/change-notes/2023-11-15-bug-fix-value-flow-in-array.md new file mode 100644 index 00000000000..931ba2d1e89 --- /dev/null +++ b/go/ql/lib/change-notes/2023-11-15-bug-fix-value-flow-in-array.md @@ -0,0 +1,4 @@ +--- +category: fix +--- +* 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. From 721bde1ce8d5ebb29fe8bbeb513376886c8179ba Mon Sep 17 00:00:00 2001 From: Rasmus Wriedt Larsen Date: Wed, 15 Nov 2023 09:59:26 +0100 Subject: [PATCH 054/202] Python: Delete orphaned `.expected` files --- .../experimental/dataflow/regression/pointsto.expected | 1 - .../Expressions/general/ExplcitCallToDel.expected | 1 - .../ReturnOrYieldOutsideOfFunction.expected | 9 --------- 3 files changed, 11 deletions(-) delete mode 100644 python/ql/test/experimental/dataflow/regression/pointsto.expected delete mode 100644 python/ql/test/query-tests/Expressions/general/ExplcitCallToDel.expected delete mode 100644 python/ql/test/query-tests/Statements/ReturnOrYieldOutsideOfFunction/ReturnOrYieldOutsideOfFunction.expected diff --git a/python/ql/test/experimental/dataflow/regression/pointsto.expected b/python/ql/test/experimental/dataflow/regression/pointsto.expected deleted file mode 100644 index 234bdda3f7f..00000000000 --- a/python/ql/test/experimental/dataflow/regression/pointsto.expected +++ /dev/null @@ -1 +0,0 @@ -| pointsto_regressions.py:15:18:15:21 | ControlFlowNode for self | pointsto_regressions.py:19:9:19:12 | ControlFlowNode for self | diff --git a/python/ql/test/query-tests/Expressions/general/ExplcitCallToDel.expected b/python/ql/test/query-tests/Expressions/general/ExplcitCallToDel.expected deleted file mode 100644 index 909c9d8ccc8..00000000000 --- a/python/ql/test/query-tests/Expressions/general/ExplcitCallToDel.expected +++ /dev/null @@ -1 +0,0 @@ -Failure \ No newline at end of file diff --git a/python/ql/test/query-tests/Statements/ReturnOrYieldOutsideOfFunction/ReturnOrYieldOutsideOfFunction.expected b/python/ql/test/query-tests/Statements/ReturnOrYieldOutsideOfFunction/ReturnOrYieldOutsideOfFunction.expected deleted file mode 100644 index 340312c832f..00000000000 --- a/python/ql/test/query-tests/Statements/ReturnOrYieldOutsideOfFunction/ReturnOrYieldOutsideOfFunction.expected +++ /dev/null @@ -1,9 +0,0 @@ -| ReturnOrYieldOutsideOfFunction_test.py:31:9:31:23 | Return | 'return' is used outside of a function. | -| ReturnOrYieldOutsideOfFunction_test.py:36:9:36:15 | Yield | 'yield' is used outside of a function. | -| ReturnOrYieldOutsideOfFunction_test.py:41:9:41:25 | YieldFrom | 'yield from' is used outside of a function. | -| ReturnOrYieldOutsideOfFunction_test.py:45:5:45:12 | Return | 'return' is used outside of a function. | -| ReturnOrYieldOutsideOfFunction_test.py:49:5:49:11 | Yield | 'yield' is used outside of a function. | -| ReturnOrYieldOutsideOfFunction_test.py:53:5:53:16 | YieldFrom | 'yield from' is used outside of a function. | -| ReturnOrYieldOutsideOfFunction_test.py:57:1:57:14 | YieldFrom | 'yield from' is used outside of a function. | -| ReturnOrYieldOutsideOfFunction_test.py:60:1:60:12 | Return | 'return' is used outside of a function. | -| ReturnOrYieldOutsideOfFunction_test.py:63:1:63:11 | Yield | 'yield' is used outside of a function. | From 55f5b26ba6734b0010ba89fb7f88214e4c03a791 Mon Sep 17 00:00:00 2001 From: Rasmus Wriedt Larsen Date: Wed, 15 Nov 2023 10:09:54 +0100 Subject: [PATCH 055/202] Python: Accept new ordering of query predicates in `.expected` --- .../test/experimental/dataflow/basic/localFlowStepTest.expected | 2 +- .../test/experimental/dataflow/basic/maximalFlowTest.expected | 2 +- .../test/experimental/dataflow/calls/DataFlowCallTest.expected | 2 +- .../dataflow/coverage-py2/argumentRoutingTest.expected | 2 +- .../dataflow/coverage-py3/argumentRoutingTest.expected | 2 +- .../experimental/dataflow/coverage/NormalDataflowTest.expected | 2 +- .../experimental/dataflow/coverage/argumentRoutingTest.expected | 2 +- .../dataflow/exceptions/NormalDataflowTest.expected | 2 +- .../experimental/dataflow/fieldflow/NormalDataflowTest.expected | 2 +- .../experimental/dataflow/fieldflow/UnresolvedCalls.expected | 2 +- .../ql/test/experimental/dataflow/global-flow/accesses.expected | 2 +- .../experimental/dataflow/match/NormalDataflowTest.expected | 2 +- .../dataflow/model-summaries/InlineTaintTest.expected | 2 +- .../dataflow/model-summaries/NormalDataflowTest.expected | 2 +- .../dataflow/module-initialization/localFlow.expected | 2 +- .../ql/test/experimental/dataflow/path-graph/PathNodes.expected | 2 +- .../dataflow/sensitive-data/TestSensitiveDataSources.expected | 2 +- .../dataflow/summaries/NormalTaintTrackingTest.expected | 2 +- .../tainttracking/commonSanitizer/InlineTaintTest.expected | 2 +- .../tainttracking/customSanitizer/InlineTaintTest.expected | 2 +- .../defaultAdditionalTaintStep-py3/InlineTaintTest.expected | 2 +- .../defaultAdditionalTaintStep/InlineTaintTest.expected | 2 +- .../tainttracking/generator-flow/InlineTaintTest.expected | 2 +- .../tainttracking/generator-flow/NormalDataflowTest.expected | 2 +- .../tainttracking/unwanted-global-flow/InlineTaintTest.expected | 2 +- .../dataflow/typetracking-summaries/tracked.expected | 2 +- .../ql/test/experimental/dataflow/typetracking/tracked.expected | 2 +- .../experimental/dataflow/typetracking_imports/tracked.expected | 2 +- .../experimental/dataflow/variable-capture/CaptureTest.expected | 2 +- .../ql/test/experimental/import-resolution/importflow.expected | 2 +- python/ql/test/experimental/import-resolution/imports.expected | 2 +- .../CallGraph-implicit-init/InlineCallGraphTest.expected | 2 +- .../CallGraph-imports/InlineCallGraphTest.expected | 2 +- .../library-tests/CallGraph/InlineCallGraphTest.expected | 2 +- .../meta/inline-taint-test-demo/InlineTaintTest.expected | 2 +- python/ql/test/library-tests/ApiGraphs/py2/use.expected | 2 +- .../InlineExpectationsTest/missing-relevant-tag/Test.expected | 2 +- python/ql/test/library-tests/essa/ssa-compute/UseUse.expected | 2 +- .../test/library-tests/frameworks/aioch/ConceptsTest.expected | 2 +- .../test/library-tests/frameworks/aiohttp/ConceptsTest.expected | 2 +- .../library-tests/frameworks/aiohttp/InlineTaintTest.expected | 2 +- .../library-tests/frameworks/aiomysql/ConceptsTest.expected | 2 +- .../test/library-tests/frameworks/aiopg/ConceptsTest.expected | 2 +- .../library-tests/frameworks/aiosqlite/ConceptsTest.expected | 2 +- .../test/library-tests/frameworks/asyncpg/ConceptsTest.expected | 2 +- .../ql/test/library-tests/frameworks/asyncpg/MaDTest.expected | 2 +- .../frameworks/cassandra-driver/ConceptsTest.expected | 2 +- .../frameworks/clickhouse_driver/ConceptsTest.expected | 2 +- .../test/library-tests/frameworks/crypto/ConceptsTest.expected | 2 +- .../library-tests/frameworks/cryptodome/ConceptsTest.expected | 2 +- .../library-tests/frameworks/cryptography/ConceptsTest.expected | 2 +- .../library-tests/frameworks/cx_Oracle/ConceptsTest.expected | 2 +- .../ql/test/library-tests/frameworks/dill/ConceptsTest.expected | 2 +- .../frameworks/django-orm/NormalDataflowTest.expected | 2 +- .../library-tests/frameworks/django-v1/ConceptsTest.expected | 2 +- .../library-tests/frameworks/django-v2-v3/ConceptsTest.expected | 2 +- .../frameworks/django-v2-v3/InlineTaintTest.expected | 2 +- .../test/library-tests/frameworks/django/ConceptsTest.expected | 2 +- .../test/library-tests/frameworks/fabric/ConceptsTest.expected | 2 +- .../library-tests/frameworks/fabric/InlineTaintTest.expected | 2 +- .../test/library-tests/frameworks/fastapi/ConceptsTest.expected | 2 +- .../library-tests/frameworks/fastapi/InlineTaintTest.expected | 2 +- .../test/library-tests/frameworks/flask/ConceptsTest.expected | 2 +- .../library-tests/frameworks/flask/InlineTaintTest.expected | 2 +- .../library-tests/frameworks/flask_admin/ConceptsTest.expected | 2 +- .../frameworks/flask_admin/InlineTaintTest.expected | 2 +- .../frameworks/flask_sqlalchemy/ConceptsTest.expected | 2 +- .../frameworks/flask_sqlalchemy/InlineTaintTest.expected | 2 +- .../test/library-tests/frameworks/httpx/ConceptsTest.expected | 2 +- .../ql/test/library-tests/frameworks/idna/ConceptsTest.expected | 2 +- .../test/library-tests/frameworks/idna/InlineTaintTest.expected | 2 +- .../internal-ql-helpers/PoorMansFunctionResolutionTest.expected | 2 +- .../test/library-tests/frameworks/invoke/ConceptsTest.expected | 2 +- .../library-tests/frameworks/jmespath/ConceptsTest.expected | 2 +- .../library-tests/frameworks/jmespath/InlineTaintTest.expected | 2 +- .../test/library-tests/frameworks/joblib/ConceptsTest.expected | 2 +- .../library-tests/frameworks/libtaxii/ConceptsTest.expected | 2 +- .../ql/test/library-tests/frameworks/lxml/ConceptsTest.expected | 2 +- .../library-tests/frameworks/markupsafe/ConceptsTest.expected | 2 +- .../frameworks/markupsafe/InlineTaintTest.expected | 2 +- .../library-tests/frameworks/multidict/ConceptsTest.expected | 2 +- .../library-tests/frameworks/multidict/InlineTaintTest.expected | 2 +- .../frameworks/mysql-connector-python/ConceptsTest.expected | 2 +- .../test/library-tests/frameworks/mysqldb/ConceptsTest.expected | 2 +- .../test/library-tests/frameworks/numpy/ConceptsTest.expected | 2 +- .../library-tests/frameworks/oracledb/ConceptsTest.expected | 2 +- .../test/library-tests/frameworks/pandas/ConceptsTest.expected | 2 +- .../test/library-tests/frameworks/peewee/ConceptsTest.expected | 2 +- .../library-tests/frameworks/peewee/InlineTaintTest.expected | 2 +- .../library-tests/frameworks/phoenixdb/ConceptsTest.expected | 2 +- .../test/library-tests/frameworks/pycurl/ConceptsTest.expected | 2 +- .../test/library-tests/frameworks/pymssql/ConceptsTest.expected | 2 +- .../test/library-tests/frameworks/pymysql/ConceptsTest.expected | 2 +- .../test/library-tests/frameworks/pyodbc/ConceptsTest.expected | 2 +- .../library-tests/frameworks/requests/ConceptsTest.expected | 2 +- .../library-tests/frameworks/requests/InlineTaintTest.expected | 2 +- .../frameworks/rest_framework/InlineTaintTest.expected | 2 +- .../ql/test/library-tests/frameworks/rsa/ConceptsTest.expected | 2 +- .../test/library-tests/frameworks/rsa/InlineTaintTest.expected | 2 +- .../library-tests/frameworks/ruamel.yaml/ConceptsTest.expected | 2 +- .../frameworks/serverless/InlineTaintTest.expected | 2 +- .../library-tests/frameworks/simplejson/ConceptsTest.expected | 2 +- .../frameworks/simplejson/InlineTaintTest.expected | 2 +- .../library-tests/frameworks/sqlalchemy/ConceptsTest.expected | 2 +- .../frameworks/sqlalchemy/InlineTaintTest.expected | 2 +- .../library-tests/frameworks/stdlib-py2/ConceptsTest.expected | 2 +- .../library-tests/frameworks/stdlib-py3/ConceptsTest.expected | 2 +- .../test/library-tests/frameworks/stdlib/ConceptsTest.expected | 2 +- .../library-tests/frameworks/stdlib/InlineTaintTest.expected | 2 +- .../ql/test/library-tests/frameworks/toml/ConceptsTest.expected | 2 +- .../test/library-tests/frameworks/tornado/ConceptsTest.expected | 2 +- .../library-tests/frameworks/tornado/InlineTaintTest.expected | 2 +- .../test/library-tests/frameworks/twisted/ConceptsTest.expected | 2 +- .../library-tests/frameworks/twisted/InlineTaintTest.expected | 2 +- .../test/library-tests/frameworks/ujson/ConceptsTest.expected | 2 +- .../library-tests/frameworks/ujson/InlineTaintTest.expected | 2 +- .../test/library-tests/frameworks/urllib3/ConceptsTest.expected | 2 +- .../library-tests/frameworks/xmltodict/ConceptsTest.expected | 2 +- .../ql/test/library-tests/frameworks/yaml/ConceptsTest.expected | 2 +- .../ql/test/library-tests/frameworks/yarl/ConceptsTest.expected | 2 +- .../test/library-tests/frameworks/yarl/InlineTaintTest.expected | 2 +- python/ql/test/library-tests/regex/SubstructureTests.expected | 2 +- .../Functions/ModificationOfParameterWithDefault/test.expected | 2 +- .../Security/CWE-022-PathInjection/DataflowQueryTest.expected | 2 +- .../CWE-078-CommandInjection/DataflowQueryTest.expected | 2 +- .../DataflowQueryTest.expected | 2 +- .../Security/CWE-209-StackTraceExposure/ExceptionInfo.expected | 2 +- .../Security/CWE-943-NoSqlInjection/DataflowQueryTest.expected | 2 +- 128 files changed, 128 insertions(+), 128 deletions(-) diff --git a/python/ql/test/experimental/dataflow/basic/localFlowStepTest.expected b/python/ql/test/experimental/dataflow/basic/localFlowStepTest.expected index 48de9172b36..8ec8033d086 100644 --- a/python/ql/test/experimental/dataflow/basic/localFlowStepTest.expected +++ b/python/ql/test/experimental/dataflow/basic/localFlowStepTest.expected @@ -1,2 +1,2 @@ -failures testFailures +failures diff --git a/python/ql/test/experimental/dataflow/basic/maximalFlowTest.expected b/python/ql/test/experimental/dataflow/basic/maximalFlowTest.expected index 48de9172b36..8ec8033d086 100644 --- a/python/ql/test/experimental/dataflow/basic/maximalFlowTest.expected +++ b/python/ql/test/experimental/dataflow/basic/maximalFlowTest.expected @@ -1,2 +1,2 @@ -failures testFailures +failures diff --git a/python/ql/test/experimental/dataflow/calls/DataFlowCallTest.expected b/python/ql/test/experimental/dataflow/calls/DataFlowCallTest.expected index 48de9172b36..8ec8033d086 100644 --- a/python/ql/test/experimental/dataflow/calls/DataFlowCallTest.expected +++ b/python/ql/test/experimental/dataflow/calls/DataFlowCallTest.expected @@ -1,2 +1,2 @@ -failures testFailures +failures diff --git a/python/ql/test/experimental/dataflow/coverage-py2/argumentRoutingTest.expected b/python/ql/test/experimental/dataflow/coverage-py2/argumentRoutingTest.expected index 48de9172b36..8ec8033d086 100644 --- a/python/ql/test/experimental/dataflow/coverage-py2/argumentRoutingTest.expected +++ b/python/ql/test/experimental/dataflow/coverage-py2/argumentRoutingTest.expected @@ -1,2 +1,2 @@ -failures testFailures +failures diff --git a/python/ql/test/experimental/dataflow/coverage-py3/argumentRoutingTest.expected b/python/ql/test/experimental/dataflow/coverage-py3/argumentRoutingTest.expected index 48de9172b36..8ec8033d086 100644 --- a/python/ql/test/experimental/dataflow/coverage-py3/argumentRoutingTest.expected +++ b/python/ql/test/experimental/dataflow/coverage-py3/argumentRoutingTest.expected @@ -1,2 +1,2 @@ -failures testFailures +failures diff --git a/python/ql/test/experimental/dataflow/coverage/NormalDataflowTest.expected b/python/ql/test/experimental/dataflow/coverage/NormalDataflowTest.expected index 04431311999..9ce23b4c553 100644 --- a/python/ql/test/experimental/dataflow/coverage/NormalDataflowTest.expected +++ b/python/ql/test/experimental/dataflow/coverage/NormalDataflowTest.expected @@ -1,3 +1,3 @@ missingAnnotationOnSink -failures testFailures +failures diff --git a/python/ql/test/experimental/dataflow/coverage/argumentRoutingTest.expected b/python/ql/test/experimental/dataflow/coverage/argumentRoutingTest.expected index 48de9172b36..8ec8033d086 100644 --- a/python/ql/test/experimental/dataflow/coverage/argumentRoutingTest.expected +++ b/python/ql/test/experimental/dataflow/coverage/argumentRoutingTest.expected @@ -1,2 +1,2 @@ -failures testFailures +failures diff --git a/python/ql/test/experimental/dataflow/exceptions/NormalDataflowTest.expected b/python/ql/test/experimental/dataflow/exceptions/NormalDataflowTest.expected index 04431311999..9ce23b4c553 100644 --- a/python/ql/test/experimental/dataflow/exceptions/NormalDataflowTest.expected +++ b/python/ql/test/experimental/dataflow/exceptions/NormalDataflowTest.expected @@ -1,3 +1,3 @@ missingAnnotationOnSink -failures testFailures +failures diff --git a/python/ql/test/experimental/dataflow/fieldflow/NormalDataflowTest.expected b/python/ql/test/experimental/dataflow/fieldflow/NormalDataflowTest.expected index 04431311999..9ce23b4c553 100644 --- a/python/ql/test/experimental/dataflow/fieldflow/NormalDataflowTest.expected +++ b/python/ql/test/experimental/dataflow/fieldflow/NormalDataflowTest.expected @@ -1,3 +1,3 @@ missingAnnotationOnSink -failures testFailures +failures diff --git a/python/ql/test/experimental/dataflow/fieldflow/UnresolvedCalls.expected b/python/ql/test/experimental/dataflow/fieldflow/UnresolvedCalls.expected index 48de9172b36..8ec8033d086 100644 --- a/python/ql/test/experimental/dataflow/fieldflow/UnresolvedCalls.expected +++ b/python/ql/test/experimental/dataflow/fieldflow/UnresolvedCalls.expected @@ -1,2 +1,2 @@ -failures testFailures +failures diff --git a/python/ql/test/experimental/dataflow/global-flow/accesses.expected b/python/ql/test/experimental/dataflow/global-flow/accesses.expected index 48de9172b36..8ec8033d086 100644 --- a/python/ql/test/experimental/dataflow/global-flow/accesses.expected +++ b/python/ql/test/experimental/dataflow/global-flow/accesses.expected @@ -1,2 +1,2 @@ -failures testFailures +failures diff --git a/python/ql/test/experimental/dataflow/match/NormalDataflowTest.expected b/python/ql/test/experimental/dataflow/match/NormalDataflowTest.expected index 04431311999..9ce23b4c553 100644 --- a/python/ql/test/experimental/dataflow/match/NormalDataflowTest.expected +++ b/python/ql/test/experimental/dataflow/match/NormalDataflowTest.expected @@ -1,3 +1,3 @@ missingAnnotationOnSink -failures testFailures +failures diff --git a/python/ql/test/experimental/dataflow/model-summaries/InlineTaintTest.expected b/python/ql/test/experimental/dataflow/model-summaries/InlineTaintTest.expected index 4a72c551661..366de37b867 100644 --- a/python/ql/test/experimental/dataflow/model-summaries/InlineTaintTest.expected +++ b/python/ql/test/experimental/dataflow/model-summaries/InlineTaintTest.expected @@ -1,4 +1,4 @@ -failures argumentToEnsureNotTaintedNotMarkedAsSpurious untaintedArgumentToEnsureTaintedNotMarkedAsMissing testFailures +failures diff --git a/python/ql/test/experimental/dataflow/model-summaries/NormalDataflowTest.expected b/python/ql/test/experimental/dataflow/model-summaries/NormalDataflowTest.expected index 04431311999..9ce23b4c553 100644 --- a/python/ql/test/experimental/dataflow/model-summaries/NormalDataflowTest.expected +++ b/python/ql/test/experimental/dataflow/model-summaries/NormalDataflowTest.expected @@ -1,3 +1,3 @@ missingAnnotationOnSink -failures testFailures +failures diff --git a/python/ql/test/experimental/dataflow/module-initialization/localFlow.expected b/python/ql/test/experimental/dataflow/module-initialization/localFlow.expected index 48de9172b36..8ec8033d086 100644 --- a/python/ql/test/experimental/dataflow/module-initialization/localFlow.expected +++ b/python/ql/test/experimental/dataflow/module-initialization/localFlow.expected @@ -1,2 +1,2 @@ -failures testFailures +failures diff --git a/python/ql/test/experimental/dataflow/path-graph/PathNodes.expected b/python/ql/test/experimental/dataflow/path-graph/PathNodes.expected index 48de9172b36..8ec8033d086 100644 --- a/python/ql/test/experimental/dataflow/path-graph/PathNodes.expected +++ b/python/ql/test/experimental/dataflow/path-graph/PathNodes.expected @@ -1,2 +1,2 @@ -failures testFailures +failures diff --git a/python/ql/test/experimental/dataflow/sensitive-data/TestSensitiveDataSources.expected b/python/ql/test/experimental/dataflow/sensitive-data/TestSensitiveDataSources.expected index 48de9172b36..8ec8033d086 100644 --- a/python/ql/test/experimental/dataflow/sensitive-data/TestSensitiveDataSources.expected +++ b/python/ql/test/experimental/dataflow/sensitive-data/TestSensitiveDataSources.expected @@ -1,2 +1,2 @@ -failures testFailures +failures diff --git a/python/ql/test/experimental/dataflow/summaries/NormalTaintTrackingTest.expected b/python/ql/test/experimental/dataflow/summaries/NormalTaintTrackingTest.expected index 04431311999..9ce23b4c553 100644 --- a/python/ql/test/experimental/dataflow/summaries/NormalTaintTrackingTest.expected +++ b/python/ql/test/experimental/dataflow/summaries/NormalTaintTrackingTest.expected @@ -1,3 +1,3 @@ missingAnnotationOnSink -failures testFailures +failures diff --git a/python/ql/test/experimental/dataflow/tainttracking/commonSanitizer/InlineTaintTest.expected b/python/ql/test/experimental/dataflow/tainttracking/commonSanitizer/InlineTaintTest.expected index 4a72c551661..366de37b867 100644 --- a/python/ql/test/experimental/dataflow/tainttracking/commonSanitizer/InlineTaintTest.expected +++ b/python/ql/test/experimental/dataflow/tainttracking/commonSanitizer/InlineTaintTest.expected @@ -1,4 +1,4 @@ -failures argumentToEnsureNotTaintedNotMarkedAsSpurious untaintedArgumentToEnsureTaintedNotMarkedAsMissing testFailures +failures diff --git a/python/ql/test/experimental/dataflow/tainttracking/customSanitizer/InlineTaintTest.expected b/python/ql/test/experimental/dataflow/tainttracking/customSanitizer/InlineTaintTest.expected index 6e4a1c072bc..5a7d215048d 100644 --- a/python/ql/test/experimental/dataflow/tainttracking/customSanitizer/InlineTaintTest.expected +++ b/python/ql/test/experimental/dataflow/tainttracking/customSanitizer/InlineTaintTest.expected @@ -1,7 +1,7 @@ -failures argumentToEnsureNotTaintedNotMarkedAsSpurious untaintedArgumentToEnsureTaintedNotMarkedAsMissing testFailures +failures isSanitizer | test.py:21:39:21:39 | ControlFlowNode for s | | test.py:34:39:34:39 | ControlFlowNode for s | diff --git a/python/ql/test/experimental/dataflow/tainttracking/defaultAdditionalTaintStep-py3/InlineTaintTest.expected b/python/ql/test/experimental/dataflow/tainttracking/defaultAdditionalTaintStep-py3/InlineTaintTest.expected index 4a72c551661..366de37b867 100644 --- a/python/ql/test/experimental/dataflow/tainttracking/defaultAdditionalTaintStep-py3/InlineTaintTest.expected +++ b/python/ql/test/experimental/dataflow/tainttracking/defaultAdditionalTaintStep-py3/InlineTaintTest.expected @@ -1,4 +1,4 @@ -failures argumentToEnsureNotTaintedNotMarkedAsSpurious untaintedArgumentToEnsureTaintedNotMarkedAsMissing testFailures +failures diff --git a/python/ql/test/experimental/dataflow/tainttracking/defaultAdditionalTaintStep/InlineTaintTest.expected b/python/ql/test/experimental/dataflow/tainttracking/defaultAdditionalTaintStep/InlineTaintTest.expected index 4a72c551661..366de37b867 100644 --- a/python/ql/test/experimental/dataflow/tainttracking/defaultAdditionalTaintStep/InlineTaintTest.expected +++ b/python/ql/test/experimental/dataflow/tainttracking/defaultAdditionalTaintStep/InlineTaintTest.expected @@ -1,4 +1,4 @@ -failures argumentToEnsureNotTaintedNotMarkedAsSpurious untaintedArgumentToEnsureTaintedNotMarkedAsMissing testFailures +failures diff --git a/python/ql/test/experimental/dataflow/tainttracking/generator-flow/InlineTaintTest.expected b/python/ql/test/experimental/dataflow/tainttracking/generator-flow/InlineTaintTest.expected index 4a72c551661..366de37b867 100644 --- a/python/ql/test/experimental/dataflow/tainttracking/generator-flow/InlineTaintTest.expected +++ b/python/ql/test/experimental/dataflow/tainttracking/generator-flow/InlineTaintTest.expected @@ -1,4 +1,4 @@ -failures argumentToEnsureNotTaintedNotMarkedAsSpurious untaintedArgumentToEnsureTaintedNotMarkedAsMissing testFailures +failures diff --git a/python/ql/test/experimental/dataflow/tainttracking/generator-flow/NormalDataflowTest.expected b/python/ql/test/experimental/dataflow/tainttracking/generator-flow/NormalDataflowTest.expected index 04431311999..9ce23b4c553 100644 --- a/python/ql/test/experimental/dataflow/tainttracking/generator-flow/NormalDataflowTest.expected +++ b/python/ql/test/experimental/dataflow/tainttracking/generator-flow/NormalDataflowTest.expected @@ -1,3 +1,3 @@ missingAnnotationOnSink -failures testFailures +failures diff --git a/python/ql/test/experimental/dataflow/tainttracking/unwanted-global-flow/InlineTaintTest.expected b/python/ql/test/experimental/dataflow/tainttracking/unwanted-global-flow/InlineTaintTest.expected index 4a72c551661..366de37b867 100644 --- a/python/ql/test/experimental/dataflow/tainttracking/unwanted-global-flow/InlineTaintTest.expected +++ b/python/ql/test/experimental/dataflow/tainttracking/unwanted-global-flow/InlineTaintTest.expected @@ -1,4 +1,4 @@ -failures argumentToEnsureNotTaintedNotMarkedAsSpurious untaintedArgumentToEnsureTaintedNotMarkedAsMissing testFailures +failures diff --git a/python/ql/test/experimental/dataflow/typetracking-summaries/tracked.expected b/python/ql/test/experimental/dataflow/typetracking-summaries/tracked.expected index 48de9172b36..8ec8033d086 100644 --- a/python/ql/test/experimental/dataflow/typetracking-summaries/tracked.expected +++ b/python/ql/test/experimental/dataflow/typetracking-summaries/tracked.expected @@ -1,2 +1,2 @@ -failures testFailures +failures diff --git a/python/ql/test/experimental/dataflow/typetracking/tracked.expected b/python/ql/test/experimental/dataflow/typetracking/tracked.expected index 48de9172b36..8ec8033d086 100644 --- a/python/ql/test/experimental/dataflow/typetracking/tracked.expected +++ b/python/ql/test/experimental/dataflow/typetracking/tracked.expected @@ -1,2 +1,2 @@ -failures testFailures +failures diff --git a/python/ql/test/experimental/dataflow/typetracking_imports/tracked.expected b/python/ql/test/experimental/dataflow/typetracking_imports/tracked.expected index 48de9172b36..8ec8033d086 100644 --- a/python/ql/test/experimental/dataflow/typetracking_imports/tracked.expected +++ b/python/ql/test/experimental/dataflow/typetracking_imports/tracked.expected @@ -1,2 +1,2 @@ -failures testFailures +failures diff --git a/python/ql/test/experimental/dataflow/variable-capture/CaptureTest.expected b/python/ql/test/experimental/dataflow/variable-capture/CaptureTest.expected index 48de9172b36..8ec8033d086 100644 --- a/python/ql/test/experimental/dataflow/variable-capture/CaptureTest.expected +++ b/python/ql/test/experimental/dataflow/variable-capture/CaptureTest.expected @@ -1,2 +1,2 @@ -failures testFailures +failures diff --git a/python/ql/test/experimental/import-resolution/importflow.expected b/python/ql/test/experimental/import-resolution/importflow.expected index 48de9172b36..8ec8033d086 100644 --- a/python/ql/test/experimental/import-resolution/importflow.expected +++ b/python/ql/test/experimental/import-resolution/importflow.expected @@ -1,2 +1,2 @@ -failures testFailures +failures diff --git a/python/ql/test/experimental/import-resolution/imports.expected b/python/ql/test/experimental/import-resolution/imports.expected index 48de9172b36..8ec8033d086 100644 --- a/python/ql/test/experimental/import-resolution/imports.expected +++ b/python/ql/test/experimental/import-resolution/imports.expected @@ -1,2 +1,2 @@ -failures testFailures +failures diff --git a/python/ql/test/experimental/library-tests/CallGraph-implicit-init/InlineCallGraphTest.expected b/python/ql/test/experimental/library-tests/CallGraph-implicit-init/InlineCallGraphTest.expected index de783b3bdcb..802b8ff5d13 100644 --- a/python/ql/test/experimental/library-tests/CallGraph-implicit-init/InlineCallGraphTest.expected +++ b/python/ql/test/experimental/library-tests/CallGraph-implicit-init/InlineCallGraphTest.expected @@ -1,5 +1,5 @@ -failures testFailures +failures debug_callableNotUnique pointsTo_found_typeTracker_notFound typeTracker_found_pointsTo_notFound diff --git a/python/ql/test/experimental/library-tests/CallGraph-imports/InlineCallGraphTest.expected b/python/ql/test/experimental/library-tests/CallGraph-imports/InlineCallGraphTest.expected index de783b3bdcb..802b8ff5d13 100644 --- a/python/ql/test/experimental/library-tests/CallGraph-imports/InlineCallGraphTest.expected +++ b/python/ql/test/experimental/library-tests/CallGraph-imports/InlineCallGraphTest.expected @@ -1,5 +1,5 @@ -failures testFailures +failures debug_callableNotUnique pointsTo_found_typeTracker_notFound typeTracker_found_pointsTo_notFound diff --git a/python/ql/test/experimental/library-tests/CallGraph/InlineCallGraphTest.expected b/python/ql/test/experimental/library-tests/CallGraph/InlineCallGraphTest.expected index 31987baf6d7..55774486be0 100644 --- a/python/ql/test/experimental/library-tests/CallGraph/InlineCallGraphTest.expected +++ b/python/ql/test/experimental/library-tests/CallGraph/InlineCallGraphTest.expected @@ -1,5 +1,5 @@ -failures testFailures +failures debug_callableNotUnique pointsTo_found_typeTracker_notFound | code/class_attr_assign.py:10:9:10:27 | ControlFlowNode for Attribute() | my_func | diff --git a/python/ql/test/experimental/meta/inline-taint-test-demo/InlineTaintTest.expected b/python/ql/test/experimental/meta/inline-taint-test-demo/InlineTaintTest.expected index 511dc50d5ca..b4d2d9c606e 100644 --- a/python/ql/test/experimental/meta/inline-taint-test-demo/InlineTaintTest.expected +++ b/python/ql/test/experimental/meta/inline-taint-test-demo/InlineTaintTest.expected @@ -1,4 +1,3 @@ -failures argumentToEnsureNotTaintedNotMarkedAsSpurious | taint_test.py:48:9:48:29 | taint_test.py:48 | ERROR, you should add `SPURIOUS:` to this annotation | should_not_be_tainted | untaintedArgumentToEnsureTaintedNotMarkedAsMissing @@ -6,3 +5,4 @@ untaintedArgumentToEnsureTaintedNotMarkedAsMissing | taint_test.py:37:24:37:40 | taint_test.py:37 | ERROR, you should add `# $ MISSING: tainted` annotation | should_be_tainted | testFailures | taint_test.py:41:20:41:21 | ts | Fixed missing result:tainted= | +failures diff --git a/python/ql/test/library-tests/ApiGraphs/py2/use.expected b/python/ql/test/library-tests/ApiGraphs/py2/use.expected index 48de9172b36..8ec8033d086 100644 --- a/python/ql/test/library-tests/ApiGraphs/py2/use.expected +++ b/python/ql/test/library-tests/ApiGraphs/py2/use.expected @@ -1,2 +1,2 @@ -failures testFailures +failures diff --git a/python/ql/test/library-tests/InlineExpectationsTest/missing-relevant-tag/Test.expected b/python/ql/test/library-tests/InlineExpectationsTest/missing-relevant-tag/Test.expected index 2cd3654766b..8dd0c425627 100644 --- a/python/ql/test/library-tests/InlineExpectationsTest/missing-relevant-tag/Test.expected +++ b/python/ql/test/library-tests/InlineExpectationsTest/missing-relevant-tag/Test.expected @@ -1,4 +1,4 @@ -failures testFailures | test.py:1:1:1:3 | foo | Tag mismatch: Actual result with tag 'foo' that is not part of getARelevantTag() | | test.py:4:1:4:3 | foo | Tag mismatch: Actual result with tag 'foo' that is not part of getARelevantTag() | +failures diff --git a/python/ql/test/library-tests/essa/ssa-compute/UseUse.expected b/python/ql/test/library-tests/essa/ssa-compute/UseUse.expected index 48de9172b36..8ec8033d086 100644 --- a/python/ql/test/library-tests/essa/ssa-compute/UseUse.expected +++ b/python/ql/test/library-tests/essa/ssa-compute/UseUse.expected @@ -1,2 +1,2 @@ -failures testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/aioch/ConceptsTest.expected b/python/ql/test/library-tests/frameworks/aioch/ConceptsTest.expected index 48de9172b36..8ec8033d086 100644 --- a/python/ql/test/library-tests/frameworks/aioch/ConceptsTest.expected +++ b/python/ql/test/library-tests/frameworks/aioch/ConceptsTest.expected @@ -1,2 +1,2 @@ -failures testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/aiohttp/ConceptsTest.expected b/python/ql/test/library-tests/frameworks/aiohttp/ConceptsTest.expected index 48de9172b36..8ec8033d086 100644 --- a/python/ql/test/library-tests/frameworks/aiohttp/ConceptsTest.expected +++ b/python/ql/test/library-tests/frameworks/aiohttp/ConceptsTest.expected @@ -1,2 +1,2 @@ -failures testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/aiohttp/InlineTaintTest.expected b/python/ql/test/library-tests/frameworks/aiohttp/InlineTaintTest.expected index 4a72c551661..366de37b867 100644 --- a/python/ql/test/library-tests/frameworks/aiohttp/InlineTaintTest.expected +++ b/python/ql/test/library-tests/frameworks/aiohttp/InlineTaintTest.expected @@ -1,4 +1,4 @@ -failures argumentToEnsureNotTaintedNotMarkedAsSpurious untaintedArgumentToEnsureTaintedNotMarkedAsMissing testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/aiomysql/ConceptsTest.expected b/python/ql/test/library-tests/frameworks/aiomysql/ConceptsTest.expected index 48de9172b36..8ec8033d086 100644 --- a/python/ql/test/library-tests/frameworks/aiomysql/ConceptsTest.expected +++ b/python/ql/test/library-tests/frameworks/aiomysql/ConceptsTest.expected @@ -1,2 +1,2 @@ -failures testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/aiopg/ConceptsTest.expected b/python/ql/test/library-tests/frameworks/aiopg/ConceptsTest.expected index 48de9172b36..8ec8033d086 100644 --- a/python/ql/test/library-tests/frameworks/aiopg/ConceptsTest.expected +++ b/python/ql/test/library-tests/frameworks/aiopg/ConceptsTest.expected @@ -1,2 +1,2 @@ -failures testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/aiosqlite/ConceptsTest.expected b/python/ql/test/library-tests/frameworks/aiosqlite/ConceptsTest.expected index 48de9172b36..8ec8033d086 100644 --- a/python/ql/test/library-tests/frameworks/aiosqlite/ConceptsTest.expected +++ b/python/ql/test/library-tests/frameworks/aiosqlite/ConceptsTest.expected @@ -1,2 +1,2 @@ -failures testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/asyncpg/ConceptsTest.expected b/python/ql/test/library-tests/frameworks/asyncpg/ConceptsTest.expected index 48de9172b36..8ec8033d086 100644 --- a/python/ql/test/library-tests/frameworks/asyncpg/ConceptsTest.expected +++ b/python/ql/test/library-tests/frameworks/asyncpg/ConceptsTest.expected @@ -1,2 +1,2 @@ -failures testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/asyncpg/MaDTest.expected b/python/ql/test/library-tests/frameworks/asyncpg/MaDTest.expected index 48de9172b36..8ec8033d086 100644 --- a/python/ql/test/library-tests/frameworks/asyncpg/MaDTest.expected +++ b/python/ql/test/library-tests/frameworks/asyncpg/MaDTest.expected @@ -1,2 +1,2 @@ -failures testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/cassandra-driver/ConceptsTest.expected b/python/ql/test/library-tests/frameworks/cassandra-driver/ConceptsTest.expected index 48de9172b36..8ec8033d086 100644 --- a/python/ql/test/library-tests/frameworks/cassandra-driver/ConceptsTest.expected +++ b/python/ql/test/library-tests/frameworks/cassandra-driver/ConceptsTest.expected @@ -1,2 +1,2 @@ -failures testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/clickhouse_driver/ConceptsTest.expected b/python/ql/test/library-tests/frameworks/clickhouse_driver/ConceptsTest.expected index 48de9172b36..8ec8033d086 100644 --- a/python/ql/test/library-tests/frameworks/clickhouse_driver/ConceptsTest.expected +++ b/python/ql/test/library-tests/frameworks/clickhouse_driver/ConceptsTest.expected @@ -1,2 +1,2 @@ -failures testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/crypto/ConceptsTest.expected b/python/ql/test/library-tests/frameworks/crypto/ConceptsTest.expected index 48de9172b36..8ec8033d086 100644 --- a/python/ql/test/library-tests/frameworks/crypto/ConceptsTest.expected +++ b/python/ql/test/library-tests/frameworks/crypto/ConceptsTest.expected @@ -1,2 +1,2 @@ -failures testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/cryptodome/ConceptsTest.expected b/python/ql/test/library-tests/frameworks/cryptodome/ConceptsTest.expected index 48de9172b36..8ec8033d086 100644 --- a/python/ql/test/library-tests/frameworks/cryptodome/ConceptsTest.expected +++ b/python/ql/test/library-tests/frameworks/cryptodome/ConceptsTest.expected @@ -1,2 +1,2 @@ -failures testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/cryptography/ConceptsTest.expected b/python/ql/test/library-tests/frameworks/cryptography/ConceptsTest.expected index 48de9172b36..8ec8033d086 100644 --- a/python/ql/test/library-tests/frameworks/cryptography/ConceptsTest.expected +++ b/python/ql/test/library-tests/frameworks/cryptography/ConceptsTest.expected @@ -1,2 +1,2 @@ -failures testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/cx_Oracle/ConceptsTest.expected b/python/ql/test/library-tests/frameworks/cx_Oracle/ConceptsTest.expected index 48de9172b36..8ec8033d086 100644 --- a/python/ql/test/library-tests/frameworks/cx_Oracle/ConceptsTest.expected +++ b/python/ql/test/library-tests/frameworks/cx_Oracle/ConceptsTest.expected @@ -1,2 +1,2 @@ -failures testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/dill/ConceptsTest.expected b/python/ql/test/library-tests/frameworks/dill/ConceptsTest.expected index 48de9172b36..8ec8033d086 100644 --- a/python/ql/test/library-tests/frameworks/dill/ConceptsTest.expected +++ b/python/ql/test/library-tests/frameworks/dill/ConceptsTest.expected @@ -1,2 +1,2 @@ -failures testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/django-orm/NormalDataflowTest.expected b/python/ql/test/library-tests/frameworks/django-orm/NormalDataflowTest.expected index 04431311999..9ce23b4c553 100644 --- a/python/ql/test/library-tests/frameworks/django-orm/NormalDataflowTest.expected +++ b/python/ql/test/library-tests/frameworks/django-orm/NormalDataflowTest.expected @@ -1,3 +1,3 @@ missingAnnotationOnSink -failures testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/django-v1/ConceptsTest.expected b/python/ql/test/library-tests/frameworks/django-v1/ConceptsTest.expected index 48de9172b36..8ec8033d086 100644 --- a/python/ql/test/library-tests/frameworks/django-v1/ConceptsTest.expected +++ b/python/ql/test/library-tests/frameworks/django-v1/ConceptsTest.expected @@ -1,2 +1,2 @@ -failures testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/django-v2-v3/ConceptsTest.expected b/python/ql/test/library-tests/frameworks/django-v2-v3/ConceptsTest.expected index 48de9172b36..8ec8033d086 100644 --- a/python/ql/test/library-tests/frameworks/django-v2-v3/ConceptsTest.expected +++ b/python/ql/test/library-tests/frameworks/django-v2-v3/ConceptsTest.expected @@ -1,2 +1,2 @@ -failures testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/django-v2-v3/InlineTaintTest.expected b/python/ql/test/library-tests/frameworks/django-v2-v3/InlineTaintTest.expected index 4a72c551661..366de37b867 100644 --- a/python/ql/test/library-tests/frameworks/django-v2-v3/InlineTaintTest.expected +++ b/python/ql/test/library-tests/frameworks/django-v2-v3/InlineTaintTest.expected @@ -1,4 +1,4 @@ -failures argumentToEnsureNotTaintedNotMarkedAsSpurious untaintedArgumentToEnsureTaintedNotMarkedAsMissing testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/django/ConceptsTest.expected b/python/ql/test/library-tests/frameworks/django/ConceptsTest.expected index 48de9172b36..8ec8033d086 100644 --- a/python/ql/test/library-tests/frameworks/django/ConceptsTest.expected +++ b/python/ql/test/library-tests/frameworks/django/ConceptsTest.expected @@ -1,2 +1,2 @@ -failures testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/fabric/ConceptsTest.expected b/python/ql/test/library-tests/frameworks/fabric/ConceptsTest.expected index 48de9172b36..8ec8033d086 100644 --- a/python/ql/test/library-tests/frameworks/fabric/ConceptsTest.expected +++ b/python/ql/test/library-tests/frameworks/fabric/ConceptsTest.expected @@ -1,2 +1,2 @@ -failures testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/fabric/InlineTaintTest.expected b/python/ql/test/library-tests/frameworks/fabric/InlineTaintTest.expected index 4a72c551661..366de37b867 100644 --- a/python/ql/test/library-tests/frameworks/fabric/InlineTaintTest.expected +++ b/python/ql/test/library-tests/frameworks/fabric/InlineTaintTest.expected @@ -1,4 +1,4 @@ -failures argumentToEnsureNotTaintedNotMarkedAsSpurious untaintedArgumentToEnsureTaintedNotMarkedAsMissing testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/fastapi/ConceptsTest.expected b/python/ql/test/library-tests/frameworks/fastapi/ConceptsTest.expected index 48de9172b36..8ec8033d086 100644 --- a/python/ql/test/library-tests/frameworks/fastapi/ConceptsTest.expected +++ b/python/ql/test/library-tests/frameworks/fastapi/ConceptsTest.expected @@ -1,2 +1,2 @@ -failures testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/fastapi/InlineTaintTest.expected b/python/ql/test/library-tests/frameworks/fastapi/InlineTaintTest.expected index 4a72c551661..366de37b867 100644 --- a/python/ql/test/library-tests/frameworks/fastapi/InlineTaintTest.expected +++ b/python/ql/test/library-tests/frameworks/fastapi/InlineTaintTest.expected @@ -1,4 +1,4 @@ -failures argumentToEnsureNotTaintedNotMarkedAsSpurious untaintedArgumentToEnsureTaintedNotMarkedAsMissing testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/flask/ConceptsTest.expected b/python/ql/test/library-tests/frameworks/flask/ConceptsTest.expected index 48de9172b36..8ec8033d086 100644 --- a/python/ql/test/library-tests/frameworks/flask/ConceptsTest.expected +++ b/python/ql/test/library-tests/frameworks/flask/ConceptsTest.expected @@ -1,2 +1,2 @@ -failures testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/flask/InlineTaintTest.expected b/python/ql/test/library-tests/frameworks/flask/InlineTaintTest.expected index 4a72c551661..366de37b867 100644 --- a/python/ql/test/library-tests/frameworks/flask/InlineTaintTest.expected +++ b/python/ql/test/library-tests/frameworks/flask/InlineTaintTest.expected @@ -1,4 +1,4 @@ -failures argumentToEnsureNotTaintedNotMarkedAsSpurious untaintedArgumentToEnsureTaintedNotMarkedAsMissing testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/flask_admin/ConceptsTest.expected b/python/ql/test/library-tests/frameworks/flask_admin/ConceptsTest.expected index 48de9172b36..8ec8033d086 100644 --- a/python/ql/test/library-tests/frameworks/flask_admin/ConceptsTest.expected +++ b/python/ql/test/library-tests/frameworks/flask_admin/ConceptsTest.expected @@ -1,2 +1,2 @@ -failures testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/flask_admin/InlineTaintTest.expected b/python/ql/test/library-tests/frameworks/flask_admin/InlineTaintTest.expected index 4a72c551661..366de37b867 100644 --- a/python/ql/test/library-tests/frameworks/flask_admin/InlineTaintTest.expected +++ b/python/ql/test/library-tests/frameworks/flask_admin/InlineTaintTest.expected @@ -1,4 +1,4 @@ -failures argumentToEnsureNotTaintedNotMarkedAsSpurious untaintedArgumentToEnsureTaintedNotMarkedAsMissing testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/flask_sqlalchemy/ConceptsTest.expected b/python/ql/test/library-tests/frameworks/flask_sqlalchemy/ConceptsTest.expected index 48de9172b36..8ec8033d086 100644 --- a/python/ql/test/library-tests/frameworks/flask_sqlalchemy/ConceptsTest.expected +++ b/python/ql/test/library-tests/frameworks/flask_sqlalchemy/ConceptsTest.expected @@ -1,2 +1,2 @@ -failures testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/flask_sqlalchemy/InlineTaintTest.expected b/python/ql/test/library-tests/frameworks/flask_sqlalchemy/InlineTaintTest.expected index 4a72c551661..366de37b867 100644 --- a/python/ql/test/library-tests/frameworks/flask_sqlalchemy/InlineTaintTest.expected +++ b/python/ql/test/library-tests/frameworks/flask_sqlalchemy/InlineTaintTest.expected @@ -1,4 +1,4 @@ -failures argumentToEnsureNotTaintedNotMarkedAsSpurious untaintedArgumentToEnsureTaintedNotMarkedAsMissing testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/httpx/ConceptsTest.expected b/python/ql/test/library-tests/frameworks/httpx/ConceptsTest.expected index 48de9172b36..8ec8033d086 100644 --- a/python/ql/test/library-tests/frameworks/httpx/ConceptsTest.expected +++ b/python/ql/test/library-tests/frameworks/httpx/ConceptsTest.expected @@ -1,2 +1,2 @@ -failures testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/idna/ConceptsTest.expected b/python/ql/test/library-tests/frameworks/idna/ConceptsTest.expected index 48de9172b36..8ec8033d086 100644 --- a/python/ql/test/library-tests/frameworks/idna/ConceptsTest.expected +++ b/python/ql/test/library-tests/frameworks/idna/ConceptsTest.expected @@ -1,2 +1,2 @@ -failures testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/idna/InlineTaintTest.expected b/python/ql/test/library-tests/frameworks/idna/InlineTaintTest.expected index 4a72c551661..366de37b867 100644 --- a/python/ql/test/library-tests/frameworks/idna/InlineTaintTest.expected +++ b/python/ql/test/library-tests/frameworks/idna/InlineTaintTest.expected @@ -1,4 +1,4 @@ -failures argumentToEnsureNotTaintedNotMarkedAsSpurious untaintedArgumentToEnsureTaintedNotMarkedAsMissing testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/internal-ql-helpers/PoorMansFunctionResolutionTest.expected b/python/ql/test/library-tests/frameworks/internal-ql-helpers/PoorMansFunctionResolutionTest.expected index 48de9172b36..8ec8033d086 100644 --- a/python/ql/test/library-tests/frameworks/internal-ql-helpers/PoorMansFunctionResolutionTest.expected +++ b/python/ql/test/library-tests/frameworks/internal-ql-helpers/PoorMansFunctionResolutionTest.expected @@ -1,2 +1,2 @@ -failures testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/invoke/ConceptsTest.expected b/python/ql/test/library-tests/frameworks/invoke/ConceptsTest.expected index 48de9172b36..8ec8033d086 100644 --- a/python/ql/test/library-tests/frameworks/invoke/ConceptsTest.expected +++ b/python/ql/test/library-tests/frameworks/invoke/ConceptsTest.expected @@ -1,2 +1,2 @@ -failures testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/jmespath/ConceptsTest.expected b/python/ql/test/library-tests/frameworks/jmespath/ConceptsTest.expected index 48de9172b36..8ec8033d086 100644 --- a/python/ql/test/library-tests/frameworks/jmespath/ConceptsTest.expected +++ b/python/ql/test/library-tests/frameworks/jmespath/ConceptsTest.expected @@ -1,2 +1,2 @@ -failures testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/jmespath/InlineTaintTest.expected b/python/ql/test/library-tests/frameworks/jmespath/InlineTaintTest.expected index 4a72c551661..366de37b867 100644 --- a/python/ql/test/library-tests/frameworks/jmespath/InlineTaintTest.expected +++ b/python/ql/test/library-tests/frameworks/jmespath/InlineTaintTest.expected @@ -1,4 +1,4 @@ -failures argumentToEnsureNotTaintedNotMarkedAsSpurious untaintedArgumentToEnsureTaintedNotMarkedAsMissing testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/joblib/ConceptsTest.expected b/python/ql/test/library-tests/frameworks/joblib/ConceptsTest.expected index 48de9172b36..8ec8033d086 100644 --- a/python/ql/test/library-tests/frameworks/joblib/ConceptsTest.expected +++ b/python/ql/test/library-tests/frameworks/joblib/ConceptsTest.expected @@ -1,2 +1,2 @@ -failures testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/libtaxii/ConceptsTest.expected b/python/ql/test/library-tests/frameworks/libtaxii/ConceptsTest.expected index 48de9172b36..8ec8033d086 100644 --- a/python/ql/test/library-tests/frameworks/libtaxii/ConceptsTest.expected +++ b/python/ql/test/library-tests/frameworks/libtaxii/ConceptsTest.expected @@ -1,2 +1,2 @@ -failures testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/lxml/ConceptsTest.expected b/python/ql/test/library-tests/frameworks/lxml/ConceptsTest.expected index 48de9172b36..8ec8033d086 100644 --- a/python/ql/test/library-tests/frameworks/lxml/ConceptsTest.expected +++ b/python/ql/test/library-tests/frameworks/lxml/ConceptsTest.expected @@ -1,2 +1,2 @@ -failures testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/markupsafe/ConceptsTest.expected b/python/ql/test/library-tests/frameworks/markupsafe/ConceptsTest.expected index 48de9172b36..8ec8033d086 100644 --- a/python/ql/test/library-tests/frameworks/markupsafe/ConceptsTest.expected +++ b/python/ql/test/library-tests/frameworks/markupsafe/ConceptsTest.expected @@ -1,2 +1,2 @@ -failures testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/markupsafe/InlineTaintTest.expected b/python/ql/test/library-tests/frameworks/markupsafe/InlineTaintTest.expected index 4a72c551661..366de37b867 100644 --- a/python/ql/test/library-tests/frameworks/markupsafe/InlineTaintTest.expected +++ b/python/ql/test/library-tests/frameworks/markupsafe/InlineTaintTest.expected @@ -1,4 +1,4 @@ -failures argumentToEnsureNotTaintedNotMarkedAsSpurious untaintedArgumentToEnsureTaintedNotMarkedAsMissing testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/multidict/ConceptsTest.expected b/python/ql/test/library-tests/frameworks/multidict/ConceptsTest.expected index 48de9172b36..8ec8033d086 100644 --- a/python/ql/test/library-tests/frameworks/multidict/ConceptsTest.expected +++ b/python/ql/test/library-tests/frameworks/multidict/ConceptsTest.expected @@ -1,2 +1,2 @@ -failures testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/multidict/InlineTaintTest.expected b/python/ql/test/library-tests/frameworks/multidict/InlineTaintTest.expected index 4a72c551661..366de37b867 100644 --- a/python/ql/test/library-tests/frameworks/multidict/InlineTaintTest.expected +++ b/python/ql/test/library-tests/frameworks/multidict/InlineTaintTest.expected @@ -1,4 +1,4 @@ -failures argumentToEnsureNotTaintedNotMarkedAsSpurious untaintedArgumentToEnsureTaintedNotMarkedAsMissing testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/mysql-connector-python/ConceptsTest.expected b/python/ql/test/library-tests/frameworks/mysql-connector-python/ConceptsTest.expected index 48de9172b36..8ec8033d086 100644 --- a/python/ql/test/library-tests/frameworks/mysql-connector-python/ConceptsTest.expected +++ b/python/ql/test/library-tests/frameworks/mysql-connector-python/ConceptsTest.expected @@ -1,2 +1,2 @@ -failures testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/mysqldb/ConceptsTest.expected b/python/ql/test/library-tests/frameworks/mysqldb/ConceptsTest.expected index 48de9172b36..8ec8033d086 100644 --- a/python/ql/test/library-tests/frameworks/mysqldb/ConceptsTest.expected +++ b/python/ql/test/library-tests/frameworks/mysqldb/ConceptsTest.expected @@ -1,2 +1,2 @@ -failures testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/numpy/ConceptsTest.expected b/python/ql/test/library-tests/frameworks/numpy/ConceptsTest.expected index 48de9172b36..8ec8033d086 100644 --- a/python/ql/test/library-tests/frameworks/numpy/ConceptsTest.expected +++ b/python/ql/test/library-tests/frameworks/numpy/ConceptsTest.expected @@ -1,2 +1,2 @@ -failures testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/oracledb/ConceptsTest.expected b/python/ql/test/library-tests/frameworks/oracledb/ConceptsTest.expected index 48de9172b36..8ec8033d086 100644 --- a/python/ql/test/library-tests/frameworks/oracledb/ConceptsTest.expected +++ b/python/ql/test/library-tests/frameworks/oracledb/ConceptsTest.expected @@ -1,2 +1,2 @@ -failures testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/pandas/ConceptsTest.expected b/python/ql/test/library-tests/frameworks/pandas/ConceptsTest.expected index 48de9172b36..8ec8033d086 100644 --- a/python/ql/test/library-tests/frameworks/pandas/ConceptsTest.expected +++ b/python/ql/test/library-tests/frameworks/pandas/ConceptsTest.expected @@ -1,2 +1,2 @@ -failures testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/peewee/ConceptsTest.expected b/python/ql/test/library-tests/frameworks/peewee/ConceptsTest.expected index 48de9172b36..8ec8033d086 100644 --- a/python/ql/test/library-tests/frameworks/peewee/ConceptsTest.expected +++ b/python/ql/test/library-tests/frameworks/peewee/ConceptsTest.expected @@ -1,2 +1,2 @@ -failures testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/peewee/InlineTaintTest.expected b/python/ql/test/library-tests/frameworks/peewee/InlineTaintTest.expected index 4a72c551661..366de37b867 100644 --- a/python/ql/test/library-tests/frameworks/peewee/InlineTaintTest.expected +++ b/python/ql/test/library-tests/frameworks/peewee/InlineTaintTest.expected @@ -1,4 +1,4 @@ -failures argumentToEnsureNotTaintedNotMarkedAsSpurious untaintedArgumentToEnsureTaintedNotMarkedAsMissing testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/phoenixdb/ConceptsTest.expected b/python/ql/test/library-tests/frameworks/phoenixdb/ConceptsTest.expected index 48de9172b36..8ec8033d086 100644 --- a/python/ql/test/library-tests/frameworks/phoenixdb/ConceptsTest.expected +++ b/python/ql/test/library-tests/frameworks/phoenixdb/ConceptsTest.expected @@ -1,2 +1,2 @@ -failures testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/pycurl/ConceptsTest.expected b/python/ql/test/library-tests/frameworks/pycurl/ConceptsTest.expected index 48de9172b36..8ec8033d086 100644 --- a/python/ql/test/library-tests/frameworks/pycurl/ConceptsTest.expected +++ b/python/ql/test/library-tests/frameworks/pycurl/ConceptsTest.expected @@ -1,2 +1,2 @@ -failures testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/pymssql/ConceptsTest.expected b/python/ql/test/library-tests/frameworks/pymssql/ConceptsTest.expected index 48de9172b36..8ec8033d086 100644 --- a/python/ql/test/library-tests/frameworks/pymssql/ConceptsTest.expected +++ b/python/ql/test/library-tests/frameworks/pymssql/ConceptsTest.expected @@ -1,2 +1,2 @@ -failures testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/pymysql/ConceptsTest.expected b/python/ql/test/library-tests/frameworks/pymysql/ConceptsTest.expected index 48de9172b36..8ec8033d086 100644 --- a/python/ql/test/library-tests/frameworks/pymysql/ConceptsTest.expected +++ b/python/ql/test/library-tests/frameworks/pymysql/ConceptsTest.expected @@ -1,2 +1,2 @@ -failures testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/pyodbc/ConceptsTest.expected b/python/ql/test/library-tests/frameworks/pyodbc/ConceptsTest.expected index 48de9172b36..8ec8033d086 100644 --- a/python/ql/test/library-tests/frameworks/pyodbc/ConceptsTest.expected +++ b/python/ql/test/library-tests/frameworks/pyodbc/ConceptsTest.expected @@ -1,2 +1,2 @@ -failures testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/requests/ConceptsTest.expected b/python/ql/test/library-tests/frameworks/requests/ConceptsTest.expected index 48de9172b36..8ec8033d086 100644 --- a/python/ql/test/library-tests/frameworks/requests/ConceptsTest.expected +++ b/python/ql/test/library-tests/frameworks/requests/ConceptsTest.expected @@ -1,2 +1,2 @@ -failures testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/requests/InlineTaintTest.expected b/python/ql/test/library-tests/frameworks/requests/InlineTaintTest.expected index 4a72c551661..366de37b867 100644 --- a/python/ql/test/library-tests/frameworks/requests/InlineTaintTest.expected +++ b/python/ql/test/library-tests/frameworks/requests/InlineTaintTest.expected @@ -1,4 +1,4 @@ -failures argumentToEnsureNotTaintedNotMarkedAsSpurious untaintedArgumentToEnsureTaintedNotMarkedAsMissing testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/rest_framework/InlineTaintTest.expected b/python/ql/test/library-tests/frameworks/rest_framework/InlineTaintTest.expected index 4a72c551661..366de37b867 100644 --- a/python/ql/test/library-tests/frameworks/rest_framework/InlineTaintTest.expected +++ b/python/ql/test/library-tests/frameworks/rest_framework/InlineTaintTest.expected @@ -1,4 +1,4 @@ -failures argumentToEnsureNotTaintedNotMarkedAsSpurious untaintedArgumentToEnsureTaintedNotMarkedAsMissing testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/rsa/ConceptsTest.expected b/python/ql/test/library-tests/frameworks/rsa/ConceptsTest.expected index 48de9172b36..8ec8033d086 100644 --- a/python/ql/test/library-tests/frameworks/rsa/ConceptsTest.expected +++ b/python/ql/test/library-tests/frameworks/rsa/ConceptsTest.expected @@ -1,2 +1,2 @@ -failures testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/rsa/InlineTaintTest.expected b/python/ql/test/library-tests/frameworks/rsa/InlineTaintTest.expected index 4a72c551661..366de37b867 100644 --- a/python/ql/test/library-tests/frameworks/rsa/InlineTaintTest.expected +++ b/python/ql/test/library-tests/frameworks/rsa/InlineTaintTest.expected @@ -1,4 +1,4 @@ -failures argumentToEnsureNotTaintedNotMarkedAsSpurious untaintedArgumentToEnsureTaintedNotMarkedAsMissing testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/ruamel.yaml/ConceptsTest.expected b/python/ql/test/library-tests/frameworks/ruamel.yaml/ConceptsTest.expected index 48de9172b36..8ec8033d086 100644 --- a/python/ql/test/library-tests/frameworks/ruamel.yaml/ConceptsTest.expected +++ b/python/ql/test/library-tests/frameworks/ruamel.yaml/ConceptsTest.expected @@ -1,2 +1,2 @@ -failures testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/serverless/InlineTaintTest.expected b/python/ql/test/library-tests/frameworks/serverless/InlineTaintTest.expected index 4a72c551661..366de37b867 100644 --- a/python/ql/test/library-tests/frameworks/serverless/InlineTaintTest.expected +++ b/python/ql/test/library-tests/frameworks/serverless/InlineTaintTest.expected @@ -1,4 +1,4 @@ -failures argumentToEnsureNotTaintedNotMarkedAsSpurious untaintedArgumentToEnsureTaintedNotMarkedAsMissing testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/simplejson/ConceptsTest.expected b/python/ql/test/library-tests/frameworks/simplejson/ConceptsTest.expected index 48de9172b36..8ec8033d086 100644 --- a/python/ql/test/library-tests/frameworks/simplejson/ConceptsTest.expected +++ b/python/ql/test/library-tests/frameworks/simplejson/ConceptsTest.expected @@ -1,2 +1,2 @@ -failures testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/simplejson/InlineTaintTest.expected b/python/ql/test/library-tests/frameworks/simplejson/InlineTaintTest.expected index 4a72c551661..366de37b867 100644 --- a/python/ql/test/library-tests/frameworks/simplejson/InlineTaintTest.expected +++ b/python/ql/test/library-tests/frameworks/simplejson/InlineTaintTest.expected @@ -1,4 +1,4 @@ -failures argumentToEnsureNotTaintedNotMarkedAsSpurious untaintedArgumentToEnsureTaintedNotMarkedAsMissing testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/sqlalchemy/ConceptsTest.expected b/python/ql/test/library-tests/frameworks/sqlalchemy/ConceptsTest.expected index 48de9172b36..8ec8033d086 100644 --- a/python/ql/test/library-tests/frameworks/sqlalchemy/ConceptsTest.expected +++ b/python/ql/test/library-tests/frameworks/sqlalchemy/ConceptsTest.expected @@ -1,2 +1,2 @@ -failures testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/sqlalchemy/InlineTaintTest.expected b/python/ql/test/library-tests/frameworks/sqlalchemy/InlineTaintTest.expected index 4a72c551661..366de37b867 100644 --- a/python/ql/test/library-tests/frameworks/sqlalchemy/InlineTaintTest.expected +++ b/python/ql/test/library-tests/frameworks/sqlalchemy/InlineTaintTest.expected @@ -1,4 +1,4 @@ -failures argumentToEnsureNotTaintedNotMarkedAsSpurious untaintedArgumentToEnsureTaintedNotMarkedAsMissing testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/stdlib-py2/ConceptsTest.expected b/python/ql/test/library-tests/frameworks/stdlib-py2/ConceptsTest.expected index 48de9172b36..8ec8033d086 100644 --- a/python/ql/test/library-tests/frameworks/stdlib-py2/ConceptsTest.expected +++ b/python/ql/test/library-tests/frameworks/stdlib-py2/ConceptsTest.expected @@ -1,2 +1,2 @@ -failures testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/stdlib-py3/ConceptsTest.expected b/python/ql/test/library-tests/frameworks/stdlib-py3/ConceptsTest.expected index 48de9172b36..8ec8033d086 100644 --- a/python/ql/test/library-tests/frameworks/stdlib-py3/ConceptsTest.expected +++ b/python/ql/test/library-tests/frameworks/stdlib-py3/ConceptsTest.expected @@ -1,2 +1,2 @@ -failures testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/stdlib/ConceptsTest.expected b/python/ql/test/library-tests/frameworks/stdlib/ConceptsTest.expected index 48de9172b36..8ec8033d086 100644 --- a/python/ql/test/library-tests/frameworks/stdlib/ConceptsTest.expected +++ b/python/ql/test/library-tests/frameworks/stdlib/ConceptsTest.expected @@ -1,2 +1,2 @@ -failures testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/stdlib/InlineTaintTest.expected b/python/ql/test/library-tests/frameworks/stdlib/InlineTaintTest.expected index 4a72c551661..366de37b867 100644 --- a/python/ql/test/library-tests/frameworks/stdlib/InlineTaintTest.expected +++ b/python/ql/test/library-tests/frameworks/stdlib/InlineTaintTest.expected @@ -1,4 +1,4 @@ -failures argumentToEnsureNotTaintedNotMarkedAsSpurious untaintedArgumentToEnsureTaintedNotMarkedAsMissing testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/toml/ConceptsTest.expected b/python/ql/test/library-tests/frameworks/toml/ConceptsTest.expected index 48de9172b36..8ec8033d086 100644 --- a/python/ql/test/library-tests/frameworks/toml/ConceptsTest.expected +++ b/python/ql/test/library-tests/frameworks/toml/ConceptsTest.expected @@ -1,2 +1,2 @@ -failures testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/tornado/ConceptsTest.expected b/python/ql/test/library-tests/frameworks/tornado/ConceptsTest.expected index 48de9172b36..8ec8033d086 100644 --- a/python/ql/test/library-tests/frameworks/tornado/ConceptsTest.expected +++ b/python/ql/test/library-tests/frameworks/tornado/ConceptsTest.expected @@ -1,2 +1,2 @@ -failures testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/tornado/InlineTaintTest.expected b/python/ql/test/library-tests/frameworks/tornado/InlineTaintTest.expected index 4a72c551661..366de37b867 100644 --- a/python/ql/test/library-tests/frameworks/tornado/InlineTaintTest.expected +++ b/python/ql/test/library-tests/frameworks/tornado/InlineTaintTest.expected @@ -1,4 +1,4 @@ -failures argumentToEnsureNotTaintedNotMarkedAsSpurious untaintedArgumentToEnsureTaintedNotMarkedAsMissing testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/twisted/ConceptsTest.expected b/python/ql/test/library-tests/frameworks/twisted/ConceptsTest.expected index 48de9172b36..8ec8033d086 100644 --- a/python/ql/test/library-tests/frameworks/twisted/ConceptsTest.expected +++ b/python/ql/test/library-tests/frameworks/twisted/ConceptsTest.expected @@ -1,2 +1,2 @@ -failures testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/twisted/InlineTaintTest.expected b/python/ql/test/library-tests/frameworks/twisted/InlineTaintTest.expected index 4a72c551661..366de37b867 100644 --- a/python/ql/test/library-tests/frameworks/twisted/InlineTaintTest.expected +++ b/python/ql/test/library-tests/frameworks/twisted/InlineTaintTest.expected @@ -1,4 +1,4 @@ -failures argumentToEnsureNotTaintedNotMarkedAsSpurious untaintedArgumentToEnsureTaintedNotMarkedAsMissing testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/ujson/ConceptsTest.expected b/python/ql/test/library-tests/frameworks/ujson/ConceptsTest.expected index 48de9172b36..8ec8033d086 100644 --- a/python/ql/test/library-tests/frameworks/ujson/ConceptsTest.expected +++ b/python/ql/test/library-tests/frameworks/ujson/ConceptsTest.expected @@ -1,2 +1,2 @@ -failures testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/ujson/InlineTaintTest.expected b/python/ql/test/library-tests/frameworks/ujson/InlineTaintTest.expected index 4a72c551661..366de37b867 100644 --- a/python/ql/test/library-tests/frameworks/ujson/InlineTaintTest.expected +++ b/python/ql/test/library-tests/frameworks/ujson/InlineTaintTest.expected @@ -1,4 +1,4 @@ -failures argumentToEnsureNotTaintedNotMarkedAsSpurious untaintedArgumentToEnsureTaintedNotMarkedAsMissing testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/urllib3/ConceptsTest.expected b/python/ql/test/library-tests/frameworks/urllib3/ConceptsTest.expected index 48de9172b36..8ec8033d086 100644 --- a/python/ql/test/library-tests/frameworks/urllib3/ConceptsTest.expected +++ b/python/ql/test/library-tests/frameworks/urllib3/ConceptsTest.expected @@ -1,2 +1,2 @@ -failures testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/xmltodict/ConceptsTest.expected b/python/ql/test/library-tests/frameworks/xmltodict/ConceptsTest.expected index 48de9172b36..8ec8033d086 100644 --- a/python/ql/test/library-tests/frameworks/xmltodict/ConceptsTest.expected +++ b/python/ql/test/library-tests/frameworks/xmltodict/ConceptsTest.expected @@ -1,2 +1,2 @@ -failures testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/yaml/ConceptsTest.expected b/python/ql/test/library-tests/frameworks/yaml/ConceptsTest.expected index 48de9172b36..8ec8033d086 100644 --- a/python/ql/test/library-tests/frameworks/yaml/ConceptsTest.expected +++ b/python/ql/test/library-tests/frameworks/yaml/ConceptsTest.expected @@ -1,2 +1,2 @@ -failures testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/yarl/ConceptsTest.expected b/python/ql/test/library-tests/frameworks/yarl/ConceptsTest.expected index 48de9172b36..8ec8033d086 100644 --- a/python/ql/test/library-tests/frameworks/yarl/ConceptsTest.expected +++ b/python/ql/test/library-tests/frameworks/yarl/ConceptsTest.expected @@ -1,2 +1,2 @@ -failures testFailures +failures diff --git a/python/ql/test/library-tests/frameworks/yarl/InlineTaintTest.expected b/python/ql/test/library-tests/frameworks/yarl/InlineTaintTest.expected index 4a72c551661..366de37b867 100644 --- a/python/ql/test/library-tests/frameworks/yarl/InlineTaintTest.expected +++ b/python/ql/test/library-tests/frameworks/yarl/InlineTaintTest.expected @@ -1,4 +1,4 @@ -failures argumentToEnsureNotTaintedNotMarkedAsSpurious untaintedArgumentToEnsureTaintedNotMarkedAsMissing testFailures +failures diff --git a/python/ql/test/library-tests/regex/SubstructureTests.expected b/python/ql/test/library-tests/regex/SubstructureTests.expected index 48de9172b36..8ec8033d086 100644 --- a/python/ql/test/library-tests/regex/SubstructureTests.expected +++ b/python/ql/test/library-tests/regex/SubstructureTests.expected @@ -1,2 +1,2 @@ -failures testFailures +failures diff --git a/python/ql/test/query-tests/Functions/ModificationOfParameterWithDefault/test.expected b/python/ql/test/query-tests/Functions/ModificationOfParameterWithDefault/test.expected index 48de9172b36..8ec8033d086 100644 --- a/python/ql/test/query-tests/Functions/ModificationOfParameterWithDefault/test.expected +++ b/python/ql/test/query-tests/Functions/ModificationOfParameterWithDefault/test.expected @@ -1,2 +1,2 @@ -failures testFailures +failures diff --git a/python/ql/test/query-tests/Security/CWE-022-PathInjection/DataflowQueryTest.expected b/python/ql/test/query-tests/Security/CWE-022-PathInjection/DataflowQueryTest.expected index 04431311999..9ce23b4c553 100644 --- a/python/ql/test/query-tests/Security/CWE-022-PathInjection/DataflowQueryTest.expected +++ b/python/ql/test/query-tests/Security/CWE-022-PathInjection/DataflowQueryTest.expected @@ -1,3 +1,3 @@ missingAnnotationOnSink -failures testFailures +failures diff --git a/python/ql/test/query-tests/Security/CWE-078-CommandInjection/DataflowQueryTest.expected b/python/ql/test/query-tests/Security/CWE-078-CommandInjection/DataflowQueryTest.expected index 04431311999..9ce23b4c553 100644 --- a/python/ql/test/query-tests/Security/CWE-078-CommandInjection/DataflowQueryTest.expected +++ b/python/ql/test/query-tests/Security/CWE-078-CommandInjection/DataflowQueryTest.expected @@ -1,3 +1,3 @@ missingAnnotationOnSink -failures testFailures +failures diff --git a/python/ql/test/query-tests/Security/CWE-078-UnsafeShellCommandConstruction/DataflowQueryTest.expected b/python/ql/test/query-tests/Security/CWE-078-UnsafeShellCommandConstruction/DataflowQueryTest.expected index 04431311999..9ce23b4c553 100644 --- a/python/ql/test/query-tests/Security/CWE-078-UnsafeShellCommandConstruction/DataflowQueryTest.expected +++ b/python/ql/test/query-tests/Security/CWE-078-UnsafeShellCommandConstruction/DataflowQueryTest.expected @@ -1,3 +1,3 @@ missingAnnotationOnSink -failures testFailures +failures diff --git a/python/ql/test/query-tests/Security/CWE-209-StackTraceExposure/ExceptionInfo.expected b/python/ql/test/query-tests/Security/CWE-209-StackTraceExposure/ExceptionInfo.expected index 48de9172b36..8ec8033d086 100644 --- a/python/ql/test/query-tests/Security/CWE-209-StackTraceExposure/ExceptionInfo.expected +++ b/python/ql/test/query-tests/Security/CWE-209-StackTraceExposure/ExceptionInfo.expected @@ -1,2 +1,2 @@ -failures testFailures +failures diff --git a/python/ql/test/query-tests/Security/CWE-943-NoSqlInjection/DataflowQueryTest.expected b/python/ql/test/query-tests/Security/CWE-943-NoSqlInjection/DataflowQueryTest.expected index 303d04688ff..9ce23b4c553 100644 --- a/python/ql/test/query-tests/Security/CWE-943-NoSqlInjection/DataflowQueryTest.expected +++ b/python/ql/test/query-tests/Security/CWE-943-NoSqlInjection/DataflowQueryTest.expected @@ -1,3 +1,3 @@ -failures missingAnnotationOnSink testFailures +failures From 69453aa144f816eefbf4e0ebd67f1c126538ede3 Mon Sep 17 00:00:00 2001 From: Rasmus Wriedt Larsen Date: Wed, 15 Nov 2023 10:10:23 +0100 Subject: [PATCH 056/202] Python: Fix missing newline in `.expected` --- .../2/library-tests/ControlFlow/Exceptions/Handles.expected | 2 +- .../test/2/library-tests/ControlFlow/Exceptions/Known.expected | 2 +- .../2/library-tests/ControlFlow/Exceptions/Unknown.expected | 2 +- .../test/2/library-tests/classes/attr/class_has_attr.expected | 2 +- .../2/library-tests/comprehensions/ConsistencyCheck.expected | 2 +- .../test/2/library-tests/modules/general/import_test.expected | 2 +- .../modules/package_members/module_attributes.expected | 2 +- .../modules/package_members/module_exports.expected | 2 +- .../modules/package_members/module_import_as.expected | 2 +- .../2/library-tests/types/properties/BuiltinProperties.expected | 2 +- .../3/library-tests/ControlFlow/Exceptions/Handles.expected | 2 +- .../test/3/library-tests/ControlFlow/Exceptions/Known.expected | 2 +- .../3/library-tests/ControlFlow/Exceptions/Unknown.expected | 2 +- .../test/3/library-tests/PointsTo/import_time/Pruned.expected | 2 +- python/ql/test/3/library-tests/classes/attr/class_attr.expected | 2 +- .../test/3/library-tests/classes/attr/class_has_attr.expected | 2 +- python/ql/test/3/library-tests/classes/meta/meta.expected | 2 +- python/ql/test/3/library-tests/classes/meta/meta_obj.expected | 2 +- .../modules/package_members/module_attributes.expected | 2 +- .../modules/package_members/module_exports.expected | 2 +- .../modules/package_members/module_import_as.expected | 2 +- .../test/3/library-tests/types/functions/ReturnTypes.expected | 2 +- .../3/library-tests/types/properties/BuiltinProperties.expected | 2 +- .../library-tests/ControlFlow/augassign/AugAssignFlow.expected | 2 +- python/ql/test/library-tests/ControlFlow/augassign/SSA.expected | 2 +- .../test/library-tests/ControlFlow/comparison/Compare.expected | 2 +- .../ControlFlow/dominators/DominatesConsistency.expected | 2 +- python/ql/test/library-tests/ControlFlow/except/test.expected | 2 +- python/ql/test/library-tests/ControlFlow/general/Cyclo.expected | 2 +- .../ql/test/library-tests/ControlFlow/general/Reaches.expected | 2 +- .../test/library-tests/ControlFlow/ssa/deletions/test.expected | 2 +- python/ql/test/library-tests/PointsTo/functions/test.expected | 2 +- .../test/library-tests/PointsTo/inheritance/SuperTypes.expected | 2 +- python/ql/test/library-tests/PointsTo/lookup/Lookup.expected | 2 +- python/ql/test/library-tests/attributes/SelfAttribute.expected | 2 +- python/ql/test/library-tests/classes/attr/class_attr.expected | 2 +- .../test/library-tests/classes/attr/class_defined_attr.expected | 2 +- .../test/library-tests/classes/attr/class_defines_attr.expected | 2 +- .../ql/test/library-tests/classes/attr/class_has_attr.expected | 2 +- python/ql/test/library-tests/classes/attr/hash.expected | 2 +- python/ql/test/library-tests/comments/blocks.expected | 2 +- .../ql/test/library-tests/comments/blocks_not_example.expected | 2 +- python/ql/test/library-tests/comments/lines.expected | 2 +- .../ql/test/library-tests/comments/lines_not_example.expected | 2 +- python/ql/test/library-tests/exceptions/Legal.expected | 2 +- python/ql/test/library-tests/imports/Alias.expected | 2 +- .../library-tests/locations/negative_numbers/negative.expected | 2 +- python/ql/test/library-tests/parentheses/Parens.expected | 2 +- .../ql/test/library-tests/stmts/general/SubExpressions.expected | 2 +- python/ql/test/library-tests/stmts/raise_stmt/AST.expected | 2 +- python/ql/test/library-tests/stmts/try_stmt/AST.expected | 2 +- python/ql/test/library-tests/stmts/with_stmt/AST.expected | 2 +- python/ql/test/library-tests/types/properties/Deleters.expected | 2 +- python/ql/test/library-tests/types/properties/Getters.expected | 2 +- .../library-tests/types/properties/PythonProperties.expected | 2 +- python/ql/test/library-tests/types/properties/Setters.expected | 2 +- 56 files changed, 56 insertions(+), 56 deletions(-) diff --git a/python/ql/test/2/library-tests/ControlFlow/Exceptions/Handles.expected b/python/ql/test/2/library-tests/ControlFlow/Exceptions/Handles.expected index 8286f8ff79f..0ecb19a002e 100644 --- a/python/ql/test/2/library-tests/ControlFlow/Exceptions/Handles.expected +++ b/python/ql/test/2/library-tests/ControlFlow/Exceptions/Handles.expected @@ -8,4 +8,4 @@ | 38 | ControlFlowNode for ExceptStmt | builtin-class AttributeError | | 40 | ControlFlowNode for ExceptStmt | builtin-class IndexError | | 42 | ControlFlowNode for ExceptStmt | builtin-class KeyError | -| 57 | ControlFlowNode for ExceptStmt | builtin-class IOError | \ No newline at end of file +| 57 | ControlFlowNode for ExceptStmt | builtin-class IOError | diff --git a/python/ql/test/2/library-tests/ControlFlow/Exceptions/Known.expected b/python/ql/test/2/library-tests/ControlFlow/Exceptions/Known.expected index ae57cba62e4..acaa91c4f77 100644 --- a/python/ql/test/2/library-tests/ControlFlow/Exceptions/Known.expected +++ b/python/ql/test/2/library-tests/ControlFlow/Exceptions/Known.expected @@ -12,4 +12,4 @@ | 35 | ControlFlowNode for Attribute | builtin-class AttributeError | | 37 | ControlFlowNode for Raise | builtin-class Exception | | 53 | ControlFlowNode for Attribute() | builtin-class IOError | -| 54 | ControlFlowNode for Attribute() | builtin-class IOError | \ No newline at end of file +| 54 | ControlFlowNode for Attribute() | builtin-class IOError | diff --git a/python/ql/test/2/library-tests/ControlFlow/Exceptions/Unknown.expected b/python/ql/test/2/library-tests/ControlFlow/Exceptions/Unknown.expected index 4d570959d6e..28851ef9a46 100644 --- a/python/ql/test/2/library-tests/ControlFlow/Exceptions/Unknown.expected +++ b/python/ql/test/2/library-tests/ControlFlow/Exceptions/Unknown.expected @@ -3,4 +3,4 @@ | 36 | ControlFlowNode for a() | | 51 | ControlFlowNode for open() | | 56 | ControlFlowNode for Attribute() | -| 58 | ControlFlowNode for Attribute() | \ No newline at end of file +| 58 | ControlFlowNode for Attribute() | diff --git a/python/ql/test/2/library-tests/classes/attr/class_has_attr.expected b/python/ql/test/2/library-tests/classes/attr/class_has_attr.expected index 7bcbd739d3c..4de9f4b4dda 100644 --- a/python/ql/test/2/library-tests/classes/attr/class_has_attr.expected +++ b/python/ql/test/2/library-tests/classes/attr/class_has_attr.expected @@ -7,4 +7,4 @@ | 36 | class DerivedFromBuiltin | pop | | 36 | class DerivedFromBuiltin | remove | | 36 | class DerivedFromBuiltin | reverse | -| 36 | class DerivedFromBuiltin | sort | \ No newline at end of file +| 36 | class DerivedFromBuiltin | sort | diff --git a/python/ql/test/2/library-tests/comprehensions/ConsistencyCheck.expected b/python/ql/test/2/library-tests/comprehensions/ConsistencyCheck.expected index c44d5fb5f0a..f082a67fcf6 100644 --- a/python/ql/test/2/library-tests/comprehensions/ConsistencyCheck.expected +++ b/python/ql/test/2/library-tests/comprehensions/ConsistencyCheck.expected @@ -1 +1 @@ -| 0 | \ No newline at end of file +| 0 | diff --git a/python/ql/test/2/library-tests/modules/general/import_test.expected b/python/ql/test/2/library-tests/modules/general/import_test.expected index e15685d33db..afaa1ccc7b2 100644 --- a/python/ql/test/2/library-tests/modules/general/import_test.expected +++ b/python/ql/test/2/library-tests/modules/general/import_test.expected @@ -12,4 +12,4 @@ | Module package.helper | 2 | ImportExpr | 0 | bottom | absolute | assistant | | Module package.helper | 3 | ImportExpr | 0 | top | absolute | sys | | Module package.helper | 10 | ImportExpr | 1 | bottom | relative | package | -| Module test_star | 1 | ImportExpr | -1 | bottom | absolute | test_package | \ No newline at end of file +| Module test_star | 1 | ImportExpr | -1 | bottom | absolute | test_package | diff --git a/python/ql/test/2/library-tests/modules/package_members/module_attributes.expected b/python/ql/test/2/library-tests/modules/package_members/module_attributes.expected index f450f15d13e..7914748b3a7 100644 --- a/python/ql/test/2/library-tests/modules/package_members/module_attributes.expected +++ b/python/ql/test/2/library-tests/modules/package_members/module_attributes.expected @@ -54,4 +54,4 @@ | Module test_star | p | str b'p' | | Module test_star | q | str b'q' | | Module test_star | r | str b'r' | -| Module test_star | sys | Module sys | \ No newline at end of file +| Module test_star | sys | Module sys | diff --git a/python/ql/test/2/library-tests/modules/package_members/module_exports.expected b/python/ql/test/2/library-tests/modules/package_members/module_exports.expected index 3a58b41c0b4..3b42e772bab 100644 --- a/python/ql/test/2/library-tests/modules/package_members/module_exports.expected +++ b/python/ql/test/2/library-tests/modules/package_members/module_exports.expected @@ -39,4 +39,4 @@ | Module test_star | p | | Module test_star | q | | Module test_star | r | -| Module test_star | sys | \ No newline at end of file +| Module test_star | sys | diff --git a/python/ql/test/2/library-tests/modules/package_members/module_import_as.expected b/python/ql/test/2/library-tests/modules/package_members/module_import_as.expected index 5610cff4000..1f2095f6fde 100644 --- a/python/ql/test/2/library-tests/modules/package_members/module_import_as.expected +++ b/python/ql/test/2/library-tests/modules/package_members/module_import_as.expected @@ -5,4 +5,4 @@ | Module test_package.module2 | test_package.module2 | | Module test_package.module3 | test_package.module3 | | Module test_package.module4 | test_package.module4 | -| Module test_star | test_star | \ No newline at end of file +| Module test_star | test_star | diff --git a/python/ql/test/2/library-tests/types/properties/BuiltinProperties.expected b/python/ql/test/2/library-tests/types/properties/BuiltinProperties.expected index 20f721fa72a..914450a2ad9 100644 --- a/python/ql/test/2/library-tests/types/properties/BuiltinProperties.expected +++ b/python/ql/test/2/library-tests/types/properties/BuiltinProperties.expected @@ -4,4 +4,4 @@ | builtin-class type | __dict__ | Property __dict__ | method-wrapper __get__ | method-wrapper __set__ | method-wrapper __delete__ | | builtin-class type | __doc__ | Property __doc__ | method-wrapper __get__ | method-wrapper __set__ | method-wrapper __delete__ | | builtin-class type | __module__ | Property __module__ | method-wrapper __get__ | method-wrapper __set__ | method-wrapper __delete__ | -| builtin-class type | __name__ | Property __name__ | method-wrapper __get__ | method-wrapper __set__ | method-wrapper __delete__ | \ No newline at end of file +| builtin-class type | __name__ | Property __name__ | method-wrapper __get__ | method-wrapper __set__ | method-wrapper __delete__ | diff --git a/python/ql/test/3/library-tests/ControlFlow/Exceptions/Handles.expected b/python/ql/test/3/library-tests/ControlFlow/Exceptions/Handles.expected index e6e6fb6b4c5..ca0d2048dc7 100644 --- a/python/ql/test/3/library-tests/ControlFlow/Exceptions/Handles.expected +++ b/python/ql/test/3/library-tests/ControlFlow/Exceptions/Handles.expected @@ -8,4 +8,4 @@ | 38 | ControlFlowNode for ExceptStmt | builtin-class AttributeError | | 40 | ControlFlowNode for ExceptStmt | builtin-class IndexError | | 42 | ControlFlowNode for ExceptStmt | builtin-class KeyError | -| 57 | ControlFlowNode for ExceptStmt | builtin-class OSError | \ No newline at end of file +| 57 | ControlFlowNode for ExceptStmt | builtin-class OSError | diff --git a/python/ql/test/3/library-tests/ControlFlow/Exceptions/Known.expected b/python/ql/test/3/library-tests/ControlFlow/Exceptions/Known.expected index 99abc64c71c..5bddba6eafe 100644 --- a/python/ql/test/3/library-tests/ControlFlow/Exceptions/Known.expected +++ b/python/ql/test/3/library-tests/ControlFlow/Exceptions/Known.expected @@ -12,4 +12,4 @@ | 35 | ControlFlowNode for Attribute | builtin-class AttributeError | | 37 | ControlFlowNode for Raise | builtin-class Exception | | 53 | ControlFlowNode for Attribute() | builtin-class OSError | -| 54 | ControlFlowNode for Attribute() | builtin-class OSError | \ No newline at end of file +| 54 | ControlFlowNode for Attribute() | builtin-class OSError | diff --git a/python/ql/test/3/library-tests/ControlFlow/Exceptions/Unknown.expected b/python/ql/test/3/library-tests/ControlFlow/Exceptions/Unknown.expected index 4d570959d6e..28851ef9a46 100644 --- a/python/ql/test/3/library-tests/ControlFlow/Exceptions/Unknown.expected +++ b/python/ql/test/3/library-tests/ControlFlow/Exceptions/Unknown.expected @@ -3,4 +3,4 @@ | 36 | ControlFlowNode for a() | | 51 | ControlFlowNode for open() | | 56 | ControlFlowNode for Attribute() | -| 58 | ControlFlowNode for Attribute() | \ No newline at end of file +| 58 | ControlFlowNode for Attribute() | diff --git a/python/ql/test/3/library-tests/PointsTo/import_time/Pruned.expected b/python/ql/test/3/library-tests/PointsTo/import_time/Pruned.expected index 88e3d8aa2de..716370a16f2 100644 --- a/python/ql/test/3/library-tests/PointsTo/import_time/Pruned.expected +++ b/python/ql/test/3/library-tests/PointsTo/import_time/Pruned.expected @@ -1,2 +1,2 @@ | 28 | -| 42 | \ No newline at end of file +| 42 | diff --git a/python/ql/test/3/library-tests/classes/attr/class_attr.expected b/python/ql/test/3/library-tests/classes/attr/class_attr.expected index cb9a29c27db..35b26e0e1b7 100644 --- a/python/ql/test/3/library-tests/classes/attr/class_attr.expected +++ b/python/ql/test/3/library-tests/classes/attr/class_attr.expected @@ -9,4 +9,4 @@ | 3 | class DerivedFromBuiltin | pop | Builtin-method pop | | 3 | class DerivedFromBuiltin | remove | Builtin-method remove | | 3 | class DerivedFromBuiltin | reverse | Builtin-method reverse | -| 3 | class DerivedFromBuiltin | sort | Builtin-method sort | \ No newline at end of file +| 3 | class DerivedFromBuiltin | sort | Builtin-method sort | diff --git a/python/ql/test/3/library-tests/classes/attr/class_has_attr.expected b/python/ql/test/3/library-tests/classes/attr/class_has_attr.expected index 99721ecd3ce..7615be492b4 100644 --- a/python/ql/test/3/library-tests/classes/attr/class_has_attr.expected +++ b/python/ql/test/3/library-tests/classes/attr/class_has_attr.expected @@ -9,4 +9,4 @@ | 3 | class DerivedFromBuiltin | pop | | 3 | class DerivedFromBuiltin | remove | | 3 | class DerivedFromBuiltin | reverse | -| 3 | class DerivedFromBuiltin | sort | \ No newline at end of file +| 3 | class DerivedFromBuiltin | sort | diff --git a/python/ql/test/3/library-tests/classes/meta/meta.expected b/python/ql/test/3/library-tests/classes/meta/meta.expected index a0597936673..5daa7e65135 100644 --- a/python/ql/test/3/library-tests/classes/meta/meta.expected +++ b/python/ql/test/3/library-tests/classes/meta/meta.expected @@ -1 +1 @@ -| ClassExpr | Meta | \ No newline at end of file +| ClassExpr | Meta | diff --git a/python/ql/test/3/library-tests/classes/meta/meta_obj.expected b/python/ql/test/3/library-tests/classes/meta/meta_obj.expected index 8c8f5618ff9..d0e98740490 100644 --- a/python/ql/test/3/library-tests/classes/meta/meta_obj.expected +++ b/python/ql/test/3/library-tests/classes/meta/meta_obj.expected @@ -1,2 +1,2 @@ | class HasMeta | class Meta | -| class Meta | builtin-class type | \ No newline at end of file +| class Meta | builtin-class type | diff --git a/python/ql/test/3/library-tests/modules/package_members/module_attributes.expected b/python/ql/test/3/library-tests/modules/package_members/module_attributes.expected index ae2a037e77a..e6dbf62d41e 100644 --- a/python/ql/test/3/library-tests/modules/package_members/module_attributes.expected +++ b/python/ql/test/3/library-tests/modules/package_members/module_attributes.expected @@ -57,4 +57,4 @@ | Module test_star | p | str u'p' | | Module test_star | q | str u'q' | | Module test_star | r | str u'r' | -| Module test_star | sys | Module sys | \ No newline at end of file +| Module test_star | sys | Module sys | diff --git a/python/ql/test/3/library-tests/modules/package_members/module_exports.expected b/python/ql/test/3/library-tests/modules/package_members/module_exports.expected index b25017607b2..44ccbb2da1e 100644 --- a/python/ql/test/3/library-tests/modules/package_members/module_exports.expected +++ b/python/ql/test/3/library-tests/modules/package_members/module_exports.expected @@ -41,4 +41,4 @@ | Module test_star | p | | Module test_star | q | | Module test_star | r | -| Module test_star | sys | \ No newline at end of file +| Module test_star | sys | diff --git a/python/ql/test/3/library-tests/modules/package_members/module_import_as.expected b/python/ql/test/3/library-tests/modules/package_members/module_import_as.expected index 5cb15a54429..d96a4d1e25c 100644 --- a/python/ql/test/3/library-tests/modules/package_members/module_import_as.expected +++ b/python/ql/test/3/library-tests/modules/package_members/module_import_as.expected @@ -6,4 +6,4 @@ | Module test_package.module3 | test_package.module3 | | Module test_package.module4 | test_package.module4 | | Module test_package.module5 | test_package.module5 | -| Module test_star | test_star | \ No newline at end of file +| Module test_star | test_star | diff --git a/python/ql/test/3/library-tests/types/functions/ReturnTypes.expected b/python/ql/test/3/library-tests/types/functions/ReturnTypes.expected index db2290e09e7..2f3871a7c69 100644 --- a/python/ql/test/3/library-tests/types/functions/ReturnTypes.expected +++ b/python/ql/test/3/library-tests/types/functions/ReturnTypes.expected @@ -21,4 +21,4 @@ | 112 | multi_return | builtin-class int | | 118 | do_something | builtin-class int | | 123 | with_flow | builtin-class int | -| 128 | return_default | builtin-class tuple | \ No newline at end of file +| 128 | return_default | builtin-class tuple | diff --git a/python/ql/test/3/library-tests/types/properties/BuiltinProperties.expected b/python/ql/test/3/library-tests/types/properties/BuiltinProperties.expected index d96c00d5d32..f34fdbd68b6 100644 --- a/python/ql/test/3/library-tests/types/properties/BuiltinProperties.expected +++ b/python/ql/test/3/library-tests/types/properties/BuiltinProperties.expected @@ -6,4 +6,4 @@ | builtin-class type | __module__ | Property __module__ | method-wrapper __get__ | method-wrapper __set__ | method-wrapper __delete__ | | builtin-class type | __name__ | Property __name__ | method-wrapper __get__ | method-wrapper __set__ | method-wrapper __delete__ | | builtin-class type | __qualname__ | Property __qualname__ | method-wrapper __get__ | method-wrapper __set__ | method-wrapper __delete__ | -| builtin-class type | __text_signature__ | Property __text_signature__ | method-wrapper __get__ | method-wrapper __set__ | method-wrapper __delete__ | \ No newline at end of file +| builtin-class type | __text_signature__ | Property __text_signature__ | method-wrapper __get__ | method-wrapper __set__ | method-wrapper __delete__ | diff --git a/python/ql/test/library-tests/ControlFlow/augassign/AugAssignFlow.expected b/python/ql/test/library-tests/ControlFlow/augassign/AugAssignFlow.expected index f5ab8c8a6f1..0939d480cb8 100644 --- a/python/ql/test/library-tests/ControlFlow/augassign/AugAssignFlow.expected +++ b/python/ql/test/library-tests/ControlFlow/augassign/AugAssignFlow.expected @@ -4,4 +4,4 @@ | ControlFlowNode for Subscript | ControlFlowNode for Subscript | 23 | | ControlFlowNode for v | ControlFlowNode for v | 28 | | ControlFlowNode for x | ControlFlowNode for x | 7 | -| ControlFlowNode for x | ControlFlowNode for x | 21 | \ No newline at end of file +| ControlFlowNode for x | ControlFlowNode for x | 21 | diff --git a/python/ql/test/library-tests/ControlFlow/augassign/SSA.expected b/python/ql/test/library-tests/ControlFlow/augassign/SSA.expected index f5c89ccdfc4..581a692e88c 100644 --- a/python/ql/test/library-tests/ControlFlow/augassign/SSA.expected +++ b/python/ql/test/library-tests/ControlFlow/augassign/SSA.expected @@ -1,3 +1,3 @@ | ControlFlowNode for v | 28 | | ControlFlowNode for x | 7 | -| ControlFlowNode for x | 21 | \ No newline at end of file +| ControlFlowNode for x | 21 | diff --git a/python/ql/test/library-tests/ControlFlow/comparison/Compare.expected b/python/ql/test/library-tests/ControlFlow/comparison/Compare.expected index 34cb8350342..4e1ea1abe8f 100644 --- a/python/ql/test/library-tests/ControlFlow/comparison/Compare.expected +++ b/python/ql/test/library-tests/ControlFlow/comparison/Compare.expected @@ -3,4 +3,4 @@ | 3 | ControlFlowNode for Compare | e | f | < | | 4 | ControlFlowNode for Compare | g | h | >= | | 5 | ControlFlowNode for Compare | i | j | <= | -| 6 | ControlFlowNode for Compare | k | l | != | \ No newline at end of file +| 6 | ControlFlowNode for Compare | k | l | != | diff --git a/python/ql/test/library-tests/ControlFlow/dominators/DominatesConsistency.expected b/python/ql/test/library-tests/ControlFlow/dominators/DominatesConsistency.expected index fe98b155587..cf01bbbac55 100644 --- a/python/ql/test/library-tests/ControlFlow/dominators/DominatesConsistency.expected +++ b/python/ql/test/library-tests/ControlFlow/dominators/DominatesConsistency.expected @@ -1 +1 @@ -| 0 | 0 | \ No newline at end of file +| 0 | 0 | diff --git a/python/ql/test/library-tests/ControlFlow/except/test.expected b/python/ql/test/library-tests/ControlFlow/except/test.expected index da4b21d23df..ca20f5706f6 100644 --- a/python/ql/test/library-tests/ControlFlow/except/test.expected +++ b/python/ql/test/library-tests/ControlFlow/except/test.expected @@ -6,4 +6,4 @@ | ec | | ed | | ee | -| ef | \ No newline at end of file +| ef | diff --git a/python/ql/test/library-tests/ControlFlow/general/Cyclo.expected b/python/ql/test/library-tests/ControlFlow/general/Cyclo.expected index e814047bf80..60f7bd7de57 100644 --- a/python/ql/test/library-tests/ControlFlow/general/Cyclo.expected +++ b/python/ql/test/library-tests/ControlFlow/general/Cyclo.expected @@ -6,4 +6,4 @@ | Function normal_args | 1 | | Function special_args | 1 | | Function try_except | 4 | -| Function try_finally | 2 | \ No newline at end of file +| Function try_finally | 2 | diff --git a/python/ql/test/library-tests/ControlFlow/general/Reaches.expected b/python/ql/test/library-tests/ControlFlow/general/Reaches.expected index 4fc0324ad13..f37824aa11f 100644 --- a/python/ql/test/library-tests/ControlFlow/general/Reaches.expected +++ b/python/ql/test/library-tests/ControlFlow/general/Reaches.expected @@ -16,4 +16,4 @@ | try_body1 | | try_body2 | | try_body3 | -| try_body4 | \ No newline at end of file +| try_body4 | diff --git a/python/ql/test/library-tests/ControlFlow/ssa/deletions/test.expected b/python/ql/test/library-tests/ControlFlow/ssa/deletions/test.expected index a80d1fe8beb..f4459604e7e 100644 --- a/python/ql/test/library-tests/ControlFlow/ssa/deletions/test.expected +++ b/python/ql/test/library-tests/ControlFlow/ssa/deletions/test.expected @@ -3,4 +3,4 @@ | 10 | ControlFlowNode for u3 | u3 | delete | | 10 | ControlFlowNode for use | use | other | | 18 | ControlFlowNode for u2 | u2 | delete | -| 21 | ControlFlowNode for u3 | u3 | delete | \ No newline at end of file +| 21 | ControlFlowNode for u3 | u3 | delete | diff --git a/python/ql/test/library-tests/PointsTo/functions/test.expected b/python/ql/test/library-tests/PointsTo/functions/test.expected index e2959372536..f50338165a3 100644 --- a/python/ql/test/library-tests/PointsTo/functions/test.expected +++ b/python/ql/test/library-tests/PointsTo/functions/test.expected @@ -1,2 +1,2 @@ | 9 | Function meth | -| 14 | Function meth | \ No newline at end of file +| 14 | Function meth | diff --git a/python/ql/test/library-tests/PointsTo/inheritance/SuperTypes.expected b/python/ql/test/library-tests/PointsTo/inheritance/SuperTypes.expected index 48ef4076ed2..98833aa0ae7 100644 --- a/python/ql/test/library-tests/PointsTo/inheritance/SuperTypes.expected +++ b/python/ql/test/library-tests/PointsTo/inheritance/SuperTypes.expected @@ -34,4 +34,4 @@ | class Wrong2 | class Base | | class Wrong2 | class Derived1 | | class Wrong2 | class Derived2 | -| class Wrong2 | class Derived3 | \ No newline at end of file +| class Wrong2 | class Derived3 | diff --git a/python/ql/test/library-tests/PointsTo/lookup/Lookup.expected b/python/ql/test/library-tests/PointsTo/lookup/Lookup.expected index d01f9d843aa..7594a005ada 100644 --- a/python/ql/test/library-tests/PointsTo/lookup/Lookup.expected +++ b/python/ql/test/library-tests/PointsTo/lookup/Lookup.expected @@ -76,4 +76,4 @@ | 136 | x | global | | 140 | object | global | | 142 | x | global | -| 143 | x | local | \ No newline at end of file +| 143 | x | local | diff --git a/python/ql/test/library-tests/attributes/SelfAttribute.expected b/python/ql/test/library-tests/attributes/SelfAttribute.expected index 7d5843ffbe0..cf3ed61b50b 100644 --- a/python/ql/test/library-tests/attributes/SelfAttribute.expected +++ b/python/ql/test/library-tests/attributes/SelfAttribute.expected @@ -1,4 +1,4 @@ | 10 | a1 | defined | | 18 | a2 | defined | | 21 | a0 | | -| 25 | a1 | guarded | \ No newline at end of file +| 25 | a1 | guarded | diff --git a/python/ql/test/library-tests/classes/attr/class_attr.expected b/python/ql/test/library-tests/classes/attr/class_attr.expected index 65d7b79023b..70a7962cbb5 100644 --- a/python/ql/test/library-tests/classes/attr/class_attr.expected +++ b/python/ql/test/library-tests/classes/attr/class_attr.expected @@ -29,4 +29,4 @@ | 103 | class Sub | float | builtin-class float | | 103 | class Sub | h | Builtin-function hash | | 103 | class Sub | int | builtin-class int | -| 103 | class Sub | l | Builtin-function len | \ No newline at end of file +| 103 | class Sub | l | Builtin-function len | diff --git a/python/ql/test/library-tests/classes/attr/class_defined_attr.expected b/python/ql/test/library-tests/classes/attr/class_defined_attr.expected index 26712c5f275..4d8f464843f 100644 --- a/python/ql/test/library-tests/classes/attr/class_defined_attr.expected +++ b/python/ql/test/library-tests/classes/attr/class_defined_attr.expected @@ -16,4 +16,4 @@ | 96 | class Oddities | float | builtin-class float | | 96 | class Oddities | h | Builtin-function hash | | 96 | class Oddities | int | builtin-class int | -| 96 | class Oddities | l | Builtin-function len | \ No newline at end of file +| 96 | class Oddities | l | Builtin-function len | diff --git a/python/ql/test/library-tests/classes/attr/class_defines_attr.expected b/python/ql/test/library-tests/classes/attr/class_defines_attr.expected index 88adc304ada..eb7d71b0e73 100644 --- a/python/ql/test/library-tests/classes/attr/class_defines_attr.expected +++ b/python/ql/test/library-tests/classes/attr/class_defines_attr.expected @@ -19,4 +19,4 @@ | 96 | class Oddities | float | | 96 | class Oddities | h | | 96 | class Oddities | int | -| 96 | class Oddities | l | \ No newline at end of file +| 96 | class Oddities | l | diff --git a/python/ql/test/library-tests/classes/attr/class_has_attr.expected b/python/ql/test/library-tests/classes/attr/class_has_attr.expected index e73ad4d1894..ed51f498a38 100644 --- a/python/ql/test/library-tests/classes/attr/class_has_attr.expected +++ b/python/ql/test/library-tests/classes/attr/class_has_attr.expected @@ -34,4 +34,4 @@ | 103 | class Sub | float | | 103 | class Sub | h | | 103 | class Sub | int | -| 103 | class Sub | l | \ No newline at end of file +| 103 | class Sub | l | diff --git a/python/ql/test/library-tests/classes/attr/hash.expected b/python/ql/test/library-tests/classes/attr/hash.expected index a65142422a0..00800c3f262 100644 --- a/python/ql/test/library-tests/classes/attr/hash.expected +++ b/python/ql/test/library-tests/classes/attr/hash.expected @@ -1,2 +1,2 @@ | 92 | class Unhashable | NoneType None | -| 103 | class Sub | NoneType None | \ No newline at end of file +| 103 | class Sub | NoneType None | diff --git a/python/ql/test/library-tests/comments/blocks.expected b/python/ql/test/library-tests/comments/blocks.expected index d337745d4d4..74942439562 100644 --- a/python/ql/test/library-tests/comments/blocks.expected +++ b/python/ql/test/library-tests/comments/blocks.expected @@ -1,4 +1,4 @@ | 15 | 16 | Commented out code | | 21 | 72 | Commented out code | | 78 | 85 | Commented out code | -| 94 | 97 | Commented out code | \ No newline at end of file +| 94 | 97 | Commented out code | diff --git a/python/ql/test/library-tests/comments/blocks_not_example.expected b/python/ql/test/library-tests/comments/blocks_not_example.expected index 7a0a7158601..3d6fbc8f7f3 100644 --- a/python/ql/test/library-tests/comments/blocks_not_example.expected +++ b/python/ql/test/library-tests/comments/blocks_not_example.expected @@ -1,3 +1,3 @@ | 15 | 16 | Commented out code | | 21 | 72 | Commented out code | -| 78 | 85 | Commented out code | \ No newline at end of file +| 78 | 85 | Commented out code | diff --git a/python/ql/test/library-tests/comments/lines.expected b/python/ql/test/library-tests/comments/lines.expected index 7c45cf8cd11..6e36571b543 100644 --- a/python/ql/test/library-tests/comments/lines.expected +++ b/python/ql/test/library-tests/comments/lines.expected @@ -43,4 +43,4 @@ | 94 | Comment # def f(): | | 95 | Comment # call() | | 96 | Comment # x.y = z | -| 97 | Comment # return x | \ No newline at end of file +| 97 | Comment # return x | diff --git a/python/ql/test/library-tests/comments/lines_not_example.expected b/python/ql/test/library-tests/comments/lines_not_example.expected index f476f967cda..bf9849826f2 100644 --- a/python/ql/test/library-tests/comments/lines_not_example.expected +++ b/python/ql/test/library-tests/comments/lines_not_example.expected @@ -39,4 +39,4 @@ | 82 | Comment #except Exception: | | 83 | Comment # pass | | 84 | Comment #except: | -| 85 | Comment # pass | \ No newline at end of file +| 85 | Comment # pass | diff --git a/python/ql/test/library-tests/exceptions/Legal.expected b/python/ql/test/library-tests/exceptions/Legal.expected index 1b6fd6ec1c4..34ff257193a 100644 --- a/python/ql/test/library-tests/exceptions/Legal.expected +++ b/python/ql/test/library-tests/exceptions/Legal.expected @@ -9,4 +9,4 @@ | class InnerNotException1 | no | | class InnerNotException2 | no | | class NotException1 | no | -| class NotException2 | no | \ No newline at end of file +| class NotException2 | no | diff --git a/python/ql/test/library-tests/imports/Alias.expected b/python/ql/test/library-tests/imports/Alias.expected index 6ea5e16c29c..a74dfb46b58 100644 --- a/python/ql/test/library-tests/imports/Alias.expected +++ b/python/ql/test/library-tests/imports/Alias.expected @@ -1,3 +1,3 @@ | Alias | a | a | | Alias | b | b | -| Alias | c | d | \ No newline at end of file +| Alias | c | d | diff --git a/python/ql/test/library-tests/locations/negative_numbers/negative.expected b/python/ql/test/library-tests/locations/negative_numbers/negative.expected index 77c824ac91f..8122e2c860a 100644 --- a/python/ql/test/library-tests/locations/negative_numbers/negative.expected +++ b/python/ql/test/library-tests/locations/negative_numbers/negative.expected @@ -23,4 +23,4 @@ | UnaryExpr | 15 | 2 | 15 | 19 | () | | UnaryExpr | 16 | 2 | 16 | 5 | () | | UnaryExpr | 17 | 2 | 17 | 8 | () | -| UnaryExpr | 19 | 1 | 19 | 3 | | \ No newline at end of file +| UnaryExpr | 19 | 1 | 19 | 3 | | diff --git a/python/ql/test/library-tests/parentheses/Parens.expected b/python/ql/test/library-tests/parentheses/Parens.expected index c19d295830d..4be830e85ae 100644 --- a/python/ql/test/library-tests/parentheses/Parens.expected +++ b/python/ql/test/library-tests/parentheses/Parens.expected @@ -27,4 +27,4 @@ | 52 | BinaryExpr | | 55 | BinaryExpr | | 56 | BinaryExpr | -| 61 | Tuple | \ No newline at end of file +| 61 | Tuple | diff --git a/python/ql/test/library-tests/stmts/general/SubExpressions.expected b/python/ql/test/library-tests/stmts/general/SubExpressions.expected index e40356ab46b..503475c0eca 100644 --- a/python/ql/test/library-tests/stmts/general/SubExpressions.expected +++ b/python/ql/test/library-tests/stmts/general/SubExpressions.expected @@ -3,4 +3,4 @@ | Delete | Subscript | Subscript | 2 | | Delete | Subscript | a | 2 | | Delete | Subscript | b | 2 | -| Delete | x | x | 3 | \ No newline at end of file +| Delete | x | x | 3 | diff --git a/python/ql/test/library-tests/stmts/raise_stmt/AST.expected b/python/ql/test/library-tests/stmts/raise_stmt/AST.expected index 655013b4592..28a9d342648 100644 --- a/python/ql/test/library-tests/stmts/raise_stmt/AST.expected +++ b/python/ql/test/library-tests/stmts/raise_stmt/AST.expected @@ -4,4 +4,4 @@ | 2 | FunctionDef | 2 | FunctionExpr | | 2 | FunctionDef | 2 | f | | 2 | FunctionExpr | 2 | Function f | -| 4 | Raise | 4 | Exception | \ No newline at end of file +| 4 | Raise | 4 | Exception | diff --git a/python/ql/test/library-tests/stmts/try_stmt/AST.expected b/python/ql/test/library-tests/stmts/try_stmt/AST.expected index a8c2778fc99..adf1db6e7a7 100644 --- a/python/ql/test/library-tests/stmts/try_stmt/AST.expected +++ b/python/ql/test/library-tests/stmts/try_stmt/AST.expected @@ -31,4 +31,4 @@ | 18 | ExprStmt | 18 | call3a() | | 18 | call3a() | 18 | call3a | | 20 | ExprStmt | 20 | call3b() | -| 20 | call3b() | 20 | call3b | \ No newline at end of file +| 20 | call3b() | 20 | call3b | diff --git a/python/ql/test/library-tests/stmts/with_stmt/AST.expected b/python/ql/test/library-tests/stmts/with_stmt/AST.expected index acae99eab4c..c46f1256a16 100644 --- a/python/ql/test/library-tests/stmts/with_stmt/AST.expected +++ b/python/ql/test/library-tests/stmts/with_stmt/AST.expected @@ -17,4 +17,4 @@ | 8 | With | 8 | y | | 8 | With | 9 | ExprStmt | | 9 | ExprStmt | 9 | call() | -| 9 | call() | 9 | call | \ No newline at end of file +| 9 | call() | 9 | call | diff --git a/python/ql/test/library-tests/types/properties/Deleters.expected b/python/ql/test/library-tests/types/properties/Deleters.expected index 1fb91ed794b..e3520ed3c6c 100644 --- a/python/ql/test/library-tests/types/properties/Deleters.expected +++ b/python/ql/test/library-tests/types/properties/Deleters.expected @@ -1 +1 @@ -| Property p2 | Function p2 | \ No newline at end of file +| Property p2 | Function p2 | diff --git a/python/ql/test/library-tests/types/properties/Getters.expected b/python/ql/test/library-tests/types/properties/Getters.expected index c451d9c1f38..7faca5f1aec 100644 --- a/python/ql/test/library-tests/types/properties/Getters.expected +++ b/python/ql/test/library-tests/types/properties/Getters.expected @@ -1,3 +1,3 @@ | Property p1 | Function p1 | | Property p2 | Function p2 | -| Property p3 | Function p3 | \ No newline at end of file +| Property p3 | Function p3 | diff --git a/python/ql/test/library-tests/types/properties/PythonProperties.expected b/python/ql/test/library-tests/types/properties/PythonProperties.expected index 4bb0de96c31..cb52d973b4e 100644 --- a/python/ql/test/library-tests/types/properties/PythonProperties.expected +++ b/python/ql/test/library-tests/types/properties/PythonProperties.expected @@ -1,3 +1,3 @@ | Property p1 | | Property p2 | -| Property p3 | \ No newline at end of file +| Property p3 | diff --git a/python/ql/test/library-tests/types/properties/Setters.expected b/python/ql/test/library-tests/types/properties/Setters.expected index 852998fd746..df863d0d417 100644 --- a/python/ql/test/library-tests/types/properties/Setters.expected +++ b/python/ql/test/library-tests/types/properties/Setters.expected @@ -1,2 +1,2 @@ | Property p1 | Function p1 | -| Property p3 | Function p3_set | \ No newline at end of file +| Property p3 | Function p3_set | From 23419ee6344bd3bce95bed7609a08e8c7e5ff1df Mon Sep 17 00:00:00 2001 From: Rasmus Wriedt Larsen Date: Wed, 15 Nov 2023 10:18:06 +0100 Subject: [PATCH 057/202] Python: Update `.expected` to support Python 3.12 You might wonder why the number of lines changed, but it's due to `tty` module receiving its' first update since 2001, so the actual number of lines DID change :phew: https://github.com/python/cpython/commits/3.12/Lib/tty.py Since there is now a difference between Python 2 and Python 3, we need to restrict the lines of code test to only run as Python 3. --- python/ql/src/Summary/options | 1 + .../types/properties/BuiltinProperties.expected | 5 ++++- python/ql/test/query-tests/Summary/LinesOfCode.expected | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) create mode 100644 python/ql/src/Summary/options diff --git a/python/ql/src/Summary/options b/python/ql/src/Summary/options new file mode 100644 index 00000000000..57d06650224 --- /dev/null +++ b/python/ql/src/Summary/options @@ -0,0 +1 @@ +semmle-extractor-options: --lang=3 diff --git a/python/ql/test/3/library-tests/types/properties/BuiltinProperties.expected b/python/ql/test/3/library-tests/types/properties/BuiltinProperties.expected index d96c00d5d32..430a5c8071b 100644 --- a/python/ql/test/3/library-tests/types/properties/BuiltinProperties.expected +++ b/python/ql/test/3/library-tests/types/properties/BuiltinProperties.expected @@ -1,9 +1,12 @@ | builtin-class object | __class__ | Property __class__ | method-wrapper __get__ | method-wrapper __set__ | method-wrapper __delete__ | | builtin-class type | __abstractmethods__ | Property __abstractmethods__ | method-wrapper __get__ | method-wrapper __set__ | method-wrapper __delete__ | +| builtin-class type | __annotations__ | Property __annotations__ | method-wrapper __get__ | method-wrapper __set__ | method-wrapper __delete__ | | builtin-class type | __bases__ | Property __bases__ | method-wrapper __get__ | method-wrapper __set__ | method-wrapper __delete__ | | builtin-class type | __dict__ | Property __dict__ | method-wrapper __get__ | method-wrapper __set__ | method-wrapper __delete__ | | builtin-class type | __doc__ | Property __doc__ | method-wrapper __get__ | method-wrapper __set__ | method-wrapper __delete__ | | builtin-class type | __module__ | Property __module__ | method-wrapper __get__ | method-wrapper __set__ | method-wrapper __delete__ | +| builtin-class type | __mro__ | Property __mro__ | method-wrapper __get__ | method-wrapper __set__ | method-wrapper __delete__ | | builtin-class type | __name__ | Property __name__ | method-wrapper __get__ | method-wrapper __set__ | method-wrapper __delete__ | | builtin-class type | __qualname__ | Property __qualname__ | method-wrapper __get__ | method-wrapper __set__ | method-wrapper __delete__ | -| builtin-class type | __text_signature__ | Property __text_signature__ | method-wrapper __get__ | method-wrapper __set__ | method-wrapper __delete__ | \ No newline at end of file +| builtin-class type | __text_signature__ | Property __text_signature__ | method-wrapper __get__ | method-wrapper __set__ | method-wrapper __delete__ | +| builtin-class type | __type_params__ | Property __type_params__ | method-wrapper __get__ | method-wrapper __set__ | method-wrapper __delete__ | diff --git a/python/ql/test/query-tests/Summary/LinesOfCode.expected b/python/ql/test/query-tests/Summary/LinesOfCode.expected index 5aa95ec1ce5..183d68cab22 100644 --- a/python/ql/test/query-tests/Summary/LinesOfCode.expected +++ b/python/ql/test/query-tests/Summary/LinesOfCode.expected @@ -1 +1 @@ -| 38 | +| 51 | From f9e9ae91f734534520b43ef2e6a8abec30e9c7ef Mon Sep 17 00:00:00 2001 From: Rasmus Wriedt Larsen Date: Wed, 15 Nov 2023 11:39:32 +0100 Subject: [PATCH 058/202] Python: Move tests that would change under Python 3.12 to lang specific directory This moves the tests to Python 2, next we copy them to Python 3. --- .../library-tests/PointsTo/imports2}/Runtime.expected | 0 .../imports => 2/library-tests/PointsTo/imports2}/Runtime.ql | 0 .../library-tests/PointsTo/imports2}/RuntimeWithType.expected | 0 .../library-tests/PointsTo/imports2}/RuntimeWithType.ql | 0 python/ql/test/2/library-tests/PointsTo/imports2/options | 1 + .../library-tests/PointsTo/imports2}/package/__init__.py | 0 .../library-tests/PointsTo/imports2}/package/module.py | 0 .../library-tests/PointsTo/imports2}/package/module2.py | 0 .../library-tests/PointsTo/imports2}/package/moduleX.py | 0 .../imports => 2/library-tests/PointsTo/imports2}/package/x.py | 0 .../imports => 2/library-tests/PointsTo/imports2}/test.py | 0 .../{ => 2}/library-tests/modules/usage/ModuleUsage.expected | 0 .../ql/test/{ => 2}/library-tests/modules/usage/ModuleUsage.ql | 0 python/ql/test/{ => 2}/library-tests/modules/usage/imported.py | 0 python/ql/test/{ => 2}/library-tests/modules/usage/main.py | 0 python/ql/test/{ => 2}/library-tests/modules/usage/myscript.py | 0 python/ql/test/2/library-tests/modules/usage/options | 1 + python/ql/test/{ => 2}/library-tests/modules/usage/script | 0 python/ql/test/library-tests/PointsTo/imports/options | 1 - python/ql/test/library-tests/modules/usage/options | 1 - 20 files changed, 2 insertions(+), 2 deletions(-) rename python/ql/test/{library-tests/PointsTo/imports => 2/library-tests/PointsTo/imports2}/Runtime.expected (100%) rename python/ql/test/{library-tests/PointsTo/imports => 2/library-tests/PointsTo/imports2}/Runtime.ql (100%) rename python/ql/test/{library-tests/PointsTo/imports => 2/library-tests/PointsTo/imports2}/RuntimeWithType.expected (100%) rename python/ql/test/{library-tests/PointsTo/imports => 2/library-tests/PointsTo/imports2}/RuntimeWithType.ql (100%) create mode 100644 python/ql/test/2/library-tests/PointsTo/imports2/options rename python/ql/test/{library-tests/PointsTo/imports => 2/library-tests/PointsTo/imports2}/package/__init__.py (100%) rename python/ql/test/{library-tests/PointsTo/imports => 2/library-tests/PointsTo/imports2}/package/module.py (100%) rename python/ql/test/{library-tests/PointsTo/imports => 2/library-tests/PointsTo/imports2}/package/module2.py (100%) rename python/ql/test/{library-tests/PointsTo/imports => 2/library-tests/PointsTo/imports2}/package/moduleX.py (100%) rename python/ql/test/{library-tests/PointsTo/imports => 2/library-tests/PointsTo/imports2}/package/x.py (100%) rename python/ql/test/{library-tests/PointsTo/imports => 2/library-tests/PointsTo/imports2}/test.py (100%) rename python/ql/test/{ => 2}/library-tests/modules/usage/ModuleUsage.expected (100%) rename python/ql/test/{ => 2}/library-tests/modules/usage/ModuleUsage.ql (100%) rename python/ql/test/{ => 2}/library-tests/modules/usage/imported.py (100%) rename python/ql/test/{ => 2}/library-tests/modules/usage/main.py (100%) rename python/ql/test/{ => 2}/library-tests/modules/usage/myscript.py (100%) create mode 100644 python/ql/test/2/library-tests/modules/usage/options rename python/ql/test/{ => 2}/library-tests/modules/usage/script (100%) delete mode 100644 python/ql/test/library-tests/PointsTo/imports/options delete mode 100644 python/ql/test/library-tests/modules/usage/options diff --git a/python/ql/test/library-tests/PointsTo/imports/Runtime.expected b/python/ql/test/2/library-tests/PointsTo/imports2/Runtime.expected similarity index 100% rename from python/ql/test/library-tests/PointsTo/imports/Runtime.expected rename to python/ql/test/2/library-tests/PointsTo/imports2/Runtime.expected diff --git a/python/ql/test/library-tests/PointsTo/imports/Runtime.ql b/python/ql/test/2/library-tests/PointsTo/imports2/Runtime.ql similarity index 100% rename from python/ql/test/library-tests/PointsTo/imports/Runtime.ql rename to python/ql/test/2/library-tests/PointsTo/imports2/Runtime.ql diff --git a/python/ql/test/library-tests/PointsTo/imports/RuntimeWithType.expected b/python/ql/test/2/library-tests/PointsTo/imports2/RuntimeWithType.expected similarity index 100% rename from python/ql/test/library-tests/PointsTo/imports/RuntimeWithType.expected rename to python/ql/test/2/library-tests/PointsTo/imports2/RuntimeWithType.expected diff --git a/python/ql/test/library-tests/PointsTo/imports/RuntimeWithType.ql b/python/ql/test/2/library-tests/PointsTo/imports2/RuntimeWithType.ql similarity index 100% rename from python/ql/test/library-tests/PointsTo/imports/RuntimeWithType.ql rename to python/ql/test/2/library-tests/PointsTo/imports2/RuntimeWithType.ql diff --git a/python/ql/test/2/library-tests/PointsTo/imports2/options b/python/ql/test/2/library-tests/PointsTo/imports2/options new file mode 100644 index 00000000000..4d4994fb3f0 --- /dev/null +++ b/python/ql/test/2/library-tests/PointsTo/imports2/options @@ -0,0 +1 @@ +semmle-extractor-options: --lang=2 --max-import-depth=2 -r package diff --git a/python/ql/test/library-tests/PointsTo/imports/package/__init__.py b/python/ql/test/2/library-tests/PointsTo/imports2/package/__init__.py similarity index 100% rename from python/ql/test/library-tests/PointsTo/imports/package/__init__.py rename to python/ql/test/2/library-tests/PointsTo/imports2/package/__init__.py diff --git a/python/ql/test/library-tests/PointsTo/imports/package/module.py b/python/ql/test/2/library-tests/PointsTo/imports2/package/module.py similarity index 100% rename from python/ql/test/library-tests/PointsTo/imports/package/module.py rename to python/ql/test/2/library-tests/PointsTo/imports2/package/module.py diff --git a/python/ql/test/library-tests/PointsTo/imports/package/module2.py b/python/ql/test/2/library-tests/PointsTo/imports2/package/module2.py similarity index 100% rename from python/ql/test/library-tests/PointsTo/imports/package/module2.py rename to python/ql/test/2/library-tests/PointsTo/imports2/package/module2.py diff --git a/python/ql/test/library-tests/PointsTo/imports/package/moduleX.py b/python/ql/test/2/library-tests/PointsTo/imports2/package/moduleX.py similarity index 100% rename from python/ql/test/library-tests/PointsTo/imports/package/moduleX.py rename to python/ql/test/2/library-tests/PointsTo/imports2/package/moduleX.py diff --git a/python/ql/test/library-tests/PointsTo/imports/package/x.py b/python/ql/test/2/library-tests/PointsTo/imports2/package/x.py similarity index 100% rename from python/ql/test/library-tests/PointsTo/imports/package/x.py rename to python/ql/test/2/library-tests/PointsTo/imports2/package/x.py diff --git a/python/ql/test/library-tests/PointsTo/imports/test.py b/python/ql/test/2/library-tests/PointsTo/imports2/test.py similarity index 100% rename from python/ql/test/library-tests/PointsTo/imports/test.py rename to python/ql/test/2/library-tests/PointsTo/imports2/test.py diff --git a/python/ql/test/library-tests/modules/usage/ModuleUsage.expected b/python/ql/test/2/library-tests/modules/usage/ModuleUsage.expected similarity index 100% rename from python/ql/test/library-tests/modules/usage/ModuleUsage.expected rename to python/ql/test/2/library-tests/modules/usage/ModuleUsage.expected diff --git a/python/ql/test/library-tests/modules/usage/ModuleUsage.ql b/python/ql/test/2/library-tests/modules/usage/ModuleUsage.ql similarity index 100% rename from python/ql/test/library-tests/modules/usage/ModuleUsage.ql rename to python/ql/test/2/library-tests/modules/usage/ModuleUsage.ql diff --git a/python/ql/test/library-tests/modules/usage/imported.py b/python/ql/test/2/library-tests/modules/usage/imported.py similarity index 100% rename from python/ql/test/library-tests/modules/usage/imported.py rename to python/ql/test/2/library-tests/modules/usage/imported.py diff --git a/python/ql/test/library-tests/modules/usage/main.py b/python/ql/test/2/library-tests/modules/usage/main.py similarity index 100% rename from python/ql/test/library-tests/modules/usage/main.py rename to python/ql/test/2/library-tests/modules/usage/main.py diff --git a/python/ql/test/library-tests/modules/usage/myscript.py b/python/ql/test/2/library-tests/modules/usage/myscript.py similarity index 100% rename from python/ql/test/library-tests/modules/usage/myscript.py rename to python/ql/test/2/library-tests/modules/usage/myscript.py diff --git a/python/ql/test/2/library-tests/modules/usage/options b/python/ql/test/2/library-tests/modules/usage/options new file mode 100644 index 00000000000..70c43353860 --- /dev/null +++ b/python/ql/test/2/library-tests/modules/usage/options @@ -0,0 +1 @@ +semmle-extractor-options: --lang=2 -F script diff --git a/python/ql/test/library-tests/modules/usage/script b/python/ql/test/2/library-tests/modules/usage/script similarity index 100% rename from python/ql/test/library-tests/modules/usage/script rename to python/ql/test/2/library-tests/modules/usage/script diff --git a/python/ql/test/library-tests/PointsTo/imports/options b/python/ql/test/library-tests/PointsTo/imports/options deleted file mode 100644 index b6a59fe2746..00000000000 --- a/python/ql/test/library-tests/PointsTo/imports/options +++ /dev/null @@ -1 +0,0 @@ -semmle-extractor-options: --max-import-depth=2 -r package diff --git a/python/ql/test/library-tests/modules/usage/options b/python/ql/test/library-tests/modules/usage/options deleted file mode 100644 index 98459309caa..00000000000 --- a/python/ql/test/library-tests/modules/usage/options +++ /dev/null @@ -1 +0,0 @@ -semmle-extractor-options: -F script From f3dd002ba96101a1b64da5d0e00df49a1e9faa05 Mon Sep 17 00:00:00 2001 From: Rasmus Wriedt Larsen Date: Wed, 15 Nov 2023 11:41:31 +0100 Subject: [PATCH 059/202] Python: Copy tests to Python 3 --- .../PointsTo/imports/Runtime.expected | 57 +++++++++++++++++++ .../library-tests/PointsTo/imports/Runtime.ql | 9 +++ .../PointsTo/imports/RuntimeWithType.expected | 57 +++++++++++++++++++ .../PointsTo/imports/RuntimeWithType.ql | 10 ++++ .../3/library-tests/PointsTo/imports/options | 1 + .../PointsTo/imports/package/__init__.py | 15 +++++ .../PointsTo/imports/package/module.py | 3 + .../PointsTo/imports/package/module2.py | 1 + .../PointsTo/imports/package/moduleX.py | 2 + .../PointsTo/imports/package/x.py | 2 + .../3/library-tests/PointsTo/imports/test.py | 34 +++++++++++ .../modules/usage/ModuleUsage.expected | 5 ++ .../modules/usage/ModuleUsage.ql | 16 ++++++ .../3/library-tests/modules/usage/imported.py | 6 ++ .../3/library-tests/modules/usage/main.py | 5 ++ .../3/library-tests/modules/usage/myscript.py | 3 + .../3/library-tests/modules/usage/options | 1 + .../test/3/library-tests/modules/usage/script | 3 + 18 files changed, 230 insertions(+) create mode 100644 python/ql/test/3/library-tests/PointsTo/imports/Runtime.expected create mode 100644 python/ql/test/3/library-tests/PointsTo/imports/Runtime.ql create mode 100644 python/ql/test/3/library-tests/PointsTo/imports/RuntimeWithType.expected create mode 100644 python/ql/test/3/library-tests/PointsTo/imports/RuntimeWithType.ql create mode 100644 python/ql/test/3/library-tests/PointsTo/imports/options create mode 100644 python/ql/test/3/library-tests/PointsTo/imports/package/__init__.py create mode 100644 python/ql/test/3/library-tests/PointsTo/imports/package/module.py create mode 100644 python/ql/test/3/library-tests/PointsTo/imports/package/module2.py create mode 100644 python/ql/test/3/library-tests/PointsTo/imports/package/moduleX.py create mode 100644 python/ql/test/3/library-tests/PointsTo/imports/package/x.py create mode 100644 python/ql/test/3/library-tests/PointsTo/imports/test.py create mode 100644 python/ql/test/3/library-tests/modules/usage/ModuleUsage.expected create mode 100644 python/ql/test/3/library-tests/modules/usage/ModuleUsage.ql create mode 100644 python/ql/test/3/library-tests/modules/usage/imported.py create mode 100644 python/ql/test/3/library-tests/modules/usage/main.py create mode 100755 python/ql/test/3/library-tests/modules/usage/myscript.py create mode 100644 python/ql/test/3/library-tests/modules/usage/options create mode 100755 python/ql/test/3/library-tests/modules/usage/script diff --git a/python/ql/test/3/library-tests/PointsTo/imports/Runtime.expected b/python/ql/test/3/library-tests/PointsTo/imports/Runtime.expected new file mode 100644 index 00000000000..345f112dccb --- /dev/null +++ b/python/ql/test/3/library-tests/PointsTo/imports/Runtime.expected @@ -0,0 +1,57 @@ +| __init__.py | 1 | ControlFlowNode for ImportExpr | Module package.module | ControlFlowNode for ImportExpr | +| __init__.py | 2 | ControlFlowNode for ImportMember | Function module | ControlFlowNode for FunctionExpr | +| __init__.py | 2 | ControlFlowNode for module | Function module | ControlFlowNode for FunctionExpr | +| __init__.py | 4 | ControlFlowNode for ImportExpr | Module package | ControlFlowNode for ImportExpr | +| __init__.py | 4 | ControlFlowNode for ImportMember | Module package.module2 | Entry node for Module package.module2 | +| __init__.py | 4 | ControlFlowNode for module3 | Module package.module2 | Entry node for Module package.module2 | +| __init__.py | 5 | ControlFlowNode for IntegerLiteral | int 7 | ControlFlowNode for IntegerLiteral | +| __init__.py | 5 | ControlFlowNode for module2 | int 7 | ControlFlowNode for IntegerLiteral | +| __init__.py | 6 | ControlFlowNode for ImportExpr | Module package | ControlFlowNode for ImportExpr | +| __init__.py | 6 | ControlFlowNode for ImportMember | int 7 | ControlFlowNode for IntegerLiteral | +| __init__.py | 6 | ControlFlowNode for module4 | int 7 | ControlFlowNode for IntegerLiteral | +| __init__.py | 7 | ControlFlowNode for ImportExpr | Module package | ControlFlowNode for ImportExpr | +| __init__.py | 7 | ControlFlowNode for ImportMember | Module package.module2 | Entry node for Module package.module2 | +| __init__.py | 7 | ControlFlowNode for module5 | Module package.module2 | Entry node for Module package.module2 | +| __init__.py | 8 | ControlFlowNode for ImportExpr | Module package | ControlFlowNode for ImportExpr | +| __init__.py | 8 | ControlFlowNode for ImportMember | Module package.moduleX | Entry node for Module package.moduleX | +| __init__.py | 8 | ControlFlowNode for moduleX | Module package.moduleX | Entry node for Module package.moduleX | +| module2.py | 1 | ControlFlowNode for IntegerLiteral | int 0 | ControlFlowNode for IntegerLiteral | +| module2.py | 1 | ControlFlowNode for x | int 0 | ControlFlowNode for IntegerLiteral | +| module.py | 2 | ControlFlowNode for FunctionExpr | Function module | ControlFlowNode for FunctionExpr | +| module.py | 2 | ControlFlowNode for module | Function module | ControlFlowNode for FunctionExpr | +| moduleX.py | 1 | ControlFlowNode for ClassExpr | class Y | ControlFlowNode for ClassExpr | +| moduleX.py | 1 | ControlFlowNode for Y | class Y | ControlFlowNode for ClassExpr | +| moduleX.py | 1 | ControlFlowNode for object | builtin-class object | ControlFlowNode for object | +| test.py | 1 | ControlFlowNode for ImportExpr | Module package | ControlFlowNode for ImportExpr | +| test.py | 2 | ControlFlowNode for ImportMember | Function module | ControlFlowNode for FunctionExpr | +| test.py | 2 | ControlFlowNode for module | Function module | ControlFlowNode for FunctionExpr | +| test.py | 4 | ControlFlowNode for ImportExpr | Module package | ControlFlowNode for ImportExpr | +| test.py | 5 | ControlFlowNode for ImportMember | Module package.x | Entry node for Module package.x | +| test.py | 5 | ControlFlowNode for x | Module package.x | Entry node for Module package.x | +| test.py | 8 | ControlFlowNode for C | class C | ControlFlowNode for ClassExpr | +| test.py | 8 | ControlFlowNode for ClassExpr | class C | ControlFlowNode for ClassExpr | +| test.py | 8 | ControlFlowNode for object | builtin-class object | ControlFlowNode for object | +| test.py | 10 | ControlFlowNode for ImportExpr | Module package | ControlFlowNode for ImportExpr | +| test.py | 10 | ControlFlowNode for ImportMember | int 7 | ControlFlowNode for IntegerLiteral | +| test.py | 10 | ControlFlowNode for module2 | int 7 | ControlFlowNode for IntegerLiteral | +| test.py | 12 | ControlFlowNode for FunctionExpr | Function f | ControlFlowNode for FunctionExpr | +| test.py | 12 | ControlFlowNode for f | Function f | ControlFlowNode for FunctionExpr | +| test.py | 13 | ControlFlowNode for ImportExpr | Module package | ControlFlowNode for ImportExpr | +| test.py | 13 | ControlFlowNode for ImportMember | Module package.x | Entry node for Module package.x | +| test.py | 13 | ControlFlowNode for x | Module package.x | Entry node for Module package.x | +| test.py | 15 | ControlFlowNode for ImportExpr | Module package | ControlFlowNode for ImportExpr | +| test.py | 15 | ControlFlowNode for ImportMember | Module package.moduleX | Entry node for Module package.moduleX | +| test.py | 15 | ControlFlowNode for moduleX | Module package.moduleX | Entry node for Module package.moduleX | +| test.py | 16 | ControlFlowNode for Attribute | class Y | ControlFlowNode for ClassExpr | +| test.py | 16 | ControlFlowNode for moduleX | Module package.moduleX | Entry node for Module package.moduleX | +| test.py | 19 | ControlFlowNode for ImportExpr | Module tty | ControlFlowNode for ImportExpr | +| test.py | 19 | ControlFlowNode for tty | Module tty | ControlFlowNode for ImportExpr | +| test.py | 22 | ControlFlowNode for Attribute | Builtin-function exc_info | ControlFlowNode for from sys import * | +| test.py | 22 | ControlFlowNode for x | Module package.x | Entry node for Module package.x | +| test.py | 24 | ControlFlowNode for IntegerLiteral | int 0 | ControlFlowNode for IntegerLiteral | +| test.py | 24 | ControlFlowNode for argv | int 0 | ControlFlowNode for IntegerLiteral | +| test.py | 27 | ControlFlowNode for ImportExpr | Module sys | ControlFlowNode for ImportExpr | +| test.py | 31 | ControlFlowNode for argv | list object | ControlFlowNode for from sys import * | +| test.py | 33 | ControlFlowNode for ImportExpr | Module socket | ControlFlowNode for ImportExpr | +| test.py | 34 | ControlFlowNode for timeout | builtin-class socket.timeout | ControlFlowNode for from _socket import * | +| x.py | 2 | ControlFlowNode for ImportExpr | Module sys | ControlFlowNode for ImportExpr | diff --git a/python/ql/test/3/library-tests/PointsTo/imports/Runtime.ql b/python/ql/test/3/library-tests/PointsTo/imports/Runtime.ql new file mode 100644 index 00000000000..f694bc64cf0 --- /dev/null +++ b/python/ql/test/3/library-tests/PointsTo/imports/Runtime.ql @@ -0,0 +1,9 @@ +import python + +from int line, ControlFlowNode f, Object o, ControlFlowNode orig +where + not f.getLocation().getFile().inStdlib() and + f.refersTo(o, orig) and + line = f.getLocation().getStartLine() and + line != 0 +select f.getLocation().getFile().getShortName(), line, f.toString(), o.toString(), orig.toString() diff --git a/python/ql/test/3/library-tests/PointsTo/imports/RuntimeWithType.expected b/python/ql/test/3/library-tests/PointsTo/imports/RuntimeWithType.expected new file mode 100644 index 00000000000..7082c15e410 --- /dev/null +++ b/python/ql/test/3/library-tests/PointsTo/imports/RuntimeWithType.expected @@ -0,0 +1,57 @@ +| __init__.py | 1 | ControlFlowNode for ImportExpr | Module package.module | builtin-class module | ControlFlowNode for ImportExpr | +| __init__.py | 2 | ControlFlowNode for ImportMember | Function module | builtin-class function | ControlFlowNode for FunctionExpr | +| __init__.py | 2 | ControlFlowNode for module | Function module | builtin-class function | ControlFlowNode for FunctionExpr | +| __init__.py | 4 | ControlFlowNode for ImportExpr | Module package | builtin-class module | ControlFlowNode for ImportExpr | +| __init__.py | 4 | ControlFlowNode for ImportMember | Module package.module2 | builtin-class module | Entry node for Module package.module2 | +| __init__.py | 4 | ControlFlowNode for module3 | Module package.module2 | builtin-class module | Entry node for Module package.module2 | +| __init__.py | 5 | ControlFlowNode for IntegerLiteral | int 7 | builtin-class int | ControlFlowNode for IntegerLiteral | +| __init__.py | 5 | ControlFlowNode for module2 | int 7 | builtin-class int | ControlFlowNode for IntegerLiteral | +| __init__.py | 6 | ControlFlowNode for ImportExpr | Module package | builtin-class module | ControlFlowNode for ImportExpr | +| __init__.py | 6 | ControlFlowNode for ImportMember | int 7 | builtin-class int | ControlFlowNode for IntegerLiteral | +| __init__.py | 6 | ControlFlowNode for module4 | int 7 | builtin-class int | ControlFlowNode for IntegerLiteral | +| __init__.py | 7 | ControlFlowNode for ImportExpr | Module package | builtin-class module | ControlFlowNode for ImportExpr | +| __init__.py | 7 | ControlFlowNode for ImportMember | Module package.module2 | builtin-class module | Entry node for Module package.module2 | +| __init__.py | 7 | ControlFlowNode for module5 | Module package.module2 | builtin-class module | Entry node for Module package.module2 | +| __init__.py | 8 | ControlFlowNode for ImportExpr | Module package | builtin-class module | ControlFlowNode for ImportExpr | +| __init__.py | 8 | ControlFlowNode for ImportMember | Module package.moduleX | builtin-class module | Entry node for Module package.moduleX | +| __init__.py | 8 | ControlFlowNode for moduleX | Module package.moduleX | builtin-class module | Entry node for Module package.moduleX | +| module2.py | 1 | ControlFlowNode for IntegerLiteral | int 0 | builtin-class int | ControlFlowNode for IntegerLiteral | +| module2.py | 1 | ControlFlowNode for x | int 0 | builtin-class int | ControlFlowNode for IntegerLiteral | +| module.py | 2 | ControlFlowNode for FunctionExpr | Function module | builtin-class function | ControlFlowNode for FunctionExpr | +| module.py | 2 | ControlFlowNode for module | Function module | builtin-class function | ControlFlowNode for FunctionExpr | +| moduleX.py | 1 | ControlFlowNode for ClassExpr | class Y | builtin-class type | ControlFlowNode for ClassExpr | +| moduleX.py | 1 | ControlFlowNode for Y | class Y | builtin-class type | ControlFlowNode for ClassExpr | +| moduleX.py | 1 | ControlFlowNode for object | builtin-class object | builtin-class type | ControlFlowNode for object | +| test.py | 1 | ControlFlowNode for ImportExpr | Module package | builtin-class module | ControlFlowNode for ImportExpr | +| test.py | 2 | ControlFlowNode for ImportMember | Function module | builtin-class function | ControlFlowNode for FunctionExpr | +| test.py | 2 | ControlFlowNode for module | Function module | builtin-class function | ControlFlowNode for FunctionExpr | +| test.py | 4 | ControlFlowNode for ImportExpr | Module package | builtin-class module | ControlFlowNode for ImportExpr | +| test.py | 5 | ControlFlowNode for ImportMember | Module package.x | builtin-class module | Entry node for Module package.x | +| test.py | 5 | ControlFlowNode for x | Module package.x | builtin-class module | Entry node for Module package.x | +| test.py | 8 | ControlFlowNode for C | class C | builtin-class type | ControlFlowNode for ClassExpr | +| test.py | 8 | ControlFlowNode for ClassExpr | class C | builtin-class type | ControlFlowNode for ClassExpr | +| test.py | 8 | ControlFlowNode for object | builtin-class object | builtin-class type | ControlFlowNode for object | +| test.py | 10 | ControlFlowNode for ImportExpr | Module package | builtin-class module | ControlFlowNode for ImportExpr | +| test.py | 10 | ControlFlowNode for ImportMember | int 7 | builtin-class int | ControlFlowNode for IntegerLiteral | +| test.py | 10 | ControlFlowNode for module2 | int 7 | builtin-class int | ControlFlowNode for IntegerLiteral | +| test.py | 12 | ControlFlowNode for FunctionExpr | Function f | builtin-class function | ControlFlowNode for FunctionExpr | +| test.py | 12 | ControlFlowNode for f | Function f | builtin-class function | ControlFlowNode for FunctionExpr | +| test.py | 13 | ControlFlowNode for ImportExpr | Module package | builtin-class module | ControlFlowNode for ImportExpr | +| test.py | 13 | ControlFlowNode for ImportMember | Module package.x | builtin-class module | Entry node for Module package.x | +| test.py | 13 | ControlFlowNode for x | Module package.x | builtin-class module | Entry node for Module package.x | +| test.py | 15 | ControlFlowNode for ImportExpr | Module package | builtin-class module | ControlFlowNode for ImportExpr | +| test.py | 15 | ControlFlowNode for ImportMember | Module package.moduleX | builtin-class module | Entry node for Module package.moduleX | +| test.py | 15 | ControlFlowNode for moduleX | Module package.moduleX | builtin-class module | Entry node for Module package.moduleX | +| test.py | 16 | ControlFlowNode for Attribute | class Y | builtin-class type | ControlFlowNode for ClassExpr | +| test.py | 16 | ControlFlowNode for moduleX | Module package.moduleX | builtin-class module | Entry node for Module package.moduleX | +| test.py | 19 | ControlFlowNode for ImportExpr | Module tty | builtin-class module | ControlFlowNode for ImportExpr | +| test.py | 19 | ControlFlowNode for tty | Module tty | builtin-class module | ControlFlowNode for ImportExpr | +| test.py | 22 | ControlFlowNode for Attribute | Builtin-function exc_info | builtin-class builtin_function_or_method | ControlFlowNode for from sys import * | +| test.py | 22 | ControlFlowNode for x | Module package.x | builtin-class module | Entry node for Module package.x | +| test.py | 24 | ControlFlowNode for IntegerLiteral | int 0 | builtin-class int | ControlFlowNode for IntegerLiteral | +| test.py | 24 | ControlFlowNode for argv | int 0 | builtin-class int | ControlFlowNode for IntegerLiteral | +| test.py | 27 | ControlFlowNode for ImportExpr | Module sys | builtin-class module | ControlFlowNode for ImportExpr | +| test.py | 31 | ControlFlowNode for argv | list object | builtin-class list | ControlFlowNode for from sys import * | +| test.py | 33 | ControlFlowNode for ImportExpr | Module socket | builtin-class module | ControlFlowNode for ImportExpr | +| test.py | 34 | ControlFlowNode for timeout | builtin-class socket.timeout | builtin-class type | ControlFlowNode for from _socket import * | +| x.py | 2 | ControlFlowNode for ImportExpr | Module sys | builtin-class module | ControlFlowNode for ImportExpr | diff --git a/python/ql/test/3/library-tests/PointsTo/imports/RuntimeWithType.ql b/python/ql/test/3/library-tests/PointsTo/imports/RuntimeWithType.ql new file mode 100644 index 00000000000..99a5f7b8163 --- /dev/null +++ b/python/ql/test/3/library-tests/PointsTo/imports/RuntimeWithType.ql @@ -0,0 +1,10 @@ +import python + +from int line, ControlFlowNode f, Object o, ClassObject cls, ControlFlowNode orig +where + not f.getLocation().getFile().inStdlib() and + f.refersTo(o, cls, orig) and + line = f.getLocation().getStartLine() and + line != 0 +select f.getLocation().getFile().getShortName(), line, f.toString(), o.toString(), cls.toString(), + orig.toString() diff --git a/python/ql/test/3/library-tests/PointsTo/imports/options b/python/ql/test/3/library-tests/PointsTo/imports/options new file mode 100644 index 00000000000..ac9b5b0c024 --- /dev/null +++ b/python/ql/test/3/library-tests/PointsTo/imports/options @@ -0,0 +1 @@ +semmle-extractor-options: --lang=3 --max-import-depth=2 -r package diff --git a/python/ql/test/3/library-tests/PointsTo/imports/package/__init__.py b/python/ql/test/3/library-tests/PointsTo/imports/package/__init__.py new file mode 100644 index 00000000000..715f4fbef35 --- /dev/null +++ b/python/ql/test/3/library-tests/PointsTo/imports/package/__init__.py @@ -0,0 +1,15 @@ +from .module \ +import module + +from . import module2 as module3 +module2 = 7 +from . import module2 as module4 +from . import module3 as module5 +from package import moduleX + +#We should now have: +#module2 = 7 +#module3 = package.module2 +#module4 = 7 +#module5 = package.module2 +#moduleX = package.moduleX diff --git a/python/ql/test/3/library-tests/PointsTo/imports/package/module.py b/python/ql/test/3/library-tests/PointsTo/imports/package/module.py new file mode 100644 index 00000000000..008b713d67e --- /dev/null +++ b/python/ql/test/3/library-tests/PointsTo/imports/package/module.py @@ -0,0 +1,3 @@ + +def module(args): + pass diff --git a/python/ql/test/3/library-tests/PointsTo/imports/package/module2.py b/python/ql/test/3/library-tests/PointsTo/imports/package/module2.py new file mode 100644 index 00000000000..3aea0c58ce5 --- /dev/null +++ b/python/ql/test/3/library-tests/PointsTo/imports/package/module2.py @@ -0,0 +1 @@ +x = 0 diff --git a/python/ql/test/3/library-tests/PointsTo/imports/package/moduleX.py b/python/ql/test/3/library-tests/PointsTo/imports/package/moduleX.py new file mode 100644 index 00000000000..3b39b8c0985 --- /dev/null +++ b/python/ql/test/3/library-tests/PointsTo/imports/package/moduleX.py @@ -0,0 +1,2 @@ +class Y(object): + pass \ No newline at end of file diff --git a/python/ql/test/3/library-tests/PointsTo/imports/package/x.py b/python/ql/test/3/library-tests/PointsTo/imports/package/x.py new file mode 100644 index 00000000000..51cf8f5a381 --- /dev/null +++ b/python/ql/test/3/library-tests/PointsTo/imports/package/x.py @@ -0,0 +1,2 @@ + +from sys import * diff --git a/python/ql/test/3/library-tests/PointsTo/imports/test.py b/python/ql/test/3/library-tests/PointsTo/imports/test.py new file mode 100644 index 00000000000..a63d1fbcdb5 --- /dev/null +++ b/python/ql/test/3/library-tests/PointsTo/imports/test.py @@ -0,0 +1,34 @@ +from package \ +import module + +from package \ +import x +#Should work correctly in nested scopes as well. + +class C(object): + + from package import module2 + + def f(self): + from package import x + +from package import moduleX +moduleX.Y + +#A small stdlib module to test version handling. +import tty + +#Check imports of builtin-objects using import * with no corresponding variable. +x.exc_info + +argv = 0 + +try: + from sys import * +except: + pass + +argv + +from socket import * +timeout diff --git a/python/ql/test/3/library-tests/modules/usage/ModuleUsage.expected b/python/ql/test/3/library-tests/modules/usage/ModuleUsage.expected new file mode 100644 index 00000000000..ae241915998 --- /dev/null +++ b/python/ql/test/3/library-tests/modules/usage/ModuleUsage.expected @@ -0,0 +1,5 @@ +| file://:0:0:0:0 | Module sys | isUsedAsModule | +| imported.py:0:0:0:0 | Module imported | isUsedAsModule | +| main.py:0:0:0:0 | Module main | isUsedAsScript | +| myscript.py:0:0:0:0 | Script myscript | isUsedAsScript | +| script:0:0:0:0 | Script script | isUsedAsScript | diff --git a/python/ql/test/3/library-tests/modules/usage/ModuleUsage.ql b/python/ql/test/3/library-tests/modules/usage/ModuleUsage.ql new file mode 100644 index 00000000000..5f776e2374e --- /dev/null +++ b/python/ql/test/3/library-tests/modules/usage/ModuleUsage.ql @@ -0,0 +1,16 @@ +import python + +from ModuleValue mv, string usage +where + // builtin module has different name in Python 2 and 3 + not mv = Module::builtinModule() and + ( + mv.isUsedAsModule() and usage = "isUsedAsModule" + or + mv.isUsedAsScript() and usage = "isUsedAsScript" + or + not mv.isUsedAsModule() and + not mv.isUsedAsScript() and + usage = "" + ) +select mv, usage diff --git a/python/ql/test/3/library-tests/modules/usage/imported.py b/python/ql/test/3/library-tests/modules/usage/imported.py new file mode 100644 index 00000000000..98e3dfd364a --- /dev/null +++ b/python/ql/test/3/library-tests/modules/usage/imported.py @@ -0,0 +1,6 @@ +def func(): + pass + +if __name__ == "__main__": + print("I could have done something interesting...") + print("but I didn't") diff --git a/python/ql/test/3/library-tests/modules/usage/main.py b/python/ql/test/3/library-tests/modules/usage/main.py new file mode 100644 index 00000000000..171fd01402f --- /dev/null +++ b/python/ql/test/3/library-tests/modules/usage/main.py @@ -0,0 +1,5 @@ +import imported + +if __name__ == "__main__": + imported.func() + print('Done') diff --git a/python/ql/test/3/library-tests/modules/usage/myscript.py b/python/ql/test/3/library-tests/modules/usage/myscript.py new file mode 100755 index 00000000000..0eb83a9dadb --- /dev/null +++ b/python/ql/test/3/library-tests/modules/usage/myscript.py @@ -0,0 +1,3 @@ +#!/usr/bin/env python + +print("I'm actually a script you see ;)") diff --git a/python/ql/test/3/library-tests/modules/usage/options b/python/ql/test/3/library-tests/modules/usage/options new file mode 100644 index 00000000000..50ecfd75dd5 --- /dev/null +++ b/python/ql/test/3/library-tests/modules/usage/options @@ -0,0 +1 @@ +semmle-extractor-options: --lang=3 -F script diff --git a/python/ql/test/3/library-tests/modules/usage/script b/python/ql/test/3/library-tests/modules/usage/script new file mode 100755 index 00000000000..b5ec8d6f2aa --- /dev/null +++ b/python/ql/test/3/library-tests/modules/usage/script @@ -0,0 +1,3 @@ +#!/usr/bin/env python + +print('Under construction :)') From 4256fbf11ad9d9a105a5f751eb7bf446eee19185 Mon Sep 17 00:00:00 2001 From: Rasmus Wriedt Larsen Date: Wed, 15 Nov 2023 11:42:01 +0100 Subject: [PATCH 060/202] Python: Accept changes from Python 3.12 --- .../ql/test/3/library-tests/PointsTo/imports/Runtime.expected | 2 +- .../3/library-tests/PointsTo/imports/RuntimeWithType.expected | 2 +- .../ql/test/3/library-tests/modules/usage/ModuleUsage.expected | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/python/ql/test/3/library-tests/PointsTo/imports/Runtime.expected b/python/ql/test/3/library-tests/PointsTo/imports/Runtime.expected index 345f112dccb..f1dcc270a3e 100644 --- a/python/ql/test/3/library-tests/PointsTo/imports/Runtime.expected +++ b/python/ql/test/3/library-tests/PointsTo/imports/Runtime.expected @@ -53,5 +53,5 @@ | test.py | 27 | ControlFlowNode for ImportExpr | Module sys | ControlFlowNode for ImportExpr | | test.py | 31 | ControlFlowNode for argv | list object | ControlFlowNode for from sys import * | | test.py | 33 | ControlFlowNode for ImportExpr | Module socket | ControlFlowNode for ImportExpr | -| test.py | 34 | ControlFlowNode for timeout | builtin-class socket.timeout | ControlFlowNode for from _socket import * | +| test.py | 34 | ControlFlowNode for timeout | builtin-class TimeoutError | ControlFlowNode for from _socket import * | | x.py | 2 | ControlFlowNode for ImportExpr | Module sys | ControlFlowNode for ImportExpr | diff --git a/python/ql/test/3/library-tests/PointsTo/imports/RuntimeWithType.expected b/python/ql/test/3/library-tests/PointsTo/imports/RuntimeWithType.expected index 7082c15e410..60cc3c6b52d 100644 --- a/python/ql/test/3/library-tests/PointsTo/imports/RuntimeWithType.expected +++ b/python/ql/test/3/library-tests/PointsTo/imports/RuntimeWithType.expected @@ -53,5 +53,5 @@ | test.py | 27 | ControlFlowNode for ImportExpr | Module sys | builtin-class module | ControlFlowNode for ImportExpr | | test.py | 31 | ControlFlowNode for argv | list object | builtin-class list | ControlFlowNode for from sys import * | | test.py | 33 | ControlFlowNode for ImportExpr | Module socket | builtin-class module | ControlFlowNode for ImportExpr | -| test.py | 34 | ControlFlowNode for timeout | builtin-class socket.timeout | builtin-class type | ControlFlowNode for from _socket import * | +| test.py | 34 | ControlFlowNode for timeout | builtin-class TimeoutError | builtin-class type | ControlFlowNode for from _socket import * | | x.py | 2 | ControlFlowNode for ImportExpr | Module sys | builtin-class module | ControlFlowNode for ImportExpr | diff --git a/python/ql/test/3/library-tests/modules/usage/ModuleUsage.expected b/python/ql/test/3/library-tests/modules/usage/ModuleUsage.expected index ae241915998..9ba2d6fdffb 100644 --- a/python/ql/test/3/library-tests/modules/usage/ModuleUsage.expected +++ b/python/ql/test/3/library-tests/modules/usage/ModuleUsage.expected @@ -1,4 +1,5 @@ | file://:0:0:0:0 | Module sys | isUsedAsModule | +| file://:0:0:0:0 | Module sys.monitoring | isUsedAsModule | | imported.py:0:0:0:0 | Module imported | isUsedAsModule | | main.py:0:0:0:0 | Module main | isUsedAsScript | | myscript.py:0:0:0:0 | Script myscript | isUsedAsScript | From 7a001f4905a1a81d2c3c4cff6685e2581f08ef2d Mon Sep 17 00:00:00 2001 From: Tamas Vajk Date: Wed, 15 Nov 2023 10:55:58 +0100 Subject: [PATCH 061/202] C#: Fix assembly attribute extraction in standalone mode --- .../Populators/TypeContainerVisitor.cs | 4 +++- .../standalone/assemblyattribute/attr.expected | 2 ++ .../standalone/assemblyattribute/attr.ql | 5 +++++ .../standalone/assemblyattribute/options | 1 + .../standalone/assemblyattribute/standalone.cs | 12 ++++++++++++ 5 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 csharp/ql/test/library-tests/standalone/assemblyattribute/attr.expected create mode 100644 csharp/ql/test/library-tests/standalone/assemblyattribute/attr.ql create mode 100644 csharp/ql/test/library-tests/standalone/assemblyattribute/options create mode 100644 csharp/ql/test/library-tests/standalone/assemblyattribute/standalone.cs 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/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 +{ +} From a46a7fadb262d228afb55d731f808f7d390dfbc9 Mon Sep 17 00:00:00 2001 From: Max Schaefer Date: Mon, 13 Nov 2023 14:49:54 +0000 Subject: [PATCH 062/202] Java: Improve QHelp for `java/path-injection` to mention less disruptive fixes. --- .../src/Security/CWE/CWE-022/TaintedPath.java | 16 ++------- .../Security/CWE/CWE-022/TaintedPath.qhelp | 35 ++++++++++++------- .../Security/CWE/CWE-022/TaintedPathGood.java | 14 ++++++++ .../CWE-022/semmle/tests/TaintedPath.expected | 12 +++++++ .../CWE-022/semmle/tests/TaintedPath.java | 35 +++++++++++++++++++ .../security/CWE-022/semmle/tests/Test.java | 8 +++++ 6 files changed, 93 insertions(+), 27 deletions(-) create mode 100644 java/ql/src/Security/CWE/CWE-022/TaintedPathGood.java create mode 100644 java/ql/test/query-tests/security/CWE-022/semmle/tests/TaintedPath.java 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..46a7a6d60cf 100644 --- a/java/ql/src/Security/CWE/CWE-022/TaintedPath.qhelp +++ b/java/ql/src/Security/CWE/CWE-022/TaintedPath.qhelp @@ -13,27 +13,36 @@ such as "..". Such a path may potentially point to any directory on the file sys -

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 the use case.

+ +

If you want to allow paths spanning multiple folders, 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 these would allow +the path to escape the root folder.

+ +

A safer (but more restrictive) option is to use an allow list of safe paths and make sure that +the user input is one of those paths.

-

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 the user's home directory) is not enough, +however, since the path could contain relative components such as "..". For example, the string +"/home/[user]/../../etc/passwd" starts with the user's home directory, but would still result in the code reading +the file located at "/etc/passwd".

+ +

To fix this, we check that the user-provided path does not contain ".." and starts with the user's home directory.

+ + +
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..dbd851846ce --- /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 (!filePath.contains("..") && filePath.startsWith("/home/" + user + "/public/")) { + BufferedReader fileReader = new BufferedReader(new FileReader(filePath)); + String fileLine = fileReader.readLine(); + while(fileLine != null) { + sock.getOutputStream().write(fileLine.getBytes()); + fileLine = fileReader.readLine(); + } + } +} diff --git a/java/ql/test/query-tests/security/CWE-022/semmle/tests/TaintedPath.expected b/java/ql/test/query-tests/security/CWE-022/semmle/tests/TaintedPath.expected index 8ebc5a03a31..ff2a1aee759 100644 --- a/java/ql/test/query-tests/security/CWE-022/semmle/tests/TaintedPath.expected +++ b/java/ql/test/query-tests/security/CWE-022/semmle/tests/TaintedPath.expected @@ -1,4 +1,9 @@ edges +| TaintedPath.java:11:38:11:110 | new BufferedReader(...) : BufferedReader | TaintedPath.java:12:24:12:37 | filenameReader : BufferedReader | +| TaintedPath.java:11:57:11:109 | new InputStreamReader(...) : InputStreamReader | TaintedPath.java:11:38:11:110 | new BufferedReader(...) : BufferedReader | +| TaintedPath.java:11:79:11:99 | getInputStream(...) : InputStream | TaintedPath.java:11:57:11:109 | new InputStreamReader(...) : InputStreamReader | +| TaintedPath.java:12:24:12:37 | filenameReader : BufferedReader | TaintedPath.java:12:24:12:48 | readLine(...) : String | +| TaintedPath.java:12:24:12:48 | readLine(...) : String | TaintedPath.java:14:68:14:75 | filename | | Test.java:19:18:19:38 | getHostName(...) : String | Test.java:24:20:24:23 | temp | | Test.java:19:18:19:38 | getHostName(...) : String | Test.java:27:21:27:24 | temp | | Test.java:19:18:19:38 | getHostName(...) : String | Test.java:30:44:30:47 | temp | @@ -184,6 +189,12 @@ edges | mad/Test.java:221:26:221:33 | source(...) : String | mad/Test.java:221:19:221:33 | (...)... | | mad/Test.java:226:29:226:36 | source(...) : String | mad/Test.java:226:20:226:36 | (...)... | nodes +| TaintedPath.java:11:38:11:110 | new BufferedReader(...) : BufferedReader | semmle.label | new BufferedReader(...) : BufferedReader | +| TaintedPath.java:11:57:11:109 | new InputStreamReader(...) : InputStreamReader | semmle.label | new InputStreamReader(...) : InputStreamReader | +| TaintedPath.java:11:79:11:99 | getInputStream(...) : InputStream | semmle.label | getInputStream(...) : InputStream | +| TaintedPath.java:12:24:12:37 | filenameReader : BufferedReader | semmle.label | filenameReader : BufferedReader | +| TaintedPath.java:12:24:12:48 | readLine(...) : String | semmle.label | readLine(...) : String | +| TaintedPath.java:14:68:14:75 | filename | semmle.label | filename | | Test.java:19:18:19:38 | getHostName(...) : String | semmle.label | getHostName(...) : String | | Test.java:24:20:24:23 | temp | semmle.label | temp | | Test.java:27:21:27:24 | temp | semmle.label | temp | @@ -375,6 +386,7 @@ nodes | mad/Test.java:226:29:226:36 | source(...) : String | semmle.label | source(...) : String | subpaths #select +| TaintedPath.java:14:53:14:76 | new FileReader(...) | TaintedPath.java:11:79:11:99 | getInputStream(...) : InputStream | TaintedPath.java:14:68:14:75 | filename | This path depends on a $@. | TaintedPath.java:11:79:11:99 | getInputStream(...) | user-provided value | | Test.java:24:11:24:24 | new File(...) | Test.java:19:18:19:38 | getHostName(...) : String | Test.java:24:20:24:23 | temp | This path depends on a $@. | Test.java:19:18:19:38 | getHostName(...) | user-provided value | | Test.java:27:11:27:25 | get(...) | Test.java:19:18:19:38 | getHostName(...) : String | Test.java:27:21:27:24 | temp | This path depends on a $@. | Test.java:19:18:19:38 | getHostName(...) | user-provided value | | Test.java:30:11:30:48 | getPath(...) | Test.java:19:18:19:38 | getHostName(...) : String | Test.java:30:44:30:47 | temp | This path depends on a $@. | Test.java:19:18:19:38 | getHostName(...) | user-provided value | diff --git a/java/ql/test/query-tests/security/CWE-022/semmle/tests/TaintedPath.java b/java/ql/test/query-tests/security/CWE-022/semmle/tests/TaintedPath.java new file mode 100644 index 00000000000..2c97312cb76 --- /dev/null +++ b/java/ql/test/query-tests/security/CWE-022/semmle/tests/TaintedPath.java @@ -0,0 +1,35 @@ +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.InputStreamReader; +import java.net.Socket; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.io.IOException; + +public class TaintedPath { + public void sendUserFile(Socket sock, String user) throws IOException { + BufferedReader filenameReader = new BufferedReader(new InputStreamReader(sock.getInputStream(), "UTF-8")); + String filename = filenameReader.readLine(); + // 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 sendUserFileGood(Socket sock, String user) throws IOException { + BufferedReader filenameReader = new BufferedReader(new InputStreamReader(sock.getInputStream(), "UTF-8")); + String filePath = filenameReader.readLine(); + // GOOD: ensure that the file is in a designated folder in the user's home directory + if (!filePath.contains("..") && filePath.startsWith("/home/" + user + "/public/")) { + BufferedReader fileReader = new BufferedReader(new FileReader(filePath)); + String fileLine = fileReader.readLine(); + while(fileLine != null) { + sock.getOutputStream().write(fileLine.getBytes()); + fileLine = fileReader.readLine(); + } + } + } +} diff --git a/java/ql/test/query-tests/security/CWE-022/semmle/tests/Test.java b/java/ql/test/query-tests/security/CWE-022/semmle/tests/Test.java index 446c9b50a35..080cc263f08 100644 --- a/java/ql/test/query-tests/security/CWE-022/semmle/tests/Test.java +++ b/java/ql/test/query-tests/security/CWE-022/semmle/tests/Test.java @@ -101,4 +101,12 @@ class Test { new File(new URI(null, null, null, 0, t, null, null)); } + void doGet6(String root, InetAddress address) + throws IOException{ + String temp = address.getHostName(); + // GOOD: Use `contains` and `startsWith` to check if the path is safe + if (!temp.contains("..") && temp.startsWith(root + "/")) { + File file = new File(temp); + } + } } From 118d50236f8cf3b45b6def8bcd9ae0e53518e04c Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Wed, 15 Nov 2023 11:48:37 +0000 Subject: [PATCH 063/202] C++: Add failing tests. --- .../ReturnStackAllocatedMemory/test.cpp | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) 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..6818300d10d 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 [NOT DETECTED] +} + +char *strdupa(const char *); +char *strndupa(const char *, size_t); + +char* test_strdupa(const char* s) { + return strdupa(s); // BAD [NOT DETECTED] +} + +void* test_strndupa(const char* s, size_t size) { + char* s2 = strndupa(s, size); + return s2; // BAD [NOT DETECTED] } \ No newline at end of file From 6730f57d5c2166dfdb60e99d7e5a4b4f4d4620e6 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Wed, 15 Nov 2023 11:51:57 +0000 Subject: [PATCH 064/202] C++: Also flag up 'alloca' and friends. --- .../ReturnStackAllocatedMemory.ql | 32 ++++++++++++------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/cpp/ql/src/Likely Bugs/Memory Management/ReturnStackAllocatedMemory.ql b/cpp/ql/src/Likely Bugs/Memory Management/ReturnStackAllocatedMemory.ql index af4bd8c61a3..37908e566ca 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"]) 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() From 2b8b5cf1b84efcf0eaca767cfb76ed15798cc521 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Wed, 15 Nov 2023 11:52:14 +0000 Subject: [PATCH 065/202] C++: Accept test changes. --- .../ReturnStackAllocatedMemory.expected | 16 ++++++++++++++++ .../ReturnStackAllocatedMemory/test.cpp | 6 +++--- 2 files changed, 19 insertions(+), 3 deletions(-) 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 6818300d10d..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 @@ -235,17 +235,17 @@ void *alloca(size_t); void* test_alloca() { void* p = alloca(10); - return p; // BAD [NOT DETECTED] + return p; // BAD } char *strdupa(const char *); char *strndupa(const char *, size_t); char* test_strdupa(const char* s) { - return strdupa(s); // BAD [NOT DETECTED] + return strdupa(s); // BAD } void* test_strndupa(const char* s, size_t size) { char* s2 = strndupa(s, size); - return s2; // BAD [NOT DETECTED] + return s2; // BAD } \ No newline at end of file From ec63099c54e8a38f9dd13527bd55c584d46b3b5e Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Wed, 15 Nov 2023 11:57:09 +0000 Subject: [PATCH 066/202] C++: Add change note. --- .../change-notes/2023-11-15-return-stack-allocated-memory.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 cpp/ql/lib/change-notes/2023-11-15-return-stack-allocated-memory.md diff --git a/cpp/ql/lib/change-notes/2023-11-15-return-stack-allocated-memory.md b/cpp/ql/lib/change-notes/2023-11-15-return-stack-allocated-memory.md new file mode 100644 index 00000000000..5d59d89d2ba --- /dev/null +++ b/cpp/ql/lib/change-notes/2023-11-15-return-stack-allocated-memory.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* 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`. \ No newline at end of file From bae7e10e463c7e62e80f60daa5b5508f3eddf076 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Wed, 15 Nov 2023 12:07:17 +0000 Subject: [PATCH 067/202] C++: Also add MSVC-related 'alloca'-like functions. --- .../Likely Bugs/Memory Management/ReturnStackAllocatedMemory.ql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cpp/ql/src/Likely Bugs/Memory Management/ReturnStackAllocatedMemory.ql b/cpp/ql/src/Likely Bugs/Memory Management/ReturnStackAllocatedMemory.ql index 37908e566ca..16679d67fd2 100644 --- a/cpp/ql/src/Likely Bugs/Memory Management/ReturnStackAllocatedMemory.ql +++ b/cpp/ql/src/Likely Bugs/Memory Management/ReturnStackAllocatedMemory.ql @@ -44,7 +44,7 @@ class ReturnStackAllocatedMemoryConfig extends MustFlowConfiguration { // `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"]) and + call.getTarget().hasGlobalName(["alloca", "strdupa", "strndupa", "_alloca", "_malloca"]) and source.getUnconvertedResultExpression() = call ) ) From ae6c95ff952150a4723c8c3ffda09235348f6778 Mon Sep 17 00:00:00 2001 From: Rasmus Wriedt Larsen Date: Wed, 15 Nov 2023 12:40:52 +0100 Subject: [PATCH 068/202] Python: Fix `asyncio.coroutine` deprecation Was removed in 3.11, see https://docs.python.org/3.10/library/asyncio-task.html#asyncio.coroutine I couldn't make the __awwait__ actually give the result to the agen function... I also tried looking into https://docs.python.org/3/library/types.html#types.coroutine, but also failed to make that work. Without the Future, such as doing `yield SOURCE` inside `__await__` it complains `RuntimeError: Task got bad yield: 'source'` --- .../experimental/dataflow/coverage/datamodel.py | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/python/ql/test/experimental/dataflow/coverage/datamodel.py b/python/ql/test/experimental/dataflow/coverage/datamodel.py index 370fb32ca99..89d9b0a819a 100644 --- a/python/ql/test/experimental/dataflow/coverage/datamodel.py +++ b/python/ql/test/experimental/dataflow/coverage/datamodel.py @@ -186,14 +186,20 @@ SINK(asyncio.run(c.coro(SOURCE))) # $ MISSING: flow class A: def __await__(self): - # yield SOURCE -- see https://groups.google.com/g/dev-python/c/_lrrc-vp9TI?pli=1 - return (yield from asyncio.coroutine(lambda: SOURCE)()) + fut = asyncio.Future() + fut.set_result(SOURCE) + yield from fut -async def agen(x): +async def atest_custom_await_impl(): a = A() - return await a + x = await a + # TODO: Figure out how to actually return something from our custom __await__ + # implementation. The problem is we have to play nicely with the asyncio framework, + # which have their own expectations on what a return value from __await__ should look + # like. + assert x is None + SINK_F(x) -SINK(asyncio.run(agen(SOURCE))) # $ MISSING: flow # Asynchronous generator functions # A function or method which is defined using async def and which uses the yield statement is called a asynchronous generator function. Such a function, when called, returns an asynchronous iterator object which can be used in an async for statement to execute the body of the function. From 0f1dc9b2d90a57b0a1041a086ba22b16c46df15d Mon Sep 17 00:00:00 2001 From: Rasmus Wriedt Larsen Date: Wed, 15 Nov 2023 13:09:48 +0100 Subject: [PATCH 069/202] Python: Add missing options file --- python/ql/test/query-tests/Summary/options | 1 + 1 file changed, 1 insertion(+) create mode 100644 python/ql/test/query-tests/Summary/options diff --git a/python/ql/test/query-tests/Summary/options b/python/ql/test/query-tests/Summary/options new file mode 100644 index 00000000000..cfef58cf2b2 --- /dev/null +++ b/python/ql/test/query-tests/Summary/options @@ -0,0 +1 @@ +semmle-extractor-options: --max-import-depth=1 --lang=3 From e02c32f3d4b79826c8f9c4289a9f202ad819c0bb Mon Sep 17 00:00:00 2001 From: Rasmus Wriedt Larsen Date: Wed, 15 Nov 2023 14:24:11 +0100 Subject: [PATCH 070/202] Python: options file was not enough, split into 2/3 I reckon this is due to the Python 3 version used by the Python 2 tests is different from 3.12, so even with --lang=3 the tests are still using an incompatible version :( --- .../query-tests/Summary/LinesOfCode.expected | 1 + .../query-tests/Summary/LinesOfCode.qlref | 0 .../Summary/LinesOfUserCode.expected | 0 .../query-tests/Summary/LinesOfUserCode.qlref | 0 .../query-tests/Summary/also_python_code | 0 .../{ => 2}/query-tests/Summary/my_file.py | 0 .../{ => 2}/query-tests/Summary/not_python | 0 .../query-tests/Summary/LinesOfCode.expected | 0 .../3/query-tests/Summary/LinesOfCode.qlref | 1 + .../Summary/LinesOfUserCode.expected | 1 + .../query-tests/Summary/LinesOfUserCode.qlref | 1 + .../3/query-tests/Summary/also_python_code | 7 +++++ .../ql/test/3/query-tests/Summary/my_file.py | 26 +++++++++++++++++++ .../ql/test/3/query-tests/Summary/not_python | 5 ++++ python/ql/test/query-tests/Summary/options | 1 - 15 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 python/ql/test/2/query-tests/Summary/LinesOfCode.expected rename python/ql/test/{ => 2}/query-tests/Summary/LinesOfCode.qlref (100%) rename python/ql/test/{ => 2}/query-tests/Summary/LinesOfUserCode.expected (100%) rename python/ql/test/{ => 2}/query-tests/Summary/LinesOfUserCode.qlref (100%) rename python/ql/test/{ => 2}/query-tests/Summary/also_python_code (100%) rename python/ql/test/{ => 2}/query-tests/Summary/my_file.py (100%) rename python/ql/test/{ => 2}/query-tests/Summary/not_python (100%) rename python/ql/test/{ => 3}/query-tests/Summary/LinesOfCode.expected (100%) create mode 100644 python/ql/test/3/query-tests/Summary/LinesOfCode.qlref create mode 100644 python/ql/test/3/query-tests/Summary/LinesOfUserCode.expected create mode 100644 python/ql/test/3/query-tests/Summary/LinesOfUserCode.qlref create mode 100755 python/ql/test/3/query-tests/Summary/also_python_code create mode 100644 python/ql/test/3/query-tests/Summary/my_file.py create mode 100755 python/ql/test/3/query-tests/Summary/not_python delete mode 100644 python/ql/test/query-tests/Summary/options diff --git a/python/ql/test/2/query-tests/Summary/LinesOfCode.expected b/python/ql/test/2/query-tests/Summary/LinesOfCode.expected new file mode 100644 index 00000000000..5aa95ec1ce5 --- /dev/null +++ b/python/ql/test/2/query-tests/Summary/LinesOfCode.expected @@ -0,0 +1 @@ +| 38 | diff --git a/python/ql/test/query-tests/Summary/LinesOfCode.qlref b/python/ql/test/2/query-tests/Summary/LinesOfCode.qlref similarity index 100% rename from python/ql/test/query-tests/Summary/LinesOfCode.qlref rename to python/ql/test/2/query-tests/Summary/LinesOfCode.qlref diff --git a/python/ql/test/query-tests/Summary/LinesOfUserCode.expected b/python/ql/test/2/query-tests/Summary/LinesOfUserCode.expected similarity index 100% rename from python/ql/test/query-tests/Summary/LinesOfUserCode.expected rename to python/ql/test/2/query-tests/Summary/LinesOfUserCode.expected diff --git a/python/ql/test/query-tests/Summary/LinesOfUserCode.qlref b/python/ql/test/2/query-tests/Summary/LinesOfUserCode.qlref similarity index 100% rename from python/ql/test/query-tests/Summary/LinesOfUserCode.qlref rename to python/ql/test/2/query-tests/Summary/LinesOfUserCode.qlref diff --git a/python/ql/test/query-tests/Summary/also_python_code b/python/ql/test/2/query-tests/Summary/also_python_code similarity index 100% rename from python/ql/test/query-tests/Summary/also_python_code rename to python/ql/test/2/query-tests/Summary/also_python_code diff --git a/python/ql/test/query-tests/Summary/my_file.py b/python/ql/test/2/query-tests/Summary/my_file.py similarity index 100% rename from python/ql/test/query-tests/Summary/my_file.py rename to python/ql/test/2/query-tests/Summary/my_file.py diff --git a/python/ql/test/query-tests/Summary/not_python b/python/ql/test/2/query-tests/Summary/not_python similarity index 100% rename from python/ql/test/query-tests/Summary/not_python rename to python/ql/test/2/query-tests/Summary/not_python diff --git a/python/ql/test/query-tests/Summary/LinesOfCode.expected b/python/ql/test/3/query-tests/Summary/LinesOfCode.expected similarity index 100% rename from python/ql/test/query-tests/Summary/LinesOfCode.expected rename to python/ql/test/3/query-tests/Summary/LinesOfCode.expected diff --git a/python/ql/test/3/query-tests/Summary/LinesOfCode.qlref b/python/ql/test/3/query-tests/Summary/LinesOfCode.qlref new file mode 100644 index 00000000000..b60eb791722 --- /dev/null +++ b/python/ql/test/3/query-tests/Summary/LinesOfCode.qlref @@ -0,0 +1 @@ +Summary/LinesOfCode.ql diff --git a/python/ql/test/3/query-tests/Summary/LinesOfUserCode.expected b/python/ql/test/3/query-tests/Summary/LinesOfUserCode.expected new file mode 100644 index 00000000000..74c7709367a --- /dev/null +++ b/python/ql/test/3/query-tests/Summary/LinesOfUserCode.expected @@ -0,0 +1 @@ +| 11 | diff --git a/python/ql/test/3/query-tests/Summary/LinesOfUserCode.qlref b/python/ql/test/3/query-tests/Summary/LinesOfUserCode.qlref new file mode 100644 index 00000000000..baaa947e6af --- /dev/null +++ b/python/ql/test/3/query-tests/Summary/LinesOfUserCode.qlref @@ -0,0 +1 @@ +Summary/LinesOfUserCode.ql diff --git a/python/ql/test/3/query-tests/Summary/also_python_code b/python/ql/test/3/query-tests/Summary/also_python_code new file mode 100755 index 00000000000..1ced5f9ded3 --- /dev/null +++ b/python/ql/test/3/query-tests/Summary/also_python_code @@ -0,0 +1,7 @@ +#!/usr/bin/env python + +# although this is actually Python code, it is not included by the extractor by default. + +print("this is also code") + +print("but just dummy code") diff --git a/python/ql/test/3/query-tests/Summary/my_file.py b/python/ql/test/3/query-tests/Summary/my_file.py new file mode 100644 index 00000000000..949cca2c87a --- /dev/null +++ b/python/ql/test/3/query-tests/Summary/my_file.py @@ -0,0 +1,26 @@ +""" +module level docstring + +is not included +""" +# this line is not code + +# `tty` was chosen for stability over python versions (so we don't get diffrent results +# on different computers, that has different versions of Python). +# +# According to https://github.com/python/cpython/tree/master/Lib (at 2021-04-23) `tty` +# was last changed in 2001, so chances of this being changed in the future are slim. +import tty + +s = """ +all these lines are code +""" + +print(s) + +def func(): + """ + this string is a doc-string. Although the module-level docstring is not considered + code, this one apparently is ¯\_(ツ)_/¯ + """ + pass diff --git a/python/ql/test/3/query-tests/Summary/not_python b/python/ql/test/3/query-tests/Summary/not_python new file mode 100755 index 00000000000..45dbc9b269a --- /dev/null +++ b/python/ql/test/3/query-tests/Summary/not_python @@ -0,0 +1,5 @@ +#!/bin/bash + +# Although this is valid python code, it should not be counted as such. + +print("foo") diff --git a/python/ql/test/query-tests/Summary/options b/python/ql/test/query-tests/Summary/options deleted file mode 100644 index cfef58cf2b2..00000000000 --- a/python/ql/test/query-tests/Summary/options +++ /dev/null @@ -1 +0,0 @@ -semmle-extractor-options: --max-import-depth=1 --lang=3 From e349891cff16406af7abcfce0e8d6e90667fe7c3 Mon Sep 17 00:00:00 2001 From: Rasmus Wriedt Larsen Date: Wed, 15 Nov 2023 14:35:52 +0100 Subject: [PATCH 071/202] Python: Apply suggestions from code review --- .../ql/test/library-tests/frameworks/baize/FileSystemAccess.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/python/ql/test/library-tests/frameworks/baize/FileSystemAccess.py b/python/ql/test/library-tests/frameworks/baize/FileSystemAccess.py index d2808292acf..7e1f7e0f0be 100644 --- a/python/ql/test/library-tests/frameworks/baize/FileSystemAccess.py +++ b/python/ql/test/library-tests/frameworks/baize/FileSystemAccess.py @@ -1,4 +1,3 @@ from baize.asgi import FileResponse as baizeFileResponse -baizeFileResponse("file") # $ getAPathArgument="file" -FileSystemAccess \ No newline at end of file +baizeFileResponse("file") # $ getAPathArgument="file" \ No newline at end of file From 92c18960c54396807e0ad75698fb490999a12e58 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Mon, 23 Oct 2023 11:59:03 +0200 Subject: [PATCH 072/202] C++: Rewrite `cpp/uncontrolled-process-operation` to not use `DefaultTaintTracking` --- .../CWE-114/UncontrolledProcessOperation.ql | 38 +++-- .../UncontrolledProcessOperation.expected | 23 +-- .../UncontrolledProcessOperation.expected | 146 +++++------------- 3 files changed, 75 insertions(+), 132 deletions(-) diff --git a/cpp/ql/src/Security/CWE/CWE-114/UncontrolledProcessOperation.ql b/cpp/ql/src/Security/CWE/CWE-114/UncontrolledProcessOperation.ql index 883a6b07423..ff07189a66f 100644 --- a/cpp/ql/src/Security/CWE/CWE-114/UncontrolledProcessOperation.ql +++ b/cpp/ql/src/Security/CWE/CWE-114/UncontrolledProcessOperation.ql @@ -14,25 +14,43 @@ 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, _) } +module Config implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node node) { + node instanceof FlowSource and not node instanceof DataFlow::ExprNode + } + + 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 + } } -from string processOperation, Expr arg, Expr source, PathNode sourceNode, PathNode sinkNode +module Flow = TaintTracking::Global; + +from + string processOperation, 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 + 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() 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..27e991f6174 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 | call to getenv indirection | 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..b9f97d92713 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,48 @@ 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 | (reference dereference) 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 | (reference dereference) indirection | semmle.label | (reference dereference) 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 | call to getenv indirection | +| 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 | call to getenv indirection | +| 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 | fgets output argument | +| 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 | fgets output argument | +| test.cpp:64:10:64:16 | (reference dereference) indirection | test.cpp:56:12:56:17 | fgets output argument | test.cpp:64:10:64:16 | (reference dereference) indirection | The value of this argument may come from $@ and is being passed to system. | test.cpp:56:12:56:17 | fgets output argument | fgets output argument | +| 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 | fgets output argument | +| 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 | fgets output argument | +| 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 | fgets output argument | +| 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 | recv output argument | +| 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 | recv output argument | +| 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 | call to fgets indirection | From 46e6e7259339beaed13fc46cd35c63fa9e39bf51 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Wed, 15 Nov 2023 13:34:22 +0100 Subject: [PATCH 073/202] C++: Address review comments --- .../CWE-114/UncontrolledProcessOperation.ql | 16 +++++++++----- .../UncontrolledProcessOperation.expected | 2 +- .../UncontrolledProcessOperation.expected | 22 +++++++++---------- 3 files changed, 22 insertions(+), 18 deletions(-) diff --git a/cpp/ql/src/Security/CWE/CWE-114/UncontrolledProcessOperation.ql b/cpp/ql/src/Security/CWE/CWE-114/UncontrolledProcessOperation.ql index ff07189a66f..3e1c62b02c2 100644 --- a/cpp/ql/src/Security/CWE/CWE-114/UncontrolledProcessOperation.ql +++ b/cpp/ql/src/Security/CWE/CWE-114/UncontrolledProcessOperation.ql @@ -27,10 +27,13 @@ predicate isProcessOperationExplanation(DataFlow::Node arg, string processOperat ) } +predicate isSource(FlowSource source, string sourceType) { + not source instanceof DataFlow::ExprNode and + sourceType = source.getSourceType() +} + module Config implements DataFlow::ConfigSig { - predicate isSource(DataFlow::Node node) { - node instanceof FlowSource and not node instanceof DataFlow::ExprNode - } + predicate isSource(DataFlow::Node node) { isSource(node, _) } predicate isSink(DataFlow::Node node) { isProcessOperationExplanation(node, _) } @@ -44,13 +47,14 @@ module Config implements DataFlow::ConfigSig { module Flow = TaintTracking::Global; from - string processOperation, DataFlow::Node source, DataFlow::Node sink, Flow::PathNode sourceNode, - Flow::PathNode sinkNode + string processOperation, string sourceType, DataFlow::Node source, DataFlow::Node sink, + Flow::PathNode sourceNode, Flow::PathNode sinkNode where 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/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 27e991f6174..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 @@ -9,4 +9,4 @@ nodes | test.cpp:73:24:73:27 | data indirection | semmle.label | data indirection | subpaths #select -| 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 | call to getenv indirection | +| 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 b9f97d92713..b30de4bceba 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 @@ -35,14 +35,14 @@ nodes | test.cpp:114:9:114:11 | ptr indirection | semmle.label | ptr indirection | subpaths #select -| 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 | call to getenv indirection | -| 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 | call to getenv indirection | -| 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 | fgets output argument | -| 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 | fgets output argument | -| test.cpp:64:10:64:16 | (reference dereference) indirection | test.cpp:56:12:56:17 | fgets output argument | test.cpp:64:10:64:16 | (reference dereference) indirection | The value of this argument may come from $@ and is being passed to system. | test.cpp:56:12:56:17 | fgets output argument | fgets output argument | -| 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 | fgets output argument | -| 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 | fgets output argument | -| 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 | fgets output argument | -| 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 | recv output argument | -| 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 | recv output argument | -| 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 | call to fgets indirection | +| 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 | (reference dereference) indirection | test.cpp:56:12:56:17 | fgets output argument | test.cpp:64:10:64:16 | (reference dereference) 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 | From 5af3e119a6536af8d7bfd1898f0c0df0bf170874 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Wed, 15 Nov 2023 14:57:53 +0000 Subject: [PATCH 074/202] Test value flow through SliceExpr with array content --- .../go/dataflow/ArrayConversion/main.go | 8 +++- .../dataflow/SliceExpressions/Flows.expected | 0 .../go/dataflow/SliceExpressions/Flows.ql | 3 ++ .../go/dataflow/SliceExpressions/main.go | 45 +++++++++++++++++++ 4 files changed, 54 insertions(+), 2 deletions(-) create mode 100644 go/ql/test/library-tests/semmle/go/dataflow/SliceExpressions/Flows.expected create mode 100644 go/ql/test/library-tests/semmle/go/dataflow/SliceExpressions/Flows.ql create mode 100644 go/ql/test/library-tests/semmle/go/dataflow/SliceExpressions/main.go 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 7cb366a50db..09409f2c580 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[:]) + alias := [2]string(a[:]) sink(alias[0]) // $ hasTaintFlow="index expression" + sink(alias[1]) // $ SPURIOUS: hasTaintFlow="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]) // $ 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/go/ql/test/library-tests/semmle/go/dataflow/SliceExpressions/Flows.expected b/go/ql/test/library-tests/semmle/go/dataflow/SliceExpressions/Flows.expected new file mode 100644 index 00000000000..e69de29bb2d 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..e010b192bcc --- /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]) // $ hasTaintFlow="index expression" + sink(slice[1]) // $ SPURIOUS: hasTaintFlow="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]) // $ hasTaintFlow="index expression" + sink(slice[1]) // $ SPURIOUS: hasTaintFlow="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]) // $ hasTaintFlow="index expression" + sink(slice[1]) // $ SPURIOUS: hasTaintFlow="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]) // $ hasTaintFlow="index expression" + sink(slice[1]) // $ SPURIOUS: hasTaintFlow="index expression" // we don't distinguish different elements of arrays or slices + sink(slice) // $ hasTaintFlow="slice" +} From 2b897a9825b6334f1fb916badaa5a7e60d5be012 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Wed, 15 Nov 2023 14:02:58 +0000 Subject: [PATCH 075/202] Add synthetic SliceElementNode --- .../go/dataflow/internal/DataFlowNodes.qll | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) 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. */ From aaa8f9c41fb4af8cfb01a7535b5f116cce3c35f6 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Wed, 15 Nov 2023 14:26:29 +0000 Subject: [PATCH 076/202] Add read and store steps for SliceElementNode --- .../semmle/go/dataflow/internal/ContainerFlow.qll | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/go/ql/lib/semmle/go/dataflow/internal/ContainerFlow.qll b/go/ql/lib/semmle/go/dataflow/internal/ContainerFlow.qll index 3a0bc45b16e..ad985e2c5b5 100644 --- a/go/ql/lib/semmle/go/dataflow/internal/ContainerFlow.qll +++ b/go/ql/lib/semmle/go/dataflow/internal/ContainerFlow.qll @@ -24,6 +24,13 @@ predicate containerStoreStep(Node node1, Node node2, Content c) { 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 From e0879969c96627914d6237bfb2da97143b2e8b64 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Wed, 15 Nov 2023 15:08:48 +0000 Subject: [PATCH 077/202] Update tests --- .../semmle/go/dataflow/ArrayConversion/main.go | 4 ++-- .../semmle/go/dataflow/SliceExpressions/main.go | 16 ++++++++-------- 2 files changed, 10 insertions(+), 10 deletions(-) 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 09409f2c580..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 @@ -16,8 +16,8 @@ func main() { var a [4]string a[0] = source() alias := [2]string(a[:]) - sink(alias[0]) // $ hasTaintFlow="index expression" - sink(alias[1]) // $ SPURIOUS: hasTaintFlow="index expression" // we don't distinguish different elements of arrays or slices + 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 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 index e010b192bcc..4fff6d1ce50 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/SliceExpressions/main.go +++ b/go/ql/test/library-tests/semmle/go/dataflow/SliceExpressions/main.go @@ -15,31 +15,31 @@ func main() { func arrayBase(base [4]string) { base[1] = source() slice := base[1:4] - sink(slice[0]) // $ hasTaintFlow="index expression" - sink(slice[1]) // $ SPURIOUS: hasTaintFlow="index expression" // we don't distinguish different elements of arrays or slices + 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]) // $ hasTaintFlow="index expression" - sink(slice[1]) // $ SPURIOUS: hasTaintFlow="index expression" // we don't distinguish different elements of arrays or slices + 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]) // $ hasTaintFlow="index expression" - sink(slice[1]) // $ SPURIOUS: hasTaintFlow="index expression" // we don't distinguish different elements of arrays or slices + 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]) // $ hasTaintFlow="index expression" - sink(slice[1]) // $ SPURIOUS: hasTaintFlow="index expression" // we don't distinguish different elements of arrays or slices + 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" } From 1ac3a9e8d372907ae4ea7b1b32d48ec11ea13250 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Wed, 15 Nov 2023 15:12:58 +0000 Subject: [PATCH 078/202] Add change note --- .../2023-11-15-bug-fix-value-flow-in-slice-expression.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 go/ql/lib/change-notes/2023-11-15-bug-fix-value-flow-in-slice-expression.md 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. From 64bf6cc62bcf72d8d2439fd488e3372446bad8be Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Wed, 15 Nov 2023 15:33:09 +0000 Subject: [PATCH 079/202] Update existing test (extra nodes, no extra alerts) --- .../CWE-078/CommandInjection.expected | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) 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 | From f66f7ce8d780aaead90bcad69ba714b1e6d8f15d Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Tue, 7 Nov 2023 14:28:38 +0100 Subject: [PATCH 080/202] Shared: Split up `TypeTracking.qll` into two files --- .../codeql/typetracking/TypeTracking.qll | 823 +---------------- .../internal/TypeTrackingImpl.qll | 841 ++++++++++++++++++ 2 files changed, 851 insertions(+), 813 deletions(-) create mode 100644 shared/typetracking/codeql/typetracking/internal/TypeTrackingImpl.qll diff --git a/shared/typetracking/codeql/typetracking/TypeTracking.qll b/shared/typetracking/codeql/typetracking/TypeTracking.qll index 94cca417a86..60205e9e7da 100644 --- a/shared/typetracking/codeql/typetracking/TypeTracking.qll +++ b/shared/typetracking/codeql/typetracking/TypeTracking.qll @@ -3,9 +3,6 @@ * for tracking types. */ -private import codeql.util.Boolean -private import codeql.util.Option - /** * The step relations for type tracking. */ @@ -118,832 +115,32 @@ signature module TypeTrackingInput { predicate hasFeatureBacktrackStoreTarget(); } +private import internal.TypeTrackingImpl as Impl + /** * Given a set of step relations, this module provides classes and predicates * for simple data-flow reachability suitable for tracking types. */ module TypeTracking { - private import I + private module MkImpl = Impl::TypeTracking; - /** Provides consistency checks for the type-tracker step relations. */ - module ConsistencyChecks { - private predicate stepEntry(Node n, string kind) { - simpleLocalSmallStep(n, _) and kind = "simpleLocalSmallStep" - or - exists(StepSummary ss | smallStep(n, _, ss) and kind = ss.toString()) - or - hasFeatureBacktrackStoreTarget() and - kind = "storeTarget" and - (storeStep(_, n, _) or loadStoreStep(_, n, _, _)) - } + deprecated module ConsistencyChecks = MkImpl::ConsistencyChecks; - /** - * Holds if there is any node in a step relation that is unreachable from a - * `LocalSourceNode`. - */ - query predicate unreachableNode(string msg) { - exists(int k, string kind | - k = strictcount(Node n | stepEntry(n, kind) and not flowsTo(_, n)) and - msg = "There are " + k + " unreachable nodes in steps of kind " + kind + "." - ) - } + class TypeTracker = MkImpl::TypeTracker; - /** - * Holds if there is a store target that isn't a `LocalSourceNode` and - * backtracking store target feature isn't enabled. - */ - query predicate nonSourceStoreTarget(string msg) { - not hasFeatureBacktrackStoreTarget() and - exists(int k | - k = - strictcount(Node n | - not n instanceof LocalSourceNode and - (storeStep(_, n, _) or loadStoreStep(_, n, _, _)) - ) and - msg = - "There are " + k + - " store targets that are not local source nodes and backtracking store targets is not enabled." - ) - } - } + module TypeTracker = MkImpl::TypeTracker; - private module ContentOption = Option; + class TypeBackTracker = MkImpl::TypeBackTracker; - private class ContentOption = ContentOption::Option; + module TypeBackTracker = MkImpl::TypeBackTracker; - private newtype TStepSummary = - LevelStep() or - CallStep() or - ReturnStep() or - StoreStep(Content content) { storeStep(_, _, content) } or - LoadStep(Content content) { loadStep(_, _, content) } or - LoadStoreStep(Content load, Content store) { loadStoreStep(_, _, load, store) } or - WithContent(ContentFilter filter) { withContentStep(_, _, filter) } or - WithoutContent(ContentFilter filter) { withoutContentStep(_, _, filter) } or - JumpStep() - - /** - * A description of a step on an inter-procedural data flow path. - */ - private class StepSummary extends TStepSummary { - /** Gets a textual representation of this step summary. */ - string toString() { - this instanceof LevelStep and result = "level" - or - this instanceof CallStep and result = "call" - or - this instanceof ReturnStep and result = "return" - or - exists(Content content | this = StoreStep(content) | result = "store " + content) - or - exists(Content content | this = LoadStep(content) | result = "load " + content) - or - exists(Content load, Content store | - this = LoadStoreStep(load, store) and - result = "load-store " + load + " -> " + store - ) - or - this instanceof JumpStep and result = "jump" - } - } - - private newtype TTypeTracker = - MkTypeTracker(Boolean hasCall, ContentOption content) { - content.isNone() - or - // Restrict `content` to those that might eventually match a load. - // We can't rely on `basicStoreStep` since `startInContent` might be used with - // a content that has no corresponding store. - exists(Content loadContents | - ( - loadStep(_, _, loadContents) - or - loadStoreStep(_, _, loadContents, _) - ) and - compatibleContents(content.asSome(), loadContents) - ) - } - - private newtype TTypeBackTracker = - MkTypeBackTracker(Boolean hasReturn, ContentOption content) { - content.isNone() - or - // As in MkTypeTracker, restrict `content` to those that might eventually match a store. - exists(Content storeContent | - ( - storeStep(_, _, storeContent) - or - loadStoreStep(_, _, _, storeContent) - ) and - compatibleContents(storeContent, content.asSome()) - ) - } - - pragma[nomagic] - private TypeTracker noContentTypeTracker(boolean hasCall) { - result = MkTypeTracker(hasCall, any(ContentOption::None c)) - } - - pragma[nomagic] - private TypeTracker contentTypeTracker(boolean hasCall, Content c) { - result = MkTypeTracker(hasCall, ContentOption::some(c)) - } - - /** Gets the summary resulting from appending `step` to type-tracking summary `tt`. */ - pragma[nomagic] - private TypeTracker append(TypeTracker tt, StepSummary step) { - exists(Boolean hasCall, ContentOption currentContents | - tt = MkTypeTracker(hasCall, currentContents) - | - step = LevelStep() and result = tt - or - step = CallStep() and result = MkTypeTracker(true, currentContents) - or - step = ReturnStep() and hasCall = false and result = tt - or - step = JumpStep() and - result = MkTypeTracker(false, currentContents) - or - exists(ContentFilter filter | result = tt | - step = WithContent(filter) and - currentContents.asSome() = filter.getAMatchingContent() - or - step = WithoutContent(filter) and - not currentContents.asSome() = filter.getAMatchingContent() - ) - ) - or - exists(Content storeContents, boolean hasCall | - exists(Content loadContents | - step = LoadStep(pragma[only_bind_into](loadContents)) and - tt = contentTypeTracker(hasCall, storeContents) and - compatibleContents(storeContents, loadContents) and - result = noContentTypeTracker(hasCall) - ) - or - step = StoreStep(pragma[only_bind_into](storeContents)) and - tt = noContentTypeTracker(hasCall) and - result = contentTypeTracker(hasCall, storeContents) - ) - or - exists(Content currentContent, Content store, Content load, boolean hasCall | - step = LoadStoreStep(pragma[only_bind_into](load), pragma[only_bind_into](store)) and - compatibleContents(pragma[only_bind_into](currentContent), load) and - tt = contentTypeTracker(pragma[only_bind_into](hasCall), currentContent) and - result = contentTypeTracker(pragma[only_bind_out](hasCall), store) - ) - } - - pragma[nomagic] - private TypeBackTracker noContentTypeBackTracker(boolean hasReturn) { - result = MkTypeBackTracker(hasReturn, any(ContentOption::None c)) - } - - pragma[nomagic] - private TypeBackTracker contentTypeBackTracker(boolean hasReturn, Content c) { - result = MkTypeBackTracker(hasReturn, ContentOption::some(c)) - } - - /** Gets the summary resulting from prepending `step` to this type-tracking summary. */ - pragma[nomagic] - private TypeBackTracker prepend(TypeBackTracker tbt, StepSummary step) { - exists(Boolean hasReturn, ContentOption content | tbt = MkTypeBackTracker(hasReturn, content) | - step = LevelStep() and result = tbt - or - step = CallStep() and hasReturn = false and result = tbt - or - step = ReturnStep() and result = MkTypeBackTracker(true, content) - or - step = JumpStep() and - result = MkTypeBackTracker(false, content) - or - exists(ContentFilter filter | result = tbt | - step = WithContent(filter) and - content.asSome() = filter.getAMatchingContent() - or - step = WithoutContent(filter) and - not content.asSome() = filter.getAMatchingContent() - ) - ) - or - exists(Content loadContents, boolean hasReturn | - exists(Content storeContents | - step = StoreStep(pragma[only_bind_into](storeContents)) and - tbt = contentTypeBackTracker(hasReturn, loadContents) and - compatibleContents(storeContents, loadContents) and - result = noContentTypeBackTracker(hasReturn) - ) - or - step = LoadStep(pragma[only_bind_into](loadContents)) and - tbt = noContentTypeBackTracker(hasReturn) and - result = contentTypeBackTracker(hasReturn, loadContents) - ) - or - exists(Content currentContent, Content store, Content load, boolean hasCall | - step = LoadStoreStep(pragma[only_bind_into](load), pragma[only_bind_into](store)) and - compatibleContents(store, pragma[only_bind_into](currentContent)) and - tbt = contentTypeBackTracker(pragma[only_bind_into](hasCall), currentContent) and - result = contentTypeBackTracker(pragma[only_bind_out](hasCall), load) - ) - } - - pragma[inline] - private predicate isLocalSourceNode(LocalSourceNode n) { any() } - - /** - * Holds if there is flow from `localSource` to `dst` using zero or more - * `simpleLocalSmallStep`s. - */ - pragma[nomagic] - predicate flowsTo(LocalSourceNode localSource, Node dst) { - // explicit type check in base case to avoid repeated type tests in recursive case - isLocalSourceNode(localSource) and - dst = localSource - or - exists(Node mid | - flowsTo(localSource, mid) and - simpleLocalSmallStep(mid, dst) - ) - } - - pragma[nomagic] - private predicate storeStepIntoSource(Node nodeFrom, LocalSourceNode nodeTo, Content c) { - if hasFeatureBacktrackStoreTarget() - then - exists(Node obj | - flowsTo(nodeTo, obj) and - storeStep(nodeFrom, obj, c) - ) - else storeStep(nodeFrom, nodeTo, c) - } - - pragma[nomagic] - private predicate loadStoreStepIntoSource( - Node nodeFrom, LocalSourceNode nodeTo, Content c1, Content c2 - ) { - if hasFeatureBacktrackStoreTarget() - then - exists(Node obj | - flowsTo(nodeTo, obj) and - loadStoreStep(nodeFrom, obj, c1, c2) - ) - else loadStoreStep(nodeFrom, nodeTo, c1, c2) - } - - pragma[nomagic] - private predicate smallStepNoCall(Node nodeFrom, LocalSourceNode nodeTo, StepSummary summary) { - levelStepNoCall(nodeFrom, nodeTo) and summary = LevelStep() - or - exists(Content content | - storeStepIntoSource(nodeFrom, nodeTo, content) and - summary = StoreStep(content) - ) - or - exists(Content content | - loadStep(nodeFrom, nodeTo, content) and - summary = LoadStep(content) - ) - or - exists(Content content1, Content content2 | - loadStoreStepIntoSource(nodeFrom, nodeTo, content1, content2) and - summary = LoadStoreStep(content1, content2) - ) - or - exists(ContentFilter filter | - withContentStep(nodeFrom, nodeTo, filter) and - summary = WithContent(filter) - ) - or - exists(ContentFilter filter | - withoutContentStep(nodeFrom, nodeTo, filter) and - summary = WithoutContent(filter) - ) - or - jumpStep(nodeFrom, nodeTo) and summary = JumpStep() - } - - pragma[nomagic] - private predicate smallStepCall(Node nodeFrom, LocalSourceNode nodeTo, StepSummary summary) { - levelStepCall(nodeFrom, nodeTo) and summary = LevelStep() - or - callStep(nodeFrom, nodeTo) and summary = CallStep() - or - returnStep(nodeFrom, nodeTo) and summary = ReturnStep() - } - - pragma[nomagic] - private predicate stepNoCall(LocalSourceNode nodeFrom, LocalSourceNode nodeTo, StepSummary summary) { - exists(Node mid | flowsTo(nodeFrom, mid) and smallStepNoCall(mid, nodeTo, summary)) - } - - pragma[nomagic] - private predicate stepCall(LocalSourceNode nodeFrom, LocalSourceNode nodeTo, StepSummary summary) { - exists(Node mid | flowsTo(nodeFrom, mid) and smallStepCall(mid, nodeTo, summary)) - } - - pragma[inline] - private predicate smallStepSplit(Node nodeFrom, LocalSourceNode nodeTo, StepSummary summary) { - smallStepCall(nodeFrom, nodeTo, summary) or smallStepNoCall(nodeFrom, nodeTo, summary) - } - - pragma[inline] - private predicate stepSplit(LocalSourceNode nodeFrom, LocalSourceNode nodeTo, StepSummary summary) { - stepNoCall(nodeFrom, nodeTo, summary) or stepCall(nodeFrom, nodeTo, summary) - } - - pragma[nomagic] - private predicate smallStep(Node nodeFrom, LocalSourceNode nodeTo, StepSummary summary) { - smallStepSplit(nodeFrom, nodeTo, summary) - } - - pragma[nomagic] - private predicate step(LocalSourceNode nodeFrom, LocalSourceNode nodeTo, StepSummary summary) { - stepSplit(nodeFrom, nodeTo, summary) - } - - pragma[nomagic] - private predicate stepProj(LocalSourceNode nodeFrom, StepSummary summary) { - step(nodeFrom, _, summary) - } - - bindingset[t, nodeFrom] - pragma[inline_late] - pragma[noopt] - private TypeTracker stepInlineLate(TypeTracker t, LocalSourceNode nodeFrom, LocalSourceNode nodeTo) { - exists(StepSummary summary | - stepProj(nodeFrom, summary) and - result = append(t, summary) and - step(nodeFrom, nodeTo, summary) - ) - } - - pragma[nomagic] - private predicate smallStepProj(Node nodeFrom, StepSummary summary) { - smallStep(nodeFrom, _, summary) - } - - bindingset[t, nodeFrom] - pragma[inline_late] - pragma[noopt] - private TypeTracker smallStepInlineLate(TypeTracker t, Node nodeFrom, LocalSourceNode nodeTo) { - exists(StepSummary summary | - smallStepProj(nodeFrom, summary) and - result = append(t, summary) and - smallStep(nodeFrom, nodeTo, summary) - ) - } - - /** - * A summary of the steps needed to track a value to a given dataflow node. - * - * This can be used to track objects that implement a certain API in order to - * recognize calls to that API. Note that type-tracking does not by itself provide a - * source/sink relation, that is, it may determine that a node has a given type, - * but it won't determine where that type came from. - * - * It is recommended that all uses of this type are written in the following form, - * for tracking some type `myType`: - * ```ql - * Node myType(TypeTracker tt) { - * tt.start() and - * result = < source of myType > - * or - * exists(TypeTracker tt2 | - * tt = tt2.step(myType(tt2), result) - * ) - * } - * - * Node myType() { myType(TypeTracker::end()).flowsTo(result) } - * ``` - * - * If you want to track individual intra-procedural steps, use `tt2.smallstep` - * instead of `tt2.step`. - */ - class TypeTracker extends TTypeTracker { - private Boolean hasCall; - private ContentOption content; - - TypeTracker() { this = MkTypeTracker(hasCall, content) } - - /** Gets a textual representation of this summary. */ - string toString() { - exists(string withCall, string withContent | - (if hasCall = true then withCall = "with" else withCall = "without") and - ( - withContent = " with content " + content.asSome() - or - content instanceof ContentOption::None and - withContent = "" - ) and - result = "type tracker " + withCall + " call steps" + withContent - ) - } - - /** - * Holds if this is the starting point of type tracking. - */ - predicate start() { hasCall = false and content.isNone() } - - /** - * Holds if this is the starting point of type tracking, and the value starts in the content named `contentName`. - * The type tracking only ends after the content has been loaded. - */ - predicate startInContent(Content contentName) { - hasCall = false and content = ContentOption::some(contentName) - } - - /** - * Holds if this is the starting point of type tracking - * when tracking a parameter into a call, but not out of it. - */ - predicate call() { hasCall = true and content.isNone() } - - /** - * Holds if this is the end point of type tracking. - */ - predicate end() { content.isNone() } - - /** - * INTERNAL. DO NOT USE. - * - * Gets the content associated with this type tracker. - */ - ContentOption getContent() { result = content } - - /** - * Gets a type tracker that starts where this one has left off to allow continued - * tracking. - * - * This predicate is only defined if the type is not associated to a piece of content. - */ - TypeTracker continue() { content.isNone() and result = this } - - /** - * Gets the summary that corresponds to having taken a forwards - * heap and/or inter-procedural step from `nodeFrom` to `nodeTo`. - */ - pragma[inline] - TypeTracker step(LocalSourceNode nodeFrom, LocalSourceNode nodeTo) { - result = stepInlineLate(this, nodeFrom, nodeTo) - } - - /** - * Gets the summary that corresponds to having taken a forwards - * local, heap and/or inter-procedural step from `nodeFrom` to `nodeTo`. - * - * Unlike `TypeTracker::step`, this predicate exposes all edges - * in the flow graph, and not just the edges between `Node`s. - * It may therefore be less performant. - * - * Type tracking predicates using small steps typically take the following form: - * ```ql - * Node myType(TypeTracker tt) { - * tt.start() and - * result = < source of myType > - * or - * exists(TypeTracker tt2 | - * tt = tt2.smallstep(myType(tt2), result) - * ) - * } - * - * Node myType() { - * result = myType(TypeTracker::end()) - * } - * ``` - */ - pragma[inline] - TypeTracker smallstep(Node nodeFrom, Node nodeTo) { - result = smallStepInlineLate(this, nodeFrom, nodeTo) - or - simpleLocalSmallStep(nodeFrom, nodeTo) and - result = this - } - } - - /** Provides predicates for implementing custom `TypeTracker`s. */ - module TypeTracker { - /** - * Gets a valid end point of type tracking. - */ - TypeTracker end() { result.end() } - } - - pragma[nomagic] - private predicate backStepProj(LocalSourceNode nodeTo, StepSummary summary) { - step(_, nodeTo, summary) - } - - bindingset[t, nodeTo] - pragma[inline_late] - pragma[noopt] - private TypeBackTracker backStepInlineLate( - TypeBackTracker t, LocalSourceNode nodeFrom, LocalSourceNode nodeTo - ) { - exists(StepSummary summary | - backStepProj(nodeTo, summary) and - result = prepend(t, summary) and - step(nodeFrom, nodeTo, summary) - ) - } - - pragma[nomagic] - private predicate backSmallStepProj(LocalSourceNode nodeTo, StepSummary summary) { - smallStep(_, nodeTo, summary) - } - - bindingset[t, nodeTo] - pragma[inline_late] - pragma[noopt] - private TypeBackTracker backSmallStepInlineLate( - TypeBackTracker t, Node nodeFrom, LocalSourceNode nodeTo - ) { - exists(StepSummary summary | - backSmallStepProj(nodeTo, summary) and - result = prepend(t, summary) and - smallStep(nodeFrom, nodeTo, summary) - ) - } - - /** - * A summary of the steps needed to back-track a use of a value to a given dataflow node. - * - * This can for example be used to track callbacks that are passed to a certain API, - * so we can model specific parameters of that callback as having a certain type. - * - * Note that type back-tracking does not provide a source/sink relation, that is, - * it may determine that a node will be used in an API call somewhere, but it won't - * determine exactly where that use was, or the path that led to the use. - * - * It is recommended that all uses of this type are written in the following form, - * for back-tracking some callback type `myCallback`: - * - * ```ql - * Node myCallback(TypeBackTracker t) { - * t.start() and - * result = (< some API call >).getArgument(< n >).getALocalSource() - * or - * exists(TypeBackTracker t2 | - * t = t2.step(result, myCallback(t2)) - * ) - * } - * - * Node myCallback() { result = myCallback(TypeBackTracker::end()) } - * ``` - * - * If you want to track individual intra-procedural steps, use `t2.smallstep` - * instead of `t2.step`. - */ - class TypeBackTracker extends TTypeBackTracker { - private Boolean hasReturn; - private ContentOption content; - - TypeBackTracker() { this = MkTypeBackTracker(hasReturn, content) } - - /** Gets a textual representation of this summary. */ - string toString() { - exists(string withReturn, string withContent | - (if hasReturn = true then withReturn = "with" else withReturn = "without") and - ( - withContent = " with content " + content.asSome() - or - content instanceof ContentOption::None and - withContent = "" - ) and - result = "type back-tracker " + withReturn + " return steps" + withContent - ) - } - - /** - * Holds if this is the starting point of type tracking. - */ - predicate start() { hasReturn = false and content.isNone() } - - /** - * Holds if this is the end point of type tracking. - */ - predicate end() { content.isNone() } - - /** - * Gets a type tracker that starts where this one has left off to allow continued - * tracking. - * - * This predicate is only defined if the type has not been tracked into a piece of content. - */ - TypeBackTracker continue() { content.isNone() and result = this } - - /** - * Gets the summary that corresponds to having taken a backwards - * heap and/or inter-procedural step from `nodeTo` to `nodeFrom`. - */ - pragma[inline] - TypeBackTracker step(LocalSourceNode nodeFrom, LocalSourceNode nodeTo) { - result = backStepInlineLate(this, nodeFrom, nodeTo) - } - - /** - * Gets the summary that corresponds to having taken a backwards - * local, heap and/or inter-procedural step from `nodeTo` to `nodeFrom`. - * - * Unlike `TypeBackTracker::step`, this predicate exposes all edges - * in the flowgraph, and not just the edges between - * `TypeTrackingNode`s. It may therefore be less performant. - * - * Type tracking predicates using small steps typically take the following form: - * ```ql - * Node myType(TypeBackTracker t) { - * t.start() and - * result = < some API call >.getArgument(< n >) - * or - * exists (TypeBackTracker t2 | - * t = t2.smallstep(result, myType(t2)) - * ) - * } - * - * Node myType() { - * result = myType(DataFlow::TypeBackTracker::end()) - * } - * ``` - */ - pragma[inline] - TypeBackTracker smallstep(Node nodeFrom, Node nodeTo) { - result = backSmallStepInlineLate(this, nodeFrom, nodeTo) - or - simpleLocalSmallStep(nodeFrom, nodeTo) and - result = this - } - - /** - * Gets a forwards summary that is compatible with this backwards summary. - * That is, if this summary describes the steps needed to back-track a value - * from `sink` to `mid`, and the result is a valid summary of the steps needed - * to track a value from `source` to `mid`, then the value from `source` may - * also flow to `sink`. - */ - TypeTracker getACompatibleTypeTracker() { - exists(boolean hasCall | result = MkTypeTracker(hasCall, content) | - hasCall = false or hasReturn = false - ) - } - } - - /** Provides predicates for implementing custom `TypeBackTracker`s. */ - module TypeBackTracker { - /** - * Gets a valid end point of type back-tracking. - */ - TypeBackTracker end() { result.end() } - } - - signature predicate endpoint(Node node); + signature predicate endpoint(I::Node node); /** * Given a source definition, constructs the default forward type tracking from * those sources. */ module TypeTrack { - pragma[nomagic] - private predicate sourceSimpleLocalSmallSteps(Node src, Node n) { - source(src) and - not src instanceof LocalSourceNode and - src = n - or - exists(Node mid | - sourceSimpleLocalSmallSteps(src, mid) and - simpleLocalSmallStep(mid, n) - ) - } - - private predicate firstStep(TypeTracker tt, Node src, LocalSourceNode n2) { - exists(Node n1, TypeTracker tt0 | - sourceSimpleLocalSmallSteps(src, n1) and - tt0.start() and - tt = smallStepInlineLate(tt0, n1, n2) - ) - } - - private Node flow(TypeTracker tt) { - tt.start() and source(result) - or - firstStep(tt, _, result) - or - exists(TypeTracker ttMid | tt = ttMid.step(flow(ttMid), result)) - } - - /** - * Holds if a source flows to `n`. - */ - predicate flowsTo(Node n) { - flowsTo(flow(TypeTracker::end()), n) or sourceSimpleLocalSmallSteps(_, n) - } - - /** - * Given a sink definition, constructs the relation of edges that can be used - * in a source-sink path and calculates the set of source-sink pairs. - */ - module Graph { - private newtype TPathNode = - TPathNodeMid(Node node, TypeTracker tt) { node = flow(tt) } or - TPathNodeSink(Node node) { sink(node) and flowsTo(node) } - - /** - * A node on a path that is reachable from a source. This is a pair of a - * `Node` and a `TypeTracker` except at sinks for which there is no `TypeTracker`. - */ - class PathNodeFwd extends TPathNode { - /** Gets the node of this `PathNode`. */ - Node getNode() { this = TPathNodeMid(result, _) or this = TPathNodeSink(result) } - - /** Gets the typetracker of this `PathNode`, if any. */ - TypeTracker getTypeTracker() { this = TPathNodeMid(_, result) } - - private string ppContent() { - exists(ContentOption c | this.getTypeTracker() = MkTypeTracker(_, c) | - result = " with content " + c.asSome() - or - c instanceof ContentOption::None and - result = "" - ) - or - result = "" and this instanceof TPathNodeSink - } - - /** Gets a textual representation of this node. */ - string toString() { result = this.getNode().toString() + this.ppContent() } - - /** Holds if this is a source. */ - predicate isSource() { - source(this.getNode()) and - (this.getTypeTracker().start() or this instanceof TPathNodeSink) - } - - /** Holds if this is a sink. */ - predicate isSink() { this instanceof TPathNodeSink } - } - - private predicate edgeCand(Node n1, TypeTracker tt1, Node n2, TypeTracker tt2) { - n1 = flow(tt1) and - ( - tt2 = tt1.step(n1, n2) - or - tt1.start() and firstStep(tt2, n1, n2) - ) - } - - private predicate edgeCand(PathNodeFwd n1, PathNodeFwd n2) { - exists(PathNodeFwd tgt | - edgeCand(n1.getNode(), n1.getTypeTracker(), tgt.getNode(), tgt.getTypeTracker()) - | - n2 = tgt - or - n2 = TPathNodeSink(tgt.getNode()) and tgt.getTypeTracker().end() - ) - or - n1.getTypeTracker().end() and - flowsTo(n1.getNode(), n2.getNode()) and - n1.getNode() != n2.getNode() and - n2 instanceof TPathNodeSink - or - sourceSimpleLocalSmallSteps(n1.getNode(), n2.getNode()) and - n1.getNode() != n2.getNode() and - n1.isSource() and - n2.isSink() - } - - private predicate reachRev(PathNodeFwd n) { - n.isSink() - or - exists(PathNodeFwd mid | - edgeCand(n, mid) and - reachRev(mid) - ) - } - - /** - * A node on a path that is reachable from a source and can reach a sink. - * This is a pair of a `Node` and a `TypeTracker`. - */ - class PathNode extends PathNodeFwd { - PathNode() { reachRev(this) } - } - - /** Holds if `(p1, p2)` is an edge in a path between a source and a sink. */ - query predicate edges(PathNode n1, PathNode n2) { edgeCand(n1, n2) } - - private predicate stepPlus(PathNode n1, PathNode n2) = fastTC(edges/2)(n1, n2) - - /** - * DEPRECATED: Use `flowPath` instead. - * - * Holds if there is a path between `source` and `sink`. - */ - deprecated predicate hasFlow(PathNode source, PathNode sink) { flowPath(source, sink) } - - /** Holds if there is a path between `source` and `sink`. */ - predicate flowPath(PathNode source, PathNode sink) { - source.isSource() and - sink.isSink() and - (source = sink or stepPlus(source, sink)) - } - } + import MkImpl::TypeTrack } } diff --git a/shared/typetracking/codeql/typetracking/internal/TypeTrackingImpl.qll b/shared/typetracking/codeql/typetracking/internal/TypeTrackingImpl.qll new file mode 100644 index 00000000000..f7c5e4188f2 --- /dev/null +++ b/shared/typetracking/codeql/typetracking/internal/TypeTrackingImpl.qll @@ -0,0 +1,841 @@ +/** + * Provides classes and predicates for simple data-flow reachability suitable + * for tracking types. + */ + +private import codeql.util.Boolean +private import codeql.util.Option +private import codeql.typetracking.TypeTracking + +/** + * Given a set of step relations, this module provides classes and predicates + * for simple data-flow reachability suitable for tracking types. + * + * The constructed module contains both public and internal logic; the public + * interface is exposed via `codeql.typetracking.TypeTracking`. + */ +module TypeTracking { + private import I + + /** Provides consistency checks for the type-tracker step relations. */ + module ConsistencyChecks { + private predicate stepEntry(Node n, string kind) { + simpleLocalSmallStep(n, _) and kind = "simpleLocalSmallStep" + or + exists(StepSummary ss | smallStep(n, _, ss) and kind = ss.toString()) + or + hasFeatureBacktrackStoreTarget() and + kind = "storeTarget" and + (storeStep(_, n, _) or loadStoreStep(_, n, _, _)) + } + + /** + * Holds if there is any node in a step relation that is unreachable from a + * `LocalSourceNode`. + */ + query predicate unreachableNode(string msg) { + exists(int k, string kind | + k = strictcount(Node n | stepEntry(n, kind) and not flowsTo(_, n)) and + msg = "There are " + k + " unreachable nodes in steps of kind " + kind + "." + ) + } + + /** + * Holds if there is a store target that isn't a `LocalSourceNode` and + * backtracking store target feature isn't enabled. + */ + query predicate nonSourceStoreTarget(string msg) { + not hasFeatureBacktrackStoreTarget() and + exists(int k | + k = + strictcount(Node n | + not n instanceof LocalSourceNode and + (storeStep(_, n, _) or loadStoreStep(_, n, _, _)) + ) and + msg = + "There are " + k + + " store targets that are not local source nodes and backtracking store targets is not enabled." + ) + } + } + + private module ContentOption = Option; + + private class ContentOption = ContentOption::Option; + + private newtype TStepSummary = + LevelStep() or + CallStep() or + ReturnStep() or + StoreStep(Content content) { storeStep(_, _, content) } or + LoadStep(Content content) { loadStep(_, _, content) } or + LoadStoreStep(Content load, Content store) { loadStoreStep(_, _, load, store) } or + WithContent(ContentFilter filter) { withContentStep(_, _, filter) } or + WithoutContent(ContentFilter filter) { withoutContentStep(_, _, filter) } or + JumpStep() + + /** + * A description of a step on an inter-procedural data flow path. + */ + private class StepSummary extends TStepSummary { + /** Gets a textual representation of this step summary. */ + string toString() { + this instanceof LevelStep and result = "level" + or + this instanceof CallStep and result = "call" + or + this instanceof ReturnStep and result = "return" + or + exists(Content content | this = StoreStep(content) | result = "store " + content) + or + exists(Content content | this = LoadStep(content) | result = "load " + content) + or + exists(Content load, Content store | + this = LoadStoreStep(load, store) and + result = "load-store " + load + " -> " + store + ) + or + this instanceof JumpStep and result = "jump" + } + } + + private newtype TTypeTracker = + MkTypeTracker(Boolean hasCall, ContentOption content) { + content.isNone() + or + // Restrict `content` to those that might eventually match a load. + // We can't rely on `basicStoreStep` since `startInContent` might be used with + // a content that has no corresponding store. + exists(Content loadContents | + ( + loadStep(_, _, loadContents) + or + loadStoreStep(_, _, loadContents, _) + ) and + compatibleContents(content.asSome(), loadContents) + ) + } + + private newtype TTypeBackTracker = + MkTypeBackTracker(Boolean hasReturn, ContentOption content) { + content.isNone() + or + // As in MkTypeTracker, restrict `content` to those that might eventually match a store. + exists(Content storeContent | + ( + storeStep(_, _, storeContent) + or + loadStoreStep(_, _, _, storeContent) + ) and + compatibleContents(storeContent, content.asSome()) + ) + } + + pragma[nomagic] + private TypeTracker noContentTypeTracker(boolean hasCall) { + result = MkTypeTracker(hasCall, any(ContentOption::None c)) + } + + pragma[nomagic] + private TypeTracker contentTypeTracker(boolean hasCall, Content c) { + result = MkTypeTracker(hasCall, ContentOption::some(c)) + } + + /** Gets the summary resulting from appending `step` to type-tracking summary `tt`. */ + pragma[nomagic] + private TypeTracker append(TypeTracker tt, StepSummary step) { + exists(Boolean hasCall, ContentOption currentContents | + tt = MkTypeTracker(hasCall, currentContents) + | + step = LevelStep() and result = tt + or + step = CallStep() and result = MkTypeTracker(true, currentContents) + or + step = ReturnStep() and hasCall = false and result = tt + or + step = JumpStep() and + result = MkTypeTracker(false, currentContents) + or + exists(ContentFilter filter | result = tt | + step = WithContent(filter) and + currentContents.asSome() = filter.getAMatchingContent() + or + step = WithoutContent(filter) and + not currentContents.asSome() = filter.getAMatchingContent() + ) + ) + or + exists(Content storeContents, boolean hasCall | + exists(Content loadContents | + step = LoadStep(pragma[only_bind_into](loadContents)) and + tt = contentTypeTracker(hasCall, storeContents) and + compatibleContents(storeContents, loadContents) and + result = noContentTypeTracker(hasCall) + ) + or + step = StoreStep(pragma[only_bind_into](storeContents)) and + tt = noContentTypeTracker(hasCall) and + result = contentTypeTracker(hasCall, storeContents) + ) + or + exists(Content currentContent, Content store, Content load, boolean hasCall | + step = LoadStoreStep(pragma[only_bind_into](load), pragma[only_bind_into](store)) and + compatibleContents(pragma[only_bind_into](currentContent), load) and + tt = contentTypeTracker(pragma[only_bind_into](hasCall), currentContent) and + result = contentTypeTracker(pragma[only_bind_out](hasCall), store) + ) + } + + pragma[nomagic] + private TypeBackTracker noContentTypeBackTracker(boolean hasReturn) { + result = MkTypeBackTracker(hasReturn, any(ContentOption::None c)) + } + + pragma[nomagic] + private TypeBackTracker contentTypeBackTracker(boolean hasReturn, Content c) { + result = MkTypeBackTracker(hasReturn, ContentOption::some(c)) + } + + /** Gets the summary resulting from prepending `step` to this type-tracking summary. */ + pragma[nomagic] + private TypeBackTracker prepend(TypeBackTracker tbt, StepSummary step) { + exists(Boolean hasReturn, ContentOption content | tbt = MkTypeBackTracker(hasReturn, content) | + step = LevelStep() and result = tbt + or + step = CallStep() and hasReturn = false and result = tbt + or + step = ReturnStep() and result = MkTypeBackTracker(true, content) + or + step = JumpStep() and + result = MkTypeBackTracker(false, content) + or + exists(ContentFilter filter | result = tbt | + step = WithContent(filter) and + content.asSome() = filter.getAMatchingContent() + or + step = WithoutContent(filter) and + not content.asSome() = filter.getAMatchingContent() + ) + ) + or + exists(Content loadContents, boolean hasReturn | + exists(Content storeContents | + step = StoreStep(pragma[only_bind_into](storeContents)) and + tbt = contentTypeBackTracker(hasReturn, loadContents) and + compatibleContents(storeContents, loadContents) and + result = noContentTypeBackTracker(hasReturn) + ) + or + step = LoadStep(pragma[only_bind_into](loadContents)) and + tbt = noContentTypeBackTracker(hasReturn) and + result = contentTypeBackTracker(hasReturn, loadContents) + ) + or + exists(Content currentContent, Content store, Content load, boolean hasCall | + step = LoadStoreStep(pragma[only_bind_into](load), pragma[only_bind_into](store)) and + compatibleContents(store, pragma[only_bind_into](currentContent)) and + tbt = contentTypeBackTracker(pragma[only_bind_into](hasCall), currentContent) and + result = contentTypeBackTracker(pragma[only_bind_out](hasCall), load) + ) + } + + pragma[inline] + private predicate isLocalSourceNode(LocalSourceNode n) { any() } + + /** + * Holds if there is flow from `localSource` to `dst` using zero or more + * `simpleLocalSmallStep`s. + */ + pragma[nomagic] + predicate flowsTo(LocalSourceNode localSource, Node dst) { + // explicit type check in base case to avoid repeated type tests in recursive case + isLocalSourceNode(localSource) and + dst = localSource + or + exists(Node mid | + flowsTo(localSource, mid) and + simpleLocalSmallStep(mid, dst) + ) + } + + pragma[nomagic] + private predicate storeStepIntoSource(Node nodeFrom, LocalSourceNode nodeTo, Content c) { + if hasFeatureBacktrackStoreTarget() + then + exists(Node obj | + flowsTo(nodeTo, obj) and + storeStep(nodeFrom, obj, c) + ) + else storeStep(nodeFrom, nodeTo, c) + } + + pragma[nomagic] + private predicate loadStoreStepIntoSource( + Node nodeFrom, LocalSourceNode nodeTo, Content c1, Content c2 + ) { + if hasFeatureBacktrackStoreTarget() + then + exists(Node obj | + flowsTo(nodeTo, obj) and + loadStoreStep(nodeFrom, obj, c1, c2) + ) + else loadStoreStep(nodeFrom, nodeTo, c1, c2) + } + + pragma[nomagic] + private predicate smallStepNoCall(Node nodeFrom, LocalSourceNode nodeTo, StepSummary summary) { + levelStepNoCall(nodeFrom, nodeTo) and summary = LevelStep() + or + exists(Content content | + storeStepIntoSource(nodeFrom, nodeTo, content) and + summary = StoreStep(content) + ) + or + exists(Content content | + loadStep(nodeFrom, nodeTo, content) and + summary = LoadStep(content) + ) + or + exists(Content content1, Content content2 | + loadStoreStepIntoSource(nodeFrom, nodeTo, content1, content2) and + summary = LoadStoreStep(content1, content2) + ) + or + exists(ContentFilter filter | + withContentStep(nodeFrom, nodeTo, filter) and + summary = WithContent(filter) + ) + or + exists(ContentFilter filter | + withoutContentStep(nodeFrom, nodeTo, filter) and + summary = WithoutContent(filter) + ) + or + jumpStep(nodeFrom, nodeTo) and summary = JumpStep() + } + + pragma[nomagic] + private predicate smallStepCall(Node nodeFrom, LocalSourceNode nodeTo, StepSummary summary) { + levelStepCall(nodeFrom, nodeTo) and summary = LevelStep() + or + callStep(nodeFrom, nodeTo) and summary = CallStep() + or + returnStep(nodeFrom, nodeTo) and summary = ReturnStep() + } + + pragma[nomagic] + private predicate stepNoCall(LocalSourceNode nodeFrom, LocalSourceNode nodeTo, StepSummary summary) { + exists(Node mid | flowsTo(nodeFrom, mid) and smallStepNoCall(mid, nodeTo, summary)) + } + + pragma[nomagic] + private predicate stepCall(LocalSourceNode nodeFrom, LocalSourceNode nodeTo, StepSummary summary) { + exists(Node mid | flowsTo(nodeFrom, mid) and smallStepCall(mid, nodeTo, summary)) + } + + pragma[inline] + private predicate smallStepSplit(Node nodeFrom, LocalSourceNode nodeTo, StepSummary summary) { + smallStepCall(nodeFrom, nodeTo, summary) or smallStepNoCall(nodeFrom, nodeTo, summary) + } + + pragma[inline] + private predicate stepSplit(LocalSourceNode nodeFrom, LocalSourceNode nodeTo, StepSummary summary) { + stepNoCall(nodeFrom, nodeTo, summary) or stepCall(nodeFrom, nodeTo, summary) + } + + pragma[nomagic] + private predicate smallStep(Node nodeFrom, LocalSourceNode nodeTo, StepSummary summary) { + smallStepSplit(nodeFrom, nodeTo, summary) + } + + pragma[nomagic] + private predicate step(LocalSourceNode nodeFrom, LocalSourceNode nodeTo, StepSummary summary) { + stepSplit(nodeFrom, nodeTo, summary) + } + + pragma[nomagic] + private predicate stepProj(LocalSourceNode nodeFrom, StepSummary summary) { + step(nodeFrom, _, summary) + } + + bindingset[t, nodeFrom] + pragma[inline_late] + pragma[noopt] + private TypeTracker stepInlineLate(TypeTracker t, LocalSourceNode nodeFrom, LocalSourceNode nodeTo) { + exists(StepSummary summary | + stepProj(nodeFrom, summary) and + result = append(t, summary) and + step(nodeFrom, nodeTo, summary) + ) + } + + pragma[nomagic] + private predicate smallStepProj(Node nodeFrom, StepSummary summary) { + smallStep(nodeFrom, _, summary) + } + + bindingset[t, nodeFrom] + pragma[inline_late] + pragma[noopt] + private TypeTracker smallStepInlineLate(TypeTracker t, Node nodeFrom, LocalSourceNode nodeTo) { + exists(StepSummary summary | + smallStepProj(nodeFrom, summary) and + result = append(t, summary) and + smallStep(nodeFrom, nodeTo, summary) + ) + } + + /** + * A summary of the steps needed to track a value to a given dataflow node. + * + * This can be used to track objects that implement a certain API in order to + * recognize calls to that API. Note that type-tracking does not by itself provide a + * source/sink relation, that is, it may determine that a node has a given type, + * but it won't determine where that type came from. + * + * It is recommended that all uses of this type are written in the following form, + * for tracking some type `myType`: + * ```ql + * Node myType(TypeTracker tt) { + * tt.start() and + * result = < source of myType > + * or + * exists(TypeTracker tt2 | + * tt = tt2.step(myType(tt2), result) + * ) + * } + * + * Node myType() { myType(TypeTracker::end()).flowsTo(result) } + * ``` + * + * If you want to track individual intra-procedural steps, use `tt2.smallstep` + * instead of `tt2.step`. + */ + class TypeTracker extends TTypeTracker { + private Boolean hasCall; + private ContentOption content; + + TypeTracker() { this = MkTypeTracker(hasCall, content) } + + /** Gets a textual representation of this summary. */ + string toString() { + exists(string withCall, string withContent | + (if hasCall = true then withCall = "with" else withCall = "without") and + ( + withContent = " with content " + content.asSome() + or + content instanceof ContentOption::None and + withContent = "" + ) and + result = "type tracker " + withCall + " call steps" + withContent + ) + } + + /** + * Holds if this is the starting point of type tracking. + */ + predicate start() { hasCall = false and content.isNone() } + + /** + * Holds if this is the starting point of type tracking, and the value starts in the content named `contentName`. + * The type tracking only ends after the content has been loaded. + */ + predicate startInContent(Content contentName) { + hasCall = false and content = ContentOption::some(contentName) + } + + /** + * Holds if this is the starting point of type tracking + * when tracking a parameter into a call, but not out of it. + */ + predicate call() { hasCall = true and content.isNone() } + + /** + * Holds if this is the end point of type tracking. + */ + predicate end() { content.isNone() } + + /** + * INTERNAL. DO NOT USE. + * + * Gets the content associated with this type tracker. + */ + ContentOption getContent() { result = content } + + /** + * Gets a type tracker that starts where this one has left off to allow continued + * tracking. + * + * This predicate is only defined if the type is not associated to a piece of content. + */ + TypeTracker continue() { content.isNone() and result = this } + + /** + * Gets the summary that corresponds to having taken a forwards + * heap and/or inter-procedural step from `nodeFrom` to `nodeTo`. + */ + pragma[inline] + TypeTracker step(LocalSourceNode nodeFrom, LocalSourceNode nodeTo) { + result = stepInlineLate(this, nodeFrom, nodeTo) + } + + /** + * Gets the summary that corresponds to having taken a forwards + * local, heap and/or inter-procedural step from `nodeFrom` to `nodeTo`. + * + * Unlike `TypeTracker::step`, this predicate exposes all edges + * in the flow graph, and not just the edges between `Node`s. + * It may therefore be less performant. + * + * Type tracking predicates using small steps typically take the following form: + * ```ql + * Node myType(TypeTracker tt) { + * tt.start() and + * result = < source of myType > + * or + * exists(TypeTracker tt2 | + * tt = tt2.smallstep(myType(tt2), result) + * ) + * } + * + * Node myType() { + * result = myType(TypeTracker::end()) + * } + * ``` + */ + pragma[inline] + TypeTracker smallstep(Node nodeFrom, Node nodeTo) { + result = smallStepInlineLate(this, nodeFrom, nodeTo) + or + simpleLocalSmallStep(nodeFrom, nodeTo) and + result = this + } + } + + /** Provides predicates for implementing custom `TypeTracker`s. */ + module TypeTracker { + /** + * Gets a valid end point of type tracking. + */ + TypeTracker end() { result.end() } + } + + pragma[nomagic] + private predicate backStepProj(LocalSourceNode nodeTo, StepSummary summary) { + step(_, nodeTo, summary) + } + + bindingset[t, nodeTo] + pragma[inline_late] + pragma[noopt] + private TypeBackTracker backStepInlineLate( + TypeBackTracker t, LocalSourceNode nodeFrom, LocalSourceNode nodeTo + ) { + exists(StepSummary summary | + backStepProj(nodeTo, summary) and + result = prepend(t, summary) and + step(nodeFrom, nodeTo, summary) + ) + } + + pragma[nomagic] + private predicate backSmallStepProj(LocalSourceNode nodeTo, StepSummary summary) { + smallStep(_, nodeTo, summary) + } + + bindingset[t, nodeTo] + pragma[inline_late] + pragma[noopt] + private TypeBackTracker backSmallStepInlineLate( + TypeBackTracker t, Node nodeFrom, LocalSourceNode nodeTo + ) { + exists(StepSummary summary | + backSmallStepProj(nodeTo, summary) and + result = prepend(t, summary) and + smallStep(nodeFrom, nodeTo, summary) + ) + } + + /** + * A summary of the steps needed to back-track a use of a value to a given dataflow node. + * + * This can for example be used to track callbacks that are passed to a certain API, + * so we can model specific parameters of that callback as having a certain type. + * + * Note that type back-tracking does not provide a source/sink relation, that is, + * it may determine that a node will be used in an API call somewhere, but it won't + * determine exactly where that use was, or the path that led to the use. + * + * It is recommended that all uses of this type are written in the following form, + * for back-tracking some callback type `myCallback`: + * + * ```ql + * Node myCallback(TypeBackTracker t) { + * t.start() and + * result = (< some API call >).getArgument(< n >).getALocalSource() + * or + * exists(TypeBackTracker t2 | + * t = t2.step(result, myCallback(t2)) + * ) + * } + * + * Node myCallback() { result = myCallback(TypeBackTracker::end()) } + * ``` + * + * If you want to track individual intra-procedural steps, use `t2.smallstep` + * instead of `t2.step`. + */ + class TypeBackTracker extends TTypeBackTracker { + private Boolean hasReturn; + private ContentOption content; + + TypeBackTracker() { this = MkTypeBackTracker(hasReturn, content) } + + /** Gets a textual representation of this summary. */ + string toString() { + exists(string withReturn, string withContent | + (if hasReturn = true then withReturn = "with" else withReturn = "without") and + ( + withContent = " with content " + content.asSome() + or + content instanceof ContentOption::None and + withContent = "" + ) and + result = "type back-tracker " + withReturn + " return steps" + withContent + ) + } + + /** + * Holds if this is the starting point of type tracking. + */ + predicate start() { hasReturn = false and content.isNone() } + + /** + * Holds if this is the end point of type tracking. + */ + predicate end() { content.isNone() } + + /** + * Gets a type tracker that starts where this one has left off to allow continued + * tracking. + * + * This predicate is only defined if the type has not been tracked into a piece of content. + */ + TypeBackTracker continue() { content.isNone() and result = this } + + /** + * Gets the summary that corresponds to having taken a backwards + * heap and/or inter-procedural step from `nodeTo` to `nodeFrom`. + */ + pragma[inline] + TypeBackTracker step(LocalSourceNode nodeFrom, LocalSourceNode nodeTo) { + result = backStepInlineLate(this, nodeFrom, nodeTo) + } + + /** + * Gets the summary that corresponds to having taken a backwards + * local, heap and/or inter-procedural step from `nodeTo` to `nodeFrom`. + * + * Unlike `TypeBackTracker::step`, this predicate exposes all edges + * in the flowgraph, and not just the edges between + * `TypeTrackingNode`s. It may therefore be less performant. + * + * Type tracking predicates using small steps typically take the following form: + * ```ql + * Node myType(TypeBackTracker t) { + * t.start() and + * result = < some API call >.getArgument(< n >) + * or + * exists (TypeBackTracker t2 | + * t = t2.smallstep(result, myType(t2)) + * ) + * } + * + * Node myType() { + * result = myType(DataFlow::TypeBackTracker::end()) + * } + * ``` + */ + pragma[inline] + TypeBackTracker smallstep(Node nodeFrom, Node nodeTo) { + result = backSmallStepInlineLate(this, nodeFrom, nodeTo) + or + simpleLocalSmallStep(nodeFrom, nodeTo) and + result = this + } + + /** + * Gets a forwards summary that is compatible with this backwards summary. + * That is, if this summary describes the steps needed to back-track a value + * from `sink` to `mid`, and the result is a valid summary of the steps needed + * to track a value from `source` to `mid`, then the value from `source` may + * also flow to `sink`. + */ + TypeTracker getACompatibleTypeTracker() { + exists(boolean hasCall | result = MkTypeTracker(hasCall, content) | + hasCall = false or hasReturn = false + ) + } + } + + /** Provides predicates for implementing custom `TypeBackTracker`s. */ + module TypeBackTracker { + /** + * Gets a valid end point of type back-tracking. + */ + TypeBackTracker end() { result.end() } + } + + signature predicate endpoint(Node node); + + /** + * Given a source definition, constructs the default forward type tracking from + * those sources. + */ + module TypeTrack { + pragma[nomagic] + private predicate sourceSimpleLocalSmallSteps(Node src, Node n) { + source(src) and + not src instanceof LocalSourceNode and + src = n + or + exists(Node mid | + sourceSimpleLocalSmallSteps(src, mid) and + simpleLocalSmallStep(mid, n) + ) + } + + private predicate firstStep(TypeTracker tt, Node src, LocalSourceNode n2) { + exists(Node n1, TypeTracker tt0 | + sourceSimpleLocalSmallSteps(src, n1) and + tt0.start() and + tt = smallStepInlineLate(tt0, n1, n2) + ) + } + + private Node flow(TypeTracker tt) { + tt.start() and source(result) + or + firstStep(tt, _, result) + or + exists(TypeTracker ttMid | tt = ttMid.step(flow(ttMid), result)) + } + + /** + * Holds if a source flows to `n`. + */ + predicate flowsTo(Node n) { + flowsTo(flow(TypeTracker::end()), n) or sourceSimpleLocalSmallSteps(_, n) + } + + /** + * Given a sink definition, constructs the relation of edges that can be used + * in a source-sink path and calculates the set of source-sink pairs. + */ + module Graph { + private newtype TPathNode = + TPathNodeMid(Node node, TypeTracker tt) { node = flow(tt) } or + TPathNodeSink(Node node) { sink(node) and flowsTo(node) } + + /** + * A node on a path that is reachable from a source. This is a pair of a + * `Node` and a `TypeTracker` except at sinks for which there is no `TypeTracker`. + */ + class PathNodeFwd extends TPathNode { + /** Gets the node of this `PathNode`. */ + Node getNode() { this = TPathNodeMid(result, _) or this = TPathNodeSink(result) } + + /** Gets the typetracker of this `PathNode`, if any. */ + TypeTracker getTypeTracker() { this = TPathNodeMid(_, result) } + + private string ppContent() { + exists(ContentOption c | this.getTypeTracker() = MkTypeTracker(_, c) | + result = " with content " + c.asSome() + or + c instanceof ContentOption::None and + result = "" + ) + or + result = "" and this instanceof TPathNodeSink + } + + /** Gets a textual representation of this node. */ + string toString() { result = this.getNode().toString() + this.ppContent() } + + /** Holds if this is a source. */ + predicate isSource() { + source(this.getNode()) and + (this.getTypeTracker().start() or this instanceof TPathNodeSink) + } + + /** Holds if this is a sink. */ + predicate isSink() { this instanceof TPathNodeSink } + } + + private predicate edgeCand(Node n1, TypeTracker tt1, Node n2, TypeTracker tt2) { + n1 = flow(tt1) and + ( + tt2 = tt1.step(n1, n2) + or + tt1.start() and firstStep(tt2, n1, n2) + ) + } + + private predicate edgeCand(PathNodeFwd n1, PathNodeFwd n2) { + exists(PathNodeFwd tgt | + edgeCand(n1.getNode(), n1.getTypeTracker(), tgt.getNode(), tgt.getTypeTracker()) + | + n2 = tgt + or + n2 = TPathNodeSink(tgt.getNode()) and tgt.getTypeTracker().end() + ) + or + n1.getTypeTracker().end() and + flowsTo(n1.getNode(), n2.getNode()) and + n1.getNode() != n2.getNode() and + n2 instanceof TPathNodeSink + or + sourceSimpleLocalSmallSteps(n1.getNode(), n2.getNode()) and + n1.getNode() != n2.getNode() and + n1.isSource() and + n2.isSink() + } + + private predicate reachRev(PathNodeFwd n) { + n.isSink() + or + exists(PathNodeFwd mid | + edgeCand(n, mid) and + reachRev(mid) + ) + } + + /** + * A node on a path that is reachable from a source and can reach a sink. + * This is a pair of a `Node` and a `TypeTracker`. + */ + class PathNode extends PathNodeFwd { + PathNode() { reachRev(this) } + } + + /** Holds if `(p1, p2)` is an edge in a path between a source and a sink. */ + query predicate edges(PathNode n1, PathNode n2) { edgeCand(n1, n2) } + + private predicate stepPlus(PathNode n1, PathNode n2) = fastTC(edges/2)(n1, n2) + + /** + * DEPRECATED: Use `flowPath` instead. + * + * Holds if there is a path between `source` and `sink`. + */ + deprecated predicate hasFlow(PathNode source, PathNode sink) { flowPath(source, sink) } + + /** Holds if there is a path between `source` and `sink`. */ + predicate flowPath(PathNode source, PathNode sink) { + source.isSource() and + sink.isSink() and + (source = sink or stepPlus(source, sink)) + } + } + } +} From 5f087f00843ecf97fef3059f57d6749500f02586 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Tue, 7 Nov 2023 14:35:02 +0100 Subject: [PATCH 081/202] Shared: Port features from Ruby's type tracking library to the shared library - Cache relevant predicates. - Expose some predicates and classes (only exposed internally). - Make some top-level `inline_late` predicates member predicates. - Actually eliminate type check in `flowsTo`. - Fix bug in `getACompatibleTypeTracker`. - Adopt the `CallGraphConstruction` module. --- .../internal/TypeTrackingImpl.qll | 697 +++++++++++------- 1 file changed, 426 insertions(+), 271 deletions(-) diff --git a/shared/typetracking/codeql/typetracking/internal/TypeTrackingImpl.qll b/shared/typetracking/codeql/typetracking/internal/TypeTrackingImpl.qll index f7c5e4188f2..9eb47658124 100644 --- a/shared/typetracking/codeql/typetracking/internal/TypeTrackingImpl.qll +++ b/shared/typetracking/codeql/typetracking/internal/TypeTrackingImpl.qll @@ -63,21 +63,221 @@ module TypeTracking { private class ContentOption = ContentOption::Option; - private newtype TStepSummary = - LevelStep() or - CallStep() or - ReturnStep() or - StoreStep(Content content) { storeStep(_, _, content) } or - LoadStep(Content content) { loadStep(_, _, content) } or - LoadStoreStep(Content load, Content store) { loadStoreStep(_, _, load, store) } or - WithContent(ContentFilter filter) { withContentStep(_, _, filter) } or - WithoutContent(ContentFilter filter) { withoutContentStep(_, _, filter) } or - JumpStep() + cached + private module Cached { + cached + newtype TStepSummary = + LevelStep() or + CallStep() or + ReturnStep() or + StoreStep(Content content) { storeStep(_, _, content) } or + LoadStep(Content content) { loadStep(_, _, content) } or + LoadStoreStep(Content load, Content store) { loadStoreStep(_, _, load, store) } or + WithContent(ContentFilter filter) { withContentStep(_, _, filter) } or + WithoutContent(ContentFilter filter) { withoutContentStep(_, _, filter) } or + JumpStep() + + cached + newtype TTypeTracker = + MkTypeTracker(Boolean hasCall, ContentOption content) { + content.isNone() + or + // Restrict `content` to those that might eventually match a load. + // We can't rely on `basicStoreStep` since `startInContent` might be used with + // a content that has no corresponding store. + exists(Content loadContents | + ( + loadStep(_, _, loadContents) + or + loadStoreStep(_, _, loadContents, _) + ) and + compatibleContents(content.asSome(), loadContents) + ) + } + + cached + newtype TTypeBackTracker = + MkTypeBackTracker(Boolean hasReturn, ContentOption content) { + content.isNone() + or + // As in MkTypeTracker, restrict `content` to those that might eventually match a store. + exists(Content storeContent | + ( + storeStep(_, _, storeContent) + or + loadStoreStep(_, _, _, storeContent) + ) and + compatibleContents(storeContent, content.asSome()) + ) + } + + /** Gets the summary resulting from appending `step` to type-tracking summary `tt`. */ + cached + TypeTracker append(TypeTracker tt, StepSummary step) { + exists(Boolean hasCall, ContentOption currentContents | + tt = MkTypeTracker(hasCall, currentContents) + | + step = LevelStep() and result = tt + or + step = CallStep() and result = MkTypeTracker(true, currentContents) + or + step = ReturnStep() and hasCall = false and result = tt + or + step = JumpStep() and + result = MkTypeTracker(false, currentContents) + or + exists(ContentFilter filter | result = tt | + step = WithContent(filter) and + currentContents.asSome() = filter.getAMatchingContent() + or + step = WithoutContent(filter) and + not currentContents.asSome() = filter.getAMatchingContent() + ) + ) + or + exists(Content storeContents, boolean hasCall | + exists(Content loadContents | + step = LoadStep(pragma[only_bind_into](loadContents)) and + tt = contentTypeTracker(hasCall, storeContents) and + compatibleContents(storeContents, loadContents) and + result = noContentTypeTracker(hasCall) + ) + or + step = StoreStep(pragma[only_bind_into](storeContents)) and + tt = noContentTypeTracker(hasCall) and + result = contentTypeTracker(hasCall, storeContents) + ) + or + exists(Content currentContent, Content store, Content load, boolean hasCall | + step = LoadStoreStep(pragma[only_bind_into](load), pragma[only_bind_into](store)) and + compatibleContents(pragma[only_bind_into](currentContent), load) and + tt = contentTypeTracker(pragma[only_bind_into](hasCall), currentContent) and + result = contentTypeTracker(pragma[only_bind_out](hasCall), store) + ) + } + + /** Gets the summary resulting from prepending `step` to this type-tracking summary. */ + cached + TypeBackTracker prepend(TypeBackTracker tbt, StepSummary step) { + exists(Boolean hasReturn, ContentOption content | + tbt = MkTypeBackTracker(hasReturn, content) + | + step = LevelStep() and result = tbt + or + step = CallStep() and hasReturn = false and result = tbt + or + step = ReturnStep() and result = MkTypeBackTracker(true, content) + or + step = JumpStep() and + result = MkTypeBackTracker(false, content) + or + exists(ContentFilter filter | result = tbt | + step = WithContent(filter) and + content.asSome() = filter.getAMatchingContent() + or + step = WithoutContent(filter) and + not content.asSome() = filter.getAMatchingContent() + ) + ) + or + exists(Content loadContents, boolean hasReturn | + exists(Content storeContents | + step = StoreStep(pragma[only_bind_into](storeContents)) and + tbt = contentTypeBackTracker(hasReturn, loadContents) and + compatibleContents(storeContents, loadContents) and + result = noContentTypeBackTracker(hasReturn) + ) + or + step = LoadStep(pragma[only_bind_into](loadContents)) and + tbt = noContentTypeBackTracker(hasReturn) and + result = contentTypeBackTracker(hasReturn, loadContents) + ) + or + exists(Content currentContent, Content store, Content load, boolean hasCall | + step = LoadStoreStep(pragma[only_bind_into](load), pragma[only_bind_into](store)) and + compatibleContents(store, pragma[only_bind_into](currentContent)) and + tbt = contentTypeBackTracker(pragma[only_bind_into](hasCall), currentContent) and + result = contentTypeBackTracker(pragma[only_bind_out](hasCall), load) + ) + } + + cached + predicate smallStepNoCall(Node nodeFrom, LocalSourceNode nodeTo, StepSummary summary) { + levelStepNoCall(nodeFrom, nodeTo) and summary = LevelStep() + or + exists(Content content | + storeStepIntoSource(nodeFrom, nodeTo, content) and + summary = StoreStep(content) + ) + or + exists(Content content | + loadStep(nodeFrom, nodeTo, content) and + summary = LoadStep(content) + ) + or + exists(Content content1, Content content2 | + loadStoreStepIntoSource(nodeFrom, nodeTo, content1, content2) and + summary = LoadStoreStep(content1, content2) + ) + or + exists(ContentFilter filter | + withContentStep(nodeFrom, nodeTo, filter) and + summary = WithContent(filter) + ) + or + exists(ContentFilter filter | + withoutContentStep(nodeFrom, nodeTo, filter) and + summary = WithoutContent(filter) + ) + or + jumpStep(nodeFrom, nodeTo) and summary = JumpStep() + } + + cached + predicate smallStepCall(Node nodeFrom, LocalSourceNode nodeTo, StepSummary summary) { + levelStepCall(nodeFrom, nodeTo) and summary = LevelStep() + or + callStep(nodeFrom, nodeTo) and summary = CallStep() + or + returnStep(nodeFrom, nodeTo) and summary = ReturnStep() + } + + pragma[inline] + private predicate isLocalSourceNode(LocalSourceNode n) { any() } + + /** + * Holds if there is flow from `localSource` to `dst` using zero or more + * `simpleLocalSmallStep`s. + */ + cached + predicate flowsTo(Node localSource, Node dst) { + // explicit type check in base case to avoid repeated type tests in recursive case + isLocalSourceNode(localSource) and + dst = localSource + or + exists(Node mid | + flowsTo(localSource, mid) and + simpleLocalSmallStep(mid, dst) + ) + } + + cached + predicate stepNoCall(LocalSourceNode nodeFrom, LocalSourceNode nodeTo, StepSummary summary) { + exists(Node mid | flowsTo(nodeFrom, mid) and smallStepNoCall(mid, nodeTo, summary)) + } + + cached + predicate stepCall(LocalSourceNode nodeFrom, LocalSourceNode nodeTo, StepSummary summary) { + exists(Node mid | flowsTo(nodeFrom, mid) and smallStepCall(mid, nodeTo, summary)) + } + } + + import Cached /** * A description of a step on an inter-procedural data flow path. */ - private class StepSummary extends TStepSummary { + class StepSummary extends TStepSummary { /** Gets a textual representation of this step summary. */ string toString() { this instanceof LevelStep and result = "level" @@ -99,40 +299,8 @@ module TypeTracking { } } - private newtype TTypeTracker = - MkTypeTracker(Boolean hasCall, ContentOption content) { - content.isNone() - or - // Restrict `content` to those that might eventually match a load. - // We can't rely on `basicStoreStep` since `startInContent` might be used with - // a content that has no corresponding store. - exists(Content loadContents | - ( - loadStep(_, _, loadContents) - or - loadStoreStep(_, _, loadContents, _) - ) and - compatibleContents(content.asSome(), loadContents) - ) - } - - private newtype TTypeBackTracker = - MkTypeBackTracker(Boolean hasReturn, ContentOption content) { - content.isNone() - or - // As in MkTypeTracker, restrict `content` to those that might eventually match a store. - exists(Content storeContent | - ( - storeStep(_, _, storeContent) - or - loadStoreStep(_, _, _, storeContent) - ) and - compatibleContents(storeContent, content.asSome()) - ) - } - pragma[nomagic] - private TypeTracker noContentTypeTracker(boolean hasCall) { + TypeTracker noContentTypeTracker(boolean hasCall) { result = MkTypeTracker(hasCall, any(ContentOption::None c)) } @@ -141,51 +309,6 @@ module TypeTracking { result = MkTypeTracker(hasCall, ContentOption::some(c)) } - /** Gets the summary resulting from appending `step` to type-tracking summary `tt`. */ - pragma[nomagic] - private TypeTracker append(TypeTracker tt, StepSummary step) { - exists(Boolean hasCall, ContentOption currentContents | - tt = MkTypeTracker(hasCall, currentContents) - | - step = LevelStep() and result = tt - or - step = CallStep() and result = MkTypeTracker(true, currentContents) - or - step = ReturnStep() and hasCall = false and result = tt - or - step = JumpStep() and - result = MkTypeTracker(false, currentContents) - or - exists(ContentFilter filter | result = tt | - step = WithContent(filter) and - currentContents.asSome() = filter.getAMatchingContent() - or - step = WithoutContent(filter) and - not currentContents.asSome() = filter.getAMatchingContent() - ) - ) - or - exists(Content storeContents, boolean hasCall | - exists(Content loadContents | - step = LoadStep(pragma[only_bind_into](loadContents)) and - tt = contentTypeTracker(hasCall, storeContents) and - compatibleContents(storeContents, loadContents) and - result = noContentTypeTracker(hasCall) - ) - or - step = StoreStep(pragma[only_bind_into](storeContents)) and - tt = noContentTypeTracker(hasCall) and - result = contentTypeTracker(hasCall, storeContents) - ) - or - exists(Content currentContent, Content store, Content load, boolean hasCall | - step = LoadStoreStep(pragma[only_bind_into](load), pragma[only_bind_into](store)) and - compatibleContents(pragma[only_bind_into](currentContent), load) and - tt = contentTypeTracker(pragma[only_bind_into](hasCall), currentContent) and - result = contentTypeTracker(pragma[only_bind_out](hasCall), store) - ) - } - pragma[nomagic] private TypeBackTracker noContentTypeBackTracker(boolean hasReturn) { result = MkTypeBackTracker(hasReturn, any(ContentOption::None c)) @@ -196,68 +319,6 @@ module TypeTracking { result = MkTypeBackTracker(hasReturn, ContentOption::some(c)) } - /** Gets the summary resulting from prepending `step` to this type-tracking summary. */ - pragma[nomagic] - private TypeBackTracker prepend(TypeBackTracker tbt, StepSummary step) { - exists(Boolean hasReturn, ContentOption content | tbt = MkTypeBackTracker(hasReturn, content) | - step = LevelStep() and result = tbt - or - step = CallStep() and hasReturn = false and result = tbt - or - step = ReturnStep() and result = MkTypeBackTracker(true, content) - or - step = JumpStep() and - result = MkTypeBackTracker(false, content) - or - exists(ContentFilter filter | result = tbt | - step = WithContent(filter) and - content.asSome() = filter.getAMatchingContent() - or - step = WithoutContent(filter) and - not content.asSome() = filter.getAMatchingContent() - ) - ) - or - exists(Content loadContents, boolean hasReturn | - exists(Content storeContents | - step = StoreStep(pragma[only_bind_into](storeContents)) and - tbt = contentTypeBackTracker(hasReturn, loadContents) and - compatibleContents(storeContents, loadContents) and - result = noContentTypeBackTracker(hasReturn) - ) - or - step = LoadStep(pragma[only_bind_into](loadContents)) and - tbt = noContentTypeBackTracker(hasReturn) and - result = contentTypeBackTracker(hasReturn, loadContents) - ) - or - exists(Content currentContent, Content store, Content load, boolean hasCall | - step = LoadStoreStep(pragma[only_bind_into](load), pragma[only_bind_into](store)) and - compatibleContents(store, pragma[only_bind_into](currentContent)) and - tbt = contentTypeBackTracker(pragma[only_bind_into](hasCall), currentContent) and - result = contentTypeBackTracker(pragma[only_bind_out](hasCall), load) - ) - } - - pragma[inline] - private predicate isLocalSourceNode(LocalSourceNode n) { any() } - - /** - * Holds if there is flow from `localSource` to `dst` using zero or more - * `simpleLocalSmallStep`s. - */ - pragma[nomagic] - predicate flowsTo(LocalSourceNode localSource, Node dst) { - // explicit type check in base case to avoid repeated type tests in recursive case - isLocalSourceNode(localSource) and - dst = localSource - or - exists(Node mid | - flowsTo(localSource, mid) and - simpleLocalSmallStep(mid, dst) - ) - } - pragma[nomagic] private predicate storeStepIntoSource(Node nodeFrom, LocalSourceNode nodeTo, Content c) { if hasFeatureBacktrackStoreTarget() @@ -283,108 +344,25 @@ module TypeTracking { } pragma[nomagic] - private predicate smallStepNoCall(Node nodeFrom, LocalSourceNode nodeTo, StepSummary summary) { - levelStepNoCall(nodeFrom, nodeTo) and summary = LevelStep() - or - exists(Content content | - storeStepIntoSource(nodeFrom, nodeTo, content) and - summary = StoreStep(content) - ) - or - exists(Content content | - loadStep(nodeFrom, nodeTo, content) and - summary = LoadStep(content) - ) - or - exists(Content content1, Content content2 | - loadStoreStepIntoSource(nodeFrom, nodeTo, content1, content2) and - summary = LoadStoreStep(content1, content2) - ) - or - exists(ContentFilter filter | - withContentStep(nodeFrom, nodeTo, filter) and - summary = WithContent(filter) - ) - or - exists(ContentFilter filter | - withoutContentStep(nodeFrom, nodeTo, filter) and - summary = WithoutContent(filter) - ) - or - jumpStep(nodeFrom, nodeTo) and summary = JumpStep() - } - - pragma[nomagic] - private predicate smallStepCall(Node nodeFrom, LocalSourceNode nodeTo, StepSummary summary) { - levelStepCall(nodeFrom, nodeTo) and summary = LevelStep() - or - callStep(nodeFrom, nodeTo) and summary = CallStep() - or - returnStep(nodeFrom, nodeTo) and summary = ReturnStep() - } - - pragma[nomagic] - private predicate stepNoCall(LocalSourceNode nodeFrom, LocalSourceNode nodeTo, StepSummary summary) { - exists(Node mid | flowsTo(nodeFrom, mid) and smallStepNoCall(mid, nodeTo, summary)) - } - - pragma[nomagic] - private predicate stepCall(LocalSourceNode nodeFrom, LocalSourceNode nodeTo, StepSummary summary) { - exists(Node mid | flowsTo(nodeFrom, mid) and smallStepCall(mid, nodeTo, summary)) - } - - pragma[inline] - private predicate smallStepSplit(Node nodeFrom, LocalSourceNode nodeTo, StepSummary summary) { + predicate smallStep(Node nodeFrom, LocalSourceNode nodeTo, StepSummary summary) { smallStepCall(nodeFrom, nodeTo, summary) or smallStepNoCall(nodeFrom, nodeTo, summary) } - pragma[inline] - private predicate stepSplit(LocalSourceNode nodeFrom, LocalSourceNode nodeTo, StepSummary summary) { + pragma[nomagic] + predicate step(LocalSourceNode nodeFrom, LocalSourceNode nodeTo, StepSummary summary) { stepNoCall(nodeFrom, nodeTo, summary) or stepCall(nodeFrom, nodeTo, summary) } - pragma[nomagic] - private predicate smallStep(Node nodeFrom, LocalSourceNode nodeTo, StepSummary summary) { - smallStepSplit(nodeFrom, nodeTo, summary) - } - - pragma[nomagic] - private predicate step(LocalSourceNode nodeFrom, LocalSourceNode nodeTo, StepSummary summary) { - stepSplit(nodeFrom, nodeTo, summary) - } - pragma[nomagic] private predicate stepProj(LocalSourceNode nodeFrom, StepSummary summary) { step(nodeFrom, _, summary) } - bindingset[t, nodeFrom] - pragma[inline_late] - pragma[noopt] - private TypeTracker stepInlineLate(TypeTracker t, LocalSourceNode nodeFrom, LocalSourceNode nodeTo) { - exists(StepSummary summary | - stepProj(nodeFrom, summary) and - result = append(t, summary) and - step(nodeFrom, nodeTo, summary) - ) - } - pragma[nomagic] private predicate smallStepProj(Node nodeFrom, StepSummary summary) { smallStep(nodeFrom, _, summary) } - bindingset[t, nodeFrom] - pragma[inline_late] - pragma[noopt] - private TypeTracker smallStepInlineLate(TypeTracker t, Node nodeFrom, LocalSourceNode nodeTo) { - exists(StepSummary summary | - smallStepProj(nodeFrom, summary) and - result = append(t, summary) and - smallStep(nodeFrom, nodeTo, summary) - ) - } - /** * A summary of the steps needed to track a value to a given dataflow node. * @@ -474,9 +452,26 @@ module TypeTracking { * Gets the summary that corresponds to having taken a forwards * heap and/or inter-procedural step from `nodeFrom` to `nodeTo`. */ - pragma[inline] + bindingset[this, nodeFrom] + pragma[inline_late] + pragma[noopt] TypeTracker step(LocalSourceNode nodeFrom, LocalSourceNode nodeTo) { - result = stepInlineLate(this, nodeFrom, nodeTo) + exists(StepSummary summary | + stepProj(nodeFrom, summary) and + result = append(this, summary) and + step(nodeFrom, nodeTo, summary) + ) + } + + bindingset[this, nodeFrom] + pragma[inline_late] + pragma[noopt] + private TypeTracker smallstepNoSimpleLocalFlowStep(Node nodeFrom, LocalSourceNode nodeTo) { + exists(StepSummary summary | + smallStepProj(nodeFrom, summary) and + result = append(this, summary) and + smallStep(nodeFrom, nodeTo, summary) + ) } /** @@ -505,7 +500,7 @@ module TypeTracking { */ pragma[inline] TypeTracker smallstep(Node nodeFrom, Node nodeTo) { - result = smallStepInlineLate(this, nodeFrom, nodeTo) + result = this.smallstepNoSimpleLocalFlowStep(nodeFrom, nodeTo) or simpleLocalSmallStep(nodeFrom, nodeTo) and result = this @@ -525,37 +520,11 @@ module TypeTracking { step(_, nodeTo, summary) } - bindingset[t, nodeTo] - pragma[inline_late] - pragma[noopt] - private TypeBackTracker backStepInlineLate( - TypeBackTracker t, LocalSourceNode nodeFrom, LocalSourceNode nodeTo - ) { - exists(StepSummary summary | - backStepProj(nodeTo, summary) and - result = prepend(t, summary) and - step(nodeFrom, nodeTo, summary) - ) - } - pragma[nomagic] private predicate backSmallStepProj(LocalSourceNode nodeTo, StepSummary summary) { smallStep(_, nodeTo, summary) } - bindingset[t, nodeTo] - pragma[inline_late] - pragma[noopt] - private TypeBackTracker backSmallStepInlineLate( - TypeBackTracker t, Node nodeFrom, LocalSourceNode nodeTo - ) { - exists(StepSummary summary | - backSmallStepProj(nodeTo, summary) and - result = prepend(t, summary) and - smallStep(nodeFrom, nodeTo, summary) - ) - } - /** * A summary of the steps needed to back-track a use of a value to a given dataflow node. * @@ -627,9 +596,26 @@ module TypeTracking { * Gets the summary that corresponds to having taken a backwards * heap and/or inter-procedural step from `nodeTo` to `nodeFrom`. */ - pragma[inline] + bindingset[this, nodeTo] + pragma[inline_late] + pragma[noopt] TypeBackTracker step(LocalSourceNode nodeFrom, LocalSourceNode nodeTo) { - result = backStepInlineLate(this, nodeFrom, nodeTo) + exists(StepSummary summary | + backStepProj(nodeTo, summary) and + result = prepend(this, summary) and + step(nodeFrom, nodeTo, summary) + ) + } + + bindingset[this, nodeTo] + pragma[inline_late] + pragma[noopt] + private TypeBackTracker smallstepNoSimpleLocalFlowStep(Node nodeFrom, LocalSourceNode nodeTo) { + exists(StepSummary summary | + backSmallStepProj(nodeTo, summary) and + result = prepend(this, summary) and + smallStep(nodeFrom, nodeTo, summary) + ) } /** @@ -658,7 +644,7 @@ module TypeTracking { */ pragma[inline] TypeBackTracker smallstep(Node nodeFrom, Node nodeTo) { - result = backSmallStepInlineLate(this, nodeFrom, nodeTo) + result = this.smallstepNoSimpleLocalFlowStep(nodeFrom, nodeTo) or simpleLocalSmallStep(nodeFrom, nodeTo) and result = this @@ -672,7 +658,14 @@ module TypeTracking { * also flow to `sink`. */ TypeTracker getACompatibleTypeTracker() { - exists(boolean hasCall | result = MkTypeTracker(hasCall, content) | + exists(boolean hasCall, ContentOption c | + result = MkTypeTracker(hasCall, c) and + ( + c.isNone() and content.isNone() + or + compatibleContents(c.asSome(), content.asSome()) + ) + | hasCall = false or hasReturn = false ) } @@ -709,7 +702,7 @@ module TypeTracking { exists(Node n1, TypeTracker tt0 | sourceSimpleLocalSmallSteps(src, n1) and tt0.start() and - tt = smallStepInlineLate(tt0, n1, n2) + tt = tt0.smallstep(n1, n2) ) } @@ -838,4 +831,166 @@ module TypeTracking { } } } + + /** + * Provides logic for constructing a call graph in mutual recursion with type tracking. + * + * When type tracking is used to construct a call graph, we cannot use the join-order + * from `TypeTracker::step/4`, because `step/3` becomes a recursive call, which means + * that we will have a conjunct with 3 recursive calls: the call to `step`, the call to + * `stepProj`, and the recursive type tracking call itself. The solution is to split the + * three-way non-linear recursion into two non-linear predicates: one that first joins + * with the projected `stepCall` relation, followed by a predicate that joins with the full + * `stepCall` relation (`stepNoCall` not being recursive, can be join-ordered in the + * same way as in `stepInlineLate`). + */ + module CallGraphConstruction { + /** The input to call graph construction. */ + signature module InputSig { + /** A state to track during type tracking. */ + class State; + + /** Holds if type tracking should start at `start` in state `state`. */ + predicate start(Node start, State state); + + /** + * Holds if type tracking should use the step from `nodeFrom` to `nodeTo`, + * which _does not_ depend on the call graph. + * + * Implementing this predicate using `[small]stepNoCall` yields + * standard type tracking. + */ + predicate stepNoCall(Node nodeFrom, Node nodeTo, StepSummary summary); + + /** + * Holds if type tracking should use the step from `nodeFrom` to `nodeTo`, + * which _does_ depend on the call graph. + * + * Implementing this predicate using `[small]stepCall` yields + * standard type tracking. + */ + predicate stepCall(Node nodeFrom, Node nodeTo, StepSummary summary); + + /** A projection of an element from the state space. */ + class StateProj; + + /** Gets the projection of `state`. */ + StateProj stateProj(State state); + + /** Holds if type tracking should stop at `n` when we are tracking projected state `stateProj`. */ + predicate filter(Node n, StateProj stateProj); + } + + /** Provides the `track` predicate for use in call graph construction. */ + module Make { + pragma[nomagic] + private predicate stepNoCallProj(Node nodeFrom, StepSummary summary) { + Input::stepNoCall(nodeFrom, _, summary) + } + + pragma[nomagic] + private predicate stepCallProj(Node nodeFrom, StepSummary summary) { + Input::stepCall(nodeFrom, _, summary) + } + + bindingset[nodeFrom, t] + pragma[inline_late] + pragma[noopt] + private TypeTracker stepNoCallInlineLate(TypeTracker t, Node nodeFrom, Node nodeTo) { + exists(StepSummary summary | + stepNoCallProj(nodeFrom, summary) and + result = append(t, summary) and + Input::stepNoCall(nodeFrom, nodeTo, summary) + ) + } + + bindingset[state] + pragma[inline_late] + private Input::StateProj stateProjInlineLate(Input::State state) { + result = Input::stateProj(state) + } + + pragma[nomagic] + private Node track(Input::State state, TypeTracker t) { + t.start() and Input::start(result, state) + or + exists(Input::StateProj stateProj | + stateProj = stateProjInlineLate(state) and + not Input::filter(result, stateProj) + | + exists(TypeTracker t2 | t = stepNoCallInlineLate(t2, track(state, t2), result)) + or + exists(StepSummary summary | + // non-linear recursion + Input::stepCall(trackCall(state, t, summary), result, summary) + ) + ) + } + + bindingset[t, summary] + pragma[inline_late] + private TypeTracker appendInlineLate(TypeTracker t, StepSummary summary) { + result = append(t, summary) + } + + pragma[nomagic] + private Node trackCall(Input::State state, TypeTracker t, StepSummary summary) { + exists(TypeTracker t2 | + // non-linear recursion + result = track(state, t2) and + stepCallProj(result, summary) and + t = appendInlineLate(t2, summary) + ) + } + + /** Gets a node that can be reached from _some_ start node in state `state`. */ + pragma[nomagic] + Node track(Input::State state) { result = track(state, TypeTracker::end()) } + } + + /** A simple version of `CallGraphConstruction` that uses standard type tracking. */ + module Simple { + /** The input to call graph construction. */ + signature module InputSig { + /** A state to track during type tracking. */ + class State; + + /** Holds if type tracking should start at `start` in state `state`. */ + predicate start(Node start, State state); + + /** Holds if type tracking should stop at `n`. */ + predicate filter(Node n); + } + + /** Provides the `track` predicate for use in call graph construction. */ + module Make { + private module SimpleInput implements CallGraphConstruction::InputSig { + private import codeql.util.Unit + + class State = Input::State; + + predicate start(Node start, State state) { Input::start(start, state) } + + predicate stepNoCall(Node nodeFrom, Node nodeTo, StepSummary summary) { + Cached::stepNoCall(nodeFrom, nodeTo, summary) + } + + predicate stepCall(Node nodeFrom, Node nodeTo, StepSummary summary) { + Cached::stepCall(nodeFrom, nodeTo, summary) + } + + class StateProj = Unit; + + Unit stateProj(State state) { exists(state) and exists(result) } + + predicate filter(Node n, Unit u) { + Input::filter(n) and + exists(u) + } + } + + import CallGraphConstruction::Make + } + } + } } From 57f6859ddc523876ca1092c86cbf24aaa9dae39f Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Wed, 15 Nov 2023 15:26:15 +0100 Subject: [PATCH 082/202] Shared: Update type tracking consistency checks --- .../internal/TypeTrackingImpl.qll | 24 +++++++------------ 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/shared/typetracking/codeql/typetracking/internal/TypeTrackingImpl.qll b/shared/typetracking/codeql/typetracking/internal/TypeTrackingImpl.qll index 9eb47658124..d7ac86740b0 100644 --- a/shared/typetracking/codeql/typetracking/internal/TypeTrackingImpl.qll +++ b/shared/typetracking/codeql/typetracking/internal/TypeTrackingImpl.qll @@ -33,10 +33,11 @@ module TypeTracking { * Holds if there is any node in a step relation that is unreachable from a * `LocalSourceNode`. */ - query predicate unreachableNode(string msg) { - exists(int k, string kind | - k = strictcount(Node n | stepEntry(n, kind) and not flowsTo(_, n)) and - msg = "There are " + k + " unreachable nodes in steps of kind " + kind + "." + query predicate unreachableNode(Node n, string msg) { + exists(string kind | + stepEntry(n, kind) and + not flowsTo(_, n) and + msg = "Unreachable node in step of kind " + kind + "." ) } @@ -44,18 +45,11 @@ module TypeTracking { * Holds if there is a store target that isn't a `LocalSourceNode` and * backtracking store target feature isn't enabled. */ - query predicate nonSourceStoreTarget(string msg) { + query predicate nonSourceStoreTarget(Node n, string msg) { not hasFeatureBacktrackStoreTarget() and - exists(int k | - k = - strictcount(Node n | - not n instanceof LocalSourceNode and - (storeStep(_, n, _) or loadStoreStep(_, n, _, _)) - ) and - msg = - "There are " + k + - " store targets that are not local source nodes and backtracking store targets is not enabled." - ) + not n instanceof LocalSourceNode and + (storeStep(_, n, _) or loadStoreStep(_, n, _, _)) and + msg = "Store target is not a local source nodes and backtracking store targets is disabled." } } From 72af41b196e8f03f852f0d3d1bf71fb9a465b724 Mon Sep 17 00:00:00 2001 From: Ian Lynagh Date: Wed, 21 Jun 2023 12:51:13 +0100 Subject: [PATCH 083/202] Kotlin: Prepare for a Kotlin2 copy of the testsuite --- codeql-workspace.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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" From d443354651e583738f81cddea53aac7ce2bb77b3 Mon Sep 17 00:00:00 2001 From: Sam Browning <106113886+sabrowning1@users.noreply.github.com> Date: Wed, 15 Nov 2023 11:35:33 -0500 Subject: [PATCH 084/202] Apply feedback and fix syntax --- .../codeql-for-visual-studio-code/analyzing-your-projects.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 97cc24a601f..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 @@ -61,13 +61,14 @@ 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. Selecting a language will autogenerate a directory labeled `codeql-custom-queries-`, where `` is the name of the selected language. That directory will contain a query template labeled `example.ql`. +#. 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 From 615a1287701820eaa098cf928a8784d0acd9f99c Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Thu, 16 Nov 2023 09:04:58 +0100 Subject: [PATCH 085/202] Bazel/CMake: support new internal transition rules --- misc/bazel/cmake/cmake.bzl | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/misc/bazel/cmake/cmake.bzl b/misc/bazel/cmake/cmake.bzl index 38bfe4305ea..b3e7a39455a 100644 --- a/misc/bazel/cmake/cmake.bzl +++ b/misc/bazel/cmake/cmake.bzl @@ -51,7 +51,9 @@ def _get_includes(includes): def _cmake_aspect_impl(target, ctx): if not ctx.rule.kind.startswith("cc_"): return [CmakeInfo(name = None, transitive_deps = depset())] - if ctx.rule.kind == "cc_binary_add_features": + + # TODO: remove cc_binary_add_features once we remove it from internal repo + if ctx.rule.kind in ("cc_binary_add_features", "_cc_add_features_binary", "_cc_add_features_test"): dep = ctx.rule.attr.dep[0][CmakeInfo] return [CmakeInfo( name = None, From afe318edbe40a2c327c661b3ca4c4ee1e98a2615 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Thu, 16 Nov 2023 10:52:05 +0100 Subject: [PATCH 086/202] C++: Delete `cpp/tainted-format-string-through-global` --- ...UncontrolledFormatStringThroughGlobalVar.c | 24 ------- ...ntrolledFormatStringThroughGlobalVar.qhelp | 36 ---------- ...ncontrolledFormatStringThroughGlobalVar.ql | 40 ----------- ...ed-format-string-through-global-deleted.md | 4 ++ ...olledFormatStringThroughGlobalVar.expected | 69 ------------------- ...ntrolledFormatStringThroughGlobalVar.qlref | 1 - 6 files changed, 4 insertions(+), 170 deletions(-) delete mode 100644 cpp/ql/src/Security/CWE/CWE-134/UncontrolledFormatStringThroughGlobalVar.c delete mode 100644 cpp/ql/src/Security/CWE/CWE-134/UncontrolledFormatStringThroughGlobalVar.qhelp delete mode 100644 cpp/ql/src/Security/CWE/CWE-134/UncontrolledFormatStringThroughGlobalVar.ql create mode 100644 cpp/ql/src/change-notes/2023-11-16-tainted-format-string-through-global-deleted.md delete mode 100644 cpp/ql/test/query-tests/Security/CWE/CWE-134/semmle/globalVars/UncontrolledFormatStringThroughGlobalVar.expected delete mode 100644 cpp/ql/test/query-tests/Security/CWE/CWE-134/semmle/globalVars/UncontrolledFormatStringThroughGlobalVar.qlref 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).

- -
- - - - - - -
- - - - 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/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..9e4d972f85e --- /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 alerts, as the query duplicated a subset of the alerts from `cpp/tainted-format-string`. 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 From 2eb67549e63840f00cb2d13feda42b2e0cf469cc Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Thu, 16 Nov 2023 10:56:47 +0100 Subject: [PATCH 087/202] C++: Tweak change note slightly --- .../2023-11-16-tainted-format-string-through-global-deleted.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 index 9e4d972f85e..a4b3be355bc 100644 --- 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 @@ -1,4 +1,4 @@ --- category: breaking --- -* The `cpp/tainted-format-string-through-global` query has been deleted. This does not lead to a loss of alerts, as the query duplicated a subset of the alerts from `cpp/tainted-format-string`. +* 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`. From 5c0fb2030d647ddda7e029a0acb8bf3eea56c03f Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Thu, 16 Nov 2023 09:57:08 +0000 Subject: [PATCH 088/202] C++: Move change note. --- cpp/ql/{src => lib}/change-notes/2023-10-31-odbc-models.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename cpp/ql/{src => lib}/change-notes/2023-10-31-odbc-models.md (100%) diff --git a/cpp/ql/src/change-notes/2023-10-31-odbc-models.md b/cpp/ql/lib/change-notes/2023-10-31-odbc-models.md similarity index 100% rename from cpp/ql/src/change-notes/2023-10-31-odbc-models.md rename to cpp/ql/lib/change-notes/2023-10-31-odbc-models.md From 009d58034f9b9bcf370c8fb8074847cec58b866e Mon Sep 17 00:00:00 2001 From: Max Schaefer Date: Thu, 16 Nov 2023 10:05:21 +0000 Subject: [PATCH 089/202] Address suggestions from review. --- .../Security/CWE/CWE-022/TaintedPath.qhelp | 31 ++++++++++--------- .../Security/CWE/CWE-022/TaintedPathGood.java | 4 +-- .../CWE-022/semmle/tests/TaintedPath.java | 6 ++-- 3 files changed, 22 insertions(+), 19 deletions(-) diff --git a/java/ql/src/Security/CWE/CWE-022/TaintedPath.qhelp b/java/ql/src/Security/CWE/CWE-022/TaintedPath.qhelp index 46a7a6d60cf..569b8903b0f 100644 --- a/java/ql/src/Security/CWE/CWE-022/TaintedPath.qhelp +++ b/java/ql/src/Security/CWE/CWE-022/TaintedPath.qhelp @@ -8,22 +8,28 @@ 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.

-

The choice of validation depends on the use case.

+

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.

-

If you want to allow paths spanning multiple folders, 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 these would allow -the path to escape the root folder.

+

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.

-

A safer (but more restrictive) option is to use an allow list of safe paths and make sure that -the user input is one of those paths.

+

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.

@@ -34,12 +40,9 @@ such as "/etc/passwd".

-

Simply checking that the path is under a trusted location (such as the user's home directory) is not enough, -however, since the path could contain relative components such as "..". For example, the string -"/home/[user]/../../etc/passwd" starts with the user's home directory, but would still result in the code reading -the file located at "/etc/passwd".

- -

To fix this, we check that the user-provided path does not contain ".." and starts with the user's home directory.

+

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, we check that the 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 index dbd851846ce..37e8be7486c 100644 --- a/java/ql/src/Security/CWE/CWE-022/TaintedPathGood.java +++ b/java/ql/src/Security/CWE/CWE-022/TaintedPathGood.java @@ -3,8 +3,8 @@ public void sendUserFileGood(Socket sock, String user) { 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 (!filePath.contains("..") && filePath.startsWith("/home/" + user + "/public/")) { - BufferedReader fileReader = new BufferedReader(new FileReader(filePath)); + 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()); diff --git a/java/ql/test/query-tests/security/CWE-022/semmle/tests/TaintedPath.java b/java/ql/test/query-tests/security/CWE-022/semmle/tests/TaintedPath.java index 2c97312cb76..5a5a63ad6ad 100644 --- a/java/ql/test/query-tests/security/CWE-022/semmle/tests/TaintedPath.java +++ b/java/ql/test/query-tests/security/CWE-022/semmle/tests/TaintedPath.java @@ -21,10 +21,10 @@ public class TaintedPath { public void sendUserFileGood(Socket sock, String user) throws IOException { BufferedReader filenameReader = new BufferedReader(new InputStreamReader(sock.getInputStream(), "UTF-8")); - String filePath = filenameReader.readLine(); + String filename = filenameReader.readLine(); // GOOD: ensure that the file is in a designated folder in the user's home directory - if (!filePath.contains("..") && filePath.startsWith("/home/" + user + "/public/")) { - BufferedReader fileReader = new BufferedReader(new FileReader(filePath)); + 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()); From 947b094387278c3cf0e4f2162a84df3def2bf688 Mon Sep 17 00:00:00 2001 From: Max Schaefer Date: Thu, 16 Nov 2023 10:06:19 +0000 Subject: [PATCH 090/202] Add additional example. --- java/ql/src/Security/CWE/CWE-022/TaintedPath.qhelp | 5 +++++ .../src/Security/CWE/CWE-022/TaintedPathGood2.java | 13 +++++++++++++ .../security/CWE-022/semmle/tests/TaintedPath.java | 13 +++++++++++++ 3 files changed, 31 insertions(+) create mode 100644 java/ql/src/Security/CWE/CWE-022/TaintedPathGood2.java diff --git a/java/ql/src/Security/CWE/CWE-022/TaintedPath.qhelp b/java/ql/src/Security/CWE/CWE-022/TaintedPath.qhelp index 569b8903b0f..f2471048520 100644 --- a/java/ql/src/Security/CWE/CWE-022/TaintedPath.qhelp +++ b/java/ql/src/Security/CWE/CWE-022/TaintedPath.qhelp @@ -46,6 +46,11 @@ not contain ".." and starts with the public folder.

+

Alternatively, if we only want to allow simple filenames without a path component, we can remove all path +separators ("/" or "\") and all ".." sequences from the input before using it to construct a file path.

+ + +
diff --git a/java/ql/src/Security/CWE/CWE-022/TaintedPathGood2.java b/java/ql/src/Security/CWE/CWE-022/TaintedPathGood2.java new file mode 100644 index 00000000000..6f5a19d5fd8 --- /dev/null +++ b/java/ql/src/Security/CWE/CWE-022/TaintedPathGood2.java @@ -0,0 +1,13 @@ +public void sendUserFileGood(Socket sock, String user) { + BufferedReader filenameReader = new BufferedReader( + new InputStreamReader(sock.getInputStream(), "UTF-8")); + String filename = filenameReader.readLine(); + // GOOD: remove all ".." sequences and path separators from the filename + filename = filename.replaceAll("\\.\\.|[/\\\\]", ""); + 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/test/query-tests/security/CWE-022/semmle/tests/TaintedPath.java b/java/ql/test/query-tests/security/CWE-022/semmle/tests/TaintedPath.java index 5a5a63ad6ad..6f20e66c34e 100644 --- a/java/ql/test/query-tests/security/CWE-022/semmle/tests/TaintedPath.java +++ b/java/ql/test/query-tests/security/CWE-022/semmle/tests/TaintedPath.java @@ -32,4 +32,17 @@ public class TaintedPath { } } } + + public void sendUserFileGood2(Socket sock, String user) throws IOException { + BufferedReader filenameReader = new BufferedReader(new InputStreamReader(sock.getInputStream(), "UTF-8")); + String filename = filenameReader.readLine(); + // GOOD: remove all ".." sequences and path separators from the filename + filename = filename.replaceAll("\\.\\.|[/\\\\]", ""); + BufferedReader fileReader = new BufferedReader(new FileReader(filename)); + String fileLine = fileReader.readLine(); + while(fileLine != null) { + sock.getOutputStream().write(fileLine.getBytes()); + fileLine = fileReader.readLine(); + } + } } From 6a1504b91c54e39df5cc8f20240e124c54d65060 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Thu, 16 Nov 2023 10:46:08 +0000 Subject: [PATCH 091/202] C++: Slightly refactor test QL files so that we can add a test which tests the nodes being selected. --- .../dataflow/dataflow-tests/TestBase.qll | 103 +++++++++++++++++ .../dataflow-tests/test-source-sink.ql | 9 ++ .../dataflow/dataflow-tests/test.ql | 106 +----------------- 3 files changed, 113 insertions(+), 105 deletions(-) create mode 100644 cpp/ql/test/library-tests/dataflow/dataflow-tests/TestBase.qll create mode 100644 cpp/ql/test/library-tests/dataflow/dataflow-tests/test-source-sink.ql 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..77087dbd3ee --- /dev/null +++ b/cpp/ql/test/library-tests/dataflow/dataflow-tests/TestBase.qll @@ -0,0 +1,103 @@ +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.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/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.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>> From f8feb8495835533282137380406d456e9fbd37ea Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Thu, 16 Nov 2023 10:48:40 +0000 Subject: [PATCH 092/202] C++: Accept test changes from refactoring QL files. --- .../dataflow-tests/test-source-sink.expected | 290 ++++++++++++++++++ .../dataflow/dataflow-tests/test.expected | 7 - 2 files changed, 290 insertions(+), 7 deletions(-) create mode 100644 cpp/ql/test/library-tests/dataflow/dataflow-tests/test-source-sink.expected 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..fb514ae58fa --- /dev/null +++ b/cpp/ql/test/library-tests/dataflow/dataflow-tests/test-source-sink.expected @@ -0,0 +1,290 @@ +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 | +| 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 | +| 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.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 From 799873113f1b8ab51429f59cd5e6ae7435668619 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Thu, 16 Nov 2023 10:50:01 +0000 Subject: [PATCH 093/202] C++: Add a test that demonstrates reference dereference duplication. --- .../dataflow-tests/dataflow-consistency.expected | 1 + .../dataflow/dataflow-tests/test-source-sink.expected | 5 +++++ .../library-tests/dataflow/dataflow-tests/test.cpp | 10 ++++++++++ 3 files changed, 16 insertions(+) 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..068376778b2 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 @@ -24,6 +24,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 index fb514ae58fa..b5ea9aec2e3 100644 --- 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 @@ -118,6 +118,8 @@ astFlow | 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 | | 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 | @@ -278,6 +280,9 @@ irFlow | 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:846:13:846:27 | call to indirect_source indirection | test.cpp:848:23:848:25 | (reference dereference) 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 | 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..022ee63706a 100644 --- a/cpp/ql/test/library-tests/dataflow/dataflow-tests/test.cpp +++ b/cpp/ql/test/library-tests/dataflow/dataflow-tests/test.cpp @@ -836,4 +836,14 @@ 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 } \ No newline at end of file From 5a7cb8f25a58a3ea7b8c0dbd43517acb3f5f6413 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Thu, 16 Nov 2023 09:20:59 +0000 Subject: [PATCH 094/202] C++: Fix duplication on reference dereference expressions. --- .../cpp/ir/dataflow/internal/DataFlowUtil.qll | 22 +++++++++++++++++-- .../dataflow-tests/test-source-sink.expected | 1 - .../UncontrolledProcessOperation.expected | 3 --- 3 files changed, 20 insertions(+), 6 deletions(-) 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..1da4ca62622 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 @@ -1273,12 +1273,27 @@ abstract private class IndirectExprNodeBase extends Node { } } +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 +} + 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) + not exists(Expr conv, int adjustedIndirectionIndex | + adjustForReference(e, indirectionIndex, conv, adjustedIndirectionIndex) and + indirectExprNodeShouldBeIndirectOperand(_, conv, n + 1, adjustedIndirectionIndex) + ) ) } @@ -1292,7 +1307,10 @@ private class IndirectInstructionIndirectExprNode extends IndirectExprNodeBase i IndirectInstructionIndirectExprNode() { exists(Expr e, int n, int indirectionIndex | indirectExprNodeShouldBeIndirectInstruction(this, e, n, indirectionIndex) and - not indirectExprNodeShouldBeIndirectInstruction(_, e, n + 1, indirectionIndex) + not exists(Expr conv, int adjustedIndirectionIndex | + adjustForReference(e, indirectionIndex, conv, adjustedIndirectionIndex) and + not indirectExprNodeShouldBeIndirectInstruction(_, conv, n + 1, adjustedIndirectionIndex) + ) ) } 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 index b5ea9aec2e3..7e9f560ac0f 100644 --- 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 @@ -282,7 +282,6 @@ irFlow | 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:846:13:846:27 | call to indirect_source indirection | test.cpp:848:23:848:25 | (reference dereference) 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 | 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 b30de4bceba..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 @@ -5,7 +5,6 @@ edges | 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 | (reference dereference) 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 | @@ -22,7 +21,6 @@ nodes | test.cpp:56:12:56:17 | fgets output argument | semmle.label | fgets output argument | | 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 | (reference dereference) indirection | semmle.label | (reference dereference) 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 | @@ -39,7 +37,6 @@ subpaths | 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 | (reference dereference) indirection | test.cpp:56:12:56:17 | fgets output argument | test.cpp:64:10:64:16 | (reference dereference) 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 | From d25c24b64da01c6b193a24519c73e3868015d8bd Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Thu, 16 Nov 2023 09:51:30 +0000 Subject: [PATCH 095/202] C++: Reduce code duplication by moving shared code into a module. --- .../cpp/ir/dataflow/internal/DataFlowUtil.qll | 101 ++++++++++++------ 1 file changed, 71 insertions(+), 30 deletions(-) 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 1da4ca62622..17dae213cde 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 @@ -1273,49 +1273,90 @@ abstract private class IndirectExprNodeBase extends Node { } } -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 +/** 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 + } + + /** 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 module IndirectOperandIndirectExprNodeImpl implements IndirectNodeToIndirectExprSig { + class IndirectNode = IndirectOperand; + + predicate indirectNodeHasIndirectExpr = indirectExprNodeShouldBeIndirectOperand/4; +} + +module IndirectOperandToIndirectExpr = + IndirectNodeToIndirectExpr; + private class IndirectOperandIndirectExprNode extends IndirectExprNodeBase instanceof IndirectOperand { - IndirectOperandIndirectExprNode() { - exists(Expr e, int n, int indirectionIndex | - indirectExprNodeShouldBeIndirectOperand(this, e, n, indirectionIndex) and - not exists(Expr conv, int adjustedIndirectionIndex | - adjustForReference(e, indirectionIndex, conv, adjustedIndirectionIndex) and - indirectExprNodeShouldBeIndirectOperand(_, conv, n + 1, adjustedIndirectionIndex) - ) - ) - } + IndirectOperandIndirectExprNode() { IndirectOperandToIndirectExpr::charpred(this) } final override Expr getConvertedExpr(int n, int index) { - indirectExprNodeShouldBeIndirectOperand(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() { - exists(Expr e, int n, int indirectionIndex | - indirectExprNodeShouldBeIndirectInstruction(this, e, n, indirectionIndex) and - not exists(Expr conv, int adjustedIndirectionIndex | - adjustForReference(e, indirectionIndex, conv, adjustedIndirectionIndex) and - not indirectExprNodeShouldBeIndirectInstruction(_, conv, n + 1, adjustedIndirectionIndex) - ) - ) - } + IndirectInstructionIndirectExprNode() { IndirectInstructionToIndirectExpr::charpred(this) } final override Expr getConvertedExpr(int n, int index) { - indirectExprNodeShouldBeIndirectInstruction(this, result, n, index) + IndirectInstructionToIndirectExpr::indirectNodeHasIndirectExpr(this, result, n, index) } } From 30925da7d903ceb6bf51a187006ae8fb4c203d9b Mon Sep 17 00:00:00 2001 From: Stephan Brandauer Date: Wed, 15 Nov 2023 13:38:01 +0100 Subject: [PATCH 096/202] Java Automodel: tests that demonstrate that there is no sink candidate of an object being constructed in app mode --- ...utomodelApplicationModeCharacteristics.qll | 4 +++- ...lApplicationModeExtractCandidates.expected | 22 +++++++++---------- ...cationModeExtractNegativeExamples.expected | 8 +++---- ...cationModeExtractPositiveExamples.expected | 8 +++---- .../Test.java | 12 ++++++++++ 5 files changed, 34 insertions(+), 20 deletions(-) diff --git a/java/ql/automodel/src/AutomodelApplicationModeCharacteristics.qll b/java/ql/automodel/src/AutomodelApplicationModeCharacteristics.qll index f8f2c8aaf58..c9a7e32147d 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) + } or TImplicitVarargsArray(Call call, DataFlow::Node arg, int idx) { exists(Argument argExpr | arg.asExpr() = argExpr and diff --git a/java/ql/automodel/test/AutomodelApplicationModeExtraction/AutomodelApplicationModeExtractCandidates.expected b/java/ql/automodel/test/AutomodelApplicationModeExtraction/AutomodelApplicationModeExtractCandidates.expected index b3de04f0551..5e98f212879 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://(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: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..28019a8a844 100644 --- a/java/ql/automodel/test/AutomodelApplicationModeExtraction/AutomodelApplicationModeExtractNegativeExamples.expected +++ b/java/ql/automodel/test/AutomodelApplicationModeExtraction/AutomodelApplicationModeExtractNegativeExamples.expected @@ -1,4 +1,4 @@ -| 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 | +| Test.java:67:7:67:18 | this | exception\nrelated locations: $@, $@, $@.\nmetadata: $@, $@, $@, $@, $@, $@, $@, $@, $@. | Test.java:67:7:67:18 | super(...) | CallContext | Test.java:67:7:67:18 | super(...) | MethodDoc | Test.java:67:7:67: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 | 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; + } } From d7c97d9d92fc5682f7b26f0bcb6dafd3793cffc3 Mon Sep 17 00:00:00 2001 From: Stephan Brandauer Date: Thu, 16 Nov 2023 12:26:08 +0100 Subject: [PATCH 097/202] Java Automodel: remove constructor instance arguments from endpoints and update test expectations --- .../automodel/src/AutomodelApplicationModeCharacteristics.qll | 2 +- .../AutomodelApplicationModeExtractNegativeExamples.expected | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/java/ql/automodel/src/AutomodelApplicationModeCharacteristics.qll b/java/ql/automodel/src/AutomodelApplicationModeCharacteristics.qll index c9a7e32147d..e5dd4d01c8c 100644 --- a/java/ql/automodel/src/AutomodelApplicationModeCharacteristics.qll +++ b/java/ql/automodel/src/AutomodelApplicationModeCharacteristics.qll @@ -31,7 +31,7 @@ newtype TApplicationModeEndpoint = ) } or TInstanceArgument(Call call, DataFlow::Node arg) { - arg = DataFlow::getInstanceArgument(call) + arg = DataFlow::getInstanceArgument(call) and not call instanceof ConstructorCall } or TImplicitVarargsArray(Call call, DataFlow::Node arg, int idx) { exists(Argument argExpr | diff --git a/java/ql/automodel/test/AutomodelApplicationModeExtraction/AutomodelApplicationModeExtractNegativeExamples.expected b/java/ql/automodel/test/AutomodelApplicationModeExtraction/AutomodelApplicationModeExtractNegativeExamples.expected index 28019a8a844..91f33b6fb05 100644 --- a/java/ql/automodel/test/AutomodelApplicationModeExtraction/AutomodelApplicationModeExtractNegativeExamples.expected +++ b/java/ql/automodel/test/AutomodelApplicationModeExtraction/AutomodelApplicationModeExtractNegativeExamples.expected @@ -1,4 +1,3 @@ | 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 | -| Test.java:67:7:67:18 | this | exception\nrelated locations: $@, $@, $@.\nmetadata: $@, $@, $@, $@, $@, $@, $@, $@, $@. | Test.java:67:7:67:18 | super(...) | CallContext | Test.java:67:7:67:18 | super(...) | MethodDoc | Test.java:67:7:67: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 | From de83929a6047dc9f61c32991905e59ae0733ee31 Mon Sep 17 00:00:00 2001 From: Henry Mercer Date: Thu, 16 Nov 2023 11:36:44 +0000 Subject: [PATCH 098/202] Remove LoC metrics from the analysis summary --- cpp/ql/src/Summary/LinesOfCode.ql | 1 + javascript/ql/src/Summary/LinesOfCode.ql | 1 + python/ql/src/Summary/LinesOfCode.ql | 1 + 3 files changed, 3 insertions(+) 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/javascript/ql/src/Summary/LinesOfCode.ql b/javascript/ql/src/Summary/LinesOfCode.ql index 9f89e0e2163..83bb06a644e 100644 --- a/javascript/ql/src/Summary/LinesOfCode.ql +++ b/javascript/ql/src/Summary/LinesOfCode.ql @@ -4,6 +4,7 @@ * @description The total number of lines of JavaScript or TypeScript code across all files checked into the repository, except in `node_modules`. This is a useful metric of the size of a database. For all files that were seen during extraction, this query counts the lines of code, excluding whitespace or comments. * @kind metric * @tags summary + * telemetry */ import javascript diff --git a/python/ql/src/Summary/LinesOfCode.ql b/python/ql/src/Summary/LinesOfCode.ql index d9bfc4f872c..a07a896c4ca 100644 --- a/python/ql/src/Summary/LinesOfCode.ql +++ b/python/ql/src/Summary/LinesOfCode.ql @@ -5,6 +5,7 @@ * database. This query counts the lines of code, excluding whitespace or comments. * @kind metric * @tags summary + * telemetry * @id py/summary/lines-of-code */ From 143e1680bd4e27c8b5fc9fddbeeee2c29fd4d278 Mon Sep 17 00:00:00 2001 From: Max Schaefer <54907921+max-schaefer@users.noreply.github.com> Date: Thu, 16 Nov 2023 11:42:35 +0000 Subject: [PATCH 099/202] Apply suggestions from code review Co-authored-by: Ben Ahmady <32935794+subatoi@users.noreply.github.com> --- java/ql/src/Security/CWE/CWE-022/TaintedPath.qhelp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/java/ql/src/Security/CWE/CWE-022/TaintedPath.qhelp b/java/ql/src/Security/CWE/CWE-022/TaintedPath.qhelp index f2471048520..b371a114059 100644 --- a/java/ql/src/Security/CWE/CWE-022/TaintedPath.qhelp +++ b/java/ql/src/Security/CWE/CWE-022/TaintedPath.qhelp @@ -41,12 +41,12 @@ 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, we check that the it does +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.

-

Alternatively, if we only want to allow simple filenames without a path component, we can remove all path +

Alternatively, if you only want to allow simple filenames 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.

From 30926401157a8349d873cb980f0f2b9ccab9f070 Mon Sep 17 00:00:00 2001 From: Stephan Brandauer Date: Thu, 16 Nov 2023 12:42:50 +0100 Subject: [PATCH 100/202] Java Automodel: make test case for Argument[this] sink candidates in ctors in framework mode --- .../AutomodelFrameworkModeExtractCandidates.expected | 3 +++ .../com/github/codeql/test/PublicClass.java | 4 ++++ 2 files changed, 7 insertions(+) diff --git a/java/ql/automodel/test/AutomodelFrameworkModeExtraction/AutomodelFrameworkModeExtractCandidates.expected b/java/ql/automodel/test/AutomodelFrameworkModeExtraction/AutomodelFrameworkModeExtractCandidates.expected index 2bb9b2edb25..3914ce3dec9 100644 --- a/java/ql/automodel/test/AutomodelFrameworkModeExtraction/AutomodelFrameworkModeExtractCandidates.expected +++ b/java/ql/automodel/test/AutomodelFrameworkModeExtraction/AutomodelFrameworkModeExtractCandidates.expected @@ -10,6 +10,9 @@ | 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: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://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: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 + } } From 84e58b77aa1f612de02d1098652011811485fdde Mon Sep 17 00:00:00 2001 From: Stephan Brandauer Date: Thu, 16 Nov 2023 12:43:38 +0100 Subject: [PATCH 101/202] Java Automodel: remove Qualifiers of constructors from endpoints --- java/ql/automodel/src/AutomodelFrameworkModeCharacteristics.qll | 2 +- .../AutomodelFrameworkModeExtractCandidates.expected | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) 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/test/AutomodelFrameworkModeExtraction/AutomodelFrameworkModeExtractCandidates.expected b/java/ql/automodel/test/AutomodelFrameworkModeExtraction/AutomodelFrameworkModeExtractCandidates.expected index 3914ce3dec9..fc3debce039 100644 --- a/java/ql/automodel/test/AutomodelFrameworkModeExtraction/AutomodelFrameworkModeExtractCandidates.expected +++ b/java/ql/automodel/test/AutomodelFrameworkModeExtraction/AutomodelFrameworkModeExtractCandidates.expected @@ -11,7 +11,6 @@ | 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: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://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: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 | From a5e7ef424e241b72ad9a4c82d113379368683026 Mon Sep 17 00:00:00 2001 From: Max Schaefer Date: Thu, 16 Nov 2023 11:54:16 +0000 Subject: [PATCH 102/202] Revert "Add additional example." This reverts commit 947b094387278c3cf0e4f2162a84df3def2bf688. --- java/ql/src/Security/CWE/CWE-022/TaintedPath.qhelp | 5 ----- .../src/Security/CWE/CWE-022/TaintedPathGood2.java | 13 ------------- .../security/CWE-022/semmle/tests/TaintedPath.java | 13 ------------- 3 files changed, 31 deletions(-) delete mode 100644 java/ql/src/Security/CWE/CWE-022/TaintedPathGood2.java diff --git a/java/ql/src/Security/CWE/CWE-022/TaintedPath.qhelp b/java/ql/src/Security/CWE/CWE-022/TaintedPath.qhelp index b371a114059..a68bdad3441 100644 --- a/java/ql/src/Security/CWE/CWE-022/TaintedPath.qhelp +++ b/java/ql/src/Security/CWE/CWE-022/TaintedPath.qhelp @@ -46,11 +46,6 @@ not contain ".." and starts with the public folder.

-

Alternatively, if you only want to allow simple filenames 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.

- - - diff --git a/java/ql/src/Security/CWE/CWE-022/TaintedPathGood2.java b/java/ql/src/Security/CWE/CWE-022/TaintedPathGood2.java deleted file mode 100644 index 6f5a19d5fd8..00000000000 --- a/java/ql/src/Security/CWE/CWE-022/TaintedPathGood2.java +++ /dev/null @@ -1,13 +0,0 @@ -public void sendUserFileGood(Socket sock, String user) { - BufferedReader filenameReader = new BufferedReader( - new InputStreamReader(sock.getInputStream(), "UTF-8")); - String filename = filenameReader.readLine(); - // GOOD: remove all ".." sequences and path separators from the filename - filename = filename.replaceAll("\\.\\.|[/\\\\]", ""); - 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/test/query-tests/security/CWE-022/semmle/tests/TaintedPath.java b/java/ql/test/query-tests/security/CWE-022/semmle/tests/TaintedPath.java index 6f20e66c34e..5a5a63ad6ad 100644 --- a/java/ql/test/query-tests/security/CWE-022/semmle/tests/TaintedPath.java +++ b/java/ql/test/query-tests/security/CWE-022/semmle/tests/TaintedPath.java @@ -32,17 +32,4 @@ public class TaintedPath { } } } - - public void sendUserFileGood2(Socket sock, String user) throws IOException { - BufferedReader filenameReader = new BufferedReader(new InputStreamReader(sock.getInputStream(), "UTF-8")); - String filename = filenameReader.readLine(); - // GOOD: remove all ".." sequences and path separators from the filename - filename = filename.replaceAll("\\.\\.|[/\\\\]", ""); - BufferedReader fileReader = new BufferedReader(new FileReader(filename)); - String fileLine = fileReader.readLine(); - while(fileLine != null) { - sock.getOutputStream().write(fileLine.getBytes()); - fileLine = fileReader.readLine(); - } - } } From 2c23dacca15b48bb4ab0ac48cd4682ed7ec234ae Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Thu, 16 Nov 2023 12:29:19 +0100 Subject: [PATCH 103/202] Ruby: Add more hash/array literal tests --- .../dataflow/array-flow/array-flow.expected | 219 ++++++++++++++++++ .../dataflow/array-flow/array-flow.ql | 3 + .../dataflow/array-flow/array_flow.rb | 30 +++ .../dataflow/hash-flow/hash-flow.expected | 102 ++++++++ .../dataflow/hash-flow/hash-flow.ql | 3 + .../dataflow/hash-flow/hash_flow.rb | 36 ++- 6 files changed, 392 insertions(+), 1 deletion(-) diff --git a/ruby/ql/test/library-tests/dataflow/array-flow/array-flow.expected b/ruby/ql/test/library-tests/dataflow/array-flow/array-flow.expected index 0d61ff1515b..f36cf514b89 100644 --- a/ruby/ql/test/library-tests/dataflow/array-flow/array-flow.expected +++ b/ruby/ql/test/library-tests/dataflow/array-flow/array-flow.expected @@ -2108,6 +2108,18 @@ edges | array_flow.rb:1641:10:1641:10 | a [element] | array_flow.rb:1641:10:1641:17 | ...[...] | | array_flow.rb:1643:10:1643:10 | a [element 0] | array_flow.rb:1643:10:1643:15 | ...[...] | | array_flow.rb:1643:10:1643:10 | a [element] | array_flow.rb:1643:10:1643:15 | ...[...] | +| array_flow.rb:1647:5:1647:5 | a [element 1] | array_flow.rb:1649:10:1649:10 | a [element 1] | +| array_flow.rb:1647:5:1647:5 | a [element 1] | array_flow.rb:1651:10:1651:10 | a [element 1] | +| array_flow.rb:1647:9:1647:32 | ...[...] [element 1] | array_flow.rb:1647:5:1647:5 | a [element 1] | +| array_flow.rb:1647:18:1647:28 | call to source | array_flow.rb:1647:9:1647:32 | ...[...] [element 1] | +| array_flow.rb:1649:10:1649:10 | a [element 1] | array_flow.rb:1649:10:1649:13 | ...[...] | +| array_flow.rb:1651:10:1651:10 | a [element 1] | array_flow.rb:1651:10:1651:13 | ...[...] | +| array_flow.rb:1668:9:1668:10 | a2 [element 1] | array_flow.rb:1670:14:1670:15 | a2 [element 1] | +| array_flow.rb:1668:9:1668:10 | a2 [element 1] | array_flow.rb:1672:14:1672:15 | a2 [element 1] | +| array_flow.rb:1668:14:1668:41 | ...[...] [element 1] | array_flow.rb:1668:9:1668:10 | a2 [element 1] | +| array_flow.rb:1668:25:1668:37 | call to source | array_flow.rb:1668:14:1668:41 | ...[...] [element 1] | +| array_flow.rb:1670:14:1670:15 | a2 [element 1] | array_flow.rb:1670:14:1670:18 | ...[...] | +| array_flow.rb:1672:14:1672:15 | a2 [element 1] | array_flow.rb:1672:14:1672:18 | ...[...] | nodes | array_flow.rb:2:5:2:5 | a [element 0] | semmle.label | a [element 0] | | array_flow.rb:2:9:2:20 | * ... [element 0] | semmle.label | * ... [element 0] | @@ -4348,7 +4360,210 @@ nodes | array_flow.rb:1643:10:1643:10 | a [element 0] | semmle.label | a [element 0] | | array_flow.rb:1643:10:1643:10 | a [element] | semmle.label | a [element] | | array_flow.rb:1643:10:1643:15 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1647:5:1647:5 | a [element 1] | semmle.label | a [element 1] | +| array_flow.rb:1647:9:1647:32 | ...[...] [element 1] | semmle.label | ...[...] [element 1] | +| array_flow.rb:1647:18:1647:28 | call to source | semmle.label | call to source | +| array_flow.rb:1649:10:1649:10 | a [element 1] | semmle.label | a [element 1] | +| array_flow.rb:1649:10:1649:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1651:10:1651:10 | a [element 1] | semmle.label | a [element 1] | +| array_flow.rb:1651:10:1651:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1668:9:1668:10 | a2 [element 1] | semmle.label | a2 [element 1] | +| array_flow.rb:1668:14:1668:41 | ...[...] [element 1] | semmle.label | ...[...] [element 1] | +| array_flow.rb:1668:25:1668:37 | call to source | semmle.label | call to source | +| array_flow.rb:1670:14:1670:15 | a2 [element 1] | semmle.label | a2 [element 1] | +| array_flow.rb:1670:14:1670:18 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1672:14:1672:15 | a2 [element 1] | semmle.label | a2 [element 1] | +| array_flow.rb:1672:14:1672:18 | ...[...] | semmle.label | ...[...] | subpaths +arrayLiteral +| array_flow.rb:9:9:9:25 | call to [] | +| array_flow.rb:33:9:33:22 | call to [] | +| array_flow.rb:40:9:40:24 | call to [] | +| array_flow.rb:41:9:41:27 | call to [] | +| array_flow.rb:48:9:48:22 | call to [] | +| array_flow.rb:55:9:55:24 | call to [] | +| array_flow.rb:56:9:56:24 | call to [] | +| array_flow.rb:63:9:63:24 | call to [] | +| array_flow.rb:64:9:64:24 | call to [] | +| array_flow.rb:71:9:71:24 | call to [] | +| array_flow.rb:80:9:80:25 | call to [] | +| array_flow.rb:88:9:88:26 | call to [] | +| array_flow.rb:96:9:96:26 | call to [] | +| array_flow.rb:103:9:103:39 | call to [] | +| array_flow.rb:109:9:109:42 | call to [] | +| array_flow.rb:120:9:120:14 | call to [] | +| array_flow.rb:128:9:128:14 | call to [] | +| array_flow.rb:129:15:129:32 | call to [] | +| array_flow.rb:136:9:136:14 | call to [] | +| array_flow.rb:144:9:144:14 | call to [] | +| array_flow.rb:145:15:145:32 | call to [] | +| array_flow.rb:152:9:152:26 | call to [] | +| array_flow.rb:159:9:159:26 | call to [] | +| array_flow.rb:166:9:166:25 | call to [] | +| array_flow.rb:175:9:175:16 | call to [] | +| array_flow.rb:176:9:176:16 | call to [] | +| array_flow.rb:177:9:177:25 | call to [] | +| array_flow.rb:178:9:178:17 | call to [] | +| array_flow.rb:184:9:184:26 | call to [] | +| array_flow.rb:192:9:192:26 | call to [] | +| array_flow.rb:200:9:200:26 | call to [] | +| array_flow.rb:208:9:208:26 | call to [] | +| array_flow.rb:215:9:215:42 | call to [] | +| array_flow.rb:224:9:224:26 | call to [] | +| array_flow.rb:231:9:231:28 | call to [] | +| array_flow.rb:240:9:240:28 | call to [] | +| array_flow.rb:250:9:250:28 | call to [] | +| array_flow.rb:253:9:253:25 | call to [] | +| array_flow.rb:264:9:264:26 | call to [] | +| array_flow.rb:273:9:273:26 | call to [] | +| array_flow.rb:279:9:279:26 | call to [] | +| array_flow.rb:286:9:286:28 | call to [] | +| array_flow.rb:287:9:287:28 | call to [] | +| array_flow.rb:294:9:294:26 | call to [] | +| array_flow.rb:301:9:301:26 | call to [] | +| array_flow.rb:308:9:308:26 | call to [] | +| array_flow.rb:316:9:316:28 | call to [] | +| array_flow.rb:325:9:325:42 | call to [] | +| array_flow.rb:330:9:330:42 | call to [] | +| array_flow.rb:338:9:338:26 | call to [] | +| array_flow.rb:349:9:349:26 | call to [] | +| array_flow.rb:350:22:350:24 | call to [] | +| array_flow.rb:355:9:355:47 | call to [] | +| array_flow.rb:355:30:355:46 | call to [] | +| array_flow.rb:364:9:364:28 | call to [] | +| array_flow.rb:372:9:372:42 | call to [] | +| array_flow.rb:387:9:387:42 | call to [] | +| array_flow.rb:395:9:395:26 | call to [] | +| array_flow.rb:403:9:403:26 | call to [] | +| array_flow.rb:412:9:412:26 | call to [] | +| array_flow.rb:419:9:419:26 | call to [] | +| array_flow.rb:427:9:427:26 | call to [] | +| array_flow.rb:435:9:435:29 | call to [] | +| array_flow.rb:442:9:442:29 | call to [] | +| array_flow.rb:451:9:451:31 | call to [] | +| array_flow.rb:460:9:460:29 | call to [] | +| array_flow.rb:466:9:466:45 | call to [] | +| array_flow.rb:482:9:482:31 | call to [] | +| array_flow.rb:498:9:498:29 | call to [] | +| array_flow.rb:506:9:506:29 | call to [] | +| array_flow.rb:518:9:518:16 | call to [] | +| array_flow.rb:525:9:525:29 | call to [] | +| array_flow.rb:535:9:535:31 | call to [] | +| array_flow.rb:543:9:543:29 | call to [] | +| array_flow.rb:551:9:551:29 | call to [] | +| array_flow.rb:558:9:558:42 | call to [] | +| array_flow.rb:570:9:570:28 | call to [] | +| array_flow.rb:573:9:573:25 | call to [] | +| array_flow.rb:584:9:584:31 | call to [] | +| array_flow.rb:584:16:584:30 | call to [] | +| array_flow.rb:590:9:590:31 | call to [] | +| array_flow.rb:590:16:590:30 | call to [] | +| array_flow.rb:600:9:600:31 | call to [] | +| array_flow.rb:611:9:611:31 | call to [] | +| array_flow.rb:622:9:622:31 | call to [] | +| array_flow.rb:631:9:631:29 | call to [] | +| array_flow.rb:638:9:638:39 | call to [] | +| array_flow.rb:655:9:655:28 | call to [] | +| array_flow.rb:669:9:669:28 | call to [] | +| array_flow.rb:676:9:676:26 | call to [] | +| array_flow.rb:683:9:683:28 | call to [] | +| array_flow.rb:684:24:684:43 | call to [] | +| array_flow.rb:684:46:684:59 | call to [] | +| array_flow.rb:689:9:689:26 | call to [] | +| array_flow.rb:699:9:699:28 | call to [] | +| array_flow.rb:708:9:708:28 | call to [] | +| array_flow.rb:717:9:717:28 | call to [] | +| array_flow.rb:726:9:726:26 | call to [] | +| array_flow.rb:754:9:754:26 | call to [] | +| array_flow.rb:772:9:772:26 | call to [] | +| array_flow.rb:800:9:800:26 | call to [] | +| array_flow.rb:818:9:818:26 | call to [] | +| array_flow.rb:834:9:834:26 | call to [] | +| array_flow.rb:844:9:844:26 | call to [] | +| array_flow.rb:853:9:853:26 | call to [] | +| array_flow.rb:860:9:860:26 | call to [] | +| array_flow.rb:866:9:866:26 | call to [] | +| array_flow.rb:876:9:876:26 | call to [] | +| array_flow.rb:905:9:905:42 | call to [] | +| array_flow.rb:913:9:913:42 | call to [] | +| array_flow.rb:924:9:924:28 | call to [] | +| array_flow.rb:935:9:935:28 | call to [] | +| array_flow.rb:936:9:936:28 | call to [] | +| array_flow.rb:937:9:937:28 | call to [] | +| array_flow.rb:944:9:944:25 | call to [] | +| array_flow.rb:953:9:953:16 | call to [] | +| array_flow.rb:954:9:954:16 | call to [] | +| array_flow.rb:955:9:955:25 | call to [] | +| array_flow.rb:956:9:956:17 | call to [] | +| array_flow.rb:962:9:962:39 | call to [] | +| array_flow.rb:976:9:976:26 | call to [] | +| array_flow.rb:985:9:985:26 | call to [] | +| array_flow.rb:995:9:995:26 | call to [] | +| array_flow.rb:1005:9:1005:26 | call to [] | +| array_flow.rb:1016:9:1016:31 | call to [] | +| array_flow.rb:1017:19:1017:32 | call to [] | +| array_flow.rb:1023:9:1023:44 | call to [] | +| array_flow.rb:1034:9:1034:44 | call to [] | +| array_flow.rb:1045:9:1045:27 | call to [] | +| array_flow.rb:1053:9:1053:27 | call to [] | +| array_flow.rb:1063:9:1063:56 | call to [] | +| array_flow.rb:1095:9:1095:56 | call to [] | +| array_flow.rb:1106:9:1106:56 | call to [] | +| array_flow.rb:1117:9:1117:56 | call to [] | +| array_flow.rb:1128:9:1128:56 | call to [] | +| array_flow.rb:1141:9:1141:30 | call to [] | +| array_flow.rb:1149:9:1149:27 | call to [] | +| array_flow.rb:1159:9:1159:41 | call to [] | +| array_flow.rb:1166:9:1166:41 | call to [] | +| array_flow.rb:1174:9:1174:41 | call to [] | +| array_flow.rb:1184:9:1184:27 | call to [] | +| array_flow.rb:1195:9:1195:27 | call to [] | +| array_flow.rb:1206:9:1206:47 | call to [] | +| array_flow.rb:1260:9:1260:47 | call to [] | +| array_flow.rb:1268:9:1268:47 | call to [] | +| array_flow.rb:1279:9:1279:47 | call to [] | +| array_flow.rb:1290:9:1290:47 | call to [] | +| array_flow.rb:1301:9:1301:47 | call to [] | +| array_flow.rb:1312:9:1312:47 | call to [] | +| array_flow.rb:1321:9:1321:47 | call to [] | +| array_flow.rb:1330:9:1330:47 | call to [] | +| array_flow.rb:1339:9:1339:47 | call to [] | +| array_flow.rb:1348:9:1348:47 | call to [] | +| array_flow.rb:1359:9:1359:27 | call to [] | +| array_flow.rb:1367:9:1367:27 | call to [] | +| array_flow.rb:1375:9:1375:27 | call to [] | +| array_flow.rb:1383:9:1383:27 | call to [] | +| array_flow.rb:1397:9:1397:27 | call to [] | +| array_flow.rb:1404:9:1404:27 | call to [] | +| array_flow.rb:1417:9:1417:27 | call to [] | +| array_flow.rb:1427:9:1427:27 | call to [] | +| array_flow.rb:1439:9:1439:27 | call to [] | +| array_flow.rb:1447:9:1447:44 | call to [] | +| array_flow.rb:1471:9:1471:27 | call to [] | +| array_flow.rb:1484:9:1484:30 | call to [] | +| array_flow.rb:1490:9:1490:27 | call to [] | +| array_flow.rb:1500:9:1500:27 | call to [] | +| array_flow.rb:1507:9:1507:68 | call to [] | +| array_flow.rb:1507:10:1507:27 | call to [] | +| array_flow.rb:1507:30:1507:47 | call to [] | +| array_flow.rb:1507:50:1507:67 | call to [] | +| array_flow.rb:1518:9:1518:29 | call to [] | +| array_flow.rb:1519:9:1519:26 | call to [] | +| array_flow.rb:1520:9:1520:26 | call to [] | +| array_flow.rb:1528:9:1528:47 | call to [] | +| array_flow.rb:1542:9:1542:44 | call to [] | +| array_flow.rb:1549:9:1549:44 | call to [] | +| array_flow.rb:1561:9:1561:29 | call to [] | +| array_flow.rb:1572:9:1572:44 | call to [] | +| array_flow.rb:1596:9:1596:29 | call to [] | +| array_flow.rb:1597:9:1597:29 | call to [] | +| array_flow.rb:1598:9:1598:29 | call to [] | +| array_flow.rb:1612:9:1612:29 | call to [] | +| array_flow.rb:1613:9:1613:26 | call to [] | +| array_flow.rb:1621:9:1621:13 | call to [] | +| array_flow.rb:1621:10:1621:12 | call to [] | +| array_flow.rb:1647:9:1647:32 | ...[...] | +| array_flow.rb:1668:14:1668:41 | ...[...] | #select | array_flow.rb:3:10:3:13 | ...[...] | array_flow.rb:2:10:2:20 | call to source | array_flow.rb:3:10:3:13 | ...[...] | $@ | array_flow.rb:2:10:2:20 | call to source | call to source | | array_flow.rb:5:10:5:13 | ...[...] | array_flow.rb:2:10:2:20 | call to source | array_flow.rb:5:10:5:13 | ...[...] | $@ | array_flow.rb:2:10:2:20 | call to source | call to source | @@ -5045,3 +5260,7 @@ subpaths | array_flow.rb:1643:10:1643:15 | ...[...] | array_flow.rb:1634:16:1634:28 | call to source | array_flow.rb:1643:10:1643:15 | ...[...] | $@ | array_flow.rb:1634:16:1634:28 | call to source | call to source | | array_flow.rb:1643:10:1643:15 | ...[...] | array_flow.rb:1636:14:1636:26 | call to source | array_flow.rb:1643:10:1643:15 | ...[...] | $@ | array_flow.rb:1636:14:1636:26 | call to source | call to source | | array_flow.rb:1643:10:1643:15 | ...[...] | array_flow.rb:1638:16:1638:28 | call to source | array_flow.rb:1643:10:1643:15 | ...[...] | $@ | array_flow.rb:1638:16:1638:28 | call to source | call to source | +| array_flow.rb:1649:10:1649:13 | ...[...] | array_flow.rb:1647:18:1647:28 | call to source | array_flow.rb:1649:10:1649:13 | ...[...] | $@ | array_flow.rb:1647:18:1647:28 | call to source | call to source | +| array_flow.rb:1651:10:1651:13 | ...[...] | array_flow.rb:1647:18:1647:28 | call to source | array_flow.rb:1651:10:1651:13 | ...[...] | $@ | array_flow.rb:1647:18:1647:28 | call to source | call to source | +| array_flow.rb:1670:14:1670:18 | ...[...] | array_flow.rb:1668:25:1668:37 | call to source | array_flow.rb:1670:14:1670:18 | ...[...] | $@ | array_flow.rb:1668:25:1668:37 | call to source | call to source | +| array_flow.rb:1672:14:1672:18 | ...[...] | array_flow.rb:1668:25:1668:37 | call to source | array_flow.rb:1672:14:1672:18 | ...[...] | $@ | array_flow.rb:1668:25:1668:37 | call to source | call to source | diff --git a/ruby/ql/test/library-tests/dataflow/array-flow/array-flow.ql b/ruby/ql/test/library-tests/dataflow/array-flow/array-flow.ql index e02827eaf8d..756833e8b35 100644 --- a/ruby/ql/test/library-tests/dataflow/array-flow/array-flow.ql +++ b/ruby/ql/test/library-tests/dataflow/array-flow/array-flow.ql @@ -3,10 +3,13 @@ */ import codeql.ruby.AST +import codeql.ruby.CFG import TestUtilities.InlineFlowTest import DefaultFlowTest import ValueFlow::PathGraph +query predicate arrayLiteral(CfgNodes::ExprNodes::ArrayLiteralCfgNode n) { any() } + from ValueFlow::PathNode source, ValueFlow::PathNode sink where ValueFlow::flowPath(source, sink) select sink, source, sink, "$@", source, source.toString() diff --git a/ruby/ql/test/library-tests/dataflow/array-flow/array_flow.rb b/ruby/ql/test/library-tests/dataflow/array-flow/array_flow.rb index fb5ee3c728a..bc137a38334 100644 --- a/ruby/ql/test/library-tests/dataflow/array-flow/array_flow.rb +++ b/ruby/ql/test/library-tests/dataflow/array-flow/array_flow.rb @@ -1642,3 +1642,33 @@ def m137 # unknown read sink(a[1.0]) # $ hasValueFlow=137.1 $ hasValueFlow=137.2 $ hasValueFlow=137.3 $ hasValueFlow=137.4 end + +def m138(i) + a = Array[0, source(138), 2] + sink(a[0]) + sink(a[1]) # $ hasValueFlow=138 + sink(a[2]) + sink(a[i]) # $ hasValueFlow=138 +end + +class M139 + class Array + def self.[] + ::Array.new + end + end + + def m139(i) + a = Array[0, source(139.1), 2] + sink(a[0]) + sink(a[1]) + sink(a[2]) + sink(a[i]) + + a2 = ::Array[0, source(139.2), 2] + sink(a2[0]) + sink(a2[1]) # $ hasValueFlow=139.2 + sink(a2[2]) + sink(a2[i]) # $ hasValueFlow=139.2 + end +end diff --git a/ruby/ql/test/library-tests/dataflow/hash-flow/hash-flow.expected b/ruby/ql/test/library-tests/dataflow/hash-flow/hash-flow.expected index 79f2565a590..00372d87e00 100644 --- a/ruby/ql/test/library-tests/dataflow/hash-flow/hash-flow.expected +++ b/ruby/ql/test/library-tests/dataflow/hash-flow/hash-flow.expected @@ -964,6 +964,18 @@ edges | hash_flow.rb:963:11:963:19 | ...[...] | hash_flow.rb:963:10:963:20 | ( ... ) | | hash_flow.rb:965:11:965:15 | hash1 [element :f] | hash_flow.rb:965:11:965:19 | ...[...] | | hash_flow.rb:965:11:965:19 | ...[...] | hash_flow.rb:965:10:965:20 | ( ... ) | +| hash_flow.rb:971:5:971:5 | h [element :b] | hash_flow.rb:973:10:973:10 | h [element :b] | +| hash_flow.rb:971:5:971:5 | h [element :b] | hash_flow.rb:975:10:975:10 | h [element :b] | +| hash_flow.rb:971:9:971:38 | ...[...] [element :b] | hash_flow.rb:971:5:971:5 | h [element :b] | +| hash_flow.rb:971:23:971:31 | call to taint | hash_flow.rb:971:9:971:38 | ...[...] [element :b] | +| hash_flow.rb:973:10:973:10 | h [element :b] | hash_flow.rb:973:10:973:14 | ...[...] | +| hash_flow.rb:975:10:975:10 | h [element :b] | hash_flow.rb:975:10:975:13 | ...[...] | +| hash_flow.rb:994:9:994:10 | h2 [element :b] | hash_flow.rb:996:14:996:15 | h2 [element :b] | +| hash_flow.rb:994:9:994:10 | h2 [element :b] | hash_flow.rb:998:14:998:15 | h2 [element :b] | +| hash_flow.rb:994:14:994:47 | ...[...] [element :b] | hash_flow.rb:994:9:994:10 | h2 [element :b] | +| hash_flow.rb:994:30:994:40 | call to taint | hash_flow.rb:994:14:994:47 | ...[...] [element :b] | +| hash_flow.rb:996:14:996:15 | h2 [element :b] | hash_flow.rb:996:14:996:19 | ...[...] | +| hash_flow.rb:998:14:998:15 | h2 [element :b] | hash_flow.rb:998:14:998:18 | ...[...] | nodes | hash_flow.rb:10:5:10:8 | hash [element 0] | semmle.label | hash [element 0] | | hash_flow.rb:10:5:10:8 | hash [element :a] | semmle.label | hash [element :a] | @@ -1999,7 +2011,93 @@ nodes | hash_flow.rb:965:10:965:20 | ( ... ) | semmle.label | ( ... ) | | hash_flow.rb:965:11:965:15 | hash1 [element :f] | semmle.label | hash1 [element :f] | | hash_flow.rb:965:11:965:19 | ...[...] | semmle.label | ...[...] | +| hash_flow.rb:971:5:971:5 | h [element :b] | semmle.label | h [element :b] | +| hash_flow.rb:971:9:971:38 | ...[...] [element :b] | semmle.label | ...[...] [element :b] | +| hash_flow.rb:971:23:971:31 | call to taint | semmle.label | call to taint | +| hash_flow.rb:973:10:973:10 | h [element :b] | semmle.label | h [element :b] | +| hash_flow.rb:973:10:973:14 | ...[...] | semmle.label | ...[...] | +| hash_flow.rb:975:10:975:10 | h [element :b] | semmle.label | h [element :b] | +| hash_flow.rb:975:10:975:13 | ...[...] | semmle.label | ...[...] | +| hash_flow.rb:994:9:994:10 | h2 [element :b] | semmle.label | h2 [element :b] | +| hash_flow.rb:994:14:994:47 | ...[...] [element :b] | semmle.label | ...[...] [element :b] | +| hash_flow.rb:994:30:994:40 | call to taint | semmle.label | call to taint | +| hash_flow.rb:996:14:996:15 | h2 [element :b] | semmle.label | h2 [element :b] | +| hash_flow.rb:996:14:996:19 | ...[...] | semmle.label | ...[...] | +| hash_flow.rb:998:14:998:15 | h2 [element :b] | semmle.label | h2 [element :b] | +| hash_flow.rb:998:14:998:18 | ...[...] | semmle.label | ...[...] | subpaths +hashLiteral +| hash_flow.rb:10:12:21:5 | call to [] | +| hash_flow.rb:55:13:55:37 | ...[...] | +| hash_flow.rb:59:9:59:29 | call to [] | +| hash_flow.rb:60:13:60:19 | ...[...] | +| hash_flow.rb:64:13:64:45 | ...[...] | +| hash_flow.rb:68:13:68:39 | ...[...] | +| hash_flow.rb:72:13:72:45 | ...[...] | +| hash_flow.rb:76:13:76:47 | ...[...] | +| hash_flow.rb:76:18:76:46 | call to [] | +| hash_flow.rb:84:13:84:42 | call to [] | +| hash_flow.rb:92:12:95:5 | call to [] | +| hash_flow.rb:127:12:130:5 | call to [] | +| hash_flow.rb:143:12:146:5 | call to [] | +| hash_flow.rb:158:12:161:5 | call to [] | +| hash_flow.rb:169:12:172:5 | call to [] | +| hash_flow.rb:181:12:184:5 | call to [] | +| hash_flow.rb:193:12:196:5 | call to [] | +| hash_flow.rb:209:12:216:5 | call to [] | +| hash_flow.rb:212:15:215:9 | call to [] | +| hash_flow.rb:226:12:229:5 | call to [] | +| hash_flow.rb:241:12:244:5 | call to [] | +| hash_flow.rb:255:12:258:5 | call to [] | +| hash_flow.rb:270:12:273:5 | call to [] | +| hash_flow.rb:284:12:289:5 | call to [] | +| hash_flow.rb:300:12:304:5 | call to [] | +| hash_flow.rb:322:12:326:5 | call to [] | +| hash_flow.rb:341:12:345:5 | call to [] | +| hash_flow.rb:357:12:361:5 | call to [] | +| hash_flow.rb:373:12:377:5 | call to [] | +| hash_flow.rb:385:12:389:5 | call to [] | +| hash_flow.rb:402:13:406:5 | call to [] | +| hash_flow.rb:407:13:411:5 | call to [] | +| hash_flow.rb:428:13:432:5 | call to [] | +| hash_flow.rb:433:13:437:5 | call to [] | +| hash_flow.rb:461:12:464:5 | call to [] | +| hash_flow.rb:473:12:476:5 | call to [] | +| hash_flow.rb:488:12:491:5 | call to [] | +| hash_flow.rb:504:12:508:5 | call to [] | +| hash_flow.rb:509:13:511:5 | call to [] | +| hash_flow.rb:519:12:523:5 | call to [] | +| hash_flow.rb:535:12:539:5 | call to [] | +| hash_flow.rb:551:12:555:5 | call to [] | +| hash_flow.rb:565:12:569:5 | call to [] | +| hash_flow.rb:584:12:588:5 | call to [] | +| hash_flow.rb:597:12:601:5 | call to [] | +| hash_flow.rb:618:12:622:5 | call to [] | +| hash_flow.rb:632:12:636:5 | call to [] | +| hash_flow.rb:648:12:652:5 | call to [] | +| hash_flow.rb:664:12:668:5 | call to [] | +| hash_flow.rb:679:13:683:5 | call to [] | +| hash_flow.rb:684:13:688:5 | call to [] | +| hash_flow.rb:712:12:716:5 | call to [] | +| hash_flow.rb:724:12:728:5 | call to [] | +| hash_flow.rb:738:13:742:5 | call to [] | +| hash_flow.rb:743:13:747:5 | call to [] | +| hash_flow.rb:748:12:748:59 | call to [] | +| hash_flow.rb:762:12:767:5 | call to [] | +| hash_flow.rb:790:13:794:5 | call to [] | +| hash_flow.rb:795:13:799:5 | call to [] | +| hash_flow.rb:816:13:820:5 | call to [] | +| hash_flow.rb:821:13:825:5 | call to [] | +| hash_flow.rb:849:13:853:5 | call to [] | +| hash_flow.rb:854:13:858:5 | call to [] | +| hash_flow.rb:881:13:885:5 | call to [] | +| hash_flow.rb:886:13:890:5 | call to [] | +| hash_flow.rb:911:13:915:5 | call to [] | +| hash_flow.rb:916:13:920:5 | call to [] | +| hash_flow.rb:941:13:945:5 | call to [] | +| hash_flow.rb:946:13:950:5 | call to [] | +| hash_flow.rb:971:9:971:38 | ...[...] | +| hash_flow.rb:994:14:994:47 | ...[...] | #select | hash_flow.rb:22:10:22:17 | ...[...] | hash_flow.rb:11:15:11:24 | call to taint | hash_flow.rb:22:10:22:17 | ...[...] | $@ | hash_flow.rb:11:15:11:24 | call to taint | call to taint | | hash_flow.rb:24:10:24:17 | ...[...] | hash_flow.rb:13:12:13:21 | call to taint | hash_flow.rb:24:10:24:17 | ...[...] | $@ | hash_flow.rb:13:12:13:21 | call to taint | call to taint | @@ -2241,3 +2339,7 @@ subpaths | hash_flow.rb:962:10:962:20 | ( ... ) | hash_flow.rb:944:12:944:22 | call to taint | hash_flow.rb:962:10:962:20 | ( ... ) | $@ | hash_flow.rb:944:12:944:22 | call to taint | call to taint | | hash_flow.rb:963:10:963:20 | ( ... ) | hash_flow.rb:947:12:947:22 | call to taint | hash_flow.rb:963:10:963:20 | ( ... ) | $@ | hash_flow.rb:947:12:947:22 | call to taint | call to taint | | hash_flow.rb:965:10:965:20 | ( ... ) | hash_flow.rb:949:12:949:22 | call to taint | hash_flow.rb:965:10:965:20 | ( ... ) | $@ | hash_flow.rb:949:12:949:22 | call to taint | call to taint | +| hash_flow.rb:973:10:973:14 | ...[...] | hash_flow.rb:971:23:971:31 | call to taint | hash_flow.rb:973:10:973:14 | ...[...] | $@ | hash_flow.rb:971:23:971:31 | call to taint | call to taint | +| hash_flow.rb:975:10:975:13 | ...[...] | hash_flow.rb:971:23:971:31 | call to taint | hash_flow.rb:975:10:975:13 | ...[...] | $@ | hash_flow.rb:971:23:971:31 | call to taint | call to taint | +| hash_flow.rb:996:14:996:19 | ...[...] | hash_flow.rb:994:30:994:40 | call to taint | hash_flow.rb:996:14:996:19 | ...[...] | $@ | hash_flow.rb:994:30:994:40 | call to taint | call to taint | +| hash_flow.rb:998:14:998:18 | ...[...] | hash_flow.rb:994:30:994:40 | call to taint | hash_flow.rb:998:14:998:18 | ...[...] | $@ | hash_flow.rb:994:30:994:40 | call to taint | call to taint | diff --git a/ruby/ql/test/library-tests/dataflow/hash-flow/hash-flow.ql b/ruby/ql/test/library-tests/dataflow/hash-flow/hash-flow.ql index 6f8978fe819..e3b694d3e75 100644 --- a/ruby/ql/test/library-tests/dataflow/hash-flow/hash-flow.ql +++ b/ruby/ql/test/library-tests/dataflow/hash-flow/hash-flow.ql @@ -3,10 +3,13 @@ */ import codeql.ruby.AST +import codeql.ruby.CFG import TestUtilities.InlineFlowTest import ValueFlowTest import ValueFlow::PathGraph +query predicate hashLiteral(CfgNodes::ExprNodes::HashLiteralCfgNode n) { any() } + from ValueFlow::PathNode source, ValueFlow::PathNode sink where ValueFlow::flowPath(source, sink) select sink, source, sink, "$@", source, source.toString() diff --git a/ruby/ql/test/library-tests/dataflow/hash-flow/hash_flow.rb b/ruby/ql/test/library-tests/dataflow/hash-flow/hash_flow.rb index dbadd617b35..14c2504f959 100644 --- a/ruby/ql/test/library-tests/dataflow/hash-flow/hash_flow.rb +++ b/ruby/ql/test/library-tests/dataflow/hash-flow/hash_flow.rb @@ -965,4 +965,38 @@ def m52() sink (hash1[:f]) # $ hasValueFlow=52.4 end -m52() \ No newline at end of file +m52() + +def m53(i) + h = Hash[a: 1, b: taint(53), c: 2] + sink(h[:a]) + sink(h[:b]) # $ hasValueFlow=53 + sink(h[:c]) + sink(h[i]) # $ hasValueFlow=53 +end + +m53(:b) + +class M54 + class Hash + def self.[](**kwargs) + ::Hash.new + end + end + + def m54(i) + h = Hash[a: 0, b: taint(54.1), c: 2] + sink(h[:a]) + sink(h[:b]) + sink(h[:c]) + sink(h[i]) + + h2 = ::Hash[a: 0, b: taint(54.2), c: 2] + sink(h2[:a]) + sink(h2[:b]) # $ hasValueFlow=54.2 + sink(h2[:c]) + sink(h2[i]) # $ hasValueFlow=54.2 + end +end + +M54.new.m54(:b) From 078f223052acf4db8c829a4854c8b56bfb2ae1d5 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Tue, 14 Nov 2023 16:46:58 +0000 Subject: [PATCH 104/202] C++: Rewrite 'cpp/cpp/integer-overflow-tainted' away from DefaultTaintTracking. --- .../CWE/CWE-190/IntegerOverflowTainted.ql | 87 ++++++++++++++++--- 1 file changed, 77 insertions(+), 10 deletions(-) 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 From b2f1022e5ceb112d538e64185fc0a596bd0ae965 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Tue, 14 Nov 2023 13:17:32 +0100 Subject: [PATCH 105/202] Ruby: Prune irrelevant data flow nodes and edges --- .../dataflow/internal/DataFlowPrivate.qll | 199 ++++++++++-------- .../ruby/dataflow/internal/DataFlowPublic.qll | 4 +- .../dataflow/local/Nodes.expected | 32 --- 3 files changed, 119 insertions(+), 116 deletions(-) diff --git a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll index 5ee2dbd3f46..1341ed66792 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll @@ -398,25 +398,29 @@ module VariableCapture { CapturedSsaDefinitionExt() { this.getSourceVariable() instanceof CapturedVariable } } - /** - * Holds if there is control-flow insensitive data-flow from `node1` to `node2` - * involving a captured variable. Only used in type tracking. - */ - predicate flowInsensitiveStep(Node node1, Node node2) { - exists(CapturedSsaDefinitionExt def, CapturedVariable v | - // From an assignment or implicit initialization of a captured variable to its flow-insensitive node - def = node1.(SsaDefinitionExtNode).getDefinitionExt() and + // From an assignment or implicit initialization of a captured variable to its flow-insensitive node + private predicate flowInsensitiveWriteStep( + SsaDefinitionExtNode node1, CapturedVariableNode node2, CapturedVariable v + ) { + exists(CapturedSsaDefinitionExt def | + def = node1.getDefinitionExt() and def.getSourceVariable() = v and ( def instanceof Ssa::WriteDefinition or def instanceof Ssa::SelfDefinition ) and - node2.(CapturedVariableNode).getVariable() = v - or - // From a captured variable node to its flow-sensitive capture nodes - node1.(CapturedVariableNode).getVariable() = v and - def = node2.(SsaDefinitionExtNode).getDefinitionExt() and + node2.getVariable() = v + ) + } + + // From a captured variable node to its flow-sensitive capture nodes + private predicate flowInsensitiveReadStep( + CapturedVariableNode node1, SsaDefinitionExtNode node2, CapturedVariable v + ) { + exists(CapturedSsaDefinitionExt def | + node1.getVariable() = v and + def = node2.getDefinitionExt() and def.getSourceVariable() = v and ( def instanceof Ssa::CapturedCallDefinition @@ -425,6 +429,20 @@ module VariableCapture { ) ) } + + /** + * Holds if there is control-flow insensitive data-flow from `node1` to `node2` + * involving a captured variable. Only used in type tracking. + */ + predicate flowInsensitiveStep(Node node1, Node node2) { + exists(CapturedVariable v | + flowInsensitiveWriteStep(node1, node2, v) and + flowInsensitiveReadStep(_, _, v) + or + flowInsensitiveReadStep(node1, node2, v) and + flowInsensitiveWriteStep(_, _, v) + ) + } } private predicate splatParameterAt(Callable c, int pos) { @@ -443,7 +461,7 @@ private module Cached { cached newtype TNode = TExprNode(CfgNodes::ExprCfgNode n) or - TReturningNode(CfgNodes::ReturningCfgNode n) or + TReturningNode(CfgNodes::ReturningCfgNode n) { exists(n.getReturnedValueNode()) } or TSsaDefinitionExtNode(SsaImpl::DefinitionExt def) or TCapturedVariableNode(VariableCapture::CapturedVariable v) or TNormalParameterNode(Parameter p) { @@ -478,11 +496,11 @@ private module Cached { } or TFlowSummaryNode(FlowSummaryImpl::Private::SummaryNode sn) or TSynthHashSplatArgumentNode(CfgNodes::ExprNodes::CallCfgNode c) { - exists(Argument arg | arg.isArgumentOf(c, any(ArgumentPosition pos | pos.isKeyword(_)))) - or - c.getAnArgument() instanceof CfgNodes::ExprNodes::PairCfgNode + ArgumentNodes::synthHashSplatStore(c, _, _) + } or + TSynthSplatArgumentNode(CfgNodes::ExprNodes::CallCfgNode c) { + ArgumentNodes::synthSplatStore(c, _, _) } or - TSynthSplatArgumentNode(CfgNodes::ExprNodes::CallCfgNode c) or TSynthSplatArgumentShiftNode(CfgNodes::ExprNodes::CallCfgNode c, int splatPos, int n) { // we use -1 to represent data at an unknown index n in [-1 .. 10] and @@ -652,7 +670,7 @@ private module Cached { ) } or TSplatContent(int i, Boolean shifted) { i in [0 .. 10] } or - THashSplatContent(ConstantValue cv) { not cv.isInt(_) } or + THashSplatContent(ConstantValue::ConstantSymbolValue cv) or TCapturedVariableContent(VariableCapture::CapturedVariable v) or // Only used by type-tracking TAttributeName(string name) { name = any(SetterMethodCall c).getTargetName() } @@ -1269,6 +1287,51 @@ module ArgumentNodes { final override Location getLocationImpl() { result = call_.getLocation() } } + /** + * Holds if a store-step should be added from keyword argument `arg`, belonging to + * `call`, into a synthetic hash splat argument. + */ + predicate synthHashSplatStore( + CfgNodes::ExprNodes::CallCfgNode call, CfgNodes::ExprCfgNode arg, ContentSet c + ) { + exists(ConstantValue cv | + // symbol key + exists(ArgumentPosition keywordPos, string name | + arg.(Argument).isArgumentOf(call, keywordPos) and + keywordPos.isKeyword(name) and + cv.isSymbol(name) + ) + or + // non-symbol key + exists(CfgNodes::ExprNodes::PairCfgNode pair, CfgNodes::ExprCfgNode key | + arg = pair.getValue() and + pair = call.getAnArgument() and + key = pair.getKey() and + cv = key.getConstantValue() and + not cv.isSymbol(_) + ) + | + if call instanceof CfgNodes::ExprNodes::HashLiteralCfgNode + then + /* + * Needed for cases like + * + * ```rb + * hash = { a: taint, b: safe } + * + * def foo(a:, b:) + * sink(a) + * end + * + * foo(**hash) + * ``` + */ + + c.isSingleton(Content::getElementContent(cv)) + else c.isSingleton(THashSplatContent(cv)) + ) + } + /** * A data-flow node that represents all keyword arguments wrapped in a hash. * @@ -1285,44 +1348,7 @@ module ArgumentNodes { * Holds if a store-step should be added from argument `arg` into this synthetic * hash-splat argument. */ - predicate storeFrom(Node arg, ContentSet c) { - exists(ConstantValue cv | - if call_ instanceof CfgNodes::ExprNodes::HashLiteralCfgNode - then - /* - * Needed for cases like - * - * ```rb - * hash = { a: taint, b: safe } - * - * def foo(a:, b:) - * sink(a) - * end - * - * foo(**hash) - * ``` - */ - - c.isSingleton(TKnownElementContent(cv)) - else c.isSingleton(THashSplatContent(cv)) - | - // symbol key - exists(ArgumentPosition keywordPos, string name | - arg.asExpr().(Argument).isArgumentOf(call_, keywordPos) and - keywordPos.isKeyword(name) and - cv.isSymbol(name) - ) - or - // non-symbol key - exists(CfgNodes::ExprNodes::PairCfgNode pair, CfgNodes::ExprCfgNode key | - arg.asExpr() = pair.getValue() and - pair = call_.getAnArgument() and - key = pair.getKey() and - cv = key.getConstantValue() and - not cv.isSymbol(_) - ) - ) - } + predicate storeFrom(Node arg, ContentSet c) { synthHashSplatStore(call_, arg.asExpr(), c) } override predicate sourceArgumentOf(CfgNodes::ExprNodes::CallCfgNode call, ArgumentPosition pos) { call = call_ and @@ -1332,6 +1358,39 @@ module ArgumentNodes { override string toStringImpl() { result = "synthetic hash-splat argument" } } + /** + * Holds if a store-step should be added from positional argument `arg`, belonging to + * `call`, into a synthetic splat argument. + */ + predicate synthSplatStore(CfgNodes::ExprNodes::CallCfgNode call, Argument arg, ContentSet c) { + exists(int n | + exists(ArgumentPosition pos | + arg.isArgumentOf(call, pos) and + pos.isPositional(n) and + not exists(int i | splatArgumentAt(call, i) and i < n) + ) + | + if call instanceof CfgNodes::ExprNodes::ArrayLiteralCfgNode + then + /* + * Needed for cases like + * + * ```rb + * arr = [taint, safe] + * + * def foo(a, b) + * sink(a) + * end + * + * foo(*arr) + * ``` + */ + + c = getArrayContent(n) + else c = getSplatContent(n, false) + ) + } + /** * A data-flow node that represents all positional arguments wrapped in an array. * @@ -1346,31 +1405,7 @@ module ArgumentNodes { * Holds if a store-step should be added from argument `arg` into this synthetic * splat argument. */ - predicate storeFrom(Node arg, ContentSet c) { - exists(ArgumentPosition pos, int n | - arg.asExpr().(Argument).isArgumentOf(call_, pos) and - pos.isPositional(n) and - not exists(int i | splatArgumentAt(call_, i) and i < n) and - if call_ instanceof CfgNodes::ExprNodes::ArrayLiteralCfgNode - then - /* - * Needed for cases like - * - * ```rb - * arr = [taint, safe] - * - * def foo(a, b) - * sink(a) - * end - * - * foo(*arr) - * ``` - */ - - c = getArrayContent(n) - else c = getSplatContent(n, false) - ) - } + predicate storeFrom(Node arg, ContentSet c) { synthSplatStore(call_, arg.asExpr(), c) } override predicate sourceArgumentOf(CfgNodes::ExprNodes::CallCfgNode call, ArgumentPosition pos) { call = call_ and diff --git a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPublic.qll b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPublic.qll index 64798d78f4d..1e3077f5bd4 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPublic.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPublic.qll @@ -606,12 +606,12 @@ module Content { * we have an implicit hash-splat argument containing `{:a => 1, :b => 2, :c => 3}`. */ class HashSplatContent extends ElementContent, THashSplatContent { - private ConstantValue cv; + private ConstantValue::ConstantSymbolValue cv; HashSplatContent() { this = THashSplatContent(cv) } /** Gets the hash key. */ - ConstantValue getKey() { result = cv } + ConstantValue::ConstantSymbolValue getKey() { result = cv } override string toString() { result = "hash-splat position " + cv } } diff --git a/ruby/ql/test/library-tests/dataflow/local/Nodes.expected b/ruby/ql/test/library-tests/dataflow/local/Nodes.expected index 575e8f1dbfc..2ce5b9c2f23 100644 --- a/ruby/ql/test/library-tests/dataflow/local/Nodes.expected +++ b/ruby/ql/test/library-tests/dataflow/local/Nodes.expected @@ -4,7 +4,6 @@ ret | local_dataflow.rb:12:3:12:5 | call to p | | local_dataflow.rb:16:3:16:10 | break | | local_dataflow.rb:20:3:20:25 | if ... | -| local_dataflow.rb:20:17:20:21 | break | | local_dataflow.rb:32:14:32:21 | "method" | | local_dataflow.rb:36:6:36:13 | return | | local_dataflow.rb:38:3:38:13 | "reachable" | @@ -1234,36 +1233,23 @@ arg | local_dataflow.rb:9:10:9:10 | 1 | local_dataflow.rb:9:9:9:15 | call to [] | position 0 | | local_dataflow.rb:9:12:9:12 | 2 | local_dataflow.rb:9:9:9:15 | call to [] | position 1 | | local_dataflow.rb:9:14:9:14 | 3 | local_dataflow.rb:9:9:9:15 | call to [] | position 2 | -| local_dataflow.rb:10:5:13:3 | synthetic splat argument | local_dataflow.rb:10:5:13:3 | call to each | synthetic * | | local_dataflow.rb:10:5:13:3 | { ... } | local_dataflow.rb:10:5:13:3 | call to each | block | | local_dataflow.rb:10:9:10:9 | defined? ... | local_dataflow.rb:10:9:10:9 | [false] ! ... | self | | local_dataflow.rb:10:9:10:9 | defined? ... | local_dataflow.rb:10:9:10:9 | [true] ! ... | self | -| local_dataflow.rb:10:9:10:9 | synthetic splat argument | local_dataflow.rb:10:9:10:9 | [false] ! ... | synthetic * | -| local_dataflow.rb:10:9:10:9 | synthetic splat argument | local_dataflow.rb:10:9:10:9 | [true] ! ... | synthetic * | -| local_dataflow.rb:10:9:10:9 | synthetic splat argument | local_dataflow.rb:10:9:10:9 | defined? ... | synthetic * | | local_dataflow.rb:10:9:10:9 | x | local_dataflow.rb:10:9:10:9 | defined? ... | self | | local_dataflow.rb:10:14:10:18 | array | local_dataflow.rb:10:5:13:3 | call to each | self | | local_dataflow.rb:11:1:11:2 | self | local_dataflow.rb:11:1:11:2 | call to do | self | -| local_dataflow.rb:11:1:11:2 | synthetic splat argument | local_dataflow.rb:11:1:11:2 | call to do | synthetic * | | local_dataflow.rb:12:3:12:5 | self | local_dataflow.rb:12:3:12:5 | call to p | self | | local_dataflow.rb:12:3:12:5 | synthetic splat argument | local_dataflow.rb:12:3:12:5 | call to p | synthetic * | | local_dataflow.rb:12:5:12:5 | x | local_dataflow.rb:12:3:12:5 | call to p | position 0 | -| local_dataflow.rb:15:1:17:3 | synthetic splat argument | local_dataflow.rb:15:1:17:3 | call to each | synthetic * | | local_dataflow.rb:15:1:17:3 | { ... } | local_dataflow.rb:15:1:17:3 | call to each | block | | local_dataflow.rb:15:5:15:5 | defined? ... | local_dataflow.rb:15:5:15:5 | [false] ! ... | self | | local_dataflow.rb:15:5:15:5 | defined? ... | local_dataflow.rb:15:5:15:5 | [true] ! ... | self | -| local_dataflow.rb:15:5:15:5 | synthetic splat argument | local_dataflow.rb:15:5:15:5 | [false] ! ... | synthetic * | -| local_dataflow.rb:15:5:15:5 | synthetic splat argument | local_dataflow.rb:15:5:15:5 | [true] ! ... | synthetic * | -| local_dataflow.rb:15:5:15:5 | synthetic splat argument | local_dataflow.rb:15:5:15:5 | defined? ... | synthetic * | | local_dataflow.rb:15:5:15:5 | x | local_dataflow.rb:15:5:15:5 | defined? ... | self | | local_dataflow.rb:15:10:15:14 | array | local_dataflow.rb:15:1:17:3 | call to each | self | -| local_dataflow.rb:19:1:21:3 | synthetic splat argument | local_dataflow.rb:19:1:21:3 | call to each | synthetic * | | local_dataflow.rb:19:1:21:3 | { ... } | local_dataflow.rb:19:1:21:3 | call to each | block | | local_dataflow.rb:19:5:19:5 | defined? ... | local_dataflow.rb:19:5:19:5 | [false] ! ... | self | | local_dataflow.rb:19:5:19:5 | defined? ... | local_dataflow.rb:19:5:19:5 | [true] ! ... | self | -| local_dataflow.rb:19:5:19:5 | synthetic splat argument | local_dataflow.rb:19:5:19:5 | [false] ! ... | synthetic * | -| local_dataflow.rb:19:5:19:5 | synthetic splat argument | local_dataflow.rb:19:5:19:5 | [true] ! ... | synthetic * | -| local_dataflow.rb:19:5:19:5 | synthetic splat argument | local_dataflow.rb:19:5:19:5 | defined? ... | synthetic * | | local_dataflow.rb:19:5:19:5 | x | local_dataflow.rb:19:5:19:5 | defined? ... | self | | local_dataflow.rb:19:10:19:14 | array | local_dataflow.rb:19:1:21:3 | call to each | self | | local_dataflow.rb:20:6:20:6 | x | local_dataflow.rb:20:6:20:10 | ... > ... | self | @@ -1276,7 +1262,6 @@ arg | local_dataflow.rb:42:6:42:11 | synthetic splat argument | local_dataflow.rb:42:6:42:11 | ... == ... | synthetic * | | local_dataflow.rb:42:11:42:11 | 4 | local_dataflow.rb:42:6:42:11 | ... == ... | position 0 | | local_dataflow.rb:49:1:53:3 | self | local_dataflow.rb:49:1:53:3 | call to m | self | -| local_dataflow.rb:49:1:53:3 | synthetic splat argument | local_dataflow.rb:49:1:53:3 | call to m | synthetic * | | local_dataflow.rb:49:3:53:3 | do ... end | local_dataflow.rb:49:1:53:3 | call to m | block | | local_dataflow.rb:50:18:50:18 | x | local_dataflow.rb:50:18:50:22 | ... < ... | self | | local_dataflow.rb:50:18:50:22 | synthetic splat argument | local_dataflow.rb:50:18:50:22 | ... < ... | synthetic * | @@ -1408,7 +1393,6 @@ arg | local_dataflow.rb:112:8:112:16 | self | local_dataflow.rb:112:8:112:16 | call to source | self | | local_dataflow.rb:112:8:112:16 | synthetic splat argument | local_dataflow.rb:112:8:112:16 | call to source | synthetic * | | local_dataflow.rb:112:8:112:20 | call to dup | local_dataflow.rb:112:3:112:21 | call to sink | position 0 | -| local_dataflow.rb:112:8:112:20 | synthetic splat argument | local_dataflow.rb:112:8:112:20 | call to dup | synthetic * | | local_dataflow.rb:112:15:112:15 | 1 | local_dataflow.rb:112:8:112:16 | call to source | position 0 | | local_dataflow.rb:113:3:113:25 | self | local_dataflow.rb:113:3:113:25 | call to sink | self | | local_dataflow.rb:113:3:113:25 | synthetic splat argument | local_dataflow.rb:113:3:113:25 | call to sink | synthetic * | @@ -1416,9 +1400,7 @@ arg | local_dataflow.rb:113:8:113:16 | self | local_dataflow.rb:113:8:113:16 | call to source | self | | local_dataflow.rb:113:8:113:16 | synthetic splat argument | local_dataflow.rb:113:8:113:16 | call to source | synthetic * | | local_dataflow.rb:113:8:113:20 | call to dup | local_dataflow.rb:113:8:113:24 | call to dup | self | -| local_dataflow.rb:113:8:113:20 | synthetic splat argument | local_dataflow.rb:113:8:113:20 | call to dup | synthetic * | | local_dataflow.rb:113:8:113:24 | call to dup | local_dataflow.rb:113:3:113:25 | call to sink | position 0 | -| local_dataflow.rb:113:8:113:24 | synthetic splat argument | local_dataflow.rb:113:8:113:24 | call to dup | synthetic * | | local_dataflow.rb:113:15:113:15 | 1 | local_dataflow.rb:113:8:113:16 | call to source | position 0 | | local_dataflow.rb:117:3:117:24 | self | local_dataflow.rb:117:3:117:24 | call to sink | self | | local_dataflow.rb:117:3:117:24 | synthetic splat argument | local_dataflow.rb:117:3:117:24 | call to sink | synthetic * | @@ -1426,13 +1408,11 @@ arg | local_dataflow.rb:117:8:117:16 | self | local_dataflow.rb:117:8:117:16 | call to source | self | | local_dataflow.rb:117:8:117:16 | synthetic splat argument | local_dataflow.rb:117:8:117:16 | call to source | synthetic * | | local_dataflow.rb:117:8:117:23 | call to tap | local_dataflow.rb:117:3:117:24 | call to sink | position 0 | -| local_dataflow.rb:117:8:117:23 | synthetic splat argument | local_dataflow.rb:117:8:117:23 | call to tap | synthetic * | | local_dataflow.rb:117:15:117:15 | 1 | local_dataflow.rb:117:8:117:16 | call to source | position 0 | | local_dataflow.rb:117:22:117:23 | { ... } | local_dataflow.rb:117:8:117:23 | call to tap | block | | local_dataflow.rb:118:3:118:11 | call to source | local_dataflow.rb:118:3:118:31 | call to tap | self | | local_dataflow.rb:118:3:118:11 | self | local_dataflow.rb:118:3:118:11 | call to source | self | | local_dataflow.rb:118:3:118:11 | synthetic splat argument | local_dataflow.rb:118:3:118:11 | call to source | synthetic * | -| local_dataflow.rb:118:3:118:31 | synthetic splat argument | local_dataflow.rb:118:3:118:31 | call to tap | synthetic * | | local_dataflow.rb:118:10:118:10 | 1 | local_dataflow.rb:118:3:118:11 | call to source | position 0 | | local_dataflow.rb:118:17:118:31 | { ... } | local_dataflow.rb:118:3:118:31 | call to tap | block | | local_dataflow.rb:118:23:118:29 | self | local_dataflow.rb:118:23:118:29 | call to sink | self | @@ -1444,9 +1424,7 @@ arg | local_dataflow.rb:119:8:119:16 | self | local_dataflow.rb:119:8:119:16 | call to source | self | | local_dataflow.rb:119:8:119:16 | synthetic splat argument | local_dataflow.rb:119:8:119:16 | call to source | synthetic * | | local_dataflow.rb:119:8:119:23 | call to tap | local_dataflow.rb:119:8:119:30 | call to tap | self | -| local_dataflow.rb:119:8:119:23 | synthetic splat argument | local_dataflow.rb:119:8:119:23 | call to tap | synthetic * | | local_dataflow.rb:119:8:119:30 | call to tap | local_dataflow.rb:119:3:119:31 | call to sink | position 0 | -| local_dataflow.rb:119:8:119:30 | synthetic splat argument | local_dataflow.rb:119:8:119:30 | call to tap | synthetic * | | local_dataflow.rb:119:15:119:15 | 1 | local_dataflow.rb:119:8:119:16 | call to source | position 0 | | local_dataflow.rb:119:22:119:23 | { ... } | local_dataflow.rb:119:8:119:23 | call to tap | block | | local_dataflow.rb:119:29:119:30 | { ... } | local_dataflow.rb:119:8:119:30 | call to tap | block | @@ -1456,18 +1434,14 @@ arg | local_dataflow.rb:123:8:123:16 | self | local_dataflow.rb:123:8:123:16 | call to source | self | | local_dataflow.rb:123:8:123:16 | synthetic splat argument | local_dataflow.rb:123:8:123:16 | call to source | synthetic * | | local_dataflow.rb:123:8:123:20 | call to dup | local_dataflow.rb:123:8:123:45 | call to tap | self | -| local_dataflow.rb:123:8:123:20 | synthetic splat argument | local_dataflow.rb:123:8:123:20 | call to dup | synthetic * | | local_dataflow.rb:123:8:123:45 | call to tap | local_dataflow.rb:123:8:123:49 | call to dup | self | -| local_dataflow.rb:123:8:123:45 | synthetic splat argument | local_dataflow.rb:123:8:123:45 | call to tap | synthetic * | | local_dataflow.rb:123:8:123:49 | call to dup | local_dataflow.rb:123:3:123:50 | call to sink | position 0 | -| local_dataflow.rb:123:8:123:49 | synthetic splat argument | local_dataflow.rb:123:8:123:49 | call to dup | synthetic * | | local_dataflow.rb:123:15:123:15 | 1 | local_dataflow.rb:123:8:123:16 | call to source | position 0 | | local_dataflow.rb:123:26:123:45 | { ... } | local_dataflow.rb:123:8:123:45 | call to tap | block | | local_dataflow.rb:123:32:123:43 | self | local_dataflow.rb:123:32:123:43 | call to puts | self | | local_dataflow.rb:123:32:123:43 | synthetic splat argument | local_dataflow.rb:123:32:123:43 | call to puts | synthetic * | | local_dataflow.rb:123:37:123:43 | "hello" | local_dataflow.rb:123:32:123:43 | call to puts | position 0 | | local_dataflow.rb:127:3:127:8 | self | local_dataflow.rb:127:3:127:8 | call to rand | self | -| local_dataflow.rb:127:3:127:8 | synthetic splat argument | local_dataflow.rb:127:3:127:8 | call to rand | synthetic * | | local_dataflow.rb:132:6:132:11 | self | local_dataflow.rb:132:6:132:11 | call to use | self | | local_dataflow.rb:132:6:132:11 | synthetic splat argument | local_dataflow.rb:132:6:132:11 | call to use | synthetic * | | local_dataflow.rb:132:10:132:10 | x | local_dataflow.rb:132:6:132:11 | call to use | position 0 | @@ -1498,8 +1472,6 @@ arg | local_dataflow.rb:137:14:137:14 | x | local_dataflow.rb:137:10:137:15 | call to use | position 0 | | local_dataflow.rb:137:20:137:26 | [false] ! ... | local_dataflow.rb:137:10:137:26 | [false] ... && ... | position 0 | | local_dataflow.rb:137:20:137:26 | [true] ! ... | local_dataflow.rb:137:10:137:26 | [true] ... && ... | position 0 | -| local_dataflow.rb:137:20:137:26 | synthetic splat argument | local_dataflow.rb:137:20:137:26 | [false] ! ... | synthetic * | -| local_dataflow.rb:137:20:137:26 | synthetic splat argument | local_dataflow.rb:137:20:137:26 | [true] ! ... | synthetic * | | local_dataflow.rb:137:21:137:26 | call to use | local_dataflow.rb:137:20:137:26 | [false] ! ... | self | | local_dataflow.rb:137:21:137:26 | call to use | local_dataflow.rb:137:20:137:26 | [true] ! ... | self | | local_dataflow.rb:137:21:137:26 | self | local_dataflow.rb:137:21:137:26 | call to use | self | @@ -1508,8 +1480,6 @@ arg | local_dataflow.rb:141:8:141:14 | [false] ! ... | local_dataflow.rb:141:8:141:37 | [false] ... \|\| ... | self | | local_dataflow.rb:141:8:141:14 | [false] ! ... | local_dataflow.rb:141:8:141:37 | [true] ... \|\| ... | self | | local_dataflow.rb:141:8:141:14 | [true] ! ... | local_dataflow.rb:141:8:141:37 | [true] ... \|\| ... | self | -| local_dataflow.rb:141:8:141:14 | synthetic splat argument | local_dataflow.rb:141:8:141:14 | [false] ! ... | synthetic * | -| local_dataflow.rb:141:8:141:14 | synthetic splat argument | local_dataflow.rb:141:8:141:14 | [true] ! ... | synthetic * | | local_dataflow.rb:141:8:141:37 | synthetic splat argument | local_dataflow.rb:141:8:141:37 | [false] ... \|\| ... | synthetic * | | local_dataflow.rb:141:8:141:37 | synthetic splat argument | local_dataflow.rb:141:8:141:37 | [true] ... \|\| ... | synthetic * | | local_dataflow.rb:141:9:141:14 | call to use | local_dataflow.rb:141:8:141:14 | [false] ! ... | self | @@ -1528,8 +1498,6 @@ arg | local_dataflow.rb:141:24:141:24 | x | local_dataflow.rb:141:20:141:25 | call to use | position 0 | | local_dataflow.rb:141:30:141:36 | [false] ! ... | local_dataflow.rb:141:20:141:36 | [false] ... && ... | position 0 | | local_dataflow.rb:141:30:141:36 | [true] ! ... | local_dataflow.rb:141:20:141:36 | [true] ... && ... | position 0 | -| local_dataflow.rb:141:30:141:36 | synthetic splat argument | local_dataflow.rb:141:30:141:36 | [false] ! ... | synthetic * | -| local_dataflow.rb:141:30:141:36 | synthetic splat argument | local_dataflow.rb:141:30:141:36 | [true] ! ... | synthetic * | | local_dataflow.rb:141:31:141:36 | call to use | local_dataflow.rb:141:30:141:36 | [false] ! ... | self | | local_dataflow.rb:141:31:141:36 | call to use | local_dataflow.rb:141:30:141:36 | [true] ! ... | self | | local_dataflow.rb:141:31:141:36 | self | local_dataflow.rb:141:31:141:36 | call to use | self | From 641646ac082aff0e1a60f5da7f20d87c86223bf3 Mon Sep 17 00:00:00 2001 From: Arthur Baars Date: Thu, 16 Nov 2023 14:04:25 +0100 Subject: [PATCH 106/202] Rename change note --- ...{2023-14-09-move-semantics.md => 2023-09-14-move-semantics.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename swift/ql/lib/change-notes/{2023-14-09-move-semantics.md => 2023-09-14-move-semantics.md} (100%) diff --git a/swift/ql/lib/change-notes/2023-14-09-move-semantics.md b/swift/ql/lib/change-notes/2023-09-14-move-semantics.md similarity index 100% rename from swift/ql/lib/change-notes/2023-14-09-move-semantics.md rename to swift/ql/lib/change-notes/2023-09-14-move-semantics.md From 6ec9b9507290eb01ec7f809951f2c9888631e434 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 16 Nov 2023 13:07:16 +0000 Subject: [PATCH 107/202] Release preparation for version 2.15.3 --- cpp/ql/lib/CHANGELOG.md | 14 ++++++ .../change-notes/2023-10-30-realloc-flow.md | 4 -- .../2023-10-31-assign-pointer-add-sub-expr.md | 4 -- .../change-notes/2023-10-31-odbc-models.md | 4 -- .../change-notes/2023-11-08-strsafe-models.md | 4 -- .../2023-11-10-strlcpy-strlcat-models.md | 4 -- ...023-11-15-return-stack-allocated-memory.md | 4 -- cpp/ql/lib/change-notes/released/0.12.0.md | 13 ++++++ cpp/ql/lib/codeql-pack.release.yml | 2 +- cpp/ql/lib/qlpack.yml | 2 +- cpp/ql/src/CHANGELOG.md | 6 +++ .../0.8.3.md} | 7 +-- cpp/ql/src/codeql-pack.release.yml | 2 +- cpp/ql/src/qlpack.yml | 2 +- .../ql/campaigns/Solorigate/lib/CHANGELOG.md | 4 ++ .../lib/change-notes/released/1.7.3.md | 3 ++ .../Solorigate/lib/codeql-pack.release.yml | 2 +- csharp/ql/campaigns/Solorigate/lib/qlpack.yml | 2 +- .../ql/campaigns/Solorigate/src/CHANGELOG.md | 4 ++ .../src/change-notes/released/1.7.3.md | 3 ++ .../Solorigate/src/codeql-pack.release.yml | 2 +- csharp/ql/campaigns/Solorigate/src/qlpack.yml | 2 +- csharp/ql/lib/CHANGELOG.md | 46 +++++++++++++++++++ .../change-notes/2023-11-09-mad-generics.md | 24 ---------- .../0.8.3.md} | 26 +++++++++-- csharp/ql/lib/codeql-pack.release.yml | 2 +- csharp/ql/lib/qlpack.yml | 2 +- csharp/ql/src/CHANGELOG.md | 6 +++ .../0.8.3.md} | 9 ++-- csharp/ql/src/codeql-pack.release.yml | 2 +- csharp/ql/src/qlpack.yml | 2 +- go/ql/consistency-queries/CHANGELOG.md | 4 ++ .../change-notes/released/0.0.2.md | 3 ++ .../codeql-pack.release.yml | 2 +- go/ql/consistency-queries/qlpack.yml | 2 +- go/ql/lib/CHANGELOG.md | 10 ++++ .../2023-10-31-add-gin-cors-framework.md | 4 -- .../2023-11-15-bug-fix-value-flow-in-array.md | 4 -- go/ql/lib/change-notes/released/0.7.3.md | 9 ++++ go/ql/lib/codeql-pack.release.yml | 2 +- go/ql/lib/qlpack.yml | 2 +- go/ql/src/CHANGELOG.md | 4 ++ go/ql/src/change-notes/released/0.7.3.md | 3 ++ go/ql/src/codeql-pack.release.yml | 2 +- go/ql/src/qlpack.yml | 2 +- java/ql/automodel/src/CHANGELOG.md | 5 +- .../src/change-notes/released/0.0.8.md | 3 ++ java/ql/automodel/src/codeql-pack.release.yml | 2 +- java/ql/automodel/src/qlpack.yml | 2 +- java/ql/lib/CHANGELOG.md | 10 ++++ .../change-notes/2023-11-06-jdk21-models.md | 4 -- .../0.8.3.md} | 11 +++-- java/ql/lib/codeql-pack.release.yml | 2 +- java/ql/lib/qlpack.yml | 2 +- java/ql/src/CHANGELOG.md | 6 +++ .../0.8.3.md} | 7 +-- java/ql/src/codeql-pack.release.yml | 2 +- java/ql/src/qlpack.yml | 2 +- javascript/ql/lib/CHANGELOG.md | 4 ++ .../ql/lib/change-notes/released/0.8.3.md | 3 ++ javascript/ql/lib/codeql-pack.release.yml | 2 +- javascript/ql/lib/qlpack.yml | 2 +- javascript/ql/src/CHANGELOG.md | 7 +++ ...9-adjust-xss-and-log-injection-severity.md | 6 --- .../ql/src/change-notes/released/0.8.3.md | 6 +++ javascript/ql/src/codeql-pack.release.yml | 2 +- javascript/ql/src/qlpack.yml | 2 +- misc/suite-helpers/CHANGELOG.md | 4 ++ .../change-notes/released/0.7.3.md | 3 ++ misc/suite-helpers/codeql-pack.release.yml | 2 +- misc/suite-helpers/qlpack.yml | 2 +- python/ql/lib/CHANGELOG.md | 6 +++ .../0.11.3.md} | 7 +-- python/ql/lib/codeql-pack.release.yml | 2 +- python/ql/lib/qlpack.yml | 2 +- python/ql/src/CHANGELOG.md | 6 +++ .../0.9.3.md} | 7 +-- python/ql/src/codeql-pack.release.yml | 2 +- python/ql/src/qlpack.yml | 2 +- ruby/ql/lib/CHANGELOG.md | 4 ++ ruby/ql/lib/change-notes/released/0.8.3.md | 3 ++ ruby/ql/lib/codeql-pack.release.yml | 2 +- ruby/ql/lib/qlpack.yml | 2 +- ruby/ql/src/CHANGELOG.md | 4 ++ ruby/ql/src/change-notes/released/0.8.3.md | 3 ++ ruby/ql/src/codeql-pack.release.yml | 2 +- ruby/ql/src/qlpack.yml | 2 +- shared/controlflow/CHANGELOG.md | 4 ++ .../change-notes/released/0.1.3.md | 3 ++ shared/controlflow/codeql-pack.release.yml | 2 +- shared/controlflow/qlpack.yml | 2 +- shared/dataflow/CHANGELOG.md | 4 ++ .../dataflow/change-notes/released/0.1.3.md | 3 ++ shared/dataflow/codeql-pack.release.yml | 2 +- shared/dataflow/qlpack.yml | 2 +- shared/mad/CHANGELOG.md | 4 ++ shared/mad/change-notes/released/0.2.3.md | 3 ++ shared/mad/codeql-pack.release.yml | 2 +- shared/mad/qlpack.yml | 2 +- shared/rangeanalysis/CHANGELOG.md | 4 ++ .../change-notes/released/0.0.2.md | 3 ++ shared/rangeanalysis/codeql-pack.release.yml | 2 +- shared/rangeanalysis/qlpack.yml | 2 +- shared/regex/CHANGELOG.md | 4 ++ shared/regex/change-notes/released/0.2.3.md | 3 ++ shared/regex/codeql-pack.release.yml | 2 +- shared/regex/qlpack.yml | 2 +- shared/ssa/CHANGELOG.md | 4 ++ shared/ssa/change-notes/released/0.2.3.md | 3 ++ shared/ssa/codeql-pack.release.yml | 2 +- shared/ssa/qlpack.yml | 2 +- shared/threat-models/CHANGELOG.md | 4 ++ .../change-notes/released/0.0.2.md | 3 ++ shared/threat-models/codeql-pack.release.yml | 2 +- shared/threat-models/qlpack.yml | 2 +- shared/tutorial/CHANGELOG.md | 4 ++ .../tutorial/change-notes/released/0.2.3.md | 3 ++ shared/tutorial/codeql-pack.release.yml | 2 +- shared/tutorial/qlpack.yml | 2 +- shared/typetracking/CHANGELOG.md | 4 ++ .../change-notes/released/0.2.3.md | 3 ++ shared/typetracking/codeql-pack.release.yml | 2 +- shared/typetracking/qlpack.yml | 2 +- shared/typos/CHANGELOG.md | 4 ++ shared/typos/change-notes/released/0.2.3.md | 3 ++ shared/typos/codeql-pack.release.yml | 2 +- shared/typos/qlpack.yml | 2 +- shared/util/CHANGELOG.md | 4 ++ shared/util/change-notes/released/0.2.3.md | 3 ++ shared/util/codeql-pack.release.yml | 2 +- shared/util/qlpack.yml | 2 +- shared/yaml/CHANGELOG.md | 4 ++ shared/yaml/change-notes/released/0.2.3.md | 3 ++ shared/yaml/codeql-pack.release.yml | 2 +- shared/yaml/qlpack.yml | 2 +- swift/ql/lib/CHANGELOG.md | 17 +++++++ .../change-notes/2023-09-14-move-semantics.md | 4 -- .../ql/lib/change-notes/2023-10-24-string.md | 5 -- .../2023-10-31-capture-list-expr-variables.md | 4 -- .../change-notes/2023-11-01-field-sinks.md | 5 -- .../lib/change-notes/2023-11-03-nsstring.md | 4 -- .../lib/change-notes/2023-11-03-subscript.md | 4 -- .../lib/change-notes/2023-11-08-swift-5.9.md | 5 -- .../2023-11-09-parameter-packs.md | 4 -- swift/ql/lib/change-notes/released/0.3.3.md | 16 +++++++ swift/ql/lib/codeql-pack.release.yml | 2 +- swift/ql/lib/qlpack.yml | 2 +- swift/ql/src/CHANGELOG.md | 12 +++++ .../2023-10-27-missing-regex-anchor.md | 5 -- .../2023-11-06-command-injection.md | 5 -- swift/ql/src/change-notes/2023-11-06-realm.md | 5 -- .../change-notes/2023-11-10-path-injection.md | 5 -- swift/ql/src/change-notes/released/0.3.3.md | 11 +++++ swift/ql/src/codeql-pack.release.yml | 2 +- swift/ql/src/qlpack.yml | 2 +- 155 files changed, 466 insertions(+), 210 deletions(-) delete mode 100644 cpp/ql/lib/change-notes/2023-10-30-realloc-flow.md delete mode 100644 cpp/ql/lib/change-notes/2023-10-31-assign-pointer-add-sub-expr.md delete mode 100644 cpp/ql/lib/change-notes/2023-10-31-odbc-models.md delete mode 100644 cpp/ql/lib/change-notes/2023-11-08-strsafe-models.md delete mode 100644 cpp/ql/lib/change-notes/2023-11-10-strlcpy-strlcat-models.md delete mode 100644 cpp/ql/lib/change-notes/2023-11-15-return-stack-allocated-memory.md create mode 100644 cpp/ql/lib/change-notes/released/0.12.0.md rename cpp/ql/src/change-notes/{2023-11-07-uninitialized-local.md => released/0.8.3.md} (67%) create mode 100644 csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.7.3.md create mode 100644 csharp/ql/campaigns/Solorigate/src/change-notes/released/1.7.3.md delete mode 100644 csharp/ql/lib/change-notes/2023-11-09-mad-generics.md rename csharp/ql/lib/change-notes/{2023-11-10-unbound-generics-fqn.md => released/0.8.3.md} (56%) rename csharp/ql/src/change-notes/{2023-10-24-disable-cil.md => released/0.8.3.md} (74%) create mode 100644 go/ql/consistency-queries/change-notes/released/0.0.2.md delete mode 100644 go/ql/lib/change-notes/2023-10-31-add-gin-cors-framework.md delete mode 100644 go/ql/lib/change-notes/2023-11-15-bug-fix-value-flow-in-array.md create mode 100644 go/ql/lib/change-notes/released/0.7.3.md create mode 100644 go/ql/src/change-notes/released/0.7.3.md create mode 100644 java/ql/automodel/src/change-notes/released/0.0.8.md delete mode 100644 java/ql/lib/change-notes/2023-11-06-jdk21-models.md rename java/ql/lib/change-notes/{2023-10-04-deprecated-sensitiveapi-predicates.md => released/0.8.3.md} (59%) rename java/ql/src/change-notes/{2023-10-26-jms-unsafe-deserialization.md => released/0.8.3.md} (73%) create mode 100644 javascript/ql/lib/change-notes/released/0.8.3.md delete mode 100644 javascript/ql/src/change-notes/2023-10-09-adjust-xss-and-log-injection-severity.md create mode 100644 javascript/ql/src/change-notes/released/0.8.3.md create mode 100644 misc/suite-helpers/change-notes/released/0.7.3.md rename python/ql/lib/change-notes/{2023-11-07-class-attribute-flow.md => released/0.11.3.md} (86%) rename python/ql/src/change-notes/{2023-11-06-more-filesystem-modeling.md => released/0.9.3.md} (84%) create mode 100644 ruby/ql/lib/change-notes/released/0.8.3.md create mode 100644 ruby/ql/src/change-notes/released/0.8.3.md create mode 100644 shared/controlflow/change-notes/released/0.1.3.md create mode 100644 shared/dataflow/change-notes/released/0.1.3.md create mode 100644 shared/mad/change-notes/released/0.2.3.md create mode 100644 shared/rangeanalysis/change-notes/released/0.0.2.md create mode 100644 shared/regex/change-notes/released/0.2.3.md create mode 100644 shared/ssa/change-notes/released/0.2.3.md create mode 100644 shared/threat-models/change-notes/released/0.0.2.md create mode 100644 shared/tutorial/change-notes/released/0.2.3.md create mode 100644 shared/typetracking/change-notes/released/0.2.3.md create mode 100644 shared/typos/change-notes/released/0.2.3.md create mode 100644 shared/util/change-notes/released/0.2.3.md create mode 100644 shared/yaml/change-notes/released/0.2.3.md delete mode 100644 swift/ql/lib/change-notes/2023-09-14-move-semantics.md delete mode 100644 swift/ql/lib/change-notes/2023-10-24-string.md delete mode 100644 swift/ql/lib/change-notes/2023-10-31-capture-list-expr-variables.md delete mode 100644 swift/ql/lib/change-notes/2023-11-01-field-sinks.md delete mode 100644 swift/ql/lib/change-notes/2023-11-03-nsstring.md delete mode 100644 swift/ql/lib/change-notes/2023-11-03-subscript.md delete mode 100644 swift/ql/lib/change-notes/2023-11-08-swift-5.9.md delete mode 100644 swift/ql/lib/change-notes/2023-11-09-parameter-packs.md create mode 100644 swift/ql/lib/change-notes/released/0.3.3.md delete mode 100644 swift/ql/src/change-notes/2023-10-27-missing-regex-anchor.md delete mode 100644 swift/ql/src/change-notes/2023-11-06-command-injection.md delete mode 100644 swift/ql/src/change-notes/2023-11-06-realm.md delete mode 100644 swift/ql/src/change-notes/2023-11-10-path-injection.md create mode 100644 swift/ql/src/change-notes/released/0.3.3.md 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-10-31-odbc-models.md b/cpp/ql/lib/change-notes/2023-10-31-odbc-models.md deleted file mode 100644 index c31883675b3..00000000000 --- a/cpp/ql/lib/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/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/2023-11-15-return-stack-allocated-memory.md b/cpp/ql/lib/change-notes/2023-11-15-return-stack-allocated-memory.md deleted file mode 100644 index 5d59d89d2ba..00000000000 --- a/cpp/ql/lib/change-notes/2023-11-15-return-stack-allocated-memory.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* 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`. \ No newline at end of file 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..d25b31da94a 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.0 groups: cpp dbscheme: semmlecode.cpp.dbscheme extractor: cpp 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/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/qlpack.yml b/cpp/ql/src/qlpack.yml index 7f07ad77a21..bb8073a4eab 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.3 groups: - cpp - queries 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..16084717c85 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.3 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..594ce8224b3 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.3 groups: - csharp - solorigate 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..40d0d3d81cd 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.3 groups: csharp dbscheme: semmlecode.csharp.dbscheme extractor: csharp 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/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..21d66abf3cf 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.3 groups: - csharp - queries 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..3264fb3e994 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.2 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-array.md b/go/ql/lib/change-notes/2023-11-15-bug-fix-value-flow-in-array.md deleted file mode 100644 index 931ba2d1e89..00000000000 --- a/go/ql/lib/change-notes/2023-11-15-bug-fix-value-flow-in-array.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: fix ---- -* 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/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..bb71db91054 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.3 groups: go dbscheme: go.dbscheme extractor: go 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..f71c2ee6037 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.3 groups: - go - queries 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.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..94bfa9724a8 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.8 groups: - java - automodel 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..3fb3293eb2f 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.3 groups: java dbscheme: config/semmlecode.dbscheme extractor: java 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/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..8998e2ae83c 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.3 groups: - java - queries diff --git a/javascript/ql/lib/CHANGELOG.md b/javascript/ql/lib/CHANGELOG.md index b72e86cd41d..06d738af804 100644 --- a/javascript/ql/lib/CHANGELOG.md +++ b/javascript/ql/lib/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.8.3 + +No user-facing changes. + ## 0.8.2 No user-facing changes. diff --git a/javascript/ql/lib/change-notes/released/0.8.3.md b/javascript/ql/lib/change-notes/released/0.8.3.md new file mode 100644 index 00000000000..1fbd73d63a5 --- /dev/null +++ b/javascript/ql/lib/change-notes/released/0.8.3.md @@ -0,0 +1,3 @@ +## 0.8.3 + +No user-facing changes. diff --git a/javascript/ql/lib/codeql-pack.release.yml b/javascript/ql/lib/codeql-pack.release.yml index 404110129dc..b6e46394f37 100644 --- a/javascript/ql/lib/codeql-pack.release.yml +++ b/javascript/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.8.2 +lastReleaseVersion: 0.8.3 diff --git a/javascript/ql/lib/qlpack.yml b/javascript/ql/lib/qlpack.yml index 5842cd19576..327cc120fd8 100644 --- a/javascript/ql/lib/qlpack.yml +++ b/javascript/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/javascript-all -version: 0.8.3-dev +version: 0.8.3 groups: javascript dbscheme: semmlecode.javascript.dbscheme extractor: javascript diff --git a/javascript/ql/src/CHANGELOG.md b/javascript/ql/src/CHANGELOG.md index 922190dac29..99c57a7421d 100644 --- a/javascript/ql/src/CHANGELOG.md +++ b/javascript/ql/src/CHANGELOG.md @@ -1,3 +1,10 @@ +## 0.8.3 + +### Query Metadata Changes + +* Lower the severity of log-injection to medium. +* Increase the severity of XSS to high. + ## 0.8.2 ### Minor Analysis Improvements diff --git a/javascript/ql/src/change-notes/2023-10-09-adjust-xss-and-log-injection-severity.md b/javascript/ql/src/change-notes/2023-10-09-adjust-xss-and-log-injection-severity.md deleted file mode 100644 index 997edbf7981..00000000000 --- a/javascript/ql/src/change-notes/2023-10-09-adjust-xss-and-log-injection-severity.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -category: queryMetadata ---- - -* Lower the severity of log-injection to medium. -* Increase the severity of XSS to high. \ No newline at end of file diff --git a/javascript/ql/src/change-notes/released/0.8.3.md b/javascript/ql/src/change-notes/released/0.8.3.md new file mode 100644 index 00000000000..34243874fb1 --- /dev/null +++ b/javascript/ql/src/change-notes/released/0.8.3.md @@ -0,0 +1,6 @@ +## 0.8.3 + +### Query Metadata Changes + +* Lower the severity of log-injection to medium. +* Increase the severity of XSS to high. diff --git a/javascript/ql/src/codeql-pack.release.yml b/javascript/ql/src/codeql-pack.release.yml index 404110129dc..b6e46394f37 100644 --- a/javascript/ql/src/codeql-pack.release.yml +++ b/javascript/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.8.2 +lastReleaseVersion: 0.8.3 diff --git a/javascript/ql/src/qlpack.yml b/javascript/ql/src/qlpack.yml index 8ac34dd2fed..43c7764c2c7 100644 --- a/javascript/ql/src/qlpack.yml +++ b/javascript/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/javascript-queries -version: 0.8.3-dev +version: 0.8.3 groups: - javascript - queries diff --git a/misc/suite-helpers/CHANGELOG.md b/misc/suite-helpers/CHANGELOG.md index f81fff6a15d..7490201c7b7 100644 --- a/misc/suite-helpers/CHANGELOG.md +++ b/misc/suite-helpers/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.7.3 + +No user-facing changes. + ## 0.7.2 No user-facing changes. diff --git a/misc/suite-helpers/change-notes/released/0.7.3.md b/misc/suite-helpers/change-notes/released/0.7.3.md new file mode 100644 index 00000000000..f58593b24f2 --- /dev/null +++ b/misc/suite-helpers/change-notes/released/0.7.3.md @@ -0,0 +1,3 @@ +## 0.7.3 + +No user-facing changes. diff --git a/misc/suite-helpers/codeql-pack.release.yml b/misc/suite-helpers/codeql-pack.release.yml index fee171e9685..a4ea9c8de17 100644 --- a/misc/suite-helpers/codeql-pack.release.yml +++ b/misc/suite-helpers/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.7.2 +lastReleaseVersion: 0.7.3 diff --git a/misc/suite-helpers/qlpack.yml b/misc/suite-helpers/qlpack.yml index a9421fb41ba..ed3dfb262c7 100644 --- a/misc/suite-helpers/qlpack.yml +++ b/misc/suite-helpers/qlpack.yml @@ -1,4 +1,4 @@ name: codeql/suite-helpers -version: 0.7.3-dev +version: 0.7.3 groups: shared warnOnImplicitThis: true diff --git a/python/ql/lib/CHANGELOG.md b/python/ql/lib/CHANGELOG.md index c3739b0bfc1..db49fd50fe8 100644 --- a/python/ql/lib/CHANGELOG.md +++ b/python/ql/lib/CHANGELOG.md @@ -1,3 +1,9 @@ +## 0.11.3 + +### Minor Analysis Improvements + +* Added basic flow for attributes defined on classes, when the attribute lookup is on a direct reference to that class (so not instance, cls parameter, or self parameter). Example: class definition `class Foo: my_tuples = (dangerous, safe)` and usage `SINK(Foo.my_tuples[0])`. + ## 0.11.2 ### Minor Analysis Improvements diff --git a/python/ql/lib/change-notes/2023-11-07-class-attribute-flow.md b/python/ql/lib/change-notes/released/0.11.3.md similarity index 86% rename from python/ql/lib/change-notes/2023-11-07-class-attribute-flow.md rename to python/ql/lib/change-notes/released/0.11.3.md index a7f2d515549..30c36415fec 100644 --- a/python/ql/lib/change-notes/2023-11-07-class-attribute-flow.md +++ b/python/ql/lib/change-notes/released/0.11.3.md @@ -1,4 +1,5 @@ ---- -category: minorAnalysis ---- +## 0.11.3 + +### Minor Analysis Improvements + * Added basic flow for attributes defined on classes, when the attribute lookup is on a direct reference to that class (so not instance, cls parameter, or self parameter). Example: class definition `class Foo: my_tuples = (dangerous, safe)` and usage `SINK(Foo.my_tuples[0])`. diff --git a/python/ql/lib/codeql-pack.release.yml b/python/ql/lib/codeql-pack.release.yml index 965b515cf93..8f931179e87 100644 --- a/python/ql/lib/codeql-pack.release.yml +++ b/python/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.11.2 +lastReleaseVersion: 0.11.3 diff --git a/python/ql/lib/qlpack.yml b/python/ql/lib/qlpack.yml index d6c26871000..a6183e74391 100644 --- a/python/ql/lib/qlpack.yml +++ b/python/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/python-all -version: 0.11.3-dev +version: 0.11.3 groups: python dbscheme: semmlecode.python.dbscheme extractor: python diff --git a/python/ql/src/CHANGELOG.md b/python/ql/src/CHANGELOG.md index 0360df4c4c5..01e6844bf34 100644 --- a/python/ql/src/CHANGELOG.md +++ b/python/ql/src/CHANGELOG.md @@ -1,3 +1,9 @@ +## 0.9.3 + +### Minor Analysis Improvements + +* Added modeling of more `FileSystemAccess` in packages `cherrypy`, `aiofile`, `aiofiles`, `anyio`, `sanic`, `starlette`, `baize`, and `io`. This will mainly affect the _Uncontrolled data used in path expression_ (`py/path-injection`) query. + ## 0.9.2 No user-facing changes. diff --git a/python/ql/src/change-notes/2023-11-06-more-filesystem-modeling.md b/python/ql/src/change-notes/released/0.9.3.md similarity index 84% rename from python/ql/src/change-notes/2023-11-06-more-filesystem-modeling.md rename to python/ql/src/change-notes/released/0.9.3.md index f801e5c22b5..38f50613c55 100644 --- a/python/ql/src/change-notes/2023-11-06-more-filesystem-modeling.md +++ b/python/ql/src/change-notes/released/0.9.3.md @@ -1,4 +1,5 @@ ---- -category: minorAnalysis ---- +## 0.9.3 + +### Minor Analysis Improvements + * Added modeling of more `FileSystemAccess` in packages `cherrypy`, `aiofile`, `aiofiles`, `anyio`, `sanic`, `starlette`, `baize`, and `io`. This will mainly affect the _Uncontrolled data used in path expression_ (`py/path-injection`) query. diff --git a/python/ql/src/codeql-pack.release.yml b/python/ql/src/codeql-pack.release.yml index e1eda519435..7af7247cbb0 100644 --- a/python/ql/src/codeql-pack.release.yml +++ b/python/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.9.2 +lastReleaseVersion: 0.9.3 diff --git a/python/ql/src/qlpack.yml b/python/ql/src/qlpack.yml index 3545c0cde79..ece24d6075f 100644 --- a/python/ql/src/qlpack.yml +++ b/python/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/python-queries -version: 0.9.3-dev +version: 0.9.3 groups: - python - queries diff --git a/ruby/ql/lib/CHANGELOG.md b/ruby/ql/lib/CHANGELOG.md index 69474dff6bf..618d29a5a1a 100644 --- a/ruby/ql/lib/CHANGELOG.md +++ b/ruby/ql/lib/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.8.3 + +No user-facing changes. + ## 0.8.2 No user-facing changes. diff --git a/ruby/ql/lib/change-notes/released/0.8.3.md b/ruby/ql/lib/change-notes/released/0.8.3.md new file mode 100644 index 00000000000..1fbd73d63a5 --- /dev/null +++ b/ruby/ql/lib/change-notes/released/0.8.3.md @@ -0,0 +1,3 @@ +## 0.8.3 + +No user-facing changes. diff --git a/ruby/ql/lib/codeql-pack.release.yml b/ruby/ql/lib/codeql-pack.release.yml index 404110129dc..b6e46394f37 100644 --- a/ruby/ql/lib/codeql-pack.release.yml +++ b/ruby/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.8.2 +lastReleaseVersion: 0.8.3 diff --git a/ruby/ql/lib/qlpack.yml b/ruby/ql/lib/qlpack.yml index 58c41f1c48c..f51f452c5c3 100644 --- a/ruby/ql/lib/qlpack.yml +++ b/ruby/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/ruby-all -version: 0.8.3-dev +version: 0.8.3 groups: ruby extractor: ruby dbscheme: ruby.dbscheme diff --git a/ruby/ql/src/CHANGELOG.md b/ruby/ql/src/CHANGELOG.md index fa5327383b0..a7876b64a41 100644 --- a/ruby/ql/src/CHANGELOG.md +++ b/ruby/ql/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.8.3 + +No user-facing changes. + ## 0.8.2 No user-facing changes. diff --git a/ruby/ql/src/change-notes/released/0.8.3.md b/ruby/ql/src/change-notes/released/0.8.3.md new file mode 100644 index 00000000000..1fbd73d63a5 --- /dev/null +++ b/ruby/ql/src/change-notes/released/0.8.3.md @@ -0,0 +1,3 @@ +## 0.8.3 + +No user-facing changes. diff --git a/ruby/ql/src/codeql-pack.release.yml b/ruby/ql/src/codeql-pack.release.yml index 404110129dc..b6e46394f37 100644 --- a/ruby/ql/src/codeql-pack.release.yml +++ b/ruby/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.8.2 +lastReleaseVersion: 0.8.3 diff --git a/ruby/ql/src/qlpack.yml b/ruby/ql/src/qlpack.yml index 61a7f4b8433..eb8127063e1 100644 --- a/ruby/ql/src/qlpack.yml +++ b/ruby/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/ruby-queries -version: 0.8.3-dev +version: 0.8.3 groups: - ruby - queries diff --git a/shared/controlflow/CHANGELOG.md b/shared/controlflow/CHANGELOG.md index 4b349473918..0ba744652dc 100644 --- a/shared/controlflow/CHANGELOG.md +++ b/shared/controlflow/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.1.3 + +No user-facing changes. + ## 0.1.2 No user-facing changes. diff --git a/shared/controlflow/change-notes/released/0.1.3.md b/shared/controlflow/change-notes/released/0.1.3.md new file mode 100644 index 00000000000..8a4827cdf12 --- /dev/null +++ b/shared/controlflow/change-notes/released/0.1.3.md @@ -0,0 +1,3 @@ +## 0.1.3 + +No user-facing changes. diff --git a/shared/controlflow/codeql-pack.release.yml b/shared/controlflow/codeql-pack.release.yml index 6abd14b1ef8..b79d8f9d00a 100644 --- a/shared/controlflow/codeql-pack.release.yml +++ b/shared/controlflow/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.1.2 +lastReleaseVersion: 0.1.3 diff --git a/shared/controlflow/qlpack.yml b/shared/controlflow/qlpack.yml index cfd0a23d6fd..964238dfdcd 100644 --- a/shared/controlflow/qlpack.yml +++ b/shared/controlflow/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/controlflow -version: 0.1.3-dev +version: 0.1.3 groups: shared library: true dependencies: diff --git a/shared/dataflow/CHANGELOG.md b/shared/dataflow/CHANGELOG.md index b09685bca27..ea28f91a38b 100644 --- a/shared/dataflow/CHANGELOG.md +++ b/shared/dataflow/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.1.3 + +No user-facing changes. + ## 0.1.2 ### Bug Fixes diff --git a/shared/dataflow/change-notes/released/0.1.3.md b/shared/dataflow/change-notes/released/0.1.3.md new file mode 100644 index 00000000000..8a4827cdf12 --- /dev/null +++ b/shared/dataflow/change-notes/released/0.1.3.md @@ -0,0 +1,3 @@ +## 0.1.3 + +No user-facing changes. diff --git a/shared/dataflow/codeql-pack.release.yml b/shared/dataflow/codeql-pack.release.yml index 6abd14b1ef8..b79d8f9d00a 100644 --- a/shared/dataflow/codeql-pack.release.yml +++ b/shared/dataflow/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.1.2 +lastReleaseVersion: 0.1.3 diff --git a/shared/dataflow/qlpack.yml b/shared/dataflow/qlpack.yml index c86f4e2827a..002e9a9725d 100644 --- a/shared/dataflow/qlpack.yml +++ b/shared/dataflow/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/dataflow -version: 0.1.3-dev +version: 0.1.3 groups: shared library: true dependencies: diff --git a/shared/mad/CHANGELOG.md b/shared/mad/CHANGELOG.md index 21731cd39e3..5dc1b1e20b9 100644 --- a/shared/mad/CHANGELOG.md +++ b/shared/mad/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.2.3 + +No user-facing changes. + ## 0.2.2 No user-facing changes. diff --git a/shared/mad/change-notes/released/0.2.3.md b/shared/mad/change-notes/released/0.2.3.md new file mode 100644 index 00000000000..873fbbfa89b --- /dev/null +++ b/shared/mad/change-notes/released/0.2.3.md @@ -0,0 +1,3 @@ +## 0.2.3 + +No user-facing changes. diff --git a/shared/mad/codeql-pack.release.yml b/shared/mad/codeql-pack.release.yml index 16a06790aa8..0b605901b42 100644 --- a/shared/mad/codeql-pack.release.yml +++ b/shared/mad/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.2.2 +lastReleaseVersion: 0.2.3 diff --git a/shared/mad/qlpack.yml b/shared/mad/qlpack.yml index bb409ee82f8..cc5eee96e37 100644 --- a/shared/mad/qlpack.yml +++ b/shared/mad/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/mad -version: 0.2.3-dev +version: 0.2.3 groups: shared library: true dependencies: null diff --git a/shared/rangeanalysis/CHANGELOG.md b/shared/rangeanalysis/CHANGELOG.md index c2ca7d0664f..9a2809e9a9f 100644 --- a/shared/rangeanalysis/CHANGELOG.md +++ b/shared/rangeanalysis/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.0.2 + +No user-facing changes. + ## 0.0.1 ### Minor Analysis Improvements diff --git a/shared/rangeanalysis/change-notes/released/0.0.2.md b/shared/rangeanalysis/change-notes/released/0.0.2.md new file mode 100644 index 00000000000..5ab250998ed --- /dev/null +++ b/shared/rangeanalysis/change-notes/released/0.0.2.md @@ -0,0 +1,3 @@ +## 0.0.2 + +No user-facing changes. diff --git a/shared/rangeanalysis/codeql-pack.release.yml b/shared/rangeanalysis/codeql-pack.release.yml index c6933410b71..55dc06fbd76 100644 --- a/shared/rangeanalysis/codeql-pack.release.yml +++ b/shared/rangeanalysis/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.0.1 +lastReleaseVersion: 0.0.2 diff --git a/shared/rangeanalysis/qlpack.yml b/shared/rangeanalysis/qlpack.yml index d3ea91c2053..36be97bd4b5 100644 --- a/shared/rangeanalysis/qlpack.yml +++ b/shared/rangeanalysis/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/rangeanalysis -version: 0.0.2-dev +version: 0.0.2 groups: shared library: true dependencies: diff --git a/shared/regex/CHANGELOG.md b/shared/regex/CHANGELOG.md index de288a996f4..3db30f7a258 100644 --- a/shared/regex/CHANGELOG.md +++ b/shared/regex/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.2.3 + +No user-facing changes. + ## 0.2.2 No user-facing changes. diff --git a/shared/regex/change-notes/released/0.2.3.md b/shared/regex/change-notes/released/0.2.3.md new file mode 100644 index 00000000000..873fbbfa89b --- /dev/null +++ b/shared/regex/change-notes/released/0.2.3.md @@ -0,0 +1,3 @@ +## 0.2.3 + +No user-facing changes. diff --git a/shared/regex/codeql-pack.release.yml b/shared/regex/codeql-pack.release.yml index 16a06790aa8..0b605901b42 100644 --- a/shared/regex/codeql-pack.release.yml +++ b/shared/regex/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.2.2 +lastReleaseVersion: 0.2.3 diff --git a/shared/regex/qlpack.yml b/shared/regex/qlpack.yml index 45593edb1fc..b6032fd5e82 100644 --- a/shared/regex/qlpack.yml +++ b/shared/regex/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/regex -version: 0.2.3-dev +version: 0.2.3 groups: shared library: true dependencies: diff --git a/shared/ssa/CHANGELOG.md b/shared/ssa/CHANGELOG.md index d5da42bc097..f76ca77ee08 100644 --- a/shared/ssa/CHANGELOG.md +++ b/shared/ssa/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.2.3 + +No user-facing changes. + ## 0.2.2 No user-facing changes. diff --git a/shared/ssa/change-notes/released/0.2.3.md b/shared/ssa/change-notes/released/0.2.3.md new file mode 100644 index 00000000000..873fbbfa89b --- /dev/null +++ b/shared/ssa/change-notes/released/0.2.3.md @@ -0,0 +1,3 @@ +## 0.2.3 + +No user-facing changes. diff --git a/shared/ssa/codeql-pack.release.yml b/shared/ssa/codeql-pack.release.yml index 16a06790aa8..0b605901b42 100644 --- a/shared/ssa/codeql-pack.release.yml +++ b/shared/ssa/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.2.2 +lastReleaseVersion: 0.2.3 diff --git a/shared/ssa/qlpack.yml b/shared/ssa/qlpack.yml index dfaee0ad8b4..db908b0fcfe 100644 --- a/shared/ssa/qlpack.yml +++ b/shared/ssa/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/ssa -version: 0.2.3-dev +version: 0.2.3 groups: shared library: true warnOnImplicitThis: true diff --git a/shared/threat-models/CHANGELOG.md b/shared/threat-models/CHANGELOG.md index 59b60bad0f3..7668a5ba39d 100644 --- a/shared/threat-models/CHANGELOG.md +++ b/shared/threat-models/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.0.2 + +No user-facing changes. + ## 0.0.1 No user-facing changes. diff --git a/shared/threat-models/change-notes/released/0.0.2.md b/shared/threat-models/change-notes/released/0.0.2.md new file mode 100644 index 00000000000..5ab250998ed --- /dev/null +++ b/shared/threat-models/change-notes/released/0.0.2.md @@ -0,0 +1,3 @@ +## 0.0.2 + +No user-facing changes. diff --git a/shared/threat-models/codeql-pack.release.yml b/shared/threat-models/codeql-pack.release.yml index c6933410b71..55dc06fbd76 100644 --- a/shared/threat-models/codeql-pack.release.yml +++ b/shared/threat-models/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.0.1 +lastReleaseVersion: 0.0.2 diff --git a/shared/threat-models/qlpack.yml b/shared/threat-models/qlpack.yml index 8bf6774202c..cae15564a85 100644 --- a/shared/threat-models/qlpack.yml +++ b/shared/threat-models/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/threat-models -version: 0.0.2-dev +version: 0.0.2 library: true groups: shared dataExtensions: diff --git a/shared/tutorial/CHANGELOG.md b/shared/tutorial/CHANGELOG.md index 8f74494a95a..6dc151cfaf4 100644 --- a/shared/tutorial/CHANGELOG.md +++ b/shared/tutorial/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.2.3 + +No user-facing changes. + ## 0.2.2 No user-facing changes. diff --git a/shared/tutorial/change-notes/released/0.2.3.md b/shared/tutorial/change-notes/released/0.2.3.md new file mode 100644 index 00000000000..873fbbfa89b --- /dev/null +++ b/shared/tutorial/change-notes/released/0.2.3.md @@ -0,0 +1,3 @@ +## 0.2.3 + +No user-facing changes. diff --git a/shared/tutorial/codeql-pack.release.yml b/shared/tutorial/codeql-pack.release.yml index 16a06790aa8..0b605901b42 100644 --- a/shared/tutorial/codeql-pack.release.yml +++ b/shared/tutorial/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.2.2 +lastReleaseVersion: 0.2.3 diff --git a/shared/tutorial/qlpack.yml b/shared/tutorial/qlpack.yml index b35e04be888..f3de926978c 100644 --- a/shared/tutorial/qlpack.yml +++ b/shared/tutorial/qlpack.yml @@ -1,7 +1,7 @@ name: codeql/tutorial description: Library for the CodeQL detective tutorials, helping new users learn to write CodeQL queries. -version: 0.2.3-dev +version: 0.2.3 groups: shared library: true warnOnImplicitThis: true diff --git a/shared/typetracking/CHANGELOG.md b/shared/typetracking/CHANGELOG.md index 573bebe6351..a68f5d29a32 100644 --- a/shared/typetracking/CHANGELOG.md +++ b/shared/typetracking/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.2.3 + +No user-facing changes. + ## 0.2.2 No user-facing changes. diff --git a/shared/typetracking/change-notes/released/0.2.3.md b/shared/typetracking/change-notes/released/0.2.3.md new file mode 100644 index 00000000000..873fbbfa89b --- /dev/null +++ b/shared/typetracking/change-notes/released/0.2.3.md @@ -0,0 +1,3 @@ +## 0.2.3 + +No user-facing changes. diff --git a/shared/typetracking/codeql-pack.release.yml b/shared/typetracking/codeql-pack.release.yml index 16a06790aa8..0b605901b42 100644 --- a/shared/typetracking/codeql-pack.release.yml +++ b/shared/typetracking/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.2.2 +lastReleaseVersion: 0.2.3 diff --git a/shared/typetracking/qlpack.yml b/shared/typetracking/qlpack.yml index 0755439b4bc..d9b01102fbf 100644 --- a/shared/typetracking/qlpack.yml +++ b/shared/typetracking/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typetracking -version: 0.2.3-dev +version: 0.2.3 groups: shared library: true dependencies: diff --git a/shared/typos/CHANGELOG.md b/shared/typos/CHANGELOG.md index 69aa575c51f..246baca2b56 100644 --- a/shared/typos/CHANGELOG.md +++ b/shared/typos/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.2.3 + +No user-facing changes. + ## 0.2.2 No user-facing changes. diff --git a/shared/typos/change-notes/released/0.2.3.md b/shared/typos/change-notes/released/0.2.3.md new file mode 100644 index 00000000000..873fbbfa89b --- /dev/null +++ b/shared/typos/change-notes/released/0.2.3.md @@ -0,0 +1,3 @@ +## 0.2.3 + +No user-facing changes. diff --git a/shared/typos/codeql-pack.release.yml b/shared/typos/codeql-pack.release.yml index 16a06790aa8..0b605901b42 100644 --- a/shared/typos/codeql-pack.release.yml +++ b/shared/typos/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.2.2 +lastReleaseVersion: 0.2.3 diff --git a/shared/typos/qlpack.yml b/shared/typos/qlpack.yml index 4e7ade7b781..17deb7e9649 100644 --- a/shared/typos/qlpack.yml +++ b/shared/typos/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typos -version: 0.2.3-dev +version: 0.2.3 groups: shared library: true warnOnImplicitThis: true diff --git a/shared/util/CHANGELOG.md b/shared/util/CHANGELOG.md index 47848666e35..c407cb8f6da 100644 --- a/shared/util/CHANGELOG.md +++ b/shared/util/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.2.3 + +No user-facing changes. + ## 0.2.2 ### New Features diff --git a/shared/util/change-notes/released/0.2.3.md b/shared/util/change-notes/released/0.2.3.md new file mode 100644 index 00000000000..873fbbfa89b --- /dev/null +++ b/shared/util/change-notes/released/0.2.3.md @@ -0,0 +1,3 @@ +## 0.2.3 + +No user-facing changes. diff --git a/shared/util/codeql-pack.release.yml b/shared/util/codeql-pack.release.yml index 16a06790aa8..0b605901b42 100644 --- a/shared/util/codeql-pack.release.yml +++ b/shared/util/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.2.2 +lastReleaseVersion: 0.2.3 diff --git a/shared/util/qlpack.yml b/shared/util/qlpack.yml index 9a0d20f61b6..a92262d8f28 100644 --- a/shared/util/qlpack.yml +++ b/shared/util/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/util -version: 0.2.3-dev +version: 0.2.3 groups: shared library: true dependencies: null diff --git a/shared/yaml/CHANGELOG.md b/shared/yaml/CHANGELOG.md index fe6a5127bce..41d46545661 100644 --- a/shared/yaml/CHANGELOG.md +++ b/shared/yaml/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.2.3 + +No user-facing changes. + ## 0.2.2 No user-facing changes. diff --git a/shared/yaml/change-notes/released/0.2.3.md b/shared/yaml/change-notes/released/0.2.3.md new file mode 100644 index 00000000000..873fbbfa89b --- /dev/null +++ b/shared/yaml/change-notes/released/0.2.3.md @@ -0,0 +1,3 @@ +## 0.2.3 + +No user-facing changes. diff --git a/shared/yaml/codeql-pack.release.yml b/shared/yaml/codeql-pack.release.yml index 16a06790aa8..0b605901b42 100644 --- a/shared/yaml/codeql-pack.release.yml +++ b/shared/yaml/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.2.2 +lastReleaseVersion: 0.2.3 diff --git a/shared/yaml/qlpack.yml b/shared/yaml/qlpack.yml index 72bb02d1ebb..cba3a3b4291 100644 --- a/shared/yaml/qlpack.yml +++ b/shared/yaml/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/yaml -version: 0.2.3-dev +version: 0.2.3 groups: shared library: true warnOnImplicitThis: true diff --git a/swift/ql/lib/CHANGELOG.md b/swift/ql/lib/CHANGELOG.md index a73f4d6a778..111e21c82d1 100644 --- a/swift/ql/lib/CHANGELOG.md +++ b/swift/ql/lib/CHANGELOG.md @@ -1,3 +1,20 @@ +## 0.3.3 + +### Major Analysis Improvements + +* Added Swift 5.9.1 support +* New AST node is extracted: `SingleValueStmtExpr` + +### Minor Analysis Improvements + +* AST and types related to parameter packs are now extracted +* Added taint flow models for the `NSString.enumerate*` methods. +* Generalized the data flow model for subscript writes (`a[index] = b`) so that it applies to subscripts on all kinds of objects, not just arrays. +* Fixed a bug where some flow sinks at field accesses were not being correctly identified. +* Added indexed `getVariable` to `CaptureListExpr`, improving its AST printing and data flow. +* Added flow models for `String` methods involving closures such as `String.withUTF8(_:)`. +* AST and types related to move semantics (`copy`, `consume`, `_borrow`) are now extracted + ## 0.3.2 ### Minor Analysis Improvements diff --git a/swift/ql/lib/change-notes/2023-09-14-move-semantics.md b/swift/ql/lib/change-notes/2023-09-14-move-semantics.md deleted file mode 100644 index d68ea4b1d9b..00000000000 --- a/swift/ql/lib/change-notes/2023-09-14-move-semantics.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* AST and types related to move semantics (`copy`, `consume`, `_borrow`) are now extracted diff --git a/swift/ql/lib/change-notes/2023-10-24-string.md b/swift/ql/lib/change-notes/2023-10-24-string.md deleted file mode 100644 index 6020e708d3b..00000000000 --- a/swift/ql/lib/change-notes/2023-10-24-string.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -category: minorAnalysis ---- - -* Added flow models for `String` methods involving closures such as `String.withUTF8(_:)`. diff --git a/swift/ql/lib/change-notes/2023-10-31-capture-list-expr-variables.md b/swift/ql/lib/change-notes/2023-10-31-capture-list-expr-variables.md deleted file mode 100644 index 5b1dcfe4044..00000000000 --- a/swift/ql/lib/change-notes/2023-10-31-capture-list-expr-variables.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* Added indexed `getVariable` to `CaptureListExpr`, improving its AST printing and data flow. diff --git a/swift/ql/lib/change-notes/2023-11-01-field-sinks.md b/swift/ql/lib/change-notes/2023-11-01-field-sinks.md deleted file mode 100644 index b9c8d522867..00000000000 --- a/swift/ql/lib/change-notes/2023-11-01-field-sinks.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -category: minorAnalysis ---- - -* Fixed a bug where some flow sinks at field accesses were not being correctly identified. diff --git a/swift/ql/lib/change-notes/2023-11-03-nsstring.md b/swift/ql/lib/change-notes/2023-11-03-nsstring.md deleted file mode 100644 index 458073a9434..00000000000 --- a/swift/ql/lib/change-notes/2023-11-03-nsstring.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* Added taint flow models for the `NSString.enumerate*` methods. diff --git a/swift/ql/lib/change-notes/2023-11-03-subscript.md b/swift/ql/lib/change-notes/2023-11-03-subscript.md deleted file mode 100644 index c90e48c0465..00000000000 --- a/swift/ql/lib/change-notes/2023-11-03-subscript.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* Generalized the data flow model for subscript writes (`a[index] = b`) so that it applies to subscripts on all kinds of objects, not just arrays. diff --git a/swift/ql/lib/change-notes/2023-11-08-swift-5.9.md b/swift/ql/lib/change-notes/2023-11-08-swift-5.9.md deleted file mode 100644 index 726b7b2e64f..00000000000 --- a/swift/ql/lib/change-notes/2023-11-08-swift-5.9.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -category: majorAnalysis ---- -* Added Swift 5.9.1 support -* New AST node is extracted: `SingleValueStmtExpr` diff --git a/swift/ql/lib/change-notes/2023-11-09-parameter-packs.md b/swift/ql/lib/change-notes/2023-11-09-parameter-packs.md deleted file mode 100644 index cbd7b62b3ba..00000000000 --- a/swift/ql/lib/change-notes/2023-11-09-parameter-packs.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* AST and types related to parameter packs are now extracted diff --git a/swift/ql/lib/change-notes/released/0.3.3.md b/swift/ql/lib/change-notes/released/0.3.3.md new file mode 100644 index 00000000000..81a96e39002 --- /dev/null +++ b/swift/ql/lib/change-notes/released/0.3.3.md @@ -0,0 +1,16 @@ +## 0.3.3 + +### Major Analysis Improvements + +* Added Swift 5.9.1 support +* New AST node is extracted: `SingleValueStmtExpr` + +### Minor Analysis Improvements + +* AST and types related to parameter packs are now extracted +* Added taint flow models for the `NSString.enumerate*` methods. +* Generalized the data flow model for subscript writes (`a[index] = b`) so that it applies to subscripts on all kinds of objects, not just arrays. +* Fixed a bug where some flow sinks at field accesses were not being correctly identified. +* Added indexed `getVariable` to `CaptureListExpr`, improving its AST printing and data flow. +* Added flow models for `String` methods involving closures such as `String.withUTF8(_:)`. +* AST and types related to move semantics (`copy`, `consume`, `_borrow`) are now extracted diff --git a/swift/ql/lib/codeql-pack.release.yml b/swift/ql/lib/codeql-pack.release.yml index 18c64250f42..9da182d3394 100644 --- a/swift/ql/lib/codeql-pack.release.yml +++ b/swift/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.3.2 +lastReleaseVersion: 0.3.3 diff --git a/swift/ql/lib/qlpack.yml b/swift/ql/lib/qlpack.yml index bef323df50c..bf2ae117ee2 100644 --- a/swift/ql/lib/qlpack.yml +++ b/swift/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/swift-all -version: 0.3.3-dev +version: 0.3.3 groups: swift extractor: swift dbscheme: swift.dbscheme diff --git a/swift/ql/src/CHANGELOG.md b/swift/ql/src/CHANGELOG.md index 19e0e84c665..1b144577732 100644 --- a/swift/ql/src/CHANGELOG.md +++ b/swift/ql/src/CHANGELOG.md @@ -1,3 +1,15 @@ +## 0.3.3 + +### New Queries + +* Added new query "System command built from user-controlled sources" (`swift/command-line-injection`) for Swift. This query detects system commands built from user-controlled sources without sufficient validation. The query was previously [contributed to the 'experimental' directory by @maikypedia](https://github.com/github/codeql/pull/13726) but will now run by default for all code scanning users. +* Added a nw query "Missing regular expression anchor" (`swift/missing-regexp-anchor`) for Swift. This query detects regular expressions without anchors that can be vulnerable to bypassing. + +### Minor Analysis Improvements + +* Added additional sinks for the "Uncontrolled data used in path expression" (`swift/path-injection`) query. Some of these sinks are heuristic (imprecise) in nature. +* Fixed an issue where some Realm database sinks were not being recognized for the `swift/cleartext-storage-database` query. + ## 0.3.2 No user-facing changes. diff --git a/swift/ql/src/change-notes/2023-10-27-missing-regex-anchor.md b/swift/ql/src/change-notes/2023-10-27-missing-regex-anchor.md deleted file mode 100644 index e419e906dac..00000000000 --- a/swift/ql/src/change-notes/2023-10-27-missing-regex-anchor.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -category: newQuery ---- - -* Added a nw query "Missing regular expression anchor" (`swift/missing-regexp-anchor`) for Swift. This query detects regular expressions without anchors that can be vulnerable to bypassing. diff --git a/swift/ql/src/change-notes/2023-11-06-command-injection.md b/swift/ql/src/change-notes/2023-11-06-command-injection.md deleted file mode 100644 index 0ad3340c7cf..00000000000 --- a/swift/ql/src/change-notes/2023-11-06-command-injection.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -category: newQuery ---- - -* Added new query "System command built from user-controlled sources" (`swift/command-line-injection`) for Swift. This query detects system commands built from user-controlled sources without sufficient validation. The query was previously [contributed to the 'experimental' directory by @maikypedia](https://github.com/github/codeql/pull/13726) but will now run by default for all code scanning users. diff --git a/swift/ql/src/change-notes/2023-11-06-realm.md b/swift/ql/src/change-notes/2023-11-06-realm.md deleted file mode 100644 index 53f4cc7fddd..00000000000 --- a/swift/ql/src/change-notes/2023-11-06-realm.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -category: minorAnalysis ---- - -* Fixed an issue where some Realm database sinks were not being recognized for the `swift/cleartext-storage-database` query. diff --git a/swift/ql/src/change-notes/2023-11-10-path-injection.md b/swift/ql/src/change-notes/2023-11-10-path-injection.md deleted file mode 100644 index effb29cce2c..00000000000 --- a/swift/ql/src/change-notes/2023-11-10-path-injection.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -category: minorAnalysis ---- - -* Added additional sinks for the "Uncontrolled data used in path expression" (`swift/path-injection`) query. Some of these sinks are heuristic (imprecise) in nature. diff --git a/swift/ql/src/change-notes/released/0.3.3.md b/swift/ql/src/change-notes/released/0.3.3.md new file mode 100644 index 00000000000..e51b20a1e42 --- /dev/null +++ b/swift/ql/src/change-notes/released/0.3.3.md @@ -0,0 +1,11 @@ +## 0.3.3 + +### New Queries + +* Added new query "System command built from user-controlled sources" (`swift/command-line-injection`) for Swift. This query detects system commands built from user-controlled sources without sufficient validation. The query was previously [contributed to the 'experimental' directory by @maikypedia](https://github.com/github/codeql/pull/13726) but will now run by default for all code scanning users. +* Added a nw query "Missing regular expression anchor" (`swift/missing-regexp-anchor`) for Swift. This query detects regular expressions without anchors that can be vulnerable to bypassing. + +### Minor Analysis Improvements + +* Added additional sinks for the "Uncontrolled data used in path expression" (`swift/path-injection`) query. Some of these sinks are heuristic (imprecise) in nature. +* Fixed an issue where some Realm database sinks were not being recognized for the `swift/cleartext-storage-database` query. diff --git a/swift/ql/src/codeql-pack.release.yml b/swift/ql/src/codeql-pack.release.yml index 18c64250f42..9da182d3394 100644 --- a/swift/ql/src/codeql-pack.release.yml +++ b/swift/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.3.2 +lastReleaseVersion: 0.3.3 diff --git a/swift/ql/src/qlpack.yml b/swift/ql/src/qlpack.yml index 556d751397f..8d8ebd1fa00 100644 --- a/swift/ql/src/qlpack.yml +++ b/swift/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/swift-queries -version: 0.3.3-dev +version: 0.3.3 groups: - swift - queries From da2215e7e5329cf79ad6f209aaf70942db0ae55b Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Tue, 14 Nov 2023 16:47:09 +0000 Subject: [PATCH 108/202] C++: Accept test changes. --- .../SAMATE/IntegerOverflowTainted.expected | 2 +- .../tainted/IntegerOverflowTainted.expected | 41 +++++++++++-------- .../IntegerOverflowTainted.expected | 2 +- 3 files changed, 25 insertions(+), 20 deletions(-) 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/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 | From 40a07de566876f1c25afa5dc93b62289e885bb3e Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Thu, 16 Nov 2023 15:23:23 +0100 Subject: [PATCH 109/202] Type tracking: Parameterize consistency checks --- .../codeql/typetracking/TypeTracking.qll | 4 +++- .../typetracking/internal/TypeTrackingImpl.qll | 12 +++++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/shared/typetracking/codeql/typetracking/TypeTracking.qll b/shared/typetracking/codeql/typetracking/TypeTracking.qll index 60205e9e7da..19a00a0c53c 100644 --- a/shared/typetracking/codeql/typetracking/TypeTracking.qll +++ b/shared/typetracking/codeql/typetracking/TypeTracking.qll @@ -124,7 +124,9 @@ private import internal.TypeTrackingImpl as Impl module TypeTracking { private module MkImpl = Impl::TypeTracking; - deprecated module ConsistencyChecks = MkImpl::ConsistencyChecks; + private module ConsistencyChecksInput implements MkImpl::ConsistencyChecksInputSig { } + + deprecated module ConsistencyChecks = MkImpl::ConsistencyChecks; class TypeTracker = MkImpl::TypeTracker; diff --git a/shared/typetracking/codeql/typetracking/internal/TypeTrackingImpl.qll b/shared/typetracking/codeql/typetracking/internal/TypeTrackingImpl.qll index d7ac86740b0..e8b60d08ae8 100644 --- a/shared/typetracking/codeql/typetracking/internal/TypeTrackingImpl.qll +++ b/shared/typetracking/codeql/typetracking/internal/TypeTrackingImpl.qll @@ -17,8 +17,16 @@ private import codeql.typetracking.TypeTracking module TypeTracking { private import I + signature module ConsistencyChecksInputSig { + /** Holds if `n` should be excluded from the consistency test `unreachableNode`. */ + default predicate unreachableNodeExclude(Node n) { none() } + + /** Holds if `n` should be excluded from the consistency test `nonSourceStoreTarget`. */ + default predicate nonSourceStoreTargetExclude(Node n) { none() } + } + /** Provides consistency checks for the type-tracker step relations. */ - module ConsistencyChecks { + module ConsistencyChecks { private predicate stepEntry(Node n, string kind) { simpleLocalSmallStep(n, _) and kind = "simpleLocalSmallStep" or @@ -34,6 +42,7 @@ module TypeTracking { * `LocalSourceNode`. */ query predicate unreachableNode(Node n, string msg) { + not ConsistencyChecksInput::unreachableNodeExclude(n) and exists(string kind | stepEntry(n, kind) and not flowsTo(_, n) and @@ -46,6 +55,7 @@ module TypeTracking { * backtracking store target feature isn't enabled. */ query predicate nonSourceStoreTarget(Node n, string msg) { + not ConsistencyChecksInput::nonSourceStoreTargetExclude(n) and not hasFeatureBacktrackStoreTarget() and not n instanceof LocalSourceNode and (storeStep(_, n, _) or loadStoreStep(_, n, _, _)) and From e9800d11b6b6a7e8b6490f6d01d0e64e66006152 Mon Sep 17 00:00:00 2001 From: Ian Lynagh Date: Thu, 16 Nov 2023 13:34:14 +0000 Subject: [PATCH 110/202] Kotlin: Build: Refactor version handling We now have a proper class to represent versions, rather than using tuples. The version is passed deeper down, so we can now have version-dependent compilation flags. --- java/kotlin-extractor/build.py | 27 +++++------- .../kotlin_plugin_versions.py | 41 ++++++++++++++----- 2 files changed, 40 insertions(+), 28 deletions(-) diff --git a/java/kotlin-extractor/build.py b/java/kotlin-extractor/build.py index 752a436218f..6d5bfcea92c 100755 --- a/java/kotlin-extractor/build.py +++ b/java/kotlin-extractor/build.py @@ -87,7 +87,7 @@ 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', @@ -96,7 +96,7 @@ def compile_to_dir(build_dir, srcs, language_version, classpath, java_classpath, '-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 +116,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 +161,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 +179,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 +196,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..da2b1d19b8c 100755 --- a/java/kotlin-extractor/kotlin_plugin_versions.py +++ b/java/kotlin-extractor/kotlin_plugin_versions.py @@ -14,19 +14,40 @@ 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 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_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 @@ -40,13 +61,11 @@ def get_single_version(fakeVersionOutput = None): m = re.match(r'.* kotlinc-jvm ([0-9]+\.[0-9]+\.[0-9]+-?[a-zA-Z]*) .*', 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)})') From 74a195b4f41646260af1108d252daa06425ce65b Mon Sep 17 00:00:00 2001 From: Stephan Brandauer Date: Thu, 16 Nov 2023 16:08:04 +0100 Subject: [PATCH 111/202] Java Automodel extraction: fix extracted meta information by using Object for the type of generic parameters --- java/ql/automodel/src/AutomodelAlertSinkUtil.qll | 2 +- .../src/AutomodelApplicationModeCharacteristics.qll | 13 ++++++++----- ...tomodelApplicationModeExtractCandidates.expected | 2 +- 3 files changed, 10 insertions(+), 7 deletions(-) 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 e5dd4d01c8c..a1a8094b7a6 100644 --- a/java/ql/automodel/src/AutomodelApplicationModeCharacteristics.qll +++ b/java/ql/automodel/src/AutomodelApplicationModeCharacteristics.qll @@ -100,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 } @@ -123,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 } @@ -154,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 } @@ -178,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 } @@ -208,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() } @@ -335,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/test/AutomodelApplicationModeExtraction/AutomodelApplicationModeExtractCandidates.expected b/java/ql/automodel/test/AutomodelApplicationModeExtraction/AutomodelApplicationModeExtractCandidates.expected index 5e98f212879..a7be708f9da 100644 --- a/java/ql/automodel/test/AutomodelApplicationModeExtraction/AutomodelApplicationModeExtractCandidates.expected +++ b/java/ql/automodel/test/AutomodelApplicationModeExtraction/AutomodelApplicationModeExtractCandidates.expected @@ -1,6 +1,6 @@ | 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: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://(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: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 | From 635bcd4fa2c9577ff37f4fa3eaaf278a893a6381 Mon Sep 17 00:00:00 2001 From: Taus Date: Thu, 16 Nov 2023 15:14:30 +0000 Subject: [PATCH 112/202] Python: Add change note --- .../lib/change-notes/2023-11-16-python-3.12-type-syntax.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 python/ql/lib/change-notes/2023-11-16-python-3.12-type-syntax.md diff --git a/python/ql/lib/change-notes/2023-11-16-python-3.12-type-syntax.md b/python/ql/lib/change-notes/2023-11-16-python-3.12-type-syntax.md new file mode 100644 index 00000000000..345cb3b46b6 --- /dev/null +++ b/python/ql/lib/change-notes/2023-11-16-python-3.12-type-syntax.md @@ -0,0 +1,5 @@ +--- +category: minorAnalysis +--- + +- Added support for type parameters in function and class definitions, as well as the new Python 3.12 type alias statement. From 114b69455362bdf63873e26203b67db3b55983fe Mon Sep 17 00:00:00 2001 From: Chris Campbell <808531+ctcampbell@users.noreply.github.com> Date: Thu, 16 Nov 2023 15:50:41 +0000 Subject: [PATCH 113/202] Remove @precision values, correct missing tags --- .../inventory/new_models/AllAsymmetricAlgorithms.ql | 1 - .../cryptography/inventory/new_models/AllCryptoAlgorithms.ql | 1 - .../inventory/new_models/AsymmetricEncryptionAlgorithms.ql | 1 - .../inventory/new_models/AuthenticatedEncryptionAlgorithms.ql | 1 - .../cryptography/inventory/new_models/BlockModeAlgorithms.ql | 1 - .../inventory/new_models/BlockModeKnownIVsOrNonces.ql | 1 - .../inventory/new_models/BlockModeUnknownIVsOrNonces.ql | 1 - .../inventory/new_models/EllipticCurveAlgorithmSize.ql | 1 - .../inventory/new_models/EllipticCurveAlgorithms.ql | 1 - .../cryptography/inventory/new_models/HashingAlgorithms.ql | 1 - .../cryptography/inventory/new_models/KeyExchangeAlgorithms.ql | 1 - .../inventory/new_models/KnownAsymmetricKeyGeneration.ql | 1 - .../cryptography/inventory/new_models/SigningAlgorithms.ql | 1 - .../inventory/new_models/SymmetricEncryptionAlgorithms.ql | 1 - .../inventory/new_models/UnknownAsymmetricKeyGeneration.ql | 1 - .../inventory/new_models/AllAsymmetricAlgorithms.ql | 2 +- .../cryptography/inventory/new_models/AllCryptoAlgorithms.ql | 1 - .../inventory/new_models/AsymmetricEncryptionAlgorithms.ql | 1 - .../inventory/new_models/AsymmetricKeyGenOperation.ql | 1 - .../inventory/new_models/AuthenticatedEncryptionAlgorithms.ql | 1 - .../cryptography/inventory/new_models/BlockModeAlgorithms.ql | 1 - .../inventory/new_models/BlockModeKnownIVsOrNonces.ql | 1 - .../inventory/new_models/BlockModeUnknownIVsOrNonces.ql | 1 - .../inventory/new_models/EllipticCurveAlgorithms.ql | 1 - .../cryptography/inventory/new_models/HashingAlgorithms.ql | 1 - .../inventory/new_models/KeyDerivationAlgorithms.ql | 1 - .../cryptography/inventory/new_models/KeyExchangeAlgorithms.ql | 1 - .../cryptography/inventory/new_models/SigningAlgorithms.ql | 1 - .../inventory/new_models/SymmetricEncryptionAlgorithms.ql | 1 - .../cryptography/inventory/old_models/AllCryptoAlgorithms.ql | 1 - .../cryptography/inventory/old_models/BlockModeAlgorithms.ql | 1 - .../cryptography/inventory/old_models/HashingAlgorithms.ql | 1 - 32 files changed, 1 insertion(+), 32 deletions(-) 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/python/ql/src/experimental/cryptography/inventory/new_models/AllAsymmetricAlgorithms.ql b/python/ql/src/experimental/cryptography/inventory/new_models/AllAsymmetricAlgorithms.ql index 8d60f5e9432..ee0b530d7d2 100644 --- a/python/ql/src/experimental/cryptography/inventory/new_models/AllAsymmetricAlgorithms.ql +++ b/python/ql/src/experimental/cryptography/inventory/new_models/AllAsymmetricAlgorithms.ql @@ -4,7 +4,7 @@ * @kind problem * @id py/quantum-readiness/cbom/all-asymmetric-algorithms * @problem.severity error - * @preci cbom + * @tags cbom * cryptography */ diff --git a/python/ql/src/experimental/cryptography/inventory/new_models/AllCryptoAlgorithms.ql b/python/ql/src/experimental/cryptography/inventory/new_models/AllCryptoAlgorithms.ql index e9daf960bdf..a66792ab04a 100644 --- a/python/ql/src/experimental/cryptography/inventory/new_models/AllCryptoAlgorithms.ql +++ b/python/ql/src/experimental/cryptography/inventory/new_models/AllCryptoAlgorithms.ql @@ -4,7 +4,6 @@ * @kind problem * @id py/quantum-readiness/cbom/all-cryptographic-algorithms * @problem.severity error - * @precision high * @tags cbom * cryptography */ diff --git a/python/ql/src/experimental/cryptography/inventory/new_models/AsymmetricEncryptionAlgorithms.ql b/python/ql/src/experimental/cryptography/inventory/new_models/AsymmetricEncryptionAlgorithms.ql index 68335234438..a895eccc85b 100644 --- a/python/ql/src/experimental/cryptography/inventory/new_models/AsymmetricEncryptionAlgorithms.ql +++ b/python/ql/src/experimental/cryptography/inventory/new_models/AsymmetricEncryptionAlgorithms.ql @@ -4,7 +4,6 @@ * @kind problem * @id py/quantum-readiness/cbom/all-asymmetric-encryption-algorithms * @problem.severity error - * @precision high * @tags cbom * cryptography */ diff --git a/python/ql/src/experimental/cryptography/inventory/new_models/AsymmetricKeyGenOperation.ql b/python/ql/src/experimental/cryptography/inventory/new_models/AsymmetricKeyGenOperation.ql index eb5af39da63..97d66ac6dbf 100644 --- a/python/ql/src/experimental/cryptography/inventory/new_models/AsymmetricKeyGenOperation.ql +++ b/python/ql/src/experimental/cryptography/inventory/new_models/AsymmetricKeyGenOperation.ql @@ -4,7 +4,6 @@ * @kind problem * @id py/quantum-readiness/cbom/asymmetric-key-generation * @problem.severity error - * @precision high * @tags cbom * cryptography */ diff --git a/python/ql/src/experimental/cryptography/inventory/new_models/AuthenticatedEncryptionAlgorithms.ql b/python/ql/src/experimental/cryptography/inventory/new_models/AuthenticatedEncryptionAlgorithms.ql index 3a154e4ffec..868ac0c9f62 100644 --- a/python/ql/src/experimental/cryptography/inventory/new_models/AuthenticatedEncryptionAlgorithms.ql +++ b/python/ql/src/experimental/cryptography/inventory/new_models/AuthenticatedEncryptionAlgorithms.ql @@ -4,7 +4,6 @@ * @kind problem * @id py/quantum-readiness/cbom/authenticated-encryption-algorithms * @problem.severity error - * @precision high * @tags cbom * cryptography */ diff --git a/python/ql/src/experimental/cryptography/inventory/new_models/BlockModeAlgorithms.ql b/python/ql/src/experimental/cryptography/inventory/new_models/BlockModeAlgorithms.ql index c8c186810ec..ba011c9d8c3 100644 --- a/python/ql/src/experimental/cryptography/inventory/new_models/BlockModeAlgorithms.ql +++ b/python/ql/src/experimental/cryptography/inventory/new_models/BlockModeAlgorithms.ql @@ -4,7 +4,6 @@ * @kind problem * @id py/quantum-readiness/cbom/block-cipher-mode * @problem.severity error - * @precision high * @tags cbom * cryptography */ diff --git a/python/ql/src/experimental/cryptography/inventory/new_models/BlockModeKnownIVsOrNonces.ql b/python/ql/src/experimental/cryptography/inventory/new_models/BlockModeKnownIVsOrNonces.ql index 60209fda6dd..f0734626340 100644 --- a/python/ql/src/experimental/cryptography/inventory/new_models/BlockModeKnownIVsOrNonces.ql +++ b/python/ql/src/experimental/cryptography/inventory/new_models/BlockModeKnownIVsOrNonces.ql @@ -4,7 +4,6 @@ * @kind problem * @id py/quantum-readiness/cbom/iv-sources * @problem.severity error - * @precision high * @tags cbom * cryptography */ diff --git a/python/ql/src/experimental/cryptography/inventory/new_models/BlockModeUnknownIVsOrNonces.ql b/python/ql/src/experimental/cryptography/inventory/new_models/BlockModeUnknownIVsOrNonces.ql index 1c8f4c6ca7c..84f77b2cf80 100644 --- a/python/ql/src/experimental/cryptography/inventory/new_models/BlockModeUnknownIVsOrNonces.ql +++ b/python/ql/src/experimental/cryptography/inventory/new_models/BlockModeUnknownIVsOrNonces.ql @@ -4,7 +4,6 @@ * @kind problem * @id py/quantum-readiness/cbom/unkown-iv-sources * @problem.severity error - * @precision high * @tags cbom * cryptography */ diff --git a/python/ql/src/experimental/cryptography/inventory/new_models/EllipticCurveAlgorithms.ql b/python/ql/src/experimental/cryptography/inventory/new_models/EllipticCurveAlgorithms.ql index 313c44d6c8a..234a6dff22d 100644 --- a/python/ql/src/experimental/cryptography/inventory/new_models/EllipticCurveAlgorithms.ql +++ b/python/ql/src/experimental/cryptography/inventory/new_models/EllipticCurveAlgorithms.ql @@ -4,7 +4,6 @@ * @kind problem * @id py/quantum-readiness/cbom/elliptic-curve-algorithms * @problem.severity error - * @precision high * @tags cbom * cryptography */ diff --git a/python/ql/src/experimental/cryptography/inventory/new_models/HashingAlgorithms.ql b/python/ql/src/experimental/cryptography/inventory/new_models/HashingAlgorithms.ql index 358ece5b454..f58d8f3f0b8 100644 --- a/python/ql/src/experimental/cryptography/inventory/new_models/HashingAlgorithms.ql +++ b/python/ql/src/experimental/cryptography/inventory/new_models/HashingAlgorithms.ql @@ -4,7 +4,6 @@ * @kind problem * @id py/quantum-readiness/cbom/hash-algorithms * @problem.severity error - * @precision high * @tags cbom * cryptography */ diff --git a/python/ql/src/experimental/cryptography/inventory/new_models/KeyDerivationAlgorithms.ql b/python/ql/src/experimental/cryptography/inventory/new_models/KeyDerivationAlgorithms.ql index 005fdcf58b7..dff5d250262 100644 --- a/python/ql/src/experimental/cryptography/inventory/new_models/KeyDerivationAlgorithms.ql +++ b/python/ql/src/experimental/cryptography/inventory/new_models/KeyDerivationAlgorithms.ql @@ -4,7 +4,6 @@ * @kind problem * @id py/quantum-readiness/cbom/key-derivation * @problem.severity error - * @precision high * @tags cbom * cryptography */ diff --git a/python/ql/src/experimental/cryptography/inventory/new_models/KeyExchangeAlgorithms.ql b/python/ql/src/experimental/cryptography/inventory/new_models/KeyExchangeAlgorithms.ql index 35696dfc3f1..5b0ff402431 100644 --- a/python/ql/src/experimental/cryptography/inventory/new_models/KeyExchangeAlgorithms.ql +++ b/python/ql/src/experimental/cryptography/inventory/new_models/KeyExchangeAlgorithms.ql @@ -4,7 +4,6 @@ * @kind problem * @id py/quantum-readiness/cbom/key-exchange * @problem.severity error - * @precision high * @tags cbom * cryptography */ diff --git a/python/ql/src/experimental/cryptography/inventory/new_models/SigningAlgorithms.ql b/python/ql/src/experimental/cryptography/inventory/new_models/SigningAlgorithms.ql index 48ce3487ac1..a729b992726 100644 --- a/python/ql/src/experimental/cryptography/inventory/new_models/SigningAlgorithms.ql +++ b/python/ql/src/experimental/cryptography/inventory/new_models/SigningAlgorithms.ql @@ -4,7 +4,6 @@ * @kind problem * @id py/quantum-readiness/cbom/signing-algorithms * @problem.severity error - * @precision high * @tags cbom * cryptography */ diff --git a/python/ql/src/experimental/cryptography/inventory/new_models/SymmetricEncryptionAlgorithms.ql b/python/ql/src/experimental/cryptography/inventory/new_models/SymmetricEncryptionAlgorithms.ql index 6d1b0b306b0..1399c406304 100644 --- a/python/ql/src/experimental/cryptography/inventory/new_models/SymmetricEncryptionAlgorithms.ql +++ b/python/ql/src/experimental/cryptography/inventory/new_models/SymmetricEncryptionAlgorithms.ql @@ -4,7 +4,6 @@ * @kind problem * @id py/quantum-readiness/cbom/symmetric-encryption-algorithms * @problem.severity error - * @precision high * @tags cbom * cryptography */ diff --git a/python/ql/src/experimental/cryptography/inventory/old_models/AllCryptoAlgorithms.ql b/python/ql/src/experimental/cryptography/inventory/old_models/AllCryptoAlgorithms.ql index ef6b38829ac..5d04eccaa34 100644 --- a/python/ql/src/experimental/cryptography/inventory/old_models/AllCryptoAlgorithms.ql +++ b/python/ql/src/experimental/cryptography/inventory/old_models/AllCryptoAlgorithms.ql @@ -4,7 +4,6 @@ * @kind problem * @id py/quantum-readiness/cbom/classic-model/all-cryptographic-algorithms * @problem.severity error - * @precision high * @tags cbom * cryptography */ diff --git a/python/ql/src/experimental/cryptography/inventory/old_models/BlockModeAlgorithms.ql b/python/ql/src/experimental/cryptography/inventory/old_models/BlockModeAlgorithms.ql index fb5e412cc4d..28980b1485e 100644 --- a/python/ql/src/experimental/cryptography/inventory/old_models/BlockModeAlgorithms.ql +++ b/python/ql/src/experimental/cryptography/inventory/old_models/BlockModeAlgorithms.ql @@ -4,7 +4,6 @@ * @kind problem * @id py/quantum-readiness/cbom/classic-model/block-cipher-mode * @problem.severity error - * @precision high * @tags cbom * cryptography */ diff --git a/python/ql/src/experimental/cryptography/inventory/old_models/HashingAlgorithms.ql b/python/ql/src/experimental/cryptography/inventory/old_models/HashingAlgorithms.ql index f06e00f9adf..d8dc44d059e 100644 --- a/python/ql/src/experimental/cryptography/inventory/old_models/HashingAlgorithms.ql +++ b/python/ql/src/experimental/cryptography/inventory/old_models/HashingAlgorithms.ql @@ -4,7 +4,6 @@ * @kind problem * @id py/quantum-readiness/cbom/classic-model/hash-algorithms * @problem.severity error - * @precision high * @tags cbom * cryptography */ From de3d15b27729a91f7e73dd86b32301197c3790c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20St=C3=B6ckli?= Date: Thu, 16 Nov 2023 16:53:12 +0100 Subject: [PATCH 114/202] Doc: Fix name of VS Code settings property to use extension packs --- .../using-the-codeql-model-editor.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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. From 9a4b56162e1507cbbbf4b00f023fe3abdb97f7a5 Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Thu, 16 Nov 2023 17:16:14 +0100 Subject: [PATCH 115/202] Bazel/CMake: small compatibility fix --- misc/bazel/cmake/cmake.bzl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/bazel/cmake/cmake.bzl b/misc/bazel/cmake/cmake.bzl index b3e7a39455a..12fb277f803 100644 --- a/misc/bazel/cmake/cmake.bzl +++ b/misc/bazel/cmake/cmake.bzl @@ -49,7 +49,7 @@ def _get_includes(includes): return [_cmake_path(i) for i in includes.to_list() if "/_virtual_includes/" not in i] def _cmake_aspect_impl(target, ctx): - if not ctx.rule.kind.startswith("cc_"): + if not ctx.rule.kind.startswith(("cc_", "_cc_add_features")): return [CmakeInfo(name = None, transitive_deps = depset())] # TODO: remove cc_binary_add_features once we remove it from internal repo From cca78ca1908ed07c3fd780b06c01608fd25acad0 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Thu, 16 Nov 2023 19:05:59 +0100 Subject: [PATCH 116/202] C#: Fix the dotnet pack integration test. --- csharp/ql/integration-tests/all-platforms/dotnet_pack/test.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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() From d7760de4c6e5c4580147c79aaec27f4f83df1311 Mon Sep 17 00:00:00 2001 From: "Michael B. Gale" Date: Thu, 16 Nov 2023 19:56:01 +0000 Subject: [PATCH 117/202] C#: Fix dotnet_test_mstest --- .../posix-only/dotnet_test_mstest/dotnet_test_mstest.csproj | 1 + 1 file changed, 1 insertion(+) 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 From 9a8ad7d5903c5bbef72e5f8ccd33e47b69eafd24 Mon Sep 17 00:00:00 2001 From: Tamas Vajk Date: Fri, 17 Nov 2023 08:48:38 +0100 Subject: [PATCH 118/202] C#: Update insecure randomness query description to match implementation --- .../ql/src/Security Features/InsecureRandomness.qhelp | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) 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.

From 7b75a30851cba8657444df4ce3ba2bd6836bd093 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Wed, 11 Oct 2023 09:32:39 +0200 Subject: [PATCH 119/202] C#: Add framework detection to the assets.json parser. --- .../Assets.cs | 79 +++++++++++++++++-- .../DependencyContainer.cs | 35 ++++---- .../DependencyManager.cs | 4 +- 3 files changed, 89 insertions(+), 29 deletions(-) diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/Assets.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/Assets.cs index 7558fd7970f..d9d31a6e149 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/Assets.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/Assets.cs @@ -68,19 +68,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 +93,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 @@ -111,7 +111,7 @@ namespace Semmle.Extraction.CSharp.DependencyFetching // If this is a .NET framework reference then include everything. if (netFrameworks.Any(framework => name.StartsWith(framework))) { - dependencies.Add(name); + dependencies.AddFramework(name); } else { @@ -120,7 +120,69 @@ namespace Semmle.Extraction.CSharp.DependencyFetching } }); - 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 +196,7 @@ namespace Semmle.Extraction.CSharp.DependencyFetching { var obj = JObject.Parse(json); AddPackageDependencies(obj, dependencies); + AddFrameworkDependencies(obj, dependencies); return true; } catch (Exception e) diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependencyContainer.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependencyContainer.cs index 4c0586c7f83..ab962b58853 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependencyContainer.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependencyContainer.cs @@ -9,8 +9,15 @@ 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(); + + /// + /// Packages that are used as a part of the required dependencies. + /// + public HashSet Packages { get; } = new(); /// /// In most cases paths in asset files point to dll's or the empty _._ file, which @@ -32,16 +39,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. /// @@ -51,19 +48,19 @@ namespace Semmle.Extraction.CSharp.DependencyFetching var d = dependency.Replace('/', Path.DirectorySeparatorChar); 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..8a9a4f2cba7 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); @@ -356,7 +356,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() From 98dbbe907e08eac56617b5c217547928c6056bcb Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Thu, 9 Nov 2023 16:24:02 +0100 Subject: [PATCH 120/202] C#: Update unit tests. --- .../Semmle.Extraction.Tests/Assets.cs | 27 ++++++++++--------- 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/csharp/extractor/Semmle.Extraction.Tests/Assets.cs b/csharp/extractor/Semmle.Extraction.Tests/Assets.cs index 1dbd6f9d41c..7267e048f97 100644 --- a/csharp/extractor/Semmle.Extraction.Tests/Assets.cs +++ b/csharp/extractor/Semmle.Extraction.Tests/Assets.cs @@ -21,10 +21,10 @@ namespace Semmle.Extraction.Tests // Verify Assert.True(success); - Assert.Equal(5, dependencies.RequiredPaths.Count()); - Assert.Equal(4, dependencies.UsedPackages.Count()); + Assert.Equal(7, dependencies.Paths.Count()); + Assert.Equal(6, dependencies.Packages.Count()); - var normalizedPaths = dependencies.RequiredPaths.Select(FixExpectedPathOnWindows); + var normalizedPaths = dependencies.Paths.Select(FixExpectedPathOnWindows); // Required 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); @@ -32,10 +32,13 @@ namespace Semmle.Extraction.Tests 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); + Assert.Contains("humanizer.core", dependencies.Packages); + // Used frameworks + Assert.Contains("microsoft.netcore.app.ref", dependencies.Packages); + Assert.Contains("microsoft.aspnetcore.app.ref", dependencies.Packages); } [Fact] @@ -51,15 +54,15 @@ namespace Semmle.Extraction.Tests // Verify Assert.True(success); - Assert.Equal(2, dependencies.RequiredPaths.Count()); + Assert.Equal(2, dependencies.Paths.Count()); - var normalizedPaths = dependencies.RequiredPaths.Select(FixExpectedPathOnWindows); + var normalizedPaths = dependencies.Paths.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); + Assert.Contains("microsoft.netframework.referenceassemblies", dependencies.Packages); + Assert.Contains("microsoft.netframework.referenceassemblies.net48", dependencies.Packages); } [Fact] @@ -75,7 +78,7 @@ namespace Semmle.Extraction.Tests // Verify Assert.False(success); - Assert.Empty(dependencies.RequiredPaths); + Assert.Empty(dependencies.Paths); } private readonly string assetsJson1 = """ From e89fe8ddde91443045adfb4c287f2bbdc41cb466 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Fri, 10 Nov 2023 08:58:58 +0100 Subject: [PATCH 121/202] C#: Re-factor the hardcoded package names into a separate class. --- .../Assets.cs | 10 +------ .../DependencyManager.cs | 12 +++------ .../FrameworkPackageNames.cs | 27 +++++++++++++++++++ .../Semmle.Extraction.Tests/Assets.cs | 6 ++--- 4 files changed, 34 insertions(+), 21 deletions(-) create mode 100644 csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FrameworkPackageNames.cs diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/Assets.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/Assets.cs index d9d31a6e149..6883683bcba 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/Assets.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/Assets.cs @@ -14,14 +14,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; @@ -109,7 +101,7 @@ namespace Semmle.Extraction.CSharp.DependencyFetching } // If this is a .NET framework reference then include everything. - if (netFrameworks.Any(framework => name.StartsWith(framework))) + if (FrameworkPackageNames.AllFrameworks.Any(framework => name.StartsWith(framework))) { dependencies.AddFramework(name); } diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependencyManager.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependencyManager.cs index 8a9a4f2cba7..9bb78cc8d7c 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependencyManager.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependencyManager.cs @@ -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); 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..6adb74c2420 --- /dev/null +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FrameworkPackageNames.cs @@ -0,0 +1,27 @@ +using System.Collections.Generic; +using System.Linq; + +namespace Semmle.Extraction.CSharp.DependencyFetching +{ + internal static class FrameworkPackageNames + { + // The order of the packages is important. + public static readonly string[] NetFrameworks = 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 string AspNetCoreFramework => + "microsoft.aspnetcore.app.ref"; + + public static string WindowsDesktopFramework => + "microsoft.windowsdesktop.app.ref"; + + public static readonly IEnumerable AllFrameworks = + NetFrameworks + .Union(new string[] { AspNetCoreFramework, WindowsDesktopFramework }); + } +} diff --git a/csharp/extractor/Semmle.Extraction.Tests/Assets.cs b/csharp/extractor/Semmle.Extraction.Tests/Assets.cs index 7267e048f97..8a307e54964 100644 --- a/csharp/extractor/Semmle.Extraction.Tests/Assets.cs +++ b/csharp/extractor/Semmle.Extraction.Tests/Assets.cs @@ -25,7 +25,7 @@ namespace Semmle.Extraction.Tests Assert.Equal(6, dependencies.Packages.Count()); var normalizedPaths = dependencies.Paths.Select(FixExpectedPathOnWindows); - // Required references + // 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); @@ -57,10 +57,10 @@ namespace Semmle.Extraction.Tests Assert.Equal(2, dependencies.Paths.Count()); var normalizedPaths = dependencies.Paths.Select(FixExpectedPathOnWindows); - // Required references + // Used references Assert.Contains("microsoft.netframework.referenceassemblies/1.0.3", normalizedPaths); Assert.Contains("microsoft.netframework.referenceassemblies.net48/1.0.3", normalizedPaths); - // Used packages + // Used frameworks Assert.Contains("microsoft.netframework.referenceassemblies", dependencies.Packages); Assert.Contains("microsoft.netframework.referenceassemblies.net48", dependencies.Packages); } From 890cba6e9570b022a898acc0be9d455d0f8cb0d2 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Mon, 13 Nov 2023 13:11:31 +0100 Subject: [PATCH 122/202] C#: Disregard _._ dependencies and only default to use an entire framework in case the compile section is empty. --- .../Assets.cs | 18 ++++++++++-------- .../DependencyContainer.cs | 13 +++++++++---- 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/Assets.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/Assets.cs index 6883683bcba..ac8dde75ede 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/Assets.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/Assets.cs @@ -100,16 +100,18 @@ namespace Semmle.Extraction.CSharp.DependencyFetching return; } - // If this is a .NET framework reference then include everything. - if (FrameworkPackageNames.AllFrameworks.Any(framework => name.StartsWith(framework))) + if (info.Compile is null || !info.Compile.Any()) { - dependencies.AddFramework(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; diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependencyContainer.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependencyContainer.cs index ab962b58853..d3858f17fe1 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependencyContainer.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependencyContainer.cs @@ -20,10 +20,8 @@ namespace Semmle.Extraction.CSharp.DependencyFetching public HashSet Packages { 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). + /// 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) { @@ -47,6 +45,13 @@ 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)); Paths.Add(path); Packages.Add(GetPackageName(p)); From 49b2209c629fa6aa12e6985451741d455c012e63 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Fri, 10 Nov 2023 13:40:45 +0100 Subject: [PATCH 123/202] C#: Update and more assets unit tests. --- .../Semmle.Extraction.Tests/Assets.cs | 1542 ++++++++++++++++- 1 file changed, 1497 insertions(+), 45 deletions(-) diff --git a/csharp/extractor/Semmle.Extraction.Tests/Assets.cs b/csharp/extractor/Semmle.Extraction.Tests/Assets.cs index 8a307e54964..85e56b6de64 100644 --- a/csharp/extractor/Semmle.Extraction.Tests/Assets.cs +++ b/csharp/extractor/Semmle.Extraction.Tests/Assets.cs @@ -21,8 +21,8 @@ namespace Semmle.Extraction.Tests // Verify Assert.True(success); - Assert.Equal(7, dependencies.Paths.Count()); - Assert.Equal(6, dependencies.Packages.Count()); + Assert.Equal(6, dependencies.Paths.Count()); + Assert.Equal(5, dependencies.Packages.Count()); var normalizedPaths = dependencies.Paths.Select(FixExpectedPathOnWindows); // Used references @@ -30,43 +30,17 @@ namespace Semmle.Extraction.Tests 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.Packages); Assert.Contains("json.net", dependencies.Packages); Assert.Contains("microsoft.aspnetcore.cryptography.internal", dependencies.Packages); - Assert.Contains("humanizer.core", 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.Paths.Count()); - - var normalizedPaths = dependencies.Paths.Select(FixExpectedPathOnWindows); - // Used references - Assert.Contains("microsoft.netframework.referenceassemblies/1.0.3", normalizedPaths); - Assert.Contains("microsoft.netframework.referenceassemblies.net48/1.0.3", normalizedPaths); - // Used frameworks - Assert.Contains("microsoft.netframework.referenceassemblies", dependencies.Packages); - Assert.Contains("microsoft.netframework.referenceassemblies.net48", dependencies.Packages); - } - - [Fact] - public void TestAssets3() + public void TestAssetsFailure() { // Setup var assets = new Assets(new ProgressMonitor(new LoggerStub())); @@ -81,6 +55,183 @@ namespace Semmle.Extraction.Tests 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, @@ -184,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" + } + } + } } """; } From b7b10ce5499df36028c40da44323caf39c95aabc Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Fri, 17 Nov 2023 09:47:36 +0100 Subject: [PATCH 124/202] C#: Address review comments. --- .../FrameworkPackageNames.cs | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FrameworkPackageNames.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FrameworkPackageNames.cs index 6adb74c2420..7b4a076f99f 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FrameworkPackageNames.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FrameworkPackageNames.cs @@ -5,8 +5,12 @@ 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 readonly string[] NetFrameworks = new string[] + public static string[] NetFrameworks { get; } = new string[] { "microsoft.netcore.app.ref", // net7.0, ... net5.0, netcoreapp3.1, netcoreapp3.0 "microsoft.netframework.referenceassemblies.", // net48, ..., net20 @@ -14,13 +18,7 @@ namespace Semmle.Extraction.CSharp.DependencyFetching "netstandard.library" // netstandard2.0 }; - public static string AspNetCoreFramework => - "microsoft.aspnetcore.app.ref"; - - public static string WindowsDesktopFramework => - "microsoft.windowsdesktop.app.ref"; - - public static readonly IEnumerable AllFrameworks = + public static IEnumerable AllFrameworks { get; } = NetFrameworks .Union(new string[] { AspNetCoreFramework, WindowsDesktopFramework }); } From 2662a4c651b908748eb3fed592c4a35b62e72809 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Thu, 16 Nov 2023 19:05:59 +0100 Subject: [PATCH 125/202] C#: Fix the dotnet pack integration test. --- csharp/ql/integration-tests/all-platforms/dotnet_pack/test.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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() From 97402fdf36313428dd0d794fd915474fb5685e9e Mon Sep 17 00:00:00 2001 From: "Michael B. Gale" Date: Thu, 16 Nov 2023 19:56:01 +0000 Subject: [PATCH 126/202] C#: Fix dotnet_test_mstest --- .../posix-only/dotnet_test_mstest/dotnet_test_mstest.csproj | 1 + 1 file changed, 1 insertion(+) 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 From e6f31c965e501b2e07b04ffe379f2fc2147a0cea Mon Sep 17 00:00:00 2001 From: Ian Lynagh Date: Mon, 25 Sep 2023 15:23:53 +0100 Subject: [PATCH 127/202] Kotlin: Add qlpack for the Kotlin 2 tests --- java/ql/test-kotlin2/qlpack.yml | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 java/ql/test-kotlin2/qlpack.yml diff --git a/java/ql/test-kotlin2/qlpack.yml b/java/ql/test-kotlin2/qlpack.yml new file mode 100644 index 00000000000..d7ebd2d550a --- /dev/null +++ b/java/ql/test-kotlin2/qlpack.yml @@ -0,0 +1,8 @@ +name: codeql/java-kotlin2-tests +groups: [java, test] +dependencies: + codeql/java-all: ${workspace} + codeql/java-queries: ${workspace} +extractor: java +tests: . +warnOnImplicitThis: true From 905583e00a5a523b5089ae61b41e79d38287aa62 Mon Sep 17 00:00:00 2001 From: Ian Lynagh Date: Thu, 26 Oct 2023 13:13:28 +0100 Subject: [PATCH 128/202] Kotlin: Add a Kotlin 2 copy of the testsuite --- java/ql/test-kotlin2/library-tests/.gitignore | 2 + .../GeneratedFiles/Generated.expected | 1 + .../library-tests/GeneratedFiles/Generated.kt | 3 + .../library-tests/GeneratedFiles/Generated.ql | 4 + .../GeneratedFiles/NonGenerated.kt | 3 + .../returnTypes.expected | 4 + .../returnTypes.ql | 5 + .../android_function_return_types/test.kt | 27 + .../PrintAst.expected | 21 + .../PrintAst.qlref | 1 + .../test.expected | 11 + .../annotation-accessor-result-type/test.kt | 3 + .../annotation-accessor-result-type/test.ql | 11 + .../annotation_classes/Annot0j.java | 3 + .../annotation_classes/Annot1j.java | 15 + .../annotation_classes/PrintAst.expected | 283 + .../annotation_classes/PrintAst.qlref | 1 + .../annotation_classes/classes.expected | 82 + .../annotation_classes/classes.ql | 20 + .../library-tests/annotation_classes/def.kt | 62 + .../library-tests/annotation_classes/use.java | 15 + .../annotations/jvmName/Test.java | 5 + .../annotations/jvmName/test.expected | 8 + .../library-tests/annotations/jvmName/test.kt | 18 + .../library-tests/annotations/jvmName/test.ql | 5 + .../arrays-with-variances/User.java | 11 + .../arrays-with-variances/takesArrayList.kt | 112 + .../arrays-with-variances/test.expected | 86 + .../arrays-with-variances/test.ql | 13 + .../arrays/arrayAccesses.expected | 22 + .../library-tests/arrays/arrayAccesses.ql | 4 + .../arrays/arrayCreations.expected | 115 + .../library-tests/arrays/arrayCreations.kt | 39 + .../library-tests/arrays/arrayCreations.ql | 18 + .../library-tests/arrays/arrayGetsSets.kt | 41 + .../arrays/arrayIterators.expected | 3 + .../library-tests/arrays/arrayIterators.kt | 13 + .../library-tests/arrays/arrayIterators.ql | 10 + .../library-tests/arrays/assignExprs.expected | 4 + .../library-tests/arrays/assignExprs.ql | 5 + .../library-tests/arrays/primitiveArrays.kt | 7 + .../library-tests/arrays/test.expected | 30 + .../test-kotlin2/library-tests/arrays/test.ql | 23 + .../call-int-to-char/test.expected | 1 + .../library-tests/call-int-to-char/test.kt | 3 + .../library-tests/call-int-to-char/test.ql | 4 + .../clashing-extension-fields/test.expected | 9 + .../clashing-extension-fields/test.kt | 7 + .../clashing-extension-fields/test.ql | 5 + .../library-tests/classes/PrintAst.expected | 1174 +++ .../library-tests/classes/PrintAst.qlref | 1 + .../classes/anonymousClasses.expected | 18 + .../library-tests/classes/anonymousClasses.ql | 7 + .../library-tests/classes/classes.expected | 69 + .../library-tests/classes/classes.kt | 162 + .../library-tests/classes/classes.ql | 5 + .../library-tests/classes/ctorCalls.expected | 68 + .../library-tests/classes/ctorCalls.ql | 5 + .../classes/genericExprTypes.expected | 109 + .../library-tests/classes/genericExprTypes.ql | 5 + .../classes/generic_anonymous.kt | 33 + .../library-tests/classes/interfaces.expected | 8 + .../library-tests/classes/interfaces.ql | 5 + .../library-tests/classes/localClass.expected | 12 + .../library-tests/classes/localClass.ql | 5 + .../library-tests/classes/localClassField.kt | 11 + .../classes/local_anonymous.expected | 14 + .../library-tests/classes/local_anonymous.kt | 45 + .../library-tests/classes/local_anonymous.ql | 53 + .../library-tests/classes/paramTypes.expected | 26 + .../library-tests/classes/paramTypes.ql | 16 + .../library-tests/classes/superChain.kt | 5 + .../library-tests/classes/superTypes.expected | 198 + .../library-tests/classes/superTypes.ql | 27 + .../collection-literals/PrintAst.expected | 12 + .../collection-literals/PrintAst.qlref | 1 + .../library-tests/collection-literals/test.kt | 1 + .../library-tests/comments/comments.expected | 82 + .../library-tests/comments/comments.kt | 95 + .../library-tests/comments/comments.ql | 15 + .../companion_objects/accesses.expected | 2 + .../companion_objects/accesses.ql | 5 + .../companion_objects.expected | 2 + .../companion_objects/companion_objects.kt | 28 + .../companion_objects/companion_objects.ql | 8 + .../method_accesses.expected | 5 + .../companion_objects/method_accesses.ql | 4 + .../compilation-units/cus.expected | 9 + .../library-tests/compilation-units/cus.ql | 5 + .../library-tests/compilation-units/test.kt | 5 + .../library-tests/controlflow/basic/Test.kt | 126 + .../controlflow/basic/bbStmts.expected | 191 + .../controlflow/basic/bbStmts.ql | 7 + .../basic/bbStrictDominance.expected | 56 + .../controlflow/basic/bbStrictDominance.ql | 6 + .../controlflow/basic/bbSuccessor.expected | 45 + .../controlflow/basic/bbSuccessor.ql | 5 + .../controlflow/basic/getASuccessor.expected | 261 + .../controlflow/basic/getASuccessor.ql | 54 + .../basic/strictDominance.expected | 566 ++ .../controlflow/basic/strictDominance.ql | 6 + .../basic/strictPostDominance.expected | 223 + .../controlflow/basic/strictPostDominance.ql | 6 + .../controlflow/dominance/Test.kt | 102 + .../controlflow/dominance/Test2.kt | 39 + .../dominance/dominanceBad.expected | 0 .../controlflow/dominance/dominanceBad.ql | 9 + .../dominance/dominanceWrong.expected | 0 .../controlflow/dominance/dominanceWrong.ql | 21 + .../dominance/dominatedByStart.expected | 0 .../controlflow/dominance/dominatedByStart.ql | 16 + .../controlflow/dominance/dominator.expected | 157 + .../controlflow/dominance/dominator.ql | 9 + .../dominance/dominatorExists.expected | 0 .../controlflow/dominance/dominatorExists.ql | 16 + .../dominance/dominatorUnique.expected | 0 .../controlflow/dominance/dominatorUnique.ql | 11 + .../library-tests/controlflow/paths/A.kt | 49 + .../controlflow/paths/paths.expected | 4 + .../library-tests/controlflow/paths/paths.ql | 14 + .../library-tests/controlflow/plot/.gitignore | 1 + .../controlflow/plot/nodeGraph.expected | 0 .../controlflow/plot/nodeGraph.ql | 47 + .../library-tests/controlflow/plot/plot.sh | 3 + .../coroutines/coroutine_user.kt | 3 + .../library-tests/coroutines/test.expected | 1 + .../library-tests/coroutines/test.ql | 5 + .../data-classes/PrintAst.expected | 196 + .../library-tests/data-classes/PrintAst.qlref | 1 + .../data-classes/callees.expected | 7 + .../library-tests/data-classes/callees.ql | 5 + .../data-classes/data_classes.expected | 1 + .../data-classes/data_classes.ql | 5 + .../library-tests/data-classes/dc.kt | 1 + .../dataflow/extensionMethod/test.expected | 6 + .../dataflow/extensionMethod/test.kt | 40 + .../dataflow/extensionMethod/test.ql | 16 + .../library-tests/dataflow/foreach/C1.java | 22 + .../library-tests/dataflow/foreach/C2.kt | 18 + .../dataflow/foreach/test.expected | 8 + .../library-tests/dataflow/foreach/test.ql | 16 + .../dataflow/func/coroutine_async_await.kt | 8 + .../dataflow/func/functionReference.kt | 22 + .../dataflow/func/kotlinx_coroutines_stubs.kt | 35 + .../library-tests/dataflow/func/lambda.kt | 33 + .../dataflow/func/localFunction.kt | 15 + .../dataflow/func/samConversion.kt | 23 + .../library-tests/dataflow/func/test.expected | 22 + .../library-tests/dataflow/func/test.ql | 14 + .../library-tests/dataflow/func/util.kt | 35 + .../dataflow/notnullexpr/NotNullExpr.kt | 14 + .../dataflow/notnullexpr/test.expected | 1 + .../dataflow/notnullexpr/test.ext.yml | 6 + .../dataflow/notnullexpr/test.ql | 14 + .../dataflow/stmtexpr/StmtExpr.kt | 16 + .../dataflow/stmtexpr/test.expected | 1 + .../library-tests/dataflow/stmtexpr/test.ql | 16 + .../dataflow/summaries/apply.expected | 2 + .../library-tests/dataflow/summaries/apply.kt | 9 + .../library-tests/dataflow/summaries/apply.ql | 5 + .../library-tests/dataflow/summaries/list.kt | 20 + .../dataflow/summaries/test.expected | 5 + .../library-tests/dataflow/summaries/test.kt | 75 + .../library-tests/dataflow/summaries/test.ql | 3 + .../library-tests/dataflow/summaries/use.kt | 11 + .../library-tests/dataflow/summaries/with.kt | 9 + .../dataflow/taint/StringTemplate.kt | 11 + .../dataflow/taint/test.expected | 1 + .../library-tests/dataflow/taint/test.ql | 14 + .../dataflow/whenexpr/WhenExpr.kt | 14 + .../dataflow/whenexpr/test.expected | 1 + .../dataflow/whenexpr/test.ext.yml | 6 + .../library-tests/dataflow/whenexpr/test.ql | 14 + .../library-tests/declaration-stack/Test.kt | 5 + .../declaration-stack/test.expected | 0 .../library-tests/declaration-stack/test.ql | 5 + .../test-kotlin2/library-tests/empty/Empty.kt | 0 .../library-tests/empty/elements.expected | 2 + .../library-tests/empty/elements.ql | 4 + .../library-tests/enum/enumUser.kt | 3 + .../library-tests/enum/test.expected | 37 + .../test-kotlin2/library-tests/enum/test.ql | 7 + .../library-tests/exprs/PrintAst.expected | 7071 +++++++++++++++++ .../library-tests/exprs/PrintAst.qlref | 1 + .../library-tests/exprs/binop.expected | 138 + .../test-kotlin2/library-tests/exprs/binop.ql | 44 + .../exprs/delegatedProperties.expected | 68 + .../exprs/delegatedProperties.kt | 87 + .../exprs/delegatedProperties.ql | 38 + .../library-tests/exprs/exprs.expected | 4388 ++++++++++ .../test-kotlin2/library-tests/exprs/exprs.kt | 358 + .../test-kotlin2/library-tests/exprs/exprs.ql | 39 + .../library-tests/exprs/funcExprs.expected | 253 + .../library-tests/exprs/funcExprs.kt | 96 + .../library-tests/exprs/funcExprs.ql | 42 + .../library-tests/exprs/kFunctionInvoke.kt | 10 + .../library-tests/exprs/localFunctionCalls.kt | 14 + .../library-tests/exprs/samConversion.kt | 77 + .../library-tests/exprs/unaryOp.expected | 23 + .../library-tests/exprs/unaryOp.ql | 36 + .../library-tests/exprs/whenExpr.kt | 10 + .../library-tests/exprs_typeaccess/A.kt | 26 + .../library-tests/exprs_typeaccess/B.java | 25 + .../exprs_typeaccess/PrintAst.expected | 176 + .../exprs_typeaccess/PrintAst.qlref | 1 + .../library-tests/extensions/A.java | 5 + .../library-tests/extensions/extensions.kt | 32 + .../extensions/methodaccesses.expected | 20 + .../extensions/methodaccesses.ql | 7 + .../library-tests/extensions/methods.expected | 12 + .../library-tests/extensions/methods.ql | 16 + .../extensions/parameters.expected | 49 + .../library-tests/extensions/parameters.ql | 11 + .../extensions_recursion/element.expected | 26 + .../extensions_recursion/element.ql | 5 + .../extensions_recursion/test.kt | 11 + .../fake_overrides/all_java/A.java | 32 + .../fake_overrides/all_java/call.expected | 1 + .../fake_overrides/all_java/call.ql | 5 + .../fake_overrides/all_kotlin/A.kt | 32 + .../fake_overrides/all_kotlin/call.expected | 1 + .../fake_overrides/all_kotlin/call.ql | 5 + .../fake_overrides/kotlin_calling_java/A.kt | 13 + .../kotlin_calling_java/OB.java | 20 + .../kotlin_calling_java/call.expected | 1 + .../kotlin_calling_java/call.ql | 5 + .../field-initializer-flow/test.expected | 3 + .../field-initializer-flow/test.kt | 11 + .../field-initializer-flow/test.ql | 20 + .../library-tests/files/otherfile.kt | 3 + .../library-tests/files/test.expected | 5 + .../test-kotlin2/library-tests/files/test.kt | 14 + .../test-kotlin2/library-tests/files/test.ql | 6 + .../for-array-iterators/test.expected | 0 .../library-tests/for-array-iterators/test.kt | 11 + .../library-tests/for-array-iterators/test.ql | 4 + .../library-tests/function-n/test.expected | 3 + .../library-tests/function-n/test.kt | 8 + .../library-tests/function-n/test.ql | 5 + .../generic-inner-classes/KotlinUser.kt | 18 + .../generic-inner-classes/OuterGeneric.kt | 22 + .../generic-inner-classes/OuterNotGeneric.kt | 11 + .../generic-inner-classes/test.expected | 60 + .../generic-inner-classes/test.ql | 28 + .../generic-instance-methods/Test.java | 33 + .../generic-instance-methods/test.expected | 85 + .../generic-instance-methods/test.kt | 28 + .../generic-instance-methods/test.ql | 46 + .../generic-methods/ClassWithParams.kt | 10 + .../generic-methods/ClassWithoutParams.kt | 7 + .../library-tests/generic-methods/kttest.kt | 17 + .../generic-methods/test.expected | 7 + .../library-tests/generic-methods/test.ql | 5 + .../generic-selective-extraction/Test.java | 23 + .../generic-selective-extraction/Test.kt | 27 + .../test.expected | 52 + .../generic-selective-extraction/test.ql | 7 + .../generic-type-bounds/test.expected | 11 + .../library-tests/generic-type-bounds/test.kt | 11 + .../library-tests/generic-type-bounds/test.ql | 13 + .../library-tests/generics-location/A.java | 11 + .../generics-location/generics.kt | 11 + .../generics-location/locations.expected | 25 + .../generics-location/locations.ql | 17 + .../library-tests/generics/PrintAst.expected | 259 + .../library-tests/generics/PrintAst.qlref | 1 + .../library-tests/generics/generics.expected | 75 + .../library-tests/generics/generics.kt | 65 + .../library-tests/generics/generics.ql | 30 + .../library-tests/inherited-callee/Test.java | 33 + .../library-tests/inherited-callee/Test.kt | 33 + .../inherited-callee/test.expected | 10 + .../library-tests/inherited-callee/test.ql | 5 + .../Test.java | 59 + .../test.expected | 2 + .../test.ql | 5 + .../user.kt | 1 + .../inherited-default-value/test.expected | 2 + .../inherited-default-value/test.kt | 13 + .../inherited-default-value/test.ql | 4 + .../test.expected | 4 + .../inherited-single-abstract-method/test.kt | 9 + .../inherited-single-abstract-method/test.ql | 5 + .../inheritence-substitution/test.expected | 40 + .../inheritence-substitution/test.kt | 36 + .../inheritence-substitution/test.ql | 17 + .../library-tests/instances/TestClassA.kt | 4 + .../library-tests/instances/TestClassAUser.kt | 16 + .../library-tests/instances/classes.expected | 5 + .../library-tests/instances/classes.ql | 5 + .../interface-delegate/intfDelegate.kt | 10 + .../interface-delegate/test.expected | 8 + .../library-tests/interface-delegate/test.ql | 7 + .../User.java | 5 + .../test.expected | 1 + .../test.kt | 5 + .../test.ql | 4 + .../internal-public-alias/User.java | 11 + .../internal-public-alias/test.expected | 6 + .../internal-public-alias/test.kt | 12 + .../internal-public-alias/test.ql | 5 + .../Test.java | 28 + .../test.expected | 423 + .../test.kt | 29 + .../test.ql | 28 + .../java-lang-number-conversions/Test.java | 27 + .../test.expected | 53 + .../java-lang-number-conversions/test.kt | 8 + .../java-lang-number-conversions/test.ql | 5 + .../java-list-kotlin-user/MyList.java | 11 + .../java-list-kotlin-user/test.expected | 3 + .../java-list-kotlin-user/test.kt | 2 + .../java-list-kotlin-user/test.ql | 5 + .../java-map-methods/PrintAst.expected | 178 + .../java-map-methods/PrintAst.qlref | 1 + .../java-map-methods/test.expected | 7 + .../library-tests/java-map-methods/test.kt | 32 + .../library-tests/java-map-methods/test.ql | 7 + .../java_and_kotlin/Continuation.java | 4 + .../library-tests/java_and_kotlin/Java.java | 23 + .../library-tests/java_and_kotlin/Kotlin.kt | 15 + .../java_and_kotlin/test.expected | 19 + .../library-tests/java_and_kotlin/test.ql | 21 + .../java/test.expected | 4 + .../java_and_kotlin_generics/java/test.ql | 12 + .../java_and_kotlin_generics/java/x.java | 8 + .../kotlin/test.expected | 4 + .../java_and_kotlin_generics/kotlin/test.ql | 12 + .../java_and_kotlin_generics/kotlin/x.kt | 7 + .../java_and_kotlin_internal/Java.java | 6 + .../java_and_kotlin_internal/Kotlin.kt | 6 + .../visibility.expected | 16 + .../java_and_kotlin_internal/visibility.ql | 13 + .../java_properties/PrintAst.expected | 22 + .../java_properties/PrintAst.qlref | 1 + .../library-tests/java_properties/Prop.java | 7 + .../library-tests/java_properties/Use.kt | 4 + .../jvmoverloads-annotation/PrintAst.expected | 1082 +++ .../jvmoverloads-annotation/PrintAst.qlref | 1 + .../jvmoverloads-annotation/test.expected | 57 + .../jvmoverloads-annotation/test.kt | 45 + .../jvmoverloads-annotation/test.ql | 5 + .../library-tests/jvmoverloads_flow/User.java | 43 + .../jvmoverloads_flow/test.expected | 20 + .../library-tests/jvmoverloads_flow/test.kt | 87 + .../library-tests/jvmoverloads_flow/test.ql | 16 + .../jvmoverloads_generics/User.java | 9 + .../jvmoverloads_generics/test.expected | 9 + .../jvmoverloads_generics/test.kt | 6 + .../jvmoverloads_generics/test.ql | 16 + .../jvmstatic-annotation/JavaUser.java | 22 + .../jvmstatic-annotation/PrintAst.expected | 417 + .../jvmstatic-annotation/PrintAst.qlref | 1 + .../jvmstatic-annotation/test.expected | 74 + .../jvmstatic-annotation/test.kt | 67 + .../jvmstatic-annotation/test.ql | 16 + .../kotlin-java-map-entries/C.java | 3 + .../kotlin-java-map-entries/b.kt | 1 + .../kotlin-java-map-entries/test.expected | 2 + .../kotlin-java-map-entries/test.ql | 7 + .../library-tests/lateinit/PrintAst.expected | 94 + .../library-tests/lateinit/PrintAst.qlref | 1 + .../library-tests/lateinit/test.expected | 8 + .../library-tests/lateinit/test.kt | 16 + .../library-tests/lateinit/test.ql | 13 + .../test.expected | 2 + .../lazy-val-multiple-constructors/test.kt | 12 + .../lazy-val-multiple-constructors/test.ql | 4 + .../library-tests/literals/literals.expected | 29 + .../library-tests/literals/literals.kt | 33 + .../library-tests/literals/literals.ql | 5 + .../maps-iterator-overloads/test.expected | 2 + .../maps-iterator-overloads/test.kt | 3 + .../maps-iterator-overloads/test.ql | 4 + .../methods-mixed-java-and-kotlin/A.java | 5 + .../methods-mixed-java-and-kotlin/B.java | 5 + .../methods-mixed-java-and-kotlin/W.kt | 9 + .../test.expected | 6 + .../methods-mixed-java-and-kotlin/test.ql | 6 + .../library-tests/methods/clinit.expected | 3 + .../library-tests/methods/clinit.kt | 3 + .../library-tests/methods/clinit.ql | 5 + .../library-tests/methods/dataClass.kt | 1 + .../library-tests/methods/delegates.kt | 12 + .../methods/diagnostics.expected | 0 .../library-tests/methods/diagnostics.ql | 4 + .../library-tests/methods/enumClass.kt | 16 + .../library-tests/methods/exprs.expected | 402 + .../library-tests/methods/exprs.ql | 5 + .../library-tests/methods/methods.expected | 92 + .../library-tests/methods/methods.kt | 21 + .../library-tests/methods/methods.ql | 35 + .../library-tests/methods/methods2.kt | 11 + .../library-tests/methods/methods3.kt | 7 + .../library-tests/methods/methods4.kt | 12 + .../library-tests/methods/methods5.kt | 13 + .../library-tests/methods/methods6.kt | 4 + .../library-tests/methods/parameters.expected | 57 + .../library-tests/methods/parameters.ql | 7 + .../library-tests/ministdlib/MiniStdLib.kt | 46 + .../library-tests/ministdlib/MyClass.kt | 1 + .../library-tests/ministdlib/classes.expected | 7 + .../library-tests/ministdlib/classes.ql | 4 + .../library-tests/ministdlib/options | 1 + .../mixed-java-and-kotlin/Q.java | 3 + .../library-tests/mixed-java-and-kotlin/W.kt | 3 + .../mixed-java-and-kotlin/test.expected | 2 + .../mixed-java-and-kotlin/test.ql | 6 + .../modifiers/modifiers.expected | 87 + .../library-tests/modifiers/modifiers.kt | 41 + .../library-tests/modifiers/modifiers.ql | 5 + .../multiple_extensions/calls.expected | 4 + .../multiple_extensions/calls.ql | 4 + .../library-tests/multiple_extensions/test.kt | 7 + .../multiple_files/classes.expected | 6 + .../library-tests/multiple_files/classes.ql | 5 + .../library-tests/multiple_files/file1.kt | 13 + .../library-tests/multiple_files/file2.kt | 5 + .../library-tests/multiple_files/file3.kt | 7 + .../library-tests/multiple_files/file4.kt | 6 + .../multiple_files/method_accesses.expected | 5 + .../multiple_files/method_accesses.ql | 28 + .../multiple_files/methods.expected | 4 + .../library-tests/multiple_files/methods.ql | 5 + .../no-when-branch-found/test.expected | 1 + .../no-when-branch-found/test.kt | 10 + .../no-when-branch-found/test.ql | 4 + .../library-tests/numlines/callable.expected | 6 + .../library-tests/numlines/callable.ql | 4 + .../library-tests/numlines/classes.expected | 1 + .../library-tests/numlines/classes.ql | 4 + .../library-tests/numlines/files.expected | 1 + .../library-tests/numlines/files.ql | 4 + .../library-tests/numlines/test.kt | 27 + .../library-tests/object/accesses.expected | 1 + .../library-tests/object/accesses.ql | 5 + .../library-tests/object/objects.expected | 1 + .../library-tests/object/objects.kt | 9 + .../library-tests/object/objects.ql | 7 + .../operator-overloads/PrintAst.expected | 103 + .../operator-overloads/PrintAst.qlref | 1 + .../operator-overloads/test.expected | 0 .../library-tests/operator-overloads/test.kt | 17 + .../library-tests/operator-overloads/test.ql | 6 + .../parameter-defaults/PrintAst.expected | 1725 ++++ .../parameter-defaults/PrintAst.qlref | 1 + .../parameter-defaults/defaults.expected | 20 + .../parameter-defaults/defaults.ql | 7 + .../parameter-defaults/erasure.expected | 36 + .../parameter-defaults/erasure.ql | 21 + .../parameter-defaults/flowTest.expected | 2 + .../parameter-defaults/flowTest.ql | 34 + .../library-tests/parameter-defaults/test.kt | 235 + .../private-anonymous-types/other.kt | 1 + .../private-anonymous-types/test.expected | 36 + .../private-anonymous-types/test.kt | 24 + .../private-anonymous-types/test.ql | 9 + .../properties/properties.expected | 54 + .../library-tests/properties/properties.kt | 98 + .../library-tests/properties/properties.ql | 49 + .../stack-overflow-1/BaseFoo.java | 3 + .../stack-overflow-1/Foo.java | 3 + .../stack-overflow-1/classes.expected | 3 + .../stack-overflow-1/classes.ql | 5 + .../stack-overflow-1/test.kt | 11 + .../stack-overflow-2/classes.expected | 3 + .../stack-overflow-2/classes.ql | 5 + .../stack-overflow-2/stackOverflow.kt | 14 + .../reflection/PrintAst.expected | 1771 +++++ .../library-tests/reflection/PrintAst.qlref | 1 + .../reflection/checkParameterCounts.expected | 0 .../reflection/checkParameterCounts.ql | 9 + .../reflection/reflection.expected | 589 ++ .../library-tests/reflection/reflection.kt | 163 + .../library-tests/reflection/reflection.ql | 110 + .../special-method-getters/test.expected | 11 + .../special-method-getters/test.kt | 1 + .../special-method-getters/test.ql | 7 + .../static-method-calls/test.expected | 2 + .../library-tests/static-method-calls/test.kt | 9 + .../library-tests/static-method-calls/test.ql | 4 + .../library-tests/stmts/PrintAst.expected | 198 + .../library-tests/stmts/PrintAst.qlref | 1 + .../library-tests/stmts/exprs.expected | 108 + .../test-kotlin2/library-tests/stmts/exprs.ql | 5 + .../library-tests/stmts/loops.expected | 10 + .../test-kotlin2/library-tests/stmts/loops.ql | 7 + .../library-tests/stmts/stmts.expected | 147 + .../test-kotlin2/library-tests/stmts/stmts.kt | 58 + .../test-kotlin2/library-tests/stmts/stmts.ql | 6 + .../library-tests/stmts/tryStmts.expected | 1 + .../library-tests/stmts/tryStmts.ql | 4 + .../library-tests/string-charat/Test.java | 5 + .../library-tests/string-charat/test.expected | 2 + .../library-tests/string-charat/test.kt | 2 + .../library-tests/string-charat/test.ql | 4 + .../super-method-calls/test.expected | 2 + .../library-tests/super-method-calls/test.kt | 36 + .../library-tests/super-method-calls/test.ql | 16 + .../library-tests/this/call.expected | 23 + .../test-kotlin2/library-tests/this/call.ql | 4 + .../library-tests/this/this.expected | 26 + .../test-kotlin2/library-tests/this/this.kt | 68 + .../test-kotlin2/library-tests/this/this.ql | 38 + .../library-tests/trap/comments.expected | 5 + .../library-tests/trap/comments.ql | 10 + .../library-tests/trap/diags.expected | 11 + .../test-kotlin2/library-tests/trap/diags.ql | 6 + .../library-tests/trap/literals.expected | 5 + .../library-tests/trap/literals.ql | 6 + .../library-tests/trap/long_comments.kt | 23 + .../library-tests/trap/long_string.kt | 20 + .../library-tests/trivial/Trivial.kt | 1 + .../library-tests/trivial/elements.expected | 7 + .../library-tests/trivial/elements.ql | 5 + .../aliases_with_type_parameters.kt | 7 + .../library-tests/type_aliases/test.kt | 16 + .../type_aliases/type_aliases.expected | 3 + .../type_aliases/type_aliases.ql | 4 + .../type_equivalences.expected | 8 + .../type_equivalences/type_equivalences.kt | 8 + .../type_equivalences/type_equivalences.ql | 18 + .../library-tests/types/types.expected | 32 + .../test-kotlin2/library-tests/types/types.kt | 43 + .../test-kotlin2/library-tests/types/types.ql | 8 + .../underscore-parameters/test.expected | 1 + .../underscore-parameters/test.kt | 7 + .../underscore-parameters/test.ql | 5 + .../library-tests/vararg/args.expected | 86 + .../test-kotlin2/library-tests/vararg/args.ql | 23 + .../library-tests/vararg/dataflow.expected | 28 + .../library-tests/vararg/dataflow.ql | 18 + .../library-tests/vararg/intList.kt | 5 + .../test-kotlin2/library-tests/vararg/test.kt | 56 + .../variables/variableAccesses.expected | 36 + .../variables/variableAccesses.ql | 9 + .../variables/variables.expected | 20 + .../library-tests/variables/variables.kt | 50 + .../library-tests/variables/variables.ql | 45 + .../AbstractToConcreteCollection.expected | 0 .../AbstractToConcreteCollection.qlref | 1 + .../AbstractToConcreteCollection/Test.kt | 5 + .../AutoBoxing/AutoBoxing.expected | 0 .../query-tests/AutoBoxing/AutoBoxing.qlref | 1 + .../query-tests/AutoBoxing/Test.kt | 5 + .../CloseReader/CloseReader.expected | 0 .../query-tests/CloseReader/CloseReader.kt | 7 + .../query-tests/CloseReader/CloseReader.qlref | 1 + .../CloseWriter/CloseWriter.expected | 0 .../query-tests/CloseWriter/CloseWriter.kt | 45 + .../query-tests/CloseWriter/CloseWriter.qlref | 1 + .../ConfusingOverloading.expected | 0 .../ConfusingOverloading.qlref | 1 + .../query-tests/ConfusingOverloading/Test.kt | 20 + .../query-tests/ConstantLoopCondition/A.kt | 24 + .../ConstantLoopCondition.expected | 3 + .../ConstantLoopCondition.qlref | 1 + .../query-tests/DeadCode/DeadClass.expected | 0 .../query-tests/DeadCode/DeadClass.qlref | 1 + .../query-tests/DeadCode/DeadMethod.expected | 0 .../query-tests/DeadCode/DeadMethod.qlref | 1 + .../test-kotlin2/query-tests/DeadCode/Test.kt | 31 + .../DeadRefTypes/DeadRefTypes.expected | 1 + .../DeadRefTypes/DeadRefTypes.qlref | 1 + .../query-tests/DeadRefTypes/test.kt | 15 + .../EmptyBlock/EmptyBlock.expected | 0 .../query-tests/EmptyBlock/EmptyBlock.qlref | 1 + .../query-tests/EmptyBlock/Test.kt | 13 + .../ExposeRepresentation.expected | 0 .../ExposeRepresentation.qlref | 1 + .../ExposeRepresentation/ExposesRep.kt | 3 + .../query-tests/ExposeRepresentation/User.kt | 5 + .../InnerClassCouldBeStatic.expected | 0 .../InnerClassCouldBeStatic.qlref | 1 + .../InnerClassCouldBeStatic/Test.kt | 6 + .../MissingInstanceofInEquals.expected | 0 .../MissingInstanceofInEquals.qlref | 1 + .../MissingInstanceofInEquals/Test.kt | 25 + .../MissingOverrideAnnotation.expected | 0 .../MissingOverrideAnnotation.qlref | 1 + .../MissingOverrideAnnotation/Test.kt | 25 + .../MutualDependency.expected | 0 .../MutualDependency/MutualDependency.qlref | 1 + .../query-tests/MutualDependency/Test.kt | 8 + .../NamingConventionsRefTypes.expected | 1 + .../NamingConventionsRefTypes.qlref | 1 + .../NamingConventionsRefTypes/Test.kt | 12 + .../NonSerializableField.expected | 0 .../NonSerializableField.qlref | 1 + .../NonSerializableFieldTest.kt | 4 + .../NonSerializableInnerClass.expected | 0 .../NonSerializableInnerClass.qlref | 1 + .../NonSerializableInnerClassTest.kt | 11 + .../query-tests/NullMaybe/NullMaybe.expected | 0 .../query-tests/NullMaybe/NullMaybe.qlref | 1 + .../query-tests/NullMaybe/Test.kt | 7 + .../OneStatementPerLine.expected | 0 .../OneStatementPerLine.qlref | 1 + .../query-tests/OneStatementPerLine/Test.kt | 7 + .../PartiallyMaskedCatch.expected | 0 .../PartiallyMaskedCatch.qlref | 1 + .../PartiallyMaskedCatchTest.kt | 31 + .../ReturnValueIgnored.expected | 0 .../ReturnValueIgnored.qlref | 1 + .../query-tests/ReturnValueIgnored/Test.kt | 16 + .../SimplifyBoolExpr.expected | 0 .../SimplifyBoolExpr/SimplifyBoolExpr.kt | 13 + .../SimplifyBoolExpr/SimplifyBoolExpr.qlref | 1 + .../query-tests/UnderscoreIdentifier/Test.kt | 11 + .../UnderscoreIdentifier.expected | 0 .../UnderscoreIdentifier.qlref | 1 + .../UnderscoreIdentifier/test.expected | 7 + .../query-tests/UnderscoreIdentifier/test.ql | 3 + .../UnreadLocal/UnreadLocal.expected | 3 + .../query-tests/UnreadLocal/UnreadLocal.qlref | 1 + .../query-tests/UnreadLocal/test.kt | 25 + .../query-tests/UselessNullCheck/Test.kt | 18 + .../UselessNullCheck.expected | 1 + .../UselessNullCheck/UselessNullCheck.qlref | 1 + .../query-tests/UselessParameter/Test.kt | 24 + .../UselessParameter.expected | 0 .../UselessParameter/UselessParameter.qlref | 1 + .../WhitespaceContradictsPrecedence.expected | 0 .../WhitespaceContradictsPrecedence.qlref | 1 + .../WhitespaceContradictsPrecedence/test.kt | 5 + 625 files changed, 32808 insertions(+) create mode 100644 java/ql/test-kotlin2/library-tests/.gitignore create mode 100644 java/ql/test-kotlin2/library-tests/GeneratedFiles/Generated.expected create mode 100644 java/ql/test-kotlin2/library-tests/GeneratedFiles/Generated.kt create mode 100644 java/ql/test-kotlin2/library-tests/GeneratedFiles/Generated.ql create mode 100644 java/ql/test-kotlin2/library-tests/GeneratedFiles/NonGenerated.kt create mode 100644 java/ql/test-kotlin2/library-tests/android_function_return_types/returnTypes.expected create mode 100644 java/ql/test-kotlin2/library-tests/android_function_return_types/returnTypes.ql create mode 100644 java/ql/test-kotlin2/library-tests/android_function_return_types/test.kt create mode 100644 java/ql/test-kotlin2/library-tests/annotation-accessor-result-type/PrintAst.expected create mode 100644 java/ql/test-kotlin2/library-tests/annotation-accessor-result-type/PrintAst.qlref create mode 100644 java/ql/test-kotlin2/library-tests/annotation-accessor-result-type/test.expected create mode 100644 java/ql/test-kotlin2/library-tests/annotation-accessor-result-type/test.kt create mode 100644 java/ql/test-kotlin2/library-tests/annotation-accessor-result-type/test.ql create mode 100644 java/ql/test-kotlin2/library-tests/annotation_classes/Annot0j.java create mode 100644 java/ql/test-kotlin2/library-tests/annotation_classes/Annot1j.java create mode 100644 java/ql/test-kotlin2/library-tests/annotation_classes/PrintAst.expected create mode 100644 java/ql/test-kotlin2/library-tests/annotation_classes/PrintAst.qlref create mode 100644 java/ql/test-kotlin2/library-tests/annotation_classes/classes.expected create mode 100644 java/ql/test-kotlin2/library-tests/annotation_classes/classes.ql create mode 100644 java/ql/test-kotlin2/library-tests/annotation_classes/def.kt create mode 100644 java/ql/test-kotlin2/library-tests/annotation_classes/use.java create mode 100644 java/ql/test-kotlin2/library-tests/annotations/jvmName/Test.java create mode 100644 java/ql/test-kotlin2/library-tests/annotations/jvmName/test.expected create mode 100644 java/ql/test-kotlin2/library-tests/annotations/jvmName/test.kt create mode 100644 java/ql/test-kotlin2/library-tests/annotations/jvmName/test.ql create mode 100644 java/ql/test-kotlin2/library-tests/arrays-with-variances/User.java create mode 100644 java/ql/test-kotlin2/library-tests/arrays-with-variances/takesArrayList.kt create mode 100644 java/ql/test-kotlin2/library-tests/arrays-with-variances/test.expected create mode 100644 java/ql/test-kotlin2/library-tests/arrays-with-variances/test.ql create mode 100644 java/ql/test-kotlin2/library-tests/arrays/arrayAccesses.expected create mode 100644 java/ql/test-kotlin2/library-tests/arrays/arrayAccesses.ql create mode 100644 java/ql/test-kotlin2/library-tests/arrays/arrayCreations.expected create mode 100644 java/ql/test-kotlin2/library-tests/arrays/arrayCreations.kt create mode 100644 java/ql/test-kotlin2/library-tests/arrays/arrayCreations.ql create mode 100644 java/ql/test-kotlin2/library-tests/arrays/arrayGetsSets.kt create mode 100644 java/ql/test-kotlin2/library-tests/arrays/arrayIterators.expected create mode 100644 java/ql/test-kotlin2/library-tests/arrays/arrayIterators.kt create mode 100644 java/ql/test-kotlin2/library-tests/arrays/arrayIterators.ql create mode 100644 java/ql/test-kotlin2/library-tests/arrays/assignExprs.expected create mode 100644 java/ql/test-kotlin2/library-tests/arrays/assignExprs.ql create mode 100644 java/ql/test-kotlin2/library-tests/arrays/primitiveArrays.kt create mode 100644 java/ql/test-kotlin2/library-tests/arrays/test.expected create mode 100644 java/ql/test-kotlin2/library-tests/arrays/test.ql create mode 100644 java/ql/test-kotlin2/library-tests/call-int-to-char/test.expected create mode 100644 java/ql/test-kotlin2/library-tests/call-int-to-char/test.kt create mode 100644 java/ql/test-kotlin2/library-tests/call-int-to-char/test.ql create mode 100644 java/ql/test-kotlin2/library-tests/clashing-extension-fields/test.expected create mode 100644 java/ql/test-kotlin2/library-tests/clashing-extension-fields/test.kt create mode 100644 java/ql/test-kotlin2/library-tests/clashing-extension-fields/test.ql create mode 100644 java/ql/test-kotlin2/library-tests/classes/PrintAst.expected create mode 100644 java/ql/test-kotlin2/library-tests/classes/PrintAst.qlref create mode 100644 java/ql/test-kotlin2/library-tests/classes/anonymousClasses.expected create mode 100644 java/ql/test-kotlin2/library-tests/classes/anonymousClasses.ql create mode 100644 java/ql/test-kotlin2/library-tests/classes/classes.expected create mode 100644 java/ql/test-kotlin2/library-tests/classes/classes.kt create mode 100644 java/ql/test-kotlin2/library-tests/classes/classes.ql create mode 100644 java/ql/test-kotlin2/library-tests/classes/ctorCalls.expected create mode 100644 java/ql/test-kotlin2/library-tests/classes/ctorCalls.ql create mode 100644 java/ql/test-kotlin2/library-tests/classes/genericExprTypes.expected create mode 100644 java/ql/test-kotlin2/library-tests/classes/genericExprTypes.ql create mode 100644 java/ql/test-kotlin2/library-tests/classes/generic_anonymous.kt create mode 100644 java/ql/test-kotlin2/library-tests/classes/interfaces.expected create mode 100644 java/ql/test-kotlin2/library-tests/classes/interfaces.ql create mode 100644 java/ql/test-kotlin2/library-tests/classes/localClass.expected create mode 100644 java/ql/test-kotlin2/library-tests/classes/localClass.ql create mode 100644 java/ql/test-kotlin2/library-tests/classes/localClassField.kt create mode 100644 java/ql/test-kotlin2/library-tests/classes/local_anonymous.expected create mode 100644 java/ql/test-kotlin2/library-tests/classes/local_anonymous.kt create mode 100644 java/ql/test-kotlin2/library-tests/classes/local_anonymous.ql create mode 100644 java/ql/test-kotlin2/library-tests/classes/paramTypes.expected create mode 100644 java/ql/test-kotlin2/library-tests/classes/paramTypes.ql create mode 100644 java/ql/test-kotlin2/library-tests/classes/superChain.kt create mode 100644 java/ql/test-kotlin2/library-tests/classes/superTypes.expected create mode 100644 java/ql/test-kotlin2/library-tests/classes/superTypes.ql create mode 100644 java/ql/test-kotlin2/library-tests/collection-literals/PrintAst.expected create mode 100644 java/ql/test-kotlin2/library-tests/collection-literals/PrintAst.qlref create mode 100644 java/ql/test-kotlin2/library-tests/collection-literals/test.kt create mode 100644 java/ql/test-kotlin2/library-tests/comments/comments.expected create mode 100644 java/ql/test-kotlin2/library-tests/comments/comments.kt create mode 100644 java/ql/test-kotlin2/library-tests/comments/comments.ql create mode 100644 java/ql/test-kotlin2/library-tests/companion_objects/accesses.expected create mode 100644 java/ql/test-kotlin2/library-tests/companion_objects/accesses.ql create mode 100644 java/ql/test-kotlin2/library-tests/companion_objects/companion_objects.expected create mode 100644 java/ql/test-kotlin2/library-tests/companion_objects/companion_objects.kt create mode 100644 java/ql/test-kotlin2/library-tests/companion_objects/companion_objects.ql create mode 100644 java/ql/test-kotlin2/library-tests/companion_objects/method_accesses.expected create mode 100644 java/ql/test-kotlin2/library-tests/companion_objects/method_accesses.ql create mode 100644 java/ql/test-kotlin2/library-tests/compilation-units/cus.expected create mode 100644 java/ql/test-kotlin2/library-tests/compilation-units/cus.ql create mode 100644 java/ql/test-kotlin2/library-tests/compilation-units/test.kt create mode 100644 java/ql/test-kotlin2/library-tests/controlflow/basic/Test.kt create mode 100644 java/ql/test-kotlin2/library-tests/controlflow/basic/bbStmts.expected create mode 100644 java/ql/test-kotlin2/library-tests/controlflow/basic/bbStmts.ql create mode 100644 java/ql/test-kotlin2/library-tests/controlflow/basic/bbStrictDominance.expected create mode 100644 java/ql/test-kotlin2/library-tests/controlflow/basic/bbStrictDominance.ql create mode 100644 java/ql/test-kotlin2/library-tests/controlflow/basic/bbSuccessor.expected create mode 100644 java/ql/test-kotlin2/library-tests/controlflow/basic/bbSuccessor.ql create mode 100644 java/ql/test-kotlin2/library-tests/controlflow/basic/getASuccessor.expected create mode 100644 java/ql/test-kotlin2/library-tests/controlflow/basic/getASuccessor.ql create mode 100644 java/ql/test-kotlin2/library-tests/controlflow/basic/strictDominance.expected create mode 100644 java/ql/test-kotlin2/library-tests/controlflow/basic/strictDominance.ql create mode 100644 java/ql/test-kotlin2/library-tests/controlflow/basic/strictPostDominance.expected create mode 100644 java/ql/test-kotlin2/library-tests/controlflow/basic/strictPostDominance.ql create mode 100644 java/ql/test-kotlin2/library-tests/controlflow/dominance/Test.kt create mode 100644 java/ql/test-kotlin2/library-tests/controlflow/dominance/Test2.kt create mode 100644 java/ql/test-kotlin2/library-tests/controlflow/dominance/dominanceBad.expected create mode 100644 java/ql/test-kotlin2/library-tests/controlflow/dominance/dominanceBad.ql create mode 100644 java/ql/test-kotlin2/library-tests/controlflow/dominance/dominanceWrong.expected create mode 100644 java/ql/test-kotlin2/library-tests/controlflow/dominance/dominanceWrong.ql create mode 100644 java/ql/test-kotlin2/library-tests/controlflow/dominance/dominatedByStart.expected create mode 100644 java/ql/test-kotlin2/library-tests/controlflow/dominance/dominatedByStart.ql create mode 100644 java/ql/test-kotlin2/library-tests/controlflow/dominance/dominator.expected create mode 100644 java/ql/test-kotlin2/library-tests/controlflow/dominance/dominator.ql create mode 100644 java/ql/test-kotlin2/library-tests/controlflow/dominance/dominatorExists.expected create mode 100644 java/ql/test-kotlin2/library-tests/controlflow/dominance/dominatorExists.ql create mode 100644 java/ql/test-kotlin2/library-tests/controlflow/dominance/dominatorUnique.expected create mode 100644 java/ql/test-kotlin2/library-tests/controlflow/dominance/dominatorUnique.ql create mode 100644 java/ql/test-kotlin2/library-tests/controlflow/paths/A.kt create mode 100644 java/ql/test-kotlin2/library-tests/controlflow/paths/paths.expected create mode 100644 java/ql/test-kotlin2/library-tests/controlflow/paths/paths.ql create mode 100644 java/ql/test-kotlin2/library-tests/controlflow/plot/.gitignore create mode 100644 java/ql/test-kotlin2/library-tests/controlflow/plot/nodeGraph.expected create mode 100644 java/ql/test-kotlin2/library-tests/controlflow/plot/nodeGraph.ql create mode 100755 java/ql/test-kotlin2/library-tests/controlflow/plot/plot.sh create mode 100644 java/ql/test-kotlin2/library-tests/coroutines/coroutine_user.kt create mode 100644 java/ql/test-kotlin2/library-tests/coroutines/test.expected create mode 100644 java/ql/test-kotlin2/library-tests/coroutines/test.ql create mode 100644 java/ql/test-kotlin2/library-tests/data-classes/PrintAst.expected create mode 100644 java/ql/test-kotlin2/library-tests/data-classes/PrintAst.qlref create mode 100644 java/ql/test-kotlin2/library-tests/data-classes/callees.expected create mode 100644 java/ql/test-kotlin2/library-tests/data-classes/callees.ql create mode 100644 java/ql/test-kotlin2/library-tests/data-classes/data_classes.expected create mode 100644 java/ql/test-kotlin2/library-tests/data-classes/data_classes.ql create mode 100644 java/ql/test-kotlin2/library-tests/data-classes/dc.kt create mode 100644 java/ql/test-kotlin2/library-tests/dataflow/extensionMethod/test.expected create mode 100644 java/ql/test-kotlin2/library-tests/dataflow/extensionMethod/test.kt create mode 100644 java/ql/test-kotlin2/library-tests/dataflow/extensionMethod/test.ql create mode 100644 java/ql/test-kotlin2/library-tests/dataflow/foreach/C1.java create mode 100644 java/ql/test-kotlin2/library-tests/dataflow/foreach/C2.kt create mode 100644 java/ql/test-kotlin2/library-tests/dataflow/foreach/test.expected create mode 100644 java/ql/test-kotlin2/library-tests/dataflow/foreach/test.ql create mode 100644 java/ql/test-kotlin2/library-tests/dataflow/func/coroutine_async_await.kt create mode 100644 java/ql/test-kotlin2/library-tests/dataflow/func/functionReference.kt create mode 100644 java/ql/test-kotlin2/library-tests/dataflow/func/kotlinx_coroutines_stubs.kt create mode 100644 java/ql/test-kotlin2/library-tests/dataflow/func/lambda.kt create mode 100644 java/ql/test-kotlin2/library-tests/dataflow/func/localFunction.kt create mode 100644 java/ql/test-kotlin2/library-tests/dataflow/func/samConversion.kt create mode 100644 java/ql/test-kotlin2/library-tests/dataflow/func/test.expected create mode 100644 java/ql/test-kotlin2/library-tests/dataflow/func/test.ql create mode 100644 java/ql/test-kotlin2/library-tests/dataflow/func/util.kt create mode 100644 java/ql/test-kotlin2/library-tests/dataflow/notnullexpr/NotNullExpr.kt create mode 100644 java/ql/test-kotlin2/library-tests/dataflow/notnullexpr/test.expected create mode 100644 java/ql/test-kotlin2/library-tests/dataflow/notnullexpr/test.ext.yml create mode 100644 java/ql/test-kotlin2/library-tests/dataflow/notnullexpr/test.ql create mode 100644 java/ql/test-kotlin2/library-tests/dataflow/stmtexpr/StmtExpr.kt create mode 100644 java/ql/test-kotlin2/library-tests/dataflow/stmtexpr/test.expected create mode 100644 java/ql/test-kotlin2/library-tests/dataflow/stmtexpr/test.ql create mode 100644 java/ql/test-kotlin2/library-tests/dataflow/summaries/apply.expected create mode 100644 java/ql/test-kotlin2/library-tests/dataflow/summaries/apply.kt create mode 100644 java/ql/test-kotlin2/library-tests/dataflow/summaries/apply.ql create mode 100644 java/ql/test-kotlin2/library-tests/dataflow/summaries/list.kt create mode 100644 java/ql/test-kotlin2/library-tests/dataflow/summaries/test.expected create mode 100644 java/ql/test-kotlin2/library-tests/dataflow/summaries/test.kt create mode 100644 java/ql/test-kotlin2/library-tests/dataflow/summaries/test.ql create mode 100644 java/ql/test-kotlin2/library-tests/dataflow/summaries/use.kt create mode 100644 java/ql/test-kotlin2/library-tests/dataflow/summaries/with.kt create mode 100644 java/ql/test-kotlin2/library-tests/dataflow/taint/StringTemplate.kt create mode 100644 java/ql/test-kotlin2/library-tests/dataflow/taint/test.expected create mode 100644 java/ql/test-kotlin2/library-tests/dataflow/taint/test.ql create mode 100644 java/ql/test-kotlin2/library-tests/dataflow/whenexpr/WhenExpr.kt create mode 100644 java/ql/test-kotlin2/library-tests/dataflow/whenexpr/test.expected create mode 100644 java/ql/test-kotlin2/library-tests/dataflow/whenexpr/test.ext.yml create mode 100644 java/ql/test-kotlin2/library-tests/dataflow/whenexpr/test.ql create mode 100644 java/ql/test-kotlin2/library-tests/declaration-stack/Test.kt create mode 100644 java/ql/test-kotlin2/library-tests/declaration-stack/test.expected create mode 100644 java/ql/test-kotlin2/library-tests/declaration-stack/test.ql create mode 100644 java/ql/test-kotlin2/library-tests/empty/Empty.kt create mode 100644 java/ql/test-kotlin2/library-tests/empty/elements.expected create mode 100644 java/ql/test-kotlin2/library-tests/empty/elements.ql create mode 100644 java/ql/test-kotlin2/library-tests/enum/enumUser.kt create mode 100644 java/ql/test-kotlin2/library-tests/enum/test.expected create mode 100644 java/ql/test-kotlin2/library-tests/enum/test.ql create mode 100644 java/ql/test-kotlin2/library-tests/exprs/PrintAst.expected create mode 100644 java/ql/test-kotlin2/library-tests/exprs/PrintAst.qlref create mode 100644 java/ql/test-kotlin2/library-tests/exprs/binop.expected create mode 100644 java/ql/test-kotlin2/library-tests/exprs/binop.ql create mode 100644 java/ql/test-kotlin2/library-tests/exprs/delegatedProperties.expected create mode 100644 java/ql/test-kotlin2/library-tests/exprs/delegatedProperties.kt create mode 100644 java/ql/test-kotlin2/library-tests/exprs/delegatedProperties.ql create mode 100644 java/ql/test-kotlin2/library-tests/exprs/exprs.expected create mode 100644 java/ql/test-kotlin2/library-tests/exprs/exprs.kt create mode 100644 java/ql/test-kotlin2/library-tests/exprs/exprs.ql create mode 100644 java/ql/test-kotlin2/library-tests/exprs/funcExprs.expected create mode 100644 java/ql/test-kotlin2/library-tests/exprs/funcExprs.kt create mode 100644 java/ql/test-kotlin2/library-tests/exprs/funcExprs.ql create mode 100644 java/ql/test-kotlin2/library-tests/exprs/kFunctionInvoke.kt create mode 100644 java/ql/test-kotlin2/library-tests/exprs/localFunctionCalls.kt create mode 100644 java/ql/test-kotlin2/library-tests/exprs/samConversion.kt create mode 100644 java/ql/test-kotlin2/library-tests/exprs/unaryOp.expected create mode 100644 java/ql/test-kotlin2/library-tests/exprs/unaryOp.ql create mode 100644 java/ql/test-kotlin2/library-tests/exprs/whenExpr.kt create mode 100644 java/ql/test-kotlin2/library-tests/exprs_typeaccess/A.kt create mode 100644 java/ql/test-kotlin2/library-tests/exprs_typeaccess/B.java create mode 100644 java/ql/test-kotlin2/library-tests/exprs_typeaccess/PrintAst.expected create mode 100644 java/ql/test-kotlin2/library-tests/exprs_typeaccess/PrintAst.qlref create mode 100644 java/ql/test-kotlin2/library-tests/extensions/A.java create mode 100644 java/ql/test-kotlin2/library-tests/extensions/extensions.kt create mode 100644 java/ql/test-kotlin2/library-tests/extensions/methodaccesses.expected create mode 100644 java/ql/test-kotlin2/library-tests/extensions/methodaccesses.ql create mode 100644 java/ql/test-kotlin2/library-tests/extensions/methods.expected create mode 100644 java/ql/test-kotlin2/library-tests/extensions/methods.ql create mode 100644 java/ql/test-kotlin2/library-tests/extensions/parameters.expected create mode 100644 java/ql/test-kotlin2/library-tests/extensions/parameters.ql create mode 100644 java/ql/test-kotlin2/library-tests/extensions_recursion/element.expected create mode 100644 java/ql/test-kotlin2/library-tests/extensions_recursion/element.ql create mode 100644 java/ql/test-kotlin2/library-tests/extensions_recursion/test.kt create mode 100644 java/ql/test-kotlin2/library-tests/fake_overrides/all_java/A.java create mode 100644 java/ql/test-kotlin2/library-tests/fake_overrides/all_java/call.expected create mode 100644 java/ql/test-kotlin2/library-tests/fake_overrides/all_java/call.ql create mode 100644 java/ql/test-kotlin2/library-tests/fake_overrides/all_kotlin/A.kt create mode 100644 java/ql/test-kotlin2/library-tests/fake_overrides/all_kotlin/call.expected create mode 100644 java/ql/test-kotlin2/library-tests/fake_overrides/all_kotlin/call.ql create mode 100644 java/ql/test-kotlin2/library-tests/fake_overrides/kotlin_calling_java/A.kt create mode 100644 java/ql/test-kotlin2/library-tests/fake_overrides/kotlin_calling_java/OB.java create mode 100644 java/ql/test-kotlin2/library-tests/fake_overrides/kotlin_calling_java/call.expected create mode 100644 java/ql/test-kotlin2/library-tests/fake_overrides/kotlin_calling_java/call.ql create mode 100644 java/ql/test-kotlin2/library-tests/field-initializer-flow/test.expected create mode 100644 java/ql/test-kotlin2/library-tests/field-initializer-flow/test.kt create mode 100644 java/ql/test-kotlin2/library-tests/field-initializer-flow/test.ql create mode 100644 java/ql/test-kotlin2/library-tests/files/otherfile.kt create mode 100644 java/ql/test-kotlin2/library-tests/files/test.expected create mode 100644 java/ql/test-kotlin2/library-tests/files/test.kt create mode 100644 java/ql/test-kotlin2/library-tests/files/test.ql create mode 100644 java/ql/test-kotlin2/library-tests/for-array-iterators/test.expected create mode 100644 java/ql/test-kotlin2/library-tests/for-array-iterators/test.kt create mode 100644 java/ql/test-kotlin2/library-tests/for-array-iterators/test.ql create mode 100644 java/ql/test-kotlin2/library-tests/function-n/test.expected create mode 100644 java/ql/test-kotlin2/library-tests/function-n/test.kt create mode 100644 java/ql/test-kotlin2/library-tests/function-n/test.ql create mode 100644 java/ql/test-kotlin2/library-tests/generic-inner-classes/KotlinUser.kt create mode 100644 java/ql/test-kotlin2/library-tests/generic-inner-classes/OuterGeneric.kt create mode 100644 java/ql/test-kotlin2/library-tests/generic-inner-classes/OuterNotGeneric.kt create mode 100644 java/ql/test-kotlin2/library-tests/generic-inner-classes/test.expected create mode 100644 java/ql/test-kotlin2/library-tests/generic-inner-classes/test.ql create mode 100644 java/ql/test-kotlin2/library-tests/generic-instance-methods/Test.java create mode 100644 java/ql/test-kotlin2/library-tests/generic-instance-methods/test.expected create mode 100644 java/ql/test-kotlin2/library-tests/generic-instance-methods/test.kt create mode 100644 java/ql/test-kotlin2/library-tests/generic-instance-methods/test.ql create mode 100644 java/ql/test-kotlin2/library-tests/generic-methods/ClassWithParams.kt create mode 100644 java/ql/test-kotlin2/library-tests/generic-methods/ClassWithoutParams.kt create mode 100644 java/ql/test-kotlin2/library-tests/generic-methods/kttest.kt create mode 100644 java/ql/test-kotlin2/library-tests/generic-methods/test.expected create mode 100644 java/ql/test-kotlin2/library-tests/generic-methods/test.ql create mode 100644 java/ql/test-kotlin2/library-tests/generic-selective-extraction/Test.java create mode 100644 java/ql/test-kotlin2/library-tests/generic-selective-extraction/Test.kt create mode 100644 java/ql/test-kotlin2/library-tests/generic-selective-extraction/test.expected create mode 100644 java/ql/test-kotlin2/library-tests/generic-selective-extraction/test.ql create mode 100644 java/ql/test-kotlin2/library-tests/generic-type-bounds/test.expected create mode 100644 java/ql/test-kotlin2/library-tests/generic-type-bounds/test.kt create mode 100644 java/ql/test-kotlin2/library-tests/generic-type-bounds/test.ql create mode 100644 java/ql/test-kotlin2/library-tests/generics-location/A.java create mode 100644 java/ql/test-kotlin2/library-tests/generics-location/generics.kt create mode 100644 java/ql/test-kotlin2/library-tests/generics-location/locations.expected create mode 100644 java/ql/test-kotlin2/library-tests/generics-location/locations.ql create mode 100644 java/ql/test-kotlin2/library-tests/generics/PrintAst.expected create mode 100644 java/ql/test-kotlin2/library-tests/generics/PrintAst.qlref create mode 100644 java/ql/test-kotlin2/library-tests/generics/generics.expected create mode 100644 java/ql/test-kotlin2/library-tests/generics/generics.kt create mode 100644 java/ql/test-kotlin2/library-tests/generics/generics.ql create mode 100644 java/ql/test-kotlin2/library-tests/inherited-callee/Test.java create mode 100644 java/ql/test-kotlin2/library-tests/inherited-callee/Test.kt create mode 100644 java/ql/test-kotlin2/library-tests/inherited-callee/test.expected create mode 100644 java/ql/test-kotlin2/library-tests/inherited-callee/test.ql create mode 100644 java/ql/test-kotlin2/library-tests/inherited-collection-implementation/Test.java create mode 100644 java/ql/test-kotlin2/library-tests/inherited-collection-implementation/test.expected create mode 100644 java/ql/test-kotlin2/library-tests/inherited-collection-implementation/test.ql create mode 100644 java/ql/test-kotlin2/library-tests/inherited-collection-implementation/user.kt create mode 100644 java/ql/test-kotlin2/library-tests/inherited-default-value/test.expected create mode 100644 java/ql/test-kotlin2/library-tests/inherited-default-value/test.kt create mode 100644 java/ql/test-kotlin2/library-tests/inherited-default-value/test.ql create mode 100644 java/ql/test-kotlin2/library-tests/inherited-single-abstract-method/test.expected create mode 100644 java/ql/test-kotlin2/library-tests/inherited-single-abstract-method/test.kt create mode 100644 java/ql/test-kotlin2/library-tests/inherited-single-abstract-method/test.ql create mode 100644 java/ql/test-kotlin2/library-tests/inheritence-substitution/test.expected create mode 100644 java/ql/test-kotlin2/library-tests/inheritence-substitution/test.kt create mode 100644 java/ql/test-kotlin2/library-tests/inheritence-substitution/test.ql create mode 100644 java/ql/test-kotlin2/library-tests/instances/TestClassA.kt create mode 100644 java/ql/test-kotlin2/library-tests/instances/TestClassAUser.kt create mode 100644 java/ql/test-kotlin2/library-tests/instances/classes.expected create mode 100644 java/ql/test-kotlin2/library-tests/instances/classes.ql create mode 100644 java/ql/test-kotlin2/library-tests/interface-delegate/intfDelegate.kt create mode 100644 java/ql/test-kotlin2/library-tests/interface-delegate/test.expected create mode 100644 java/ql/test-kotlin2/library-tests/interface-delegate/test.ql create mode 100644 java/ql/test-kotlin2/library-tests/internal-constructor-called-from-java/User.java create mode 100644 java/ql/test-kotlin2/library-tests/internal-constructor-called-from-java/test.expected create mode 100644 java/ql/test-kotlin2/library-tests/internal-constructor-called-from-java/test.kt create mode 100644 java/ql/test-kotlin2/library-tests/internal-constructor-called-from-java/test.ql create mode 100644 java/ql/test-kotlin2/library-tests/internal-public-alias/User.java create mode 100644 java/ql/test-kotlin2/library-tests/internal-public-alias/test.expected create mode 100644 java/ql/test-kotlin2/library-tests/internal-public-alias/test.kt create mode 100644 java/ql/test-kotlin2/library-tests/internal-public-alias/test.ql create mode 100644 java/ql/test-kotlin2/library-tests/java-kotlin-collection-type-generic-methods/Test.java create mode 100644 java/ql/test-kotlin2/library-tests/java-kotlin-collection-type-generic-methods/test.expected create mode 100644 java/ql/test-kotlin2/library-tests/java-kotlin-collection-type-generic-methods/test.kt create mode 100644 java/ql/test-kotlin2/library-tests/java-kotlin-collection-type-generic-methods/test.ql create mode 100644 java/ql/test-kotlin2/library-tests/java-lang-number-conversions/Test.java create mode 100644 java/ql/test-kotlin2/library-tests/java-lang-number-conversions/test.expected create mode 100644 java/ql/test-kotlin2/library-tests/java-lang-number-conversions/test.kt create mode 100644 java/ql/test-kotlin2/library-tests/java-lang-number-conversions/test.ql create mode 100644 java/ql/test-kotlin2/library-tests/java-list-kotlin-user/MyList.java create mode 100644 java/ql/test-kotlin2/library-tests/java-list-kotlin-user/test.expected create mode 100644 java/ql/test-kotlin2/library-tests/java-list-kotlin-user/test.kt create mode 100644 java/ql/test-kotlin2/library-tests/java-list-kotlin-user/test.ql create mode 100644 java/ql/test-kotlin2/library-tests/java-map-methods/PrintAst.expected create mode 100644 java/ql/test-kotlin2/library-tests/java-map-methods/PrintAst.qlref create mode 100644 java/ql/test-kotlin2/library-tests/java-map-methods/test.expected create mode 100644 java/ql/test-kotlin2/library-tests/java-map-methods/test.kt create mode 100644 java/ql/test-kotlin2/library-tests/java-map-methods/test.ql create mode 100644 java/ql/test-kotlin2/library-tests/java_and_kotlin/Continuation.java create mode 100644 java/ql/test-kotlin2/library-tests/java_and_kotlin/Java.java create mode 100644 java/ql/test-kotlin2/library-tests/java_and_kotlin/Kotlin.kt create mode 100644 java/ql/test-kotlin2/library-tests/java_and_kotlin/test.expected create mode 100644 java/ql/test-kotlin2/library-tests/java_and_kotlin/test.ql create mode 100644 java/ql/test-kotlin2/library-tests/java_and_kotlin_generics/java/test.expected create mode 100644 java/ql/test-kotlin2/library-tests/java_and_kotlin_generics/java/test.ql create mode 100644 java/ql/test-kotlin2/library-tests/java_and_kotlin_generics/java/x.java create mode 100644 java/ql/test-kotlin2/library-tests/java_and_kotlin_generics/kotlin/test.expected create mode 100644 java/ql/test-kotlin2/library-tests/java_and_kotlin_generics/kotlin/test.ql create mode 100644 java/ql/test-kotlin2/library-tests/java_and_kotlin_generics/kotlin/x.kt create mode 100644 java/ql/test-kotlin2/library-tests/java_and_kotlin_internal/Java.java create mode 100644 java/ql/test-kotlin2/library-tests/java_and_kotlin_internal/Kotlin.kt create mode 100644 java/ql/test-kotlin2/library-tests/java_and_kotlin_internal/visibility.expected create mode 100644 java/ql/test-kotlin2/library-tests/java_and_kotlin_internal/visibility.ql create mode 100644 java/ql/test-kotlin2/library-tests/java_properties/PrintAst.expected create mode 100644 java/ql/test-kotlin2/library-tests/java_properties/PrintAst.qlref create mode 100644 java/ql/test-kotlin2/library-tests/java_properties/Prop.java create mode 100644 java/ql/test-kotlin2/library-tests/java_properties/Use.kt create mode 100644 java/ql/test-kotlin2/library-tests/jvmoverloads-annotation/PrintAst.expected create mode 100644 java/ql/test-kotlin2/library-tests/jvmoverloads-annotation/PrintAst.qlref create mode 100644 java/ql/test-kotlin2/library-tests/jvmoverloads-annotation/test.expected create mode 100644 java/ql/test-kotlin2/library-tests/jvmoverloads-annotation/test.kt create mode 100644 java/ql/test-kotlin2/library-tests/jvmoverloads-annotation/test.ql create mode 100644 java/ql/test-kotlin2/library-tests/jvmoverloads_flow/User.java create mode 100644 java/ql/test-kotlin2/library-tests/jvmoverloads_flow/test.expected create mode 100644 java/ql/test-kotlin2/library-tests/jvmoverloads_flow/test.kt create mode 100644 java/ql/test-kotlin2/library-tests/jvmoverloads_flow/test.ql create mode 100644 java/ql/test-kotlin2/library-tests/jvmoverloads_generics/User.java create mode 100644 java/ql/test-kotlin2/library-tests/jvmoverloads_generics/test.expected create mode 100644 java/ql/test-kotlin2/library-tests/jvmoverloads_generics/test.kt create mode 100644 java/ql/test-kotlin2/library-tests/jvmoverloads_generics/test.ql create mode 100644 java/ql/test-kotlin2/library-tests/jvmstatic-annotation/JavaUser.java create mode 100644 java/ql/test-kotlin2/library-tests/jvmstatic-annotation/PrintAst.expected create mode 100644 java/ql/test-kotlin2/library-tests/jvmstatic-annotation/PrintAst.qlref create mode 100644 java/ql/test-kotlin2/library-tests/jvmstatic-annotation/test.expected create mode 100644 java/ql/test-kotlin2/library-tests/jvmstatic-annotation/test.kt create mode 100644 java/ql/test-kotlin2/library-tests/jvmstatic-annotation/test.ql create mode 100644 java/ql/test-kotlin2/library-tests/kotlin-java-map-entries/C.java create mode 100644 java/ql/test-kotlin2/library-tests/kotlin-java-map-entries/b.kt create mode 100644 java/ql/test-kotlin2/library-tests/kotlin-java-map-entries/test.expected create mode 100644 java/ql/test-kotlin2/library-tests/kotlin-java-map-entries/test.ql create mode 100644 java/ql/test-kotlin2/library-tests/lateinit/PrintAst.expected create mode 100644 java/ql/test-kotlin2/library-tests/lateinit/PrintAst.qlref create mode 100644 java/ql/test-kotlin2/library-tests/lateinit/test.expected create mode 100644 java/ql/test-kotlin2/library-tests/lateinit/test.kt create mode 100644 java/ql/test-kotlin2/library-tests/lateinit/test.ql create mode 100644 java/ql/test-kotlin2/library-tests/lazy-val-multiple-constructors/test.expected create mode 100644 java/ql/test-kotlin2/library-tests/lazy-val-multiple-constructors/test.kt create mode 100644 java/ql/test-kotlin2/library-tests/lazy-val-multiple-constructors/test.ql create mode 100644 java/ql/test-kotlin2/library-tests/literals/literals.expected create mode 100644 java/ql/test-kotlin2/library-tests/literals/literals.kt create mode 100644 java/ql/test-kotlin2/library-tests/literals/literals.ql create mode 100644 java/ql/test-kotlin2/library-tests/maps-iterator-overloads/test.expected create mode 100644 java/ql/test-kotlin2/library-tests/maps-iterator-overloads/test.kt create mode 100644 java/ql/test-kotlin2/library-tests/maps-iterator-overloads/test.ql create mode 100644 java/ql/test-kotlin2/library-tests/methods-mixed-java-and-kotlin/A.java create mode 100644 java/ql/test-kotlin2/library-tests/methods-mixed-java-and-kotlin/B.java create mode 100644 java/ql/test-kotlin2/library-tests/methods-mixed-java-and-kotlin/W.kt create mode 100644 java/ql/test-kotlin2/library-tests/methods-mixed-java-and-kotlin/test.expected create mode 100644 java/ql/test-kotlin2/library-tests/methods-mixed-java-and-kotlin/test.ql create mode 100644 java/ql/test-kotlin2/library-tests/methods/clinit.expected create mode 100644 java/ql/test-kotlin2/library-tests/methods/clinit.kt create mode 100644 java/ql/test-kotlin2/library-tests/methods/clinit.ql create mode 100644 java/ql/test-kotlin2/library-tests/methods/dataClass.kt create mode 100644 java/ql/test-kotlin2/library-tests/methods/delegates.kt create mode 100644 java/ql/test-kotlin2/library-tests/methods/diagnostics.expected create mode 100644 java/ql/test-kotlin2/library-tests/methods/diagnostics.ql create mode 100644 java/ql/test-kotlin2/library-tests/methods/enumClass.kt create mode 100644 java/ql/test-kotlin2/library-tests/methods/exprs.expected create mode 100644 java/ql/test-kotlin2/library-tests/methods/exprs.ql create mode 100644 java/ql/test-kotlin2/library-tests/methods/methods.expected create mode 100644 java/ql/test-kotlin2/library-tests/methods/methods.kt create mode 100644 java/ql/test-kotlin2/library-tests/methods/methods.ql create mode 100644 java/ql/test-kotlin2/library-tests/methods/methods2.kt create mode 100644 java/ql/test-kotlin2/library-tests/methods/methods3.kt create mode 100644 java/ql/test-kotlin2/library-tests/methods/methods4.kt create mode 100644 java/ql/test-kotlin2/library-tests/methods/methods5.kt create mode 100644 java/ql/test-kotlin2/library-tests/methods/methods6.kt create mode 100644 java/ql/test-kotlin2/library-tests/methods/parameters.expected create mode 100644 java/ql/test-kotlin2/library-tests/methods/parameters.ql create mode 100644 java/ql/test-kotlin2/library-tests/ministdlib/MiniStdLib.kt create mode 100644 java/ql/test-kotlin2/library-tests/ministdlib/MyClass.kt create mode 100644 java/ql/test-kotlin2/library-tests/ministdlib/classes.expected create mode 100644 java/ql/test-kotlin2/library-tests/ministdlib/classes.ql create mode 100644 java/ql/test-kotlin2/library-tests/ministdlib/options create mode 100644 java/ql/test-kotlin2/library-tests/mixed-java-and-kotlin/Q.java create mode 100644 java/ql/test-kotlin2/library-tests/mixed-java-and-kotlin/W.kt create mode 100644 java/ql/test-kotlin2/library-tests/mixed-java-and-kotlin/test.expected create mode 100644 java/ql/test-kotlin2/library-tests/mixed-java-and-kotlin/test.ql create mode 100644 java/ql/test-kotlin2/library-tests/modifiers/modifiers.expected create mode 100644 java/ql/test-kotlin2/library-tests/modifiers/modifiers.kt create mode 100644 java/ql/test-kotlin2/library-tests/modifiers/modifiers.ql create mode 100644 java/ql/test-kotlin2/library-tests/multiple_extensions/calls.expected create mode 100644 java/ql/test-kotlin2/library-tests/multiple_extensions/calls.ql create mode 100644 java/ql/test-kotlin2/library-tests/multiple_extensions/test.kt create mode 100644 java/ql/test-kotlin2/library-tests/multiple_files/classes.expected create mode 100644 java/ql/test-kotlin2/library-tests/multiple_files/classes.ql create mode 100644 java/ql/test-kotlin2/library-tests/multiple_files/file1.kt create mode 100644 java/ql/test-kotlin2/library-tests/multiple_files/file2.kt create mode 100644 java/ql/test-kotlin2/library-tests/multiple_files/file3.kt create mode 100644 java/ql/test-kotlin2/library-tests/multiple_files/file4.kt create mode 100644 java/ql/test-kotlin2/library-tests/multiple_files/method_accesses.expected create mode 100644 java/ql/test-kotlin2/library-tests/multiple_files/method_accesses.ql create mode 100644 java/ql/test-kotlin2/library-tests/multiple_files/methods.expected create mode 100644 java/ql/test-kotlin2/library-tests/multiple_files/methods.ql create mode 100644 java/ql/test-kotlin2/library-tests/no-when-branch-found/test.expected create mode 100644 java/ql/test-kotlin2/library-tests/no-when-branch-found/test.kt create mode 100644 java/ql/test-kotlin2/library-tests/no-when-branch-found/test.ql create mode 100644 java/ql/test-kotlin2/library-tests/numlines/callable.expected create mode 100644 java/ql/test-kotlin2/library-tests/numlines/callable.ql create mode 100644 java/ql/test-kotlin2/library-tests/numlines/classes.expected create mode 100644 java/ql/test-kotlin2/library-tests/numlines/classes.ql create mode 100644 java/ql/test-kotlin2/library-tests/numlines/files.expected create mode 100644 java/ql/test-kotlin2/library-tests/numlines/files.ql create mode 100644 java/ql/test-kotlin2/library-tests/numlines/test.kt create mode 100644 java/ql/test-kotlin2/library-tests/object/accesses.expected create mode 100644 java/ql/test-kotlin2/library-tests/object/accesses.ql create mode 100644 java/ql/test-kotlin2/library-tests/object/objects.expected create mode 100644 java/ql/test-kotlin2/library-tests/object/objects.kt create mode 100644 java/ql/test-kotlin2/library-tests/object/objects.ql create mode 100644 java/ql/test-kotlin2/library-tests/operator-overloads/PrintAst.expected create mode 100644 java/ql/test-kotlin2/library-tests/operator-overloads/PrintAst.qlref create mode 100644 java/ql/test-kotlin2/library-tests/operator-overloads/test.expected create mode 100644 java/ql/test-kotlin2/library-tests/operator-overloads/test.kt create mode 100644 java/ql/test-kotlin2/library-tests/operator-overloads/test.ql create mode 100644 java/ql/test-kotlin2/library-tests/parameter-defaults/PrintAst.expected create mode 100644 java/ql/test-kotlin2/library-tests/parameter-defaults/PrintAst.qlref create mode 100644 java/ql/test-kotlin2/library-tests/parameter-defaults/defaults.expected create mode 100644 java/ql/test-kotlin2/library-tests/parameter-defaults/defaults.ql create mode 100644 java/ql/test-kotlin2/library-tests/parameter-defaults/erasure.expected create mode 100644 java/ql/test-kotlin2/library-tests/parameter-defaults/erasure.ql create mode 100644 java/ql/test-kotlin2/library-tests/parameter-defaults/flowTest.expected create mode 100644 java/ql/test-kotlin2/library-tests/parameter-defaults/flowTest.ql create mode 100644 java/ql/test-kotlin2/library-tests/parameter-defaults/test.kt create mode 100644 java/ql/test-kotlin2/library-tests/private-anonymous-types/other.kt create mode 100644 java/ql/test-kotlin2/library-tests/private-anonymous-types/test.expected create mode 100644 java/ql/test-kotlin2/library-tests/private-anonymous-types/test.kt create mode 100644 java/ql/test-kotlin2/library-tests/private-anonymous-types/test.ql create mode 100644 java/ql/test-kotlin2/library-tests/properties/properties.expected create mode 100644 java/ql/test-kotlin2/library-tests/properties/properties.kt create mode 100644 java/ql/test-kotlin2/library-tests/properties/properties.ql create mode 100644 java/ql/test-kotlin2/library-tests/recursive-instantiations/stack-overflow-1/BaseFoo.java create mode 100644 java/ql/test-kotlin2/library-tests/recursive-instantiations/stack-overflow-1/Foo.java create mode 100644 java/ql/test-kotlin2/library-tests/recursive-instantiations/stack-overflow-1/classes.expected create mode 100644 java/ql/test-kotlin2/library-tests/recursive-instantiations/stack-overflow-1/classes.ql create mode 100644 java/ql/test-kotlin2/library-tests/recursive-instantiations/stack-overflow-1/test.kt create mode 100644 java/ql/test-kotlin2/library-tests/recursive-instantiations/stack-overflow-2/classes.expected create mode 100644 java/ql/test-kotlin2/library-tests/recursive-instantiations/stack-overflow-2/classes.ql create mode 100644 java/ql/test-kotlin2/library-tests/recursive-instantiations/stack-overflow-2/stackOverflow.kt create mode 100644 java/ql/test-kotlin2/library-tests/reflection/PrintAst.expected create mode 100644 java/ql/test-kotlin2/library-tests/reflection/PrintAst.qlref create mode 100644 java/ql/test-kotlin2/library-tests/reflection/checkParameterCounts.expected create mode 100644 java/ql/test-kotlin2/library-tests/reflection/checkParameterCounts.ql create mode 100644 java/ql/test-kotlin2/library-tests/reflection/reflection.expected create mode 100644 java/ql/test-kotlin2/library-tests/reflection/reflection.kt create mode 100644 java/ql/test-kotlin2/library-tests/reflection/reflection.ql create mode 100644 java/ql/test-kotlin2/library-tests/special-method-getters/test.expected create mode 100644 java/ql/test-kotlin2/library-tests/special-method-getters/test.kt create mode 100644 java/ql/test-kotlin2/library-tests/special-method-getters/test.ql create mode 100644 java/ql/test-kotlin2/library-tests/static-method-calls/test.expected create mode 100644 java/ql/test-kotlin2/library-tests/static-method-calls/test.kt create mode 100644 java/ql/test-kotlin2/library-tests/static-method-calls/test.ql create mode 100644 java/ql/test-kotlin2/library-tests/stmts/PrintAst.expected create mode 100644 java/ql/test-kotlin2/library-tests/stmts/PrintAst.qlref create mode 100644 java/ql/test-kotlin2/library-tests/stmts/exprs.expected create mode 100644 java/ql/test-kotlin2/library-tests/stmts/exprs.ql create mode 100644 java/ql/test-kotlin2/library-tests/stmts/loops.expected create mode 100644 java/ql/test-kotlin2/library-tests/stmts/loops.ql create mode 100644 java/ql/test-kotlin2/library-tests/stmts/stmts.expected create mode 100644 java/ql/test-kotlin2/library-tests/stmts/stmts.kt create mode 100644 java/ql/test-kotlin2/library-tests/stmts/stmts.ql create mode 100644 java/ql/test-kotlin2/library-tests/stmts/tryStmts.expected create mode 100644 java/ql/test-kotlin2/library-tests/stmts/tryStmts.ql create mode 100644 java/ql/test-kotlin2/library-tests/string-charat/Test.java create mode 100644 java/ql/test-kotlin2/library-tests/string-charat/test.expected create mode 100644 java/ql/test-kotlin2/library-tests/string-charat/test.kt create mode 100644 java/ql/test-kotlin2/library-tests/string-charat/test.ql create mode 100644 java/ql/test-kotlin2/library-tests/super-method-calls/test.expected create mode 100644 java/ql/test-kotlin2/library-tests/super-method-calls/test.kt create mode 100644 java/ql/test-kotlin2/library-tests/super-method-calls/test.ql create mode 100644 java/ql/test-kotlin2/library-tests/this/call.expected create mode 100644 java/ql/test-kotlin2/library-tests/this/call.ql create mode 100644 java/ql/test-kotlin2/library-tests/this/this.expected create mode 100644 java/ql/test-kotlin2/library-tests/this/this.kt create mode 100644 java/ql/test-kotlin2/library-tests/this/this.ql create mode 100644 java/ql/test-kotlin2/library-tests/trap/comments.expected create mode 100644 java/ql/test-kotlin2/library-tests/trap/comments.ql create mode 100644 java/ql/test-kotlin2/library-tests/trap/diags.expected create mode 100644 java/ql/test-kotlin2/library-tests/trap/diags.ql create mode 100644 java/ql/test-kotlin2/library-tests/trap/literals.expected create mode 100644 java/ql/test-kotlin2/library-tests/trap/literals.ql create mode 100644 java/ql/test-kotlin2/library-tests/trap/long_comments.kt create mode 100644 java/ql/test-kotlin2/library-tests/trap/long_string.kt create mode 100644 java/ql/test-kotlin2/library-tests/trivial/Trivial.kt create mode 100644 java/ql/test-kotlin2/library-tests/trivial/elements.expected create mode 100644 java/ql/test-kotlin2/library-tests/trivial/elements.ql create mode 100644 java/ql/test-kotlin2/library-tests/type_aliases/aliases_with_type_parameters.kt create mode 100644 java/ql/test-kotlin2/library-tests/type_aliases/test.kt create mode 100644 java/ql/test-kotlin2/library-tests/type_aliases/type_aliases.expected create mode 100644 java/ql/test-kotlin2/library-tests/type_aliases/type_aliases.ql create mode 100644 java/ql/test-kotlin2/library-tests/type_equivalences/type_equivalences.expected create mode 100644 java/ql/test-kotlin2/library-tests/type_equivalences/type_equivalences.kt create mode 100644 java/ql/test-kotlin2/library-tests/type_equivalences/type_equivalences.ql create mode 100644 java/ql/test-kotlin2/library-tests/types/types.expected create mode 100644 java/ql/test-kotlin2/library-tests/types/types.kt create mode 100644 java/ql/test-kotlin2/library-tests/types/types.ql create mode 100644 java/ql/test-kotlin2/library-tests/underscore-parameters/test.expected create mode 100644 java/ql/test-kotlin2/library-tests/underscore-parameters/test.kt create mode 100644 java/ql/test-kotlin2/library-tests/underscore-parameters/test.ql create mode 100644 java/ql/test-kotlin2/library-tests/vararg/args.expected create mode 100644 java/ql/test-kotlin2/library-tests/vararg/args.ql create mode 100644 java/ql/test-kotlin2/library-tests/vararg/dataflow.expected create mode 100644 java/ql/test-kotlin2/library-tests/vararg/dataflow.ql create mode 100644 java/ql/test-kotlin2/library-tests/vararg/intList.kt create mode 100644 java/ql/test-kotlin2/library-tests/vararg/test.kt create mode 100644 java/ql/test-kotlin2/library-tests/variables/variableAccesses.expected create mode 100644 java/ql/test-kotlin2/library-tests/variables/variableAccesses.ql create mode 100644 java/ql/test-kotlin2/library-tests/variables/variables.expected create mode 100644 java/ql/test-kotlin2/library-tests/variables/variables.kt create mode 100644 java/ql/test-kotlin2/library-tests/variables/variables.ql create mode 100644 java/ql/test-kotlin2/query-tests/AbstractToConcreteCollection/AbstractToConcreteCollection.expected create mode 100644 java/ql/test-kotlin2/query-tests/AbstractToConcreteCollection/AbstractToConcreteCollection.qlref create mode 100644 java/ql/test-kotlin2/query-tests/AbstractToConcreteCollection/Test.kt create mode 100644 java/ql/test-kotlin2/query-tests/AutoBoxing/AutoBoxing.expected create mode 100644 java/ql/test-kotlin2/query-tests/AutoBoxing/AutoBoxing.qlref create mode 100644 java/ql/test-kotlin2/query-tests/AutoBoxing/Test.kt create mode 100644 java/ql/test-kotlin2/query-tests/CloseReader/CloseReader.expected create mode 100644 java/ql/test-kotlin2/query-tests/CloseReader/CloseReader.kt create mode 100644 java/ql/test-kotlin2/query-tests/CloseReader/CloseReader.qlref create mode 100644 java/ql/test-kotlin2/query-tests/CloseWriter/CloseWriter.expected create mode 100644 java/ql/test-kotlin2/query-tests/CloseWriter/CloseWriter.kt create mode 100644 java/ql/test-kotlin2/query-tests/CloseWriter/CloseWriter.qlref create mode 100644 java/ql/test-kotlin2/query-tests/ConfusingOverloading/ConfusingOverloading.expected create mode 100644 java/ql/test-kotlin2/query-tests/ConfusingOverloading/ConfusingOverloading.qlref create mode 100644 java/ql/test-kotlin2/query-tests/ConfusingOverloading/Test.kt create mode 100644 java/ql/test-kotlin2/query-tests/ConstantLoopCondition/A.kt create mode 100644 java/ql/test-kotlin2/query-tests/ConstantLoopCondition/ConstantLoopCondition.expected create mode 100644 java/ql/test-kotlin2/query-tests/ConstantLoopCondition/ConstantLoopCondition.qlref create mode 100644 java/ql/test-kotlin2/query-tests/DeadCode/DeadClass.expected create mode 100644 java/ql/test-kotlin2/query-tests/DeadCode/DeadClass.qlref create mode 100644 java/ql/test-kotlin2/query-tests/DeadCode/DeadMethod.expected create mode 100644 java/ql/test-kotlin2/query-tests/DeadCode/DeadMethod.qlref create mode 100644 java/ql/test-kotlin2/query-tests/DeadCode/Test.kt create mode 100644 java/ql/test-kotlin2/query-tests/DeadRefTypes/DeadRefTypes.expected create mode 100644 java/ql/test-kotlin2/query-tests/DeadRefTypes/DeadRefTypes.qlref create mode 100644 java/ql/test-kotlin2/query-tests/DeadRefTypes/test.kt create mode 100644 java/ql/test-kotlin2/query-tests/EmptyBlock/EmptyBlock.expected create mode 100644 java/ql/test-kotlin2/query-tests/EmptyBlock/EmptyBlock.qlref create mode 100644 java/ql/test-kotlin2/query-tests/EmptyBlock/Test.kt create mode 100644 java/ql/test-kotlin2/query-tests/ExposeRepresentation/ExposeRepresentation.expected create mode 100644 java/ql/test-kotlin2/query-tests/ExposeRepresentation/ExposeRepresentation.qlref create mode 100644 java/ql/test-kotlin2/query-tests/ExposeRepresentation/ExposesRep.kt create mode 100644 java/ql/test-kotlin2/query-tests/ExposeRepresentation/User.kt create mode 100644 java/ql/test-kotlin2/query-tests/InnerClassCouldBeStatic/InnerClassCouldBeStatic.expected create mode 100644 java/ql/test-kotlin2/query-tests/InnerClassCouldBeStatic/InnerClassCouldBeStatic.qlref create mode 100644 java/ql/test-kotlin2/query-tests/InnerClassCouldBeStatic/Test.kt create mode 100644 java/ql/test-kotlin2/query-tests/MissingInstanceofInEquals/MissingInstanceofInEquals.expected create mode 100644 java/ql/test-kotlin2/query-tests/MissingInstanceofInEquals/MissingInstanceofInEquals.qlref create mode 100644 java/ql/test-kotlin2/query-tests/MissingInstanceofInEquals/Test.kt create mode 100644 java/ql/test-kotlin2/query-tests/MissingOverrideAnnotation/MissingOverrideAnnotation.expected create mode 100644 java/ql/test-kotlin2/query-tests/MissingOverrideAnnotation/MissingOverrideAnnotation.qlref create mode 100644 java/ql/test-kotlin2/query-tests/MissingOverrideAnnotation/Test.kt create mode 100644 java/ql/test-kotlin2/query-tests/MutualDependency/MutualDependency.expected create mode 100644 java/ql/test-kotlin2/query-tests/MutualDependency/MutualDependency.qlref create mode 100644 java/ql/test-kotlin2/query-tests/MutualDependency/Test.kt create mode 100644 java/ql/test-kotlin2/query-tests/NamingConventionsRefTypes/NamingConventionsRefTypes.expected create mode 100644 java/ql/test-kotlin2/query-tests/NamingConventionsRefTypes/NamingConventionsRefTypes.qlref create mode 100644 java/ql/test-kotlin2/query-tests/NamingConventionsRefTypes/Test.kt create mode 100644 java/ql/test-kotlin2/query-tests/NonSerializableField/NonSerializableField.expected create mode 100644 java/ql/test-kotlin2/query-tests/NonSerializableField/NonSerializableField.qlref create mode 100644 java/ql/test-kotlin2/query-tests/NonSerializableField/NonSerializableFieldTest.kt create mode 100644 java/ql/test-kotlin2/query-tests/NonSerializableInnerClass/NonSerializableInnerClass.expected create mode 100644 java/ql/test-kotlin2/query-tests/NonSerializableInnerClass/NonSerializableInnerClass.qlref create mode 100644 java/ql/test-kotlin2/query-tests/NonSerializableInnerClass/NonSerializableInnerClassTest.kt create mode 100644 java/ql/test-kotlin2/query-tests/NullMaybe/NullMaybe.expected create mode 100644 java/ql/test-kotlin2/query-tests/NullMaybe/NullMaybe.qlref create mode 100644 java/ql/test-kotlin2/query-tests/NullMaybe/Test.kt create mode 100644 java/ql/test-kotlin2/query-tests/OneStatementPerLine/OneStatementPerLine.expected create mode 100644 java/ql/test-kotlin2/query-tests/OneStatementPerLine/OneStatementPerLine.qlref create mode 100644 java/ql/test-kotlin2/query-tests/OneStatementPerLine/Test.kt create mode 100644 java/ql/test-kotlin2/query-tests/PartiallyMaskedCatch/PartiallyMaskedCatch.expected create mode 100644 java/ql/test-kotlin2/query-tests/PartiallyMaskedCatch/PartiallyMaskedCatch.qlref create mode 100644 java/ql/test-kotlin2/query-tests/PartiallyMaskedCatch/PartiallyMaskedCatchTest.kt create mode 100644 java/ql/test-kotlin2/query-tests/ReturnValueIgnored/ReturnValueIgnored.expected create mode 100644 java/ql/test-kotlin2/query-tests/ReturnValueIgnored/ReturnValueIgnored.qlref create mode 100644 java/ql/test-kotlin2/query-tests/ReturnValueIgnored/Test.kt create mode 100644 java/ql/test-kotlin2/query-tests/SimplifyBoolExpr/SimplifyBoolExpr.expected create mode 100644 java/ql/test-kotlin2/query-tests/SimplifyBoolExpr/SimplifyBoolExpr.kt create mode 100644 java/ql/test-kotlin2/query-tests/SimplifyBoolExpr/SimplifyBoolExpr.qlref create mode 100644 java/ql/test-kotlin2/query-tests/UnderscoreIdentifier/Test.kt create mode 100644 java/ql/test-kotlin2/query-tests/UnderscoreIdentifier/UnderscoreIdentifier.expected create mode 100644 java/ql/test-kotlin2/query-tests/UnderscoreIdentifier/UnderscoreIdentifier.qlref create mode 100644 java/ql/test-kotlin2/query-tests/UnderscoreIdentifier/test.expected create mode 100644 java/ql/test-kotlin2/query-tests/UnderscoreIdentifier/test.ql create mode 100644 java/ql/test-kotlin2/query-tests/UnreadLocal/UnreadLocal.expected create mode 100644 java/ql/test-kotlin2/query-tests/UnreadLocal/UnreadLocal.qlref create mode 100644 java/ql/test-kotlin2/query-tests/UnreadLocal/test.kt create mode 100644 java/ql/test-kotlin2/query-tests/UselessNullCheck/Test.kt create mode 100644 java/ql/test-kotlin2/query-tests/UselessNullCheck/UselessNullCheck.expected create mode 100644 java/ql/test-kotlin2/query-tests/UselessNullCheck/UselessNullCheck.qlref create mode 100644 java/ql/test-kotlin2/query-tests/UselessParameter/Test.kt create mode 100644 java/ql/test-kotlin2/query-tests/UselessParameter/UselessParameter.expected create mode 100644 java/ql/test-kotlin2/query-tests/UselessParameter/UselessParameter.qlref create mode 100644 java/ql/test-kotlin2/query-tests/WhitespaceContradictsPrecedence/WhitespaceContradictsPrecedence.expected create mode 100644 java/ql/test-kotlin2/query-tests/WhitespaceContradictsPrecedence/WhitespaceContradictsPrecedence.qlref create mode 100644 java/ql/test-kotlin2/query-tests/WhitespaceContradictsPrecedence/test.kt 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..0d42d2732c9 --- /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 +# 46| 2: [Method] fn +#-----| 1: (Annotations) +# 45| 1: [Annotation] Annot0k +# 0| 1: [IntegerLiteral] 0 +#-----| 2: (Generic Parameters) +# 46| 0: [TypeVariable] T +# 46| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 46| 0: [Parameter] a +#-----| -1: (Annotations) +# 46| 1: [Annotation] Annot0k +# 0| 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 +# 50| 1: [LocalVariableDeclStmt] var ...; +# 50| 1: [LocalVariableDeclExpr] x +# 50| 0: [IntegerLiteral] 10 +# 53| 3: [FieldDeclaration] int p; +#-----| -2: (Annotations) +# 56| 1: [Annotation] Annot0k +# 0| 1: [IntegerLiteral] 0 +# 53| -1: [TypeAccess] int +# 57| 0: [IntegerLiteral] 5 +# 57| 4: [Method] getP +#-----| 1: (Annotations) +# 54| 1: [Annotation] Annot0k +# 0| 1: [IntegerLiteral] 0 +# 57| 3: [TypeAccess] int +# 57| 5: [BlockStmt] { ... } +# 57| 0: [ReturnStmt] return ... +# 57| 0: [VarAccess] DefKt.p +# 57| -1: [TypeAccess] DefKt +# 57| 5: [Method] setP +#-----| 1: (Annotations) +# 55| 1: [Annotation] Annot0k +# 0| 1: [IntegerLiteral] 0 +# 57| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 57| 0: [Parameter] +# 57| 0: [TypeAccess] int +# 57| 5: [BlockStmt] { ... } +# 57| 0: [ExprStmt] ; +# 57| 0: [AssignExpr] ...=... +# 57| 0: [VarAccess] DefKt.p +# 57| -1: [TypeAccess] DefKt +# 57| 1: [VarAccess] +# 59| 6: [ExtensionMethod] myExtension +# 59| 3: [TypeAccess] Unit +#-----| 4: (Parameters) +# 59| 0: [Parameter] +#-----| -1: (Annotations) +# 59| 1: [Annotation] Annot0k +# 0| 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 +# 5| 2: [VarAccess] AnnotationTarget.ANNOTATION_CLASS +# 5| -1: [TypeAccess] AnnotationTarget +# 5| 3: [VarAccess] AnnotationTarget.TYPE_PARAMETER +# 5| -1: [TypeAccess] AnnotationTarget +# 5| 4: [VarAccess] AnnotationTarget.PROPERTY +# 5| -1: [TypeAccess] AnnotationTarget +# 5| 5: [VarAccess] AnnotationTarget.FIELD +# 5| -1: [TypeAccess] AnnotationTarget +# 5| 6: [VarAccess] AnnotationTarget.LOCAL_VARIABLE +# 5| -1: [TypeAccess] AnnotationTarget +# 5| 7: [VarAccess] AnnotationTarget.VALUE_PARAMETER +# 5| -1: [TypeAccess] AnnotationTarget +# 5| 8: [VarAccess] AnnotationTarget.CONSTRUCTOR +# 5| -1: [TypeAccess] AnnotationTarget +# 5| 9: [VarAccess] AnnotationTarget.FUNCTION +# 5| -1: [TypeAccess] AnnotationTarget +# 5| 10: [VarAccess] AnnotationTarget.PROPERTY_GETTER +# 5| -1: [TypeAccess] AnnotationTarget +# 5| 11: [VarAccess] AnnotationTarget.PROPERTY_SETTER +# 5| -1: [TypeAccess] AnnotationTarget +# 5| 12: [VarAccess] AnnotationTarget.TYPE +# 5| -1: [TypeAccess] AnnotationTarget +# 5| 13: [VarAccess] AnnotationTarget.FILE +# 5| -1: [TypeAccess] AnnotationTarget +# 5| 14: [VarAccess] AnnotationTarget.TYPEALIAS +# 5| -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 +# 0| 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 +# 0| 2: [Method] getEntries +# 0| 3: [TypeAccess] EnumEntries +# 0| 0: [TypeAccess] Y +# 0| 3: [Method] valueOf +# 0| 3: [TypeAccess] Y +#-----| 4: (Parameters) +# 0| 0: [Parameter] value +# 0| 0: [TypeAccess] String +# 0| 4: [Method] values +# 0| 3: [TypeAccess] Y[] +# 0| 0: [TypeAccess] Y +# 34| 5: [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] { ... } +# 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 +# 0| 1: [IntegerLiteral] 2 +# 0| 2: [StringLiteral] "ab" +# 0| 3: [TypeLiteral] X.class +# 0| 0: [TypeAccess] X +# 0| 4: [Annotation] Annot0k +# 0| 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 +# 42| 1: [Constructor] Z +#-----| 1: (Annotations) +# 41| 1: [Annotation] Annot0k +# 0| 1: [IntegerLiteral] 0 +# 41| 5: [BlockStmt] { ... } +# 42| 0: [SuperConstructorInvocationStmt] super(...) +# 42| 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..94b71230531 --- /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:44: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:0:0:0:0 | Annot0k | def.kt:39:1:39:40 | Annot1k | def.kt:5:1:21:60 | Annot0k | +| def.kt:23:1:23:8 | Annot0k | def.kt:23:1:31:1 | 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:42:5:42:19 | Z | def.kt:5:1:21:60 | Annot0k | +| def.kt:45:1:45:8 | Annot0k | def.kt:46: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:57:1:57:23 | getP | def.kt:5:1:21:60 | Annot0k | +| def.kt:55:1:55:12 | Annot0k | def.kt:57: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 | Annot0k | def.kt:0:0:0:0 | 1 | +| 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:5:30 | {...} | +| def.kt:21:26:21:42 | JvmName | def.kt:21:39:21:41 | "a" | +| def.kt:23:1:23:8 | Annot0k | def.kt:0:0:0:0 | 0 | +| def.kt:38:1:38:17 | Annot0k | def.kt:38:16:38:16 | 1 | +| def.kt:39:1:39:40 | Annot1k | def.kt:0:0:0:0 | 2 | +| def.kt:39:1:39:40 | Annot1k | def.kt:0:0:0:0 | "ab" | +| def.kt:39:1:39:40 | Annot1k | def.kt:0:0:0:0 | Annot0k | +| def.kt:39:1:39:40 | Annot1k | def.kt:0:0:0:0 | X.class | +| def.kt:39:1:39:40 | Annot1k | def.kt:39:14: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:0:0:0:0 | 0 | +| def.kt:45:1:45:8 | Annot0k | def.kt:0:0:0:0 | 0 | +| def.kt:46:21:46:28 | Annot0k | def.kt:0:0:0:0 | 0 | +| def.kt:54:1:54:12 | Annot0k | def.kt:0:0:0:0 | 0 | +| def.kt:55:1:55:12 | Annot0k | def.kt:0:0:0:0 | 0 | +| def.kt:56:1:56:14 | Annot0k | def.kt:0:0:0:0 | 0 | +| def.kt:59:5:59:21 | Annot0k | def.kt:0:0:0:0 | 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..8517c2a70f2 --- /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:4:9:4:18 | getX_prop | getX_prop | getX | +| test.kt:6:5:6:19 | getX | getX | getX | +| test.kt:10:5:10:19 | changeY | changeY | setY | +| test.kt:10:5:10:19 | y | y | getY | +| test.kt:13:5:13:15 | method | method | fn | +| test.kt:17:5:17:14 | p | p | p | +| test.kt:18:23: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..46701ce4e26 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/classes/PrintAst.expected @@ -0,0 +1,1174 @@ +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: [Constructor] ClassSix +# 28| 5: [BlockStmt] { ... } +# 28| 0: [SuperConstructorInvocationStmt] super(...) +# 28| 1: [BlockStmt] { ... } +# 28| 2: [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| 3: [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 +# 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 +# 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 +# 49| 5: [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] { ... } +# 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 +# 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 +# 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 +# 65| 1: [WhenBranch] ... -> ... +# 65| 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: [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 +# 3| 5: [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 +# 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: [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 +# 2| 1: [WhenBranch] ... -> ... +# 2| 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: [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 +# 7| 1: [WhenBranch] ... -> ... +# 7| 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..580c1d54faf --- /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:1:6:1 | 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:1:9:1 | super(...) | +| generic_anonymous.kt:3:19:5:3 | super(...) | +| generic_anonymous.kt:15:1:33:1 | super(...) | +| generic_anonymous.kt:25:9:31:9 | super(...) | +| generic_anonymous.kt:26:13:26:37 | super(...) | +| generic_anonymous.kt:27:13:27:37 | super(...) | +| generic_anonymous.kt:28:13:28:41 | super(...) | +| generic_anonymous.kt:29:13:29:29 | super(...) | +| generic_anonymous.kt:30:13:30:33 | super(...) | +| localClassField.kt:1:1:11:1 | super(...) | +| localClassField.kt:3:9:3:19 | super(...) | +| localClassField.kt:8:9:8:19 | super(...) | +| 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..95594fa9c69 --- /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 | new Object(...) { ... } | new Object(...) { ... } | +| generic_anonymous.kt:3:3:5:3 | x | new Object(...) { ... } | +| generic_anonymous.kt:3:11:5:3 | T | T | +| generic_anonymous.kt:3:11:5:3 | new Object(...) { ... } | new Object(...) { ... } | +| generic_anonymous.kt:3:11:5:3 | this | Generic | +| generic_anonymous.kt:3:11:5:3 | this.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..b02c862d300 --- /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:14: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..767e68d2f75 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/controlflow/basic/bbStmts.expected @@ -0,0 +1,191 @@ +| 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:8:80:1 | { ... } | +| Test.kt:3:1:80:1 | { ... } | 3 | Test.kt:3:8: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:7:5:7 | 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:7:5:7 | x | +| Test.kt:4:13:79:2 | { ... } | 4 | Test.kt:6:7:6:7 | 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:7:6:7 | y | +| Test.kt:4:13:79:2 | { ... } | 7 | Test.kt:7:7:7:7 | 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:7:7:7 | z | +| Test.kt:4:13:79:2 | { ... } | 10 | Test.kt:8:7:8:7 | 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:7:8:7 | 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:3:16:3 | ... -> ... | +| 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:3:16:3 | ... -> ... | 0 | Test.kt:11:3:16:3 | ... -> ... | +| Test.kt:11:3:16:3 | ... -> ... | 1 | Test.kt:11:3:16:3 | true | +| Test.kt:11:3:16:3 | ... -> ... | 2 | Test.kt:14:10:16:3 | { ... } | +| Test.kt:11:3:16:3 | ... -> ... | 3 | Test.kt:15:4:15:4 | ; | +| Test.kt:11:3:16:3 | ... -> ... | 4 | Test.kt:15:8:15:9 | 30 | +| Test.kt:11:3:16:3 | ... -> ... | 5 | Test.kt:15:4:15:9 | ...=... | +| 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:4 | ; | +| 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:4 | ; | +| 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:18:3:18:3 | ; | 0 | Test.kt:18:3:18:3 | ; | +| Test.kt:18:3:18:3 | ; | 1 | Test.kt:18:7:18:7 | 0 | +| Test.kt:18:3:18:3 | ; | 2 | Test.kt:18:3:18:7 | ...=... | +| Test.kt:18:3:18:3 | ; | 3 | Test.kt:21:3:24:9 | ; | +| Test.kt:18:3:18:3 | ; | 4 | Test.kt:21:3:24:9 | when ... | +| Test.kt:18:3:18:3 | ; | 5 | Test.kt:21:3:24:9 | ... -> ... | +| Test.kt:18:3:18:3 | ; | 6 | Test.kt:21:6:21:6 | x | +| Test.kt:18:3:18:3 | ; | 7 | Test.kt:21:10:21:10 | 0 | +| Test.kt:18:3:18:3 | ; | 8 | Test.kt:21:6:21:10 | ... < ... | +| Test.kt:21:3:24:9 | ... -> ... | 0 | Test.kt:21:3:24:9 | ... -> ... | +| Test.kt:21:3:24:9 | ... -> ... | 1 | Test.kt:21:3:24:9 | true | +| Test.kt:21:3:24:9 | ... -> ... | 2 | Test.kt:24:4:24:9 | INSTANCE | +| Test.kt:21:3:24:9 | ... -> ... | 3 | Test.kt:24:4:24:9 | return ... | +| Test.kt:22:4:22:4 | ; | 0 | Test.kt:22:4:22:4 | ; | +| Test.kt:22:4:22:4 | ; | 1 | Test.kt:22:8:22:9 | 40 | +| Test.kt:22:4:22:4 | ; | 2 | Test.kt:22:4:22:9 | ...=... | +| Test.kt:22:4:22:4 | ; | 3 | Test.kt:27:3:27:3 | ; | +| Test.kt:22:4:22:4 | ; | 4 | Test.kt:27:7:27:8 | 10 | +| Test.kt:22:4:22:4 | ; | 5 | Test.kt:27:3:27:8 | ...=... | +| Test.kt:22:4:22:4 | ; | 6 | Test.kt:30:3:33:3 | ; | +| Test.kt:22:4:22:4 | ; | 7 | Test.kt:30:3:33:3 | when ... | +| Test.kt:22:4:22:4 | ; | 8 | Test.kt:30:3:33:3 | ... -> ... | +| Test.kt:22:4:22:4 | ; | 9 | Test.kt:30:7:30:7 | x | +| Test.kt:22:4:22:4 | ; | 10 | Test.kt:30:12:30:12 | 0 | +| Test.kt:22:4:22:4 | ; | 11 | Test.kt:30:7:30:12 | ... (value equals) ... | +| 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:4 | ; | +| 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:4 | ; | +| 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:3 | ; | 0 | Test.kt:35:3:35:3 | ; | +| Test.kt:35:3:35:3 | ; | 1 | Test.kt:35:7:35:8 | 20 | +| Test.kt:35:3:35:3 | ; | 2 | Test.kt:35:3:35:8 | ...=... | +| Test.kt:35:3:35:3 | ; | 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:4 | ; | +| 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 | tmp0 | +| Test.kt:38:16:41:3 | { ... } | 10 | Test.kt:40:4:40:4 | ; | +| Test.kt:38:16:41:3 | { ... } | 11 | Test.kt:40:4:40:6 | tmp0 | +| 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 | tmp0 | +| Test.kt:38:16:41:3 | { ... } | 16 | Test.kt:40:4:40:6 | | +| Test.kt:43:3:43:3 | ; | 0 | Test.kt:43:3:43:3 | ; | +| Test.kt:43:3:43:3 | ; | 1 | Test.kt:43:7:43:8 | 30 | +| Test.kt:43:3:43:3 | ; | 2 | Test.kt:43:3:43:8 | ...=... | +| Test.kt:43:3:43:3 | ; | 3 | Test.kt:73:3:73:3 | ; | +| Test.kt:43:3:43:3 | ; | 4 | Test.kt:73:7:73:8 | 50 | +| Test.kt:43:3:43:3 | ; | 5 | Test.kt:73:3:73:8 | ...=... | +| Test.kt:43:3:43:3 | ; | 6 | Test.kt:77:3:77:3 | ; | +| Test.kt:43:3:43:3 | ; | 7 | Test.kt:77:7:77:8 | 40 | +| Test.kt:43:3:43:3 | ; | 8 | Test.kt:77:3:77:8 | ...=... | +| Test.kt:43:3:43:3 | ; | 9 | Test.kt:78:3:78:8 | INSTANCE | +| Test.kt:43:3:43:3 | ; | 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:7:84:7 | 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:7:84:7 | x | 0 | Test.kt:84:7:84:7 | x | +| Test.kt:84:7:84:7 | x | 1 | Test.kt:85:10:85:10 | 1 | +| Test.kt:84:7:84:7 | 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:7:93:7 | 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:12:93:13 | ...!! | +| Test.kt:93:7:93:7 | x | 0 | Test.kt:93:7:93:7 | x | +| Test.kt:93:7:93:7 | x | 1 | Test.kt:94:10:94:10 | 1 | +| Test.kt:93:7:93:7 | 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:5:103:5 | ... -> ... | +| 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:107:5 | ... -> ... | +| 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:18:106:27 | "x not null" | +| Test.kt:105:20:107:5 | { ... } | 3 | Test.kt:106:9:106:29 | println(...) | +| Test.kt:107:16:109:5 | ... -> ... | 0 | Test.kt:107:16:109:5 | ... -> ... | +| Test.kt:107:16:109:5 | ... -> ... | 1 | Test.kt:107:16:107:16 | y | +| Test.kt:107:16:109:5 | ... -> ... | 2 | Test.kt:107:21:107:24 | null | +| Test.kt:107:16:109:5 | ... -> ... | 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:18:108:27 | "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:5:115:5 | ... -> ... | +| 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..90c7d07b8c3 --- /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:3:16:3 | ... -> ... | +| Test.kt:4:13:79:2 | { ... } | Test.kt:11:14:14:3 | { ... } | +| Test.kt:4:13:79:2 | { ... } | Test.kt:18:3:18:3 | ; | +| Test.kt:4:13:79:2 | { ... } | Test.kt:21:3:24:9 | ... -> ... | +| Test.kt:4:13:79:2 | { ... } | Test.kt:22:4:22:4 | ; | +| Test.kt:4:13:79:2 | { ... } | Test.kt:30:15:33:3 | { ... } | +| Test.kt:4:13:79:2 | { ... } | Test.kt:35:3:35:3 | ; | +| 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:3 | ; | +| Test.kt:18:3:18:3 | ; | Test.kt:4:2:79:2 | test | +| Test.kt:18:3:18:3 | ; | Test.kt:21:3:24:9 | ... -> ... | +| Test.kt:18:3:18:3 | ; | Test.kt:22:4:22:4 | ; | +| Test.kt:18:3:18:3 | ; | Test.kt:30:15:33:3 | { ... } | +| Test.kt:18:3:18:3 | ; | Test.kt:35:3:35:3 | ; | +| Test.kt:18:3:18:3 | ; | Test.kt:38:9:38:9 | x | +| Test.kt:18:3:18:3 | ; | Test.kt:38:16:41:3 | { ... } | +| Test.kt:18:3:18:3 | ; | Test.kt:43:3:43:3 | ; | +| Test.kt:22:4:22:4 | ; | Test.kt:30:15:33:3 | { ... } | +| Test.kt:22:4:22:4 | ; | Test.kt:35:3:35:3 | ; | +| Test.kt:22:4:22:4 | ; | Test.kt:38:9:38:9 | x | +| Test.kt:22:4:22:4 | ; | Test.kt:38:16:41:3 | { ... } | +| Test.kt:22:4:22:4 | ; | Test.kt:43:3:43:3 | ; | +| Test.kt:35:3:35:3 | ; | Test.kt:38:9:38:9 | x | +| Test.kt:35:3:35:3 | ; | Test.kt:38:16:41:3 | { ... } | +| Test.kt:35:3:35:3 | ; | Test.kt:43:3:43:3 | ; | +| 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:3 | ; | +| Test.kt:82:21:89:1 | { ... } | Test.kt:82:1:89:1 | t1 | +| Test.kt:82:21:89:1 | { ... } | Test.kt:84:7:84:7 | 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:7:93:7 | 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:109:5 | ... -> ... | +| 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:109:5 | ... -> ... | +| Test.kt:105:5:109:5 | ; | Test.kt:107:27:109:5 | { ... } | +| Test.kt:107:16:109:5 | ... -> ... | 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..35c28b25b91 --- /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:3:16:3 | ... -> ... | +| Test.kt:4:13:79:2 | { ... } | Test.kt:11:14:14:3 | { ... } | +| Test.kt:11:3:16:3 | ... -> ... | Test.kt:18:3:18:3 | ; | +| Test.kt:11:14:14:3 | { ... } | Test.kt:18:3:18:3 | ; | +| Test.kt:18:3:18:3 | ; | Test.kt:21:3:24:9 | ... -> ... | +| Test.kt:18:3:18:3 | ; | Test.kt:22:4:22:4 | ; | +| Test.kt:21:3:24:9 | ... -> ... | Test.kt:4:2:79:2 | test | +| Test.kt:22:4:22:4 | ; | Test.kt:30:15:33:3 | { ... } | +| Test.kt:22:4:22:4 | ; | Test.kt:35:3:35:3 | ; | +| Test.kt:30:15:33:3 | { ... } | Test.kt:35:3:35:3 | ; | +| Test.kt:35:3:35:3 | ; | 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:3 | ; | +| Test.kt:38:16:41:3 | { ... } | Test.kt:38:9:38:9 | x | +| Test.kt:43:3:43:3 | ; | Test.kt:4:2:79:2 | test | +| Test.kt:82:21:89:1 | { ... } | Test.kt:84:7:84:7 | x | +| Test.kt:82:21:89:1 | { ... } | Test.kt:86:4:88:2 | catch (...) | +| Test.kt:84:7:84:7 | 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:7:93:7 | x | +| Test.kt:91:22:98:1 | { ... } | Test.kt:95:4:97:2 | catch (...) | +| Test.kt:93:7:93:7 | 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:109:5 | ... -> ... | +| Test.kt:105:20:107:5 | { ... } | Test.kt:100:1:110:1 | fn | +| Test.kt:107:16:109:5 | ... -> ... | Test.kt:100:1:110:1 | fn | +| Test.kt:107:16:109:5 | ... -> ... | 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..0169dc8a5e9 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/controlflow/basic/getASuccessor.expected @@ -0,0 +1,261 @@ +#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 | super(...) | SuperConstructorInvocationStmt | Test.kt:3:8:80:1 | { ... } | BlockStmt | +| Test.kt:3:1:80:1 | { ... } | BlockStmt | Test.kt:3:1:80:1 | super(...) | SuperConstructorInvocationStmt | +| Test.kt:3:8:80:1 | Test | Constructor | file://:0:0:0:0 | | | +| Test.kt:3:8:80:1 | { ... } | BlockStmt | Test.kt:3:8:80:1 | Test | Constructor | +| 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:7:5:7 | var ...; | LocalVariableDeclStmt | +| Test.kt:5:7:5:7 | int x | LocalVariableDecl | file://:0:0:0:0 | | | +| Test.kt:5:7:5:7 | var ...; | LocalVariableDeclStmt | Test.kt:5:16:5:16 | 0 | IntegerLiteral | +| Test.kt:5:7:5:7 | x | LocalVariableDeclExpr | Test.kt:6:7:6:7 | var ...; | LocalVariableDeclStmt | +| Test.kt:5:16:5:16 | 0 | IntegerLiteral | Test.kt:5:7:5:7 | x | LocalVariableDeclExpr | +| Test.kt:6:7:6:7 | long y | LocalVariableDecl | file://:0:0:0:0 | | | +| Test.kt:6:7:6:7 | var ...; | LocalVariableDeclStmt | Test.kt:6:17:6:18 | 50 | LongLiteral | +| Test.kt:6:7:6:7 | y | LocalVariableDeclExpr | Test.kt:7:7:7:7 | var ...; | LocalVariableDeclStmt | +| Test.kt:6:17:6:18 | 50 | LongLiteral | Test.kt:6:7:6:7 | y | LocalVariableDeclExpr | +| Test.kt:7:7:7:7 | int z | LocalVariableDecl | file://:0:0:0:0 | | | +| Test.kt:7:7:7:7 | var ...; | LocalVariableDeclStmt | Test.kt:7:16:7:16 | 0 | IntegerLiteral | +| Test.kt:7:7:7:7 | z | LocalVariableDeclExpr | Test.kt:8:7:8:7 | var ...; | LocalVariableDeclStmt | +| Test.kt:7:16:7:16 | 0 | IntegerLiteral | Test.kt:7:7:7:7 | z | LocalVariableDeclExpr | +| Test.kt:8:7:8:7 | int w | LocalVariableDecl | file://:0:0:0:0 | | | +| Test.kt:8:7:8:7 | var ...; | LocalVariableDeclStmt | Test.kt:8:16:8:16 | 0 | IntegerLiteral | +| Test.kt:8:7:8:7 | w | LocalVariableDeclExpr | Test.kt:11:3:16:3 | ; | ExprStmt | +| Test.kt:8:16:8:16 | 0 | IntegerLiteral | Test.kt:8:7:8:7 | w | LocalVariableDeclExpr | +| Test.kt:11:3:16:3 | ... -> ... | WhenBranch | Test.kt:11:3:16:3 | true | BooleanLiteral | +| Test.kt:11:3:16:3 | ... -> ... | WhenBranch | Test.kt:11:7:11:7 | x | VarAccess | +| Test.kt:11:3:16:3 | ; | ExprStmt | Test.kt:11:3:16:3 | when ... | WhenExpr | +| Test.kt:11:3:16:3 | true | BooleanLiteral | Test.kt:14:10:16:3 | { ... } | BlockStmt | +| Test.kt:11:3:16:3 | when ... | WhenExpr | Test.kt:11:3:16:3 | ... -> ... | WhenBranch | +| Test.kt:11:7:11:7 | x | VarAccess | Test.kt:11:11:11:11 | 0 | IntegerLiteral | +| Test.kt:11:7:11:11 | ... > ... | GTExpr | Test.kt:11:3:16:3 | ... -> ... | WhenBranch | +| Test.kt:11:7:11:11 | ... > ... | GTExpr | Test.kt:11:14:14:3 | { ... } | BlockStmt | +| 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:4 | ; | ExprStmt | +| Test.kt:12:4:12:4 | ; | ExprStmt | Test.kt:12:8:12:9 | 20 | LongLiteral | +| Test.kt:12:4:12:4 | y | VarAccess | file://:0:0:0:0 | | | +| Test.kt:12:4:12:9 | ...=... | AssignExpr | Test.kt:13:4:13:4 | ; | ExprStmt | +| Test.kt:12:8:12:9 | 20 | LongLiteral | Test.kt:12:4:12:9 | ...=... | AssignExpr | +| Test.kt:13:4:13:4 | ; | ExprStmt | Test.kt:13:8:13:9 | 10 | IntegerLiteral | +| Test.kt:13:4:13:4 | z | VarAccess | file://:0:0:0:0 | | | +| Test.kt:13:4:13:9 | ...=... | AssignExpr | Test.kt:18:3:18:3 | ; | ExprStmt | +| Test.kt:13:8:13:9 | 10 | IntegerLiteral | Test.kt:13:4:13:9 | ...=... | AssignExpr | +| Test.kt:14:10:16:3 | { ... } | BlockStmt | Test.kt:15:4:15:4 | ; | ExprStmt | +| Test.kt:15:4:15:4 | ; | ExprStmt | Test.kt:15:8:15:9 | 30 | LongLiteral | +| Test.kt:15:4:15:4 | y | VarAccess | file://:0:0:0:0 | | | +| Test.kt:15:4:15:9 | ...=... | AssignExpr | Test.kt:18:3:18:3 | ; | ExprStmt | +| Test.kt:15:8:15:9 | 30 | LongLiteral | Test.kt:15:4:15:9 | ...=... | AssignExpr | +| Test.kt:18:3:18:3 | ; | ExprStmt | Test.kt:18:7:18:7 | 0 | IntegerLiteral | +| Test.kt:18:3:18:3 | z | VarAccess | file://:0:0:0:0 | | | +| Test.kt:18:3:18:7 | ...=... | AssignExpr | Test.kt:21:3:24:9 | ; | ExprStmt | +| Test.kt:18:7:18:7 | 0 | IntegerLiteral | Test.kt:18:3:18:7 | ...=... | AssignExpr | +| Test.kt:21:3:24:9 | ... -> ... | WhenBranch | Test.kt:21:3:24:9 | true | BooleanLiteral | +| Test.kt:21:3:24:9 | ... -> ... | WhenBranch | Test.kt:21:6:21:6 | x | VarAccess | +| Test.kt:21:3:24:9 | ; | ExprStmt | Test.kt:21:3:24:9 | when ... | WhenExpr | +| Test.kt:21:3:24:9 | true | BooleanLiteral | Test.kt:24:4:24:9 | INSTANCE | VarAccess | +| Test.kt:21:3:24:9 | when ... | WhenExpr | Test.kt:21:3:24:9 | ... -> ... | WhenBranch | +| Test.kt:21:6:21:6 | x | VarAccess | Test.kt:21:10:21:10 | 0 | IntegerLiteral | +| Test.kt:21:6:21:10 | ... < ... | LTExpr | Test.kt:21:3:24:9 | ... -> ... | WhenBranch | +| Test.kt:21:6:21:10 | ... < ... | LTExpr | Test.kt:22:4:22:4 | ; | ExprStmt | +| Test.kt:21:10:21:10 | 0 | IntegerLiteral | Test.kt:21:6:21:10 | ... < ... | LTExpr | +| Test.kt:22:4:22:4 | ; | ExprStmt | Test.kt:22:8:22:9 | 40 | LongLiteral | +| Test.kt:22:4:22:4 | y | VarAccess | file://:0:0:0:0 | | | +| Test.kt:22:4:22:9 | ...=... | AssignExpr | Test.kt:27:3:27:3 | ; | ExprStmt | +| Test.kt:22:8:22:9 | 40 | LongLiteral | Test.kt:22:4:22:9 | ...=... | AssignExpr | +| Test.kt:24:4:24:9 | INSTANCE | VarAccess | Test.kt:24:4:24:9 | return ... | ReturnStmt | +| Test.kt:24:4:24:9 | return ... | ReturnStmt | Test.kt:4:2:79:2 | test | Method | +| Test.kt:27:3:27:3 | ; | ExprStmt | Test.kt:27:7:27:8 | 10 | IntegerLiteral | +| Test.kt:27:3:27:3 | z | VarAccess | file://:0:0:0:0 | | | +| Test.kt:27:3:27:8 | ...=... | AssignExpr | Test.kt:30:3:33:3 | ; | ExprStmt | +| Test.kt:27:7:27:8 | 10 | IntegerLiteral | Test.kt:27:3:27:8 | ...=... | AssignExpr | +| Test.kt:30:3:33:3 | ... -> ... | WhenBranch | Test.kt:30:7:30:7 | x | VarAccess | +| 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:3:33:3 | ... -> ... | 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:3 | ; | ExprStmt | +| 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:4 | ; | ExprStmt | +| Test.kt:31:4:31:4 | ; | ExprStmt | Test.kt:31:8:31:9 | 60 | LongLiteral | +| Test.kt:31:4:31:4 | y | VarAccess | file://:0:0:0:0 | | | +| Test.kt:31:4:31:9 | ...=... | AssignExpr | Test.kt:32:4:32:4 | ; | ExprStmt | +| Test.kt:31:8:31:9 | 60 | LongLiteral | Test.kt:31:4:31:9 | ...=... | AssignExpr | +| Test.kt:32:4:32:4 | ; | ExprStmt | Test.kt:32:8:32:9 | 10 | IntegerLiteral | +| Test.kt:32:4:32:4 | z | VarAccess | file://:0:0:0:0 | | | +| Test.kt:32:4:32:9 | ...=... | AssignExpr | Test.kt:35:3:35:3 | ; | ExprStmt | +| Test.kt:32:8:32:9 | 10 | IntegerLiteral | Test.kt:32:4:32:9 | ...=... | AssignExpr | +| Test.kt:35:3:35:3 | ; | ExprStmt | Test.kt:35:7:35:8 | 20 | IntegerLiteral | +| Test.kt:35:3:35:3 | z | VarAccess | file://:0:0:0:0 | | | +| Test.kt:35:3:35:8 | ...=... | AssignExpr | Test.kt:38:3:41:3 | while (...) | WhileStmt | +| 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:3 | ; | 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:4 | ; | ExprStmt | +| Test.kt:39:4:39:4 | ; | ExprStmt | Test.kt:39:8:39:9 | 10 | LongLiteral | +| Test.kt:39:4:39:4 | y | VarAccess | file://:0:0:0:0 | | | +| Test.kt:39:4:39:9 | ...=... | AssignExpr | Test.kt:40:4:40:6 | ; | ExprStmt | +| Test.kt:39:8:39:9 | 10 | LongLiteral | Test.kt:39:4:39:9 | ...=... | AssignExpr | +| Test.kt:40:4:40:4 | ; | ExprStmt | Test.kt:40:4:40:6 | tmp0 | VarAccess | +| Test.kt:40:4:40:4 | x | VarAccess | Test.kt:40:4:40:6 | tmp0 | LocalVariableDeclExpr | +| Test.kt:40:4:40:4 | x | VarAccess | file://:0:0:0:0 | | | +| 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 | tmp0 | 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 | 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 tmp0 | LocalVariableDecl | file://:0:0:0:0 | | | +| Test.kt:40:4:40:6 | tmp0 | LocalVariableDeclExpr | Test.kt:40:4:40:4 | ; | ExprStmt | +| Test.kt:40:4:40:6 | tmp0 | VarAccess | Test.kt:40:4:40:6 | | ImplicitCoercionToUnitExpr | +| Test.kt:40:4:40:6 | tmp0 | VarAccess | Test.kt:40:4:40:6 | dec(...) | MethodCall | +| Test.kt:40:4:40:6 | var ...; | LocalVariableDeclStmt | Test.kt:40:4:40:4 | x | VarAccess | +| Test.kt:40:4:40:6 | { ... } | BlockStmt | Test.kt:40:4:40:6 | var ...; | LocalVariableDeclStmt | +| Test.kt:43:3:43:3 | ; | ExprStmt | Test.kt:43:7:43:8 | 30 | IntegerLiteral | +| Test.kt:43:3:43:3 | z | VarAccess | file://:0:0:0:0 | | | +| Test.kt:43:3:43:8 | ...=... | AssignExpr | Test.kt:73:3:73:3 | ; | ExprStmt | +| Test.kt:43:7:43:8 | 30 | IntegerLiteral | Test.kt:43:3:43:8 | ...=... | AssignExpr | +| Test.kt:73:3:73:3 | ; | ExprStmt | Test.kt:73:7:73:8 | 50 | IntegerLiteral | +| Test.kt:73:3:73:3 | z | VarAccess | file://:0:0:0:0 | | | +| Test.kt:73:3:73:8 | ...=... | AssignExpr | Test.kt:77:3:77:3 | ; | ExprStmt | +| Test.kt:73:7:73:8 | 50 | IntegerLiteral | Test.kt:73:3:73:8 | ...=... | AssignExpr | +| Test.kt:77:3:77:3 | ; | ExprStmt | Test.kt:77:7:77:8 | 40 | IntegerLiteral | +| Test.kt:77:3:77:3 | w | VarAccess | file://:0:0:0:0 | | | +| Test.kt:77:3:77:8 | ...=... | AssignExpr | Test.kt:78:3:78:8 | INSTANCE | VarAccess | +| Test.kt:77:7:77:8 | 40 | IntegerLiteral | Test.kt:77:3:77:8 | ...=... | AssignExpr | +| Test.kt:78:3:78:8 | INSTANCE | VarAccess | Test.kt:78:3:78:8 | return ... | ReturnStmt | +| Test.kt:78:3:78:8 | return ... | ReturnStmt | Test.kt:4:2:79:2 | test | Method | +| 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:7:84:7 | var ...; | LocalVariableDeclStmt | +| Test.kt:84:7:84:7 | int x | LocalVariableDecl | file://:0:0:0:0 | | | +| Test.kt:84:7:84:7 | var ...; | LocalVariableDeclStmt | Test.kt:84:11:84:11 | o | VarAccess | +| Test.kt:84:7:84:7 | 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:7:84:7 | 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:7:93:7 | var ...; | LocalVariableDeclStmt | +| Test.kt:93:7:93:7 | Object x | LocalVariableDecl | file://:0:0:0:0 | | | +| Test.kt:93:7:93:7 | var ...; | LocalVariableDeclStmt | Test.kt:93:11:93:11 | o | VarAccess | +| Test.kt:93:7:93:7 | x | LocalVariableDeclExpr | Test.kt:94:10:94:10 | 1 | IntegerLiteral | +| Test.kt:93:11:93:11 | o | VarAccess | Test.kt:93:12:93:13 | ...!! | NotNullExpr | +| Test.kt:93:12:93:13 | ...!! | NotNullExpr | Test.kt:93:7:93:7 | x | LocalVariableDeclExpr | +| Test.kt:93:12: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 | ... -> ... | WhenBranch | Test.kt:101:9:101:30 | ... && ... | AndLogicalExpr | +| 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:5:103:5 | ... -> ... | 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: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:107:5 | ... -> ... | 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:109:5 | ... -> ... | WhenBranch | +| Test.kt:105:9:107:5 | ... -> ... | 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:18:106:27 | "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:18:106:27 | "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:109:5 | ... -> ... | 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:18:108:27 | "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:18:108:27 | "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 | ... -> ... | WhenBranch | Test.kt:113:9:113:14 | ... && ... | AndLogicalExpr | +| 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:5:115:5 | ... -> ... | 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: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..e5e94d38421 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/controlflow/basic/strictDominance.expected @@ -0,0 +1,566 @@ +| Test.kt:3:1:80:1 | super(...) | Test.kt:3:8:80:1 | { ... } | +| Test.kt:3:1:80:1 | { ... } | Test.kt:3:1:80:1 | super(...) | +| Test.kt:3:1:80:1 | { ... } | Test.kt:3:8:80:1 | { ... } | +| Test.kt:4:13:79:2 | { ... } | Test.kt:5:7:5:7 | var ...; | +| Test.kt:4:13:79:2 | { ... } | Test.kt:6:7:6:7 | var ...; | +| Test.kt:4:13:79:2 | { ... } | Test.kt:7:7:7:7 | var ...; | +| Test.kt:4:13:79:2 | { ... } | Test.kt:8:7:8:7 | var ...; | +| Test.kt:4:13:79:2 | { ... } | Test.kt:11:3:16:3 | ... -> ... | +| Test.kt:4:13:79:2 | { ... } | Test.kt:11:3:16:3 | ... -> ... | +| Test.kt:4:13:79:2 | { ... } | Test.kt:11:3:16:3 | ; | +| Test.kt:4:13:79:2 | { ... } | Test.kt:11:14:14:3 | { ... } | +| Test.kt:4:13:79:2 | { ... } | Test.kt:12:4:12:4 | ; | +| Test.kt:4:13:79:2 | { ... } | Test.kt:13:4:13:4 | ; | +| Test.kt:4:13:79:2 | { ... } | Test.kt:14:10:16:3 | { ... } | +| Test.kt:4:13:79:2 | { ... } | Test.kt:15:4:15:4 | ; | +| Test.kt:4:13:79:2 | { ... } | Test.kt:18:3:18:3 | ; | +| Test.kt:4:13:79:2 | { ... } | Test.kt:21:3:24:9 | ... -> ... | +| Test.kt:4:13:79:2 | { ... } | Test.kt:21:3:24:9 | ... -> ... | +| Test.kt:4:13:79:2 | { ... } | Test.kt:21:3:24:9 | ; | +| Test.kt:4:13:79:2 | { ... } | Test.kt:22:4:22:4 | ; | +| Test.kt:4:13:79:2 | { ... } | Test.kt:24:4:24:9 | return ... | +| Test.kt:4:13:79:2 | { ... } | Test.kt:27:3:27:3 | ; | +| Test.kt:4:13:79:2 | { ... } | Test.kt:30:3:33:3 | ... -> ... | +| Test.kt:4:13:79:2 | { ... } | Test.kt:30:3:33:3 | ; | +| Test.kt:4:13:79:2 | { ... } | Test.kt:30:15:33:3 | { ... } | +| Test.kt:4:13:79:2 | { ... } | Test.kt:31:4:31:4 | ; | +| Test.kt:4:13:79:2 | { ... } | Test.kt:32:4:32:4 | ; | +| Test.kt:4:13:79:2 | { ... } | Test.kt:35:3:35:3 | ; | +| 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:4 | ; | +| Test.kt:4:13:79:2 | { ... } | Test.kt:40:4:40:4 | ; | +| 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:3 | ; | +| Test.kt:4:13:79:2 | { ... } | Test.kt:73:3:73:3 | ; | +| Test.kt:4:13:79:2 | { ... } | Test.kt:77:3:77:3 | ; | +| Test.kt:4:13:79:2 | { ... } | Test.kt:78:3:78:8 | return ... | +| Test.kt:5:7:5:7 | var ...; | Test.kt:6:7:6:7 | var ...; | +| Test.kt:5:7:5:7 | var ...; | Test.kt:7:7:7:7 | var ...; | +| Test.kt:5:7:5:7 | var ...; | Test.kt:8:7:8:7 | var ...; | +| Test.kt:5:7:5:7 | var ...; | Test.kt:11:3:16:3 | ... -> ... | +| Test.kt:5:7:5:7 | var ...; | Test.kt:11:3:16:3 | ... -> ... | +| Test.kt:5:7:5:7 | var ...; | Test.kt:11:3:16:3 | ; | +| Test.kt:5:7:5:7 | var ...; | Test.kt:11:14:14:3 | { ... } | +| Test.kt:5:7:5:7 | var ...; | Test.kt:12:4:12:4 | ; | +| Test.kt:5:7:5:7 | var ...; | Test.kt:13:4:13:4 | ; | +| Test.kt:5:7:5:7 | var ...; | Test.kt:14:10:16:3 | { ... } | +| Test.kt:5:7:5:7 | var ...; | Test.kt:15:4:15:4 | ; | +| Test.kt:5:7:5:7 | var ...; | Test.kt:18:3:18:3 | ; | +| Test.kt:5:7:5:7 | var ...; | Test.kt:21:3:24:9 | ... -> ... | +| Test.kt:5:7:5:7 | var ...; | Test.kt:21:3:24:9 | ... -> ... | +| Test.kt:5:7:5:7 | var ...; | Test.kt:21:3:24:9 | ; | +| Test.kt:5:7:5:7 | var ...; | Test.kt:22:4:22:4 | ; | +| Test.kt:5:7:5:7 | var ...; | Test.kt:24:4:24:9 | return ... | +| Test.kt:5:7:5:7 | var ...; | Test.kt:27:3:27:3 | ; | +| Test.kt:5:7:5:7 | var ...; | Test.kt:30:3:33:3 | ... -> ... | +| Test.kt:5:7:5:7 | var ...; | Test.kt:30:3:33:3 | ; | +| Test.kt:5:7:5:7 | var ...; | Test.kt:30:15:33:3 | { ... } | +| Test.kt:5:7:5:7 | var ...; | Test.kt:31:4:31:4 | ; | +| Test.kt:5:7:5:7 | var ...; | Test.kt:32:4:32:4 | ; | +| Test.kt:5:7:5:7 | var ...; | Test.kt:35:3:35:3 | ; | +| Test.kt:5:7:5:7 | var ...; | Test.kt:38:3:41:3 | while (...) | +| Test.kt:5:7:5:7 | var ...; | Test.kt:38:16:41:3 | { ... } | +| Test.kt:5:7:5:7 | var ...; | Test.kt:39:4:39:4 | ; | +| Test.kt:5:7:5:7 | var ...; | Test.kt:40:4:40:4 | ; | +| Test.kt:5:7:5:7 | var ...; | Test.kt:40:4:40:6 | ; | +| Test.kt:5:7:5:7 | var ...; | Test.kt:40:4:40:6 | ; | +| Test.kt:5:7:5:7 | var ...; | Test.kt:40:4:40:6 | var ...; | +| Test.kt:5:7:5:7 | var ...; | Test.kt:40:4:40:6 | { ... } | +| Test.kt:5:7:5:7 | var ...; | Test.kt:43:3:43:3 | ; | +| Test.kt:5:7:5:7 | var ...; | Test.kt:73:3:73:3 | ; | +| Test.kt:5:7:5:7 | var ...; | Test.kt:77:3:77:3 | ; | +| Test.kt:5:7:5:7 | var ...; | Test.kt:78:3:78:8 | return ... | +| Test.kt:6:7:6:7 | var ...; | Test.kt:7:7:7:7 | var ...; | +| Test.kt:6:7:6:7 | var ...; | Test.kt:8:7:8:7 | var ...; | +| Test.kt:6:7:6:7 | var ...; | Test.kt:11:3:16:3 | ... -> ... | +| Test.kt:6:7:6:7 | var ...; | Test.kt:11:3:16:3 | ... -> ... | +| Test.kt:6:7:6:7 | var ...; | Test.kt:11:3:16:3 | ; | +| Test.kt:6:7:6:7 | var ...; | Test.kt:11:14:14:3 | { ... } | +| Test.kt:6:7:6:7 | var ...; | Test.kt:12:4:12:4 | ; | +| Test.kt:6:7:6:7 | var ...; | Test.kt:13:4:13:4 | ; | +| Test.kt:6:7:6:7 | var ...; | Test.kt:14:10:16:3 | { ... } | +| Test.kt:6:7:6:7 | var ...; | Test.kt:15:4:15:4 | ; | +| Test.kt:6:7:6:7 | var ...; | Test.kt:18:3:18:3 | ; | +| Test.kt:6:7:6:7 | var ...; | Test.kt:21:3:24:9 | ... -> ... | +| Test.kt:6:7:6:7 | var ...; | Test.kt:21:3:24:9 | ... -> ... | +| Test.kt:6:7:6:7 | var ...; | Test.kt:21:3:24:9 | ; | +| Test.kt:6:7:6:7 | var ...; | Test.kt:22:4:22:4 | ; | +| Test.kt:6:7:6:7 | var ...; | Test.kt:24:4:24:9 | return ... | +| Test.kt:6:7:6:7 | var ...; | Test.kt:27:3:27:3 | ; | +| Test.kt:6:7:6:7 | var ...; | Test.kt:30:3:33:3 | ... -> ... | +| Test.kt:6:7:6:7 | var ...; | Test.kt:30:3:33:3 | ; | +| Test.kt:6:7:6:7 | var ...; | Test.kt:30:15:33:3 | { ... } | +| Test.kt:6:7:6:7 | var ...; | Test.kt:31:4:31:4 | ; | +| Test.kt:6:7:6:7 | var ...; | Test.kt:32:4:32:4 | ; | +| Test.kt:6:7:6:7 | var ...; | Test.kt:35:3:35:3 | ; | +| Test.kt:6:7:6:7 | var ...; | Test.kt:38:3:41:3 | while (...) | +| Test.kt:6:7:6:7 | var ...; | Test.kt:38:16:41:3 | { ... } | +| Test.kt:6:7:6:7 | var ...; | Test.kt:39:4:39:4 | ; | +| Test.kt:6:7:6:7 | var ...; | Test.kt:40:4:40:4 | ; | +| Test.kt:6:7:6:7 | var ...; | Test.kt:40:4:40:6 | ; | +| Test.kt:6:7:6:7 | var ...; | Test.kt:40:4:40:6 | ; | +| Test.kt:6:7:6:7 | var ...; | Test.kt:40:4:40:6 | var ...; | +| Test.kt:6:7:6:7 | var ...; | Test.kt:40:4:40:6 | { ... } | +| Test.kt:6:7:6:7 | var ...; | Test.kt:43:3:43:3 | ; | +| Test.kt:6:7:6:7 | var ...; | Test.kt:73:3:73:3 | ; | +| Test.kt:6:7:6:7 | var ...; | Test.kt:77:3:77:3 | ; | +| Test.kt:6:7:6:7 | var ...; | Test.kt:78:3:78:8 | return ... | +| Test.kt:7:7:7:7 | var ...; | Test.kt:8:7:8:7 | var ...; | +| Test.kt:7:7:7:7 | var ...; | Test.kt:11:3:16:3 | ... -> ... | +| Test.kt:7:7:7:7 | var ...; | Test.kt:11:3:16:3 | ... -> ... | +| Test.kt:7:7:7:7 | var ...; | Test.kt:11:3:16:3 | ; | +| Test.kt:7:7:7:7 | var ...; | Test.kt:11:14:14:3 | { ... } | +| Test.kt:7:7:7:7 | var ...; | Test.kt:12:4:12:4 | ; | +| Test.kt:7:7:7:7 | var ...; | Test.kt:13:4:13:4 | ; | +| Test.kt:7:7:7:7 | var ...; | Test.kt:14:10:16:3 | { ... } | +| Test.kt:7:7:7:7 | var ...; | Test.kt:15:4:15:4 | ; | +| Test.kt:7:7:7:7 | var ...; | Test.kt:18:3:18:3 | ; | +| Test.kt:7:7:7:7 | var ...; | Test.kt:21:3:24:9 | ... -> ... | +| Test.kt:7:7:7:7 | var ...; | Test.kt:21:3:24:9 | ... -> ... | +| Test.kt:7:7:7:7 | var ...; | Test.kt:21:3:24:9 | ; | +| Test.kt:7:7:7:7 | var ...; | Test.kt:22:4:22:4 | ; | +| Test.kt:7:7:7:7 | var ...; | Test.kt:24:4:24:9 | return ... | +| Test.kt:7:7:7:7 | var ...; | Test.kt:27:3:27:3 | ; | +| Test.kt:7:7:7:7 | var ...; | Test.kt:30:3:33:3 | ... -> ... | +| Test.kt:7:7:7:7 | var ...; | Test.kt:30:3:33:3 | ; | +| Test.kt:7:7:7:7 | var ...; | Test.kt:30:15:33:3 | { ... } | +| Test.kt:7:7:7:7 | var ...; | Test.kt:31:4:31:4 | ; | +| Test.kt:7:7:7:7 | var ...; | Test.kt:32:4:32:4 | ; | +| Test.kt:7:7:7:7 | var ...; | Test.kt:35:3:35:3 | ; | +| Test.kt:7:7:7:7 | var ...; | Test.kt:38:3:41:3 | while (...) | +| Test.kt:7:7:7:7 | var ...; | Test.kt:38:16:41:3 | { ... } | +| Test.kt:7:7:7:7 | var ...; | Test.kt:39:4:39:4 | ; | +| Test.kt:7:7:7:7 | var ...; | Test.kt:40:4:40:4 | ; | +| Test.kt:7:7:7:7 | var ...; | Test.kt:40:4:40:6 | ; | +| Test.kt:7:7:7:7 | var ...; | Test.kt:40:4:40:6 | ; | +| Test.kt:7:7:7:7 | var ...; | Test.kt:40:4:40:6 | var ...; | +| Test.kt:7:7:7:7 | var ...; | Test.kt:40:4:40:6 | { ... } | +| Test.kt:7:7:7:7 | var ...; | Test.kt:43:3:43:3 | ; | +| Test.kt:7:7:7:7 | var ...; | Test.kt:73:3:73:3 | ; | +| Test.kt:7:7:7:7 | var ...; | Test.kt:77:3:77:3 | ; | +| Test.kt:7:7:7:7 | var ...; | Test.kt:78:3:78:8 | return ... | +| Test.kt:8:7:8:7 | var ...; | Test.kt:11:3:16:3 | ... -> ... | +| Test.kt:8:7:8:7 | var ...; | Test.kt:11:3:16:3 | ... -> ... | +| Test.kt:8:7:8:7 | var ...; | Test.kt:11:3:16:3 | ; | +| Test.kt:8:7:8:7 | var ...; | Test.kt:11:14:14:3 | { ... } | +| Test.kt:8:7:8:7 | var ...; | Test.kt:12:4:12:4 | ; | +| Test.kt:8:7:8:7 | var ...; | Test.kt:13:4:13:4 | ; | +| Test.kt:8:7:8:7 | var ...; | Test.kt:14:10:16:3 | { ... } | +| Test.kt:8:7:8:7 | var ...; | Test.kt:15:4:15:4 | ; | +| Test.kt:8:7:8:7 | var ...; | Test.kt:18:3:18:3 | ; | +| Test.kt:8:7:8:7 | var ...; | Test.kt:21:3:24:9 | ... -> ... | +| Test.kt:8:7:8:7 | var ...; | Test.kt:21:3:24:9 | ... -> ... | +| Test.kt:8:7:8:7 | var ...; | Test.kt:21:3:24:9 | ; | +| Test.kt:8:7:8:7 | var ...; | Test.kt:22:4:22:4 | ; | +| Test.kt:8:7:8:7 | var ...; | Test.kt:24:4:24:9 | return ... | +| Test.kt:8:7:8:7 | var ...; | Test.kt:27:3:27:3 | ; | +| Test.kt:8:7:8:7 | var ...; | Test.kt:30:3:33:3 | ... -> ... | +| Test.kt:8:7:8:7 | var ...; | Test.kt:30:3:33:3 | ; | +| Test.kt:8:7:8:7 | var ...; | Test.kt:30:15:33:3 | { ... } | +| Test.kt:8:7:8:7 | var ...; | Test.kt:31:4:31:4 | ; | +| Test.kt:8:7:8:7 | var ...; | Test.kt:32:4:32:4 | ; | +| Test.kt:8:7:8:7 | var ...; | Test.kt:35:3:35:3 | ; | +| Test.kt:8:7:8:7 | var ...; | Test.kt:38:3:41:3 | while (...) | +| Test.kt:8:7:8:7 | var ...; | Test.kt:38:16:41:3 | { ... } | +| Test.kt:8:7:8:7 | var ...; | Test.kt:39:4:39:4 | ; | +| Test.kt:8:7:8:7 | var ...; | Test.kt:40:4:40:4 | ; | +| Test.kt:8:7:8:7 | var ...; | Test.kt:40:4:40:6 | ; | +| Test.kt:8:7:8:7 | var ...; | Test.kt:40:4:40:6 | ; | +| Test.kt:8:7:8:7 | var ...; | Test.kt:40:4:40:6 | var ...; | +| Test.kt:8:7:8:7 | var ...; | Test.kt:40:4:40:6 | { ... } | +| Test.kt:8:7:8:7 | var ...; | Test.kt:43:3:43:3 | ; | +| Test.kt:8:7:8:7 | var ...; | Test.kt:73:3:73:3 | ; | +| Test.kt:8:7:8:7 | var ...; | Test.kt:77:3:77:3 | ; | +| Test.kt:8:7:8:7 | var ...; | Test.kt:78:3:78:8 | return ... | +| Test.kt:11:3:16:3 | ... -> ... | Test.kt:11:3:16:3 | ... -> ... | +| Test.kt:11:3:16:3 | ... -> ... | Test.kt:11:14:14:3 | { ... } | +| Test.kt:11:3:16:3 | ... -> ... | Test.kt:12:4:12:4 | ; | +| Test.kt:11:3:16:3 | ... -> ... | Test.kt:13:4:13:4 | ; | +| 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:4 | ; | +| Test.kt:11:3:16:3 | ... -> ... | Test.kt:15:4:15:4 | ; | +| Test.kt:11:3:16:3 | ... -> ... | Test.kt:18:3:18:3 | ; | +| Test.kt:11:3:16:3 | ... -> ... | Test.kt:21:3:24:9 | ... -> ... | +| Test.kt:11:3:16:3 | ... -> ... | Test.kt:21:3:24:9 | ... -> ... | +| Test.kt:11:3:16:3 | ... -> ... | Test.kt:21:3:24:9 | ; | +| Test.kt:11:3:16:3 | ... -> ... | Test.kt:22:4:22:4 | ; | +| Test.kt:11:3:16:3 | ... -> ... | Test.kt:24:4:24:9 | return ... | +| Test.kt:11:3:16:3 | ... -> ... | Test.kt:27:3:27:3 | ; | +| Test.kt:11:3:16:3 | ... -> ... | Test.kt:30:3:33:3 | ... -> ... | +| Test.kt:11:3:16:3 | ... -> ... | Test.kt:30:3:33:3 | ; | +| Test.kt:11:3:16:3 | ... -> ... | Test.kt:30:15:33:3 | { ... } | +| Test.kt:11:3:16:3 | ... -> ... | Test.kt:31:4:31:4 | ; | +| Test.kt:11:3:16:3 | ... -> ... | Test.kt:32:4:32:4 | ; | +| Test.kt:11:3:16:3 | ... -> ... | Test.kt:35:3:35:3 | ; | +| 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:4 | ; | +| Test.kt:11:3:16:3 | ... -> ... | Test.kt:40:4:40:4 | ; | +| 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:3 | ; | +| Test.kt:11:3:16:3 | ... -> ... | Test.kt:73:3:73:3 | ; | +| Test.kt:11:3:16:3 | ... -> ... | Test.kt:77:3:77:3 | ; | +| Test.kt:11:3:16:3 | ... -> ... | Test.kt:78:3:78:8 | return ... | +| Test.kt:11:3:16:3 | ; | Test.kt:11:3:16:3 | ... -> ... | +| Test.kt:11:3:16:3 | ; | Test.kt:11:3:16:3 | ... -> ... | +| Test.kt:11:3:16:3 | ; | Test.kt:11:14:14:3 | { ... } | +| Test.kt:11:3:16:3 | ; | Test.kt:12:4:12:4 | ; | +| Test.kt:11:3:16:3 | ; | Test.kt:13:4:13:4 | ; | +| Test.kt:11:3:16:3 | ; | Test.kt:14:10:16:3 | { ... } | +| Test.kt:11:3:16:3 | ; | Test.kt:15:4:15:4 | ; | +| Test.kt:11:3:16:3 | ; | Test.kt:18:3:18:3 | ; | +| Test.kt:11:3:16:3 | ; | Test.kt:21:3:24:9 | ... -> ... | +| Test.kt:11:3:16:3 | ; | Test.kt:21:3:24:9 | ... -> ... | +| Test.kt:11:3:16:3 | ; | Test.kt:21:3:24:9 | ; | +| Test.kt:11:3:16:3 | ; | Test.kt:22:4:22:4 | ; | +| Test.kt:11:3:16:3 | ; | Test.kt:24:4:24:9 | return ... | +| Test.kt:11:3:16:3 | ; | Test.kt:27:3:27:3 | ; | +| Test.kt:11:3:16:3 | ; | Test.kt:30:3:33:3 | ... -> ... | +| Test.kt:11:3:16:3 | ; | Test.kt:30:3:33:3 | ; | +| Test.kt:11:3:16:3 | ; | Test.kt:30:15:33:3 | { ... } | +| Test.kt:11:3:16:3 | ; | Test.kt:31:4:31:4 | ; | +| Test.kt:11:3:16:3 | ; | Test.kt:32:4:32:4 | ; | +| Test.kt:11:3:16:3 | ; | Test.kt:35:3:35:3 | ; | +| 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:4 | ; | +| Test.kt:11:3:16:3 | ; | Test.kt:40:4:40:4 | ; | +| 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:3 | ; | +| Test.kt:11:3:16:3 | ; | Test.kt:73:3:73:3 | ; | +| Test.kt:11:3:16:3 | ; | Test.kt:77:3:77:3 | ; | +| Test.kt:11:3:16:3 | ; | Test.kt:78:3:78:8 | return ... | +| Test.kt:11:14:14:3 | { ... } | Test.kt:12:4:12:4 | ; | +| Test.kt:11:14:14:3 | { ... } | Test.kt:13:4:13:4 | ; | +| Test.kt:12:4:12:4 | ; | Test.kt:13:4:13:4 | ; | +| Test.kt:14:10:16:3 | { ... } | Test.kt:15:4:15:4 | ; | +| Test.kt:18:3:18:3 | ; | Test.kt:21:3:24:9 | ... -> ... | +| Test.kt:18:3:18:3 | ; | Test.kt:21:3:24:9 | ... -> ... | +| Test.kt:18:3:18:3 | ; | Test.kt:21:3:24:9 | ; | +| Test.kt:18:3:18:3 | ; | Test.kt:22:4:22:4 | ; | +| Test.kt:18:3:18:3 | ; | Test.kt:24:4:24:9 | return ... | +| Test.kt:18:3:18:3 | ; | Test.kt:27:3:27:3 | ; | +| Test.kt:18:3:18:3 | ; | Test.kt:30:3:33:3 | ... -> ... | +| Test.kt:18:3:18:3 | ; | Test.kt:30:3:33:3 | ; | +| Test.kt:18:3:18:3 | ; | Test.kt:30:15:33:3 | { ... } | +| Test.kt:18:3:18:3 | ; | Test.kt:31:4:31:4 | ; | +| Test.kt:18:3:18:3 | ; | Test.kt:32:4:32:4 | ; | +| Test.kt:18:3:18:3 | ; | Test.kt:35:3:35:3 | ; | +| Test.kt:18:3:18:3 | ; | Test.kt:38:3:41:3 | while (...) | +| Test.kt:18:3:18:3 | ; | Test.kt:38:16:41:3 | { ... } | +| Test.kt:18:3:18:3 | ; | Test.kt:39:4:39:4 | ; | +| Test.kt:18:3:18:3 | ; | Test.kt:40:4:40:4 | ; | +| Test.kt:18:3:18:3 | ; | Test.kt:40:4:40:6 | ; | +| Test.kt:18:3:18:3 | ; | Test.kt:40:4:40:6 | ; | +| Test.kt:18:3:18:3 | ; | Test.kt:40:4:40:6 | var ...; | +| Test.kt:18:3:18:3 | ; | Test.kt:40:4:40:6 | { ... } | +| Test.kt:18:3:18:3 | ; | Test.kt:43:3:43:3 | ; | +| Test.kt:18:3:18:3 | ; | Test.kt:73:3:73:3 | ; | +| Test.kt:18:3:18:3 | ; | Test.kt:77:3:77:3 | ; | +| Test.kt:18:3:18:3 | ; | Test.kt:78:3:78:8 | return ... | +| Test.kt:21:3:24:9 | ... -> ... | Test.kt:21:3:24:9 | ... -> ... | +| Test.kt:21:3:24:9 | ... -> ... | Test.kt:22:4:22:4 | ; | +| Test.kt:21:3:24:9 | ... -> ... | Test.kt:24:4:24:9 | return ... | +| Test.kt:21:3:24:9 | ... -> ... | Test.kt:24:4:24:9 | return ... | +| Test.kt:21:3:24:9 | ... -> ... | Test.kt:27:3:27:3 | ; | +| Test.kt:21:3:24:9 | ... -> ... | Test.kt:30:3:33:3 | ... -> ... | +| Test.kt:21:3:24:9 | ... -> ... | Test.kt:30:3:33:3 | ; | +| Test.kt:21:3:24:9 | ... -> ... | Test.kt:30:15:33:3 | { ... } | +| Test.kt:21:3:24:9 | ... -> ... | Test.kt:31:4:31:4 | ; | +| Test.kt:21:3:24:9 | ... -> ... | Test.kt:32:4:32:4 | ; | +| Test.kt:21:3:24:9 | ... -> ... | Test.kt:35:3:35:3 | ; | +| 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:4 | ; | +| Test.kt:21:3:24:9 | ... -> ... | Test.kt:40:4:40:4 | ; | +| 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:3 | ; | +| Test.kt:21:3:24:9 | ... -> ... | Test.kt:73:3:73:3 | ; | +| Test.kt:21:3:24:9 | ... -> ... | Test.kt:77:3:77:3 | ; | +| Test.kt:21:3:24:9 | ... -> ... | Test.kt:78:3:78:8 | return ... | +| Test.kt:21:3:24:9 | ; | Test.kt:21:3:24:9 | ... -> ... | +| Test.kt:21:3:24:9 | ; | Test.kt:21:3:24:9 | ... -> ... | +| Test.kt:21:3:24:9 | ; | Test.kt:22:4:22:4 | ; | +| Test.kt:21:3:24:9 | ; | Test.kt:24:4:24:9 | return ... | +| Test.kt:21:3:24:9 | ; | Test.kt:27:3:27:3 | ; | +| Test.kt:21:3:24:9 | ; | Test.kt:30:3:33:3 | ... -> ... | +| Test.kt:21:3:24:9 | ; | Test.kt:30:3:33:3 | ; | +| Test.kt:21:3:24:9 | ; | Test.kt:30:15:33:3 | { ... } | +| Test.kt:21:3:24:9 | ; | Test.kt:31:4:31:4 | ; | +| Test.kt:21:3:24:9 | ; | Test.kt:32:4:32:4 | ; | +| Test.kt:21:3:24:9 | ; | Test.kt:35:3:35:3 | ; | +| 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:4 | ; | +| Test.kt:21:3:24:9 | ; | Test.kt:40:4:40:4 | ; | +| 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:3 | ; | +| Test.kt:21:3:24:9 | ; | Test.kt:73:3:73:3 | ; | +| Test.kt:21:3:24:9 | ; | Test.kt:77:3:77:3 | ; | +| Test.kt:21:3:24:9 | ; | Test.kt:78:3:78:8 | return ... | +| Test.kt:22:4:22:4 | ; | Test.kt:27:3:27:3 | ; | +| Test.kt:22:4:22:4 | ; | Test.kt:30:3:33:3 | ... -> ... | +| Test.kt:22:4:22:4 | ; | Test.kt:30:3:33:3 | ; | +| Test.kt:22:4:22:4 | ; | Test.kt:30:15:33:3 | { ... } | +| Test.kt:22:4:22:4 | ; | Test.kt:31:4:31:4 | ; | +| Test.kt:22:4:22:4 | ; | Test.kt:32:4:32:4 | ; | +| Test.kt:22:4:22:4 | ; | Test.kt:35:3:35:3 | ; | +| Test.kt:22:4:22:4 | ; | Test.kt:38:3:41:3 | while (...) | +| Test.kt:22:4:22:4 | ; | Test.kt:38:16:41:3 | { ... } | +| Test.kt:22:4:22:4 | ; | Test.kt:39:4:39:4 | ; | +| Test.kt:22:4:22:4 | ; | Test.kt:40:4:40:4 | ; | +| Test.kt:22:4:22:4 | ; | Test.kt:40:4:40:6 | ; | +| Test.kt:22:4:22:4 | ; | Test.kt:40:4:40:6 | ; | +| Test.kt:22:4:22:4 | ; | Test.kt:40:4:40:6 | var ...; | +| Test.kt:22:4:22:4 | ; | Test.kt:40:4:40:6 | { ... } | +| Test.kt:22:4:22:4 | ; | Test.kt:43:3:43:3 | ; | +| Test.kt:22:4:22:4 | ; | Test.kt:73:3:73:3 | ; | +| Test.kt:22:4:22:4 | ; | Test.kt:77:3:77:3 | ; | +| Test.kt:22:4:22:4 | ; | Test.kt:78:3:78:8 | return ... | +| Test.kt:27:3:27:3 | ; | Test.kt:30:3:33:3 | ... -> ... | +| Test.kt:27:3:27:3 | ; | Test.kt:30:3:33:3 | ; | +| Test.kt:27:3:27:3 | ; | Test.kt:30:15:33:3 | { ... } | +| Test.kt:27:3:27:3 | ; | Test.kt:31:4:31:4 | ; | +| Test.kt:27:3:27:3 | ; | Test.kt:32:4:32:4 | ; | +| Test.kt:27:3:27:3 | ; | Test.kt:35:3:35:3 | ; | +| Test.kt:27:3:27:3 | ; | Test.kt:38:3:41:3 | while (...) | +| Test.kt:27:3:27:3 | ; | Test.kt:38:16:41:3 | { ... } | +| Test.kt:27:3:27:3 | ; | Test.kt:39:4:39:4 | ; | +| Test.kt:27:3:27:3 | ; | Test.kt:40:4:40:4 | ; | +| Test.kt:27:3:27:3 | ; | Test.kt:40:4:40:6 | ; | +| Test.kt:27:3:27:3 | ; | Test.kt:40:4:40:6 | ; | +| Test.kt:27:3:27:3 | ; | Test.kt:40:4:40:6 | var ...; | +| Test.kt:27:3:27:3 | ; | Test.kt:40:4:40:6 | { ... } | +| Test.kt:27:3:27:3 | ; | Test.kt:43:3:43:3 | ; | +| Test.kt:27:3:27:3 | ; | Test.kt:73:3:73:3 | ; | +| Test.kt:27:3:27:3 | ; | Test.kt:77:3:77:3 | ; | +| Test.kt:27:3:27:3 | ; | Test.kt:78:3:78:8 | return ... | +| Test.kt:30:3:33:3 | ... -> ... | Test.kt:30:15:33:3 | { ... } | +| Test.kt:30:3:33:3 | ... -> ... | Test.kt:31:4:31:4 | ; | +| Test.kt:30:3:33:3 | ... -> ... | Test.kt:32:4:32:4 | ; | +| Test.kt:30:3:33:3 | ... -> ... | Test.kt:35:3:35:3 | ; | +| 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:4 | ; | +| Test.kt:30:3:33:3 | ... -> ... | Test.kt:40:4:40:4 | ; | +| 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:3 | ; | +| Test.kt:30:3:33:3 | ... -> ... | Test.kt:73:3:73:3 | ; | +| Test.kt:30:3:33:3 | ... -> ... | Test.kt:77:3:77:3 | ; | +| Test.kt:30:3:33:3 | ... -> ... | Test.kt:78:3:78:8 | return ... | +| Test.kt:30:3:33:3 | ; | Test.kt:30:3:33:3 | ... -> ... | +| Test.kt:30:3:33:3 | ; | Test.kt:30:15:33:3 | { ... } | +| Test.kt:30:3:33:3 | ; | Test.kt:31:4:31:4 | ; | +| Test.kt:30:3:33:3 | ; | Test.kt:32:4:32:4 | ; | +| Test.kt:30:3:33:3 | ; | Test.kt:35:3:35:3 | ; | +| 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:4 | ; | +| Test.kt:30:3:33:3 | ; | Test.kt:40:4:40:4 | ; | +| 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:3 | ; | +| Test.kt:30:3:33:3 | ; | Test.kt:73:3:73:3 | ; | +| Test.kt:30:3:33:3 | ; | Test.kt:77:3:77:3 | ; | +| Test.kt:30:3:33:3 | ; | Test.kt:78:3:78:8 | return ... | +| Test.kt:30:15:33:3 | { ... } | Test.kt:31:4:31:4 | ; | +| Test.kt:30:15:33:3 | { ... } | Test.kt:32:4:32:4 | ; | +| Test.kt:31:4:31:4 | ; | Test.kt:32:4:32:4 | ; | +| Test.kt:35:3:35:3 | ; | Test.kt:38:3:41:3 | while (...) | +| Test.kt:35:3:35:3 | ; | Test.kt:38:16:41:3 | { ... } | +| Test.kt:35:3:35:3 | ; | Test.kt:39:4:39:4 | ; | +| Test.kt:35:3:35:3 | ; | Test.kt:40:4:40:4 | ; | +| Test.kt:35:3:35:3 | ; | Test.kt:40:4:40:6 | ; | +| Test.kt:35:3:35:3 | ; | Test.kt:40:4:40:6 | ; | +| Test.kt:35:3:35:3 | ; | Test.kt:40:4:40:6 | var ...; | +| Test.kt:35:3:35:3 | ; | Test.kt:40:4:40:6 | { ... } | +| Test.kt:35:3:35:3 | ; | Test.kt:43:3:43:3 | ; | +| Test.kt:35:3:35:3 | ; | Test.kt:73:3:73:3 | ; | +| Test.kt:35:3:35:3 | ; | Test.kt:77:3:77:3 | ; | +| Test.kt:35:3:35:3 | ; | 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:4 | ; | +| Test.kt:38:3:41:3 | while (...) | Test.kt:40:4:40:4 | ; | +| 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:3 | ; | +| Test.kt:38:3:41:3 | while (...) | Test.kt:73:3:73:3 | ; | +| Test.kt:38:3:41:3 | while (...) | Test.kt:77:3:77:3 | ; | +| 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:4 | ; | +| Test.kt:38:16:41:3 | { ... } | Test.kt:40:4:40:4 | ; | +| 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:4 | ; | Test.kt:40:4:40:4 | ; | +| Test.kt:39:4:39:4 | ; | Test.kt:40:4:40:6 | ; | +| Test.kt:39:4:39:4 | ; | Test.kt:40:4:40:6 | ; | +| Test.kt:39:4:39:4 | ; | Test.kt:40:4:40:6 | var ...; | +| Test.kt:39:4:39:4 | ; | Test.kt:40:4:40:6 | { ... } | +| Test.kt:40:4:40:4 | ; | Test.kt:40:4:40:6 | ; | +| Test.kt:40:4:40:6 | ; | Test.kt:40:4:40:4 | ; | +| 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:4 | ; | +| Test.kt:40:4:40:6 | var ...; | Test.kt:40:4:40:6 | ; | +| Test.kt:40:4:40:6 | { ... } | Test.kt:40:4:40:4 | ; | +| 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:3 | ; | Test.kt:73:3:73:3 | ; | +| Test.kt:43:3:43:3 | ; | Test.kt:77:3:77:3 | ; | +| Test.kt:43:3:43:3 | ; | Test.kt:78:3:78:8 | return ... | +| Test.kt:73:3:73:3 | ; | Test.kt:77:3:77:3 | ; | +| Test.kt:73:3:73:3 | ; | Test.kt:78:3:78:8 | return ... | +| Test.kt:77:3:77:3 | ; | 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:7:84:7 | 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:7:84:7 | 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:7:84:7 | 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:7:84:7 | var ...; | Test.kt:85:3:85:10 | return ... | +| Test.kt:84:7:84:7 | var ...; | Test.kt:86:4:88:2 | catch (...) | +| Test.kt:84:7:84:7 | var ...; | Test.kt:86:34:88:2 | { ... } | +| Test.kt:84:7:84:7 | 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:7:93:7 | 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:7:93:7 | 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:7:93:7 | 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:7:93:7 | var ...; | Test.kt:94:3:94:10 | return ... | +| Test.kt:93:7:93:7 | var ...; | Test.kt:95:4:97:2 | catch (...) | +| Test.kt:93:7:93:7 | var ...; | Test.kt:95:36:97:2 | { ... } | +| Test.kt:93:7:93:7 | 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:5:103:5 | ; | +| 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:107:5 | ... -> ... | +| 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:109:5 | ... -> ... | +| 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: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:107:5 | ... -> ... | +| 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:109:5 | ... -> ... | +| 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:5:103:5 | ; | Test.kt:101:5:103:5 | ... -> ... | +| 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:107:5 | ... -> ... | +| 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:109:5 | ... -> ... | +| 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:33:103:5 | { ... } | Test.kt:102:9:102:25 | throw ... | +| Test.kt:105:5:109:5 | ; | Test.kt:105:9:107:5 | ... -> ... | +| 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:109:5 | ... -> ... | +| 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:107:5 | ... -> ... | Test.kt:105:20:107:5 | { ... } | +| Test.kt:105:9:107:5 | ... -> ... | Test.kt:106:9:106:29 | ; | +| Test.kt:105:9:107:5 | ... -> ... | Test.kt:107:16:109:5 | ... -> ... | +| Test.kt:105:9:107:5 | ... -> ... | Test.kt:107:27:109:5 | { ... } | +| Test.kt:105:9:107:5 | ... -> ... | Test.kt:108:9:108:29 | ; | +| Test.kt:105:20:107:5 | { ... } | Test.kt:106:9:106:29 | ; | +| Test.kt:107:16:109:5 | ... -> ... | Test.kt:107:27:109:5 | { ... } | +| Test.kt:107:16:109:5 | ... -> ... | 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:5:115:5 | ; | +| Test.kt:112:32:116:1 | { ... } | Test.kt:113:17:115:5 | { ... } | +| Test.kt:113:5:115:5 | ... -> ... | Test.kt:113:17:115:5 | { ... } | +| Test.kt:113:5:115:5 | ; | Test.kt:113:5:115:5 | ... -> ... | +| Test.kt:113:5:115:5 | ; | 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..6d47a44d581 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/controlflow/basic/strictPostDominance.expected @@ -0,0 +1,223 @@ +| Test.kt:3:1:80:1 | super(...) | Test.kt:3:1:80:1 | { ... } | +| Test.kt:3:8:80:1 | { ... } | Test.kt:3:1:80:1 | super(...) | +| Test.kt:3:8:80:1 | { ... } | Test.kt:3:1:80:1 | { ... } | +| Test.kt:5:7:5:7 | var ...; | Test.kt:4:13:79:2 | { ... } | +| Test.kt:6:7:6:7 | var ...; | Test.kt:4:13:79:2 | { ... } | +| Test.kt:6:7:6:7 | var ...; | Test.kt:5:7:5:7 | var ...; | +| Test.kt:7:7:7:7 | var ...; | Test.kt:4:13:79:2 | { ... } | +| Test.kt:7:7:7:7 | var ...; | Test.kt:5:7:5:7 | var ...; | +| Test.kt:7:7:7:7 | var ...; | Test.kt:6:7:6:7 | var ...; | +| Test.kt:8:7:8:7 | var ...; | Test.kt:4:13:79:2 | { ... } | +| Test.kt:8:7:8:7 | var ...; | Test.kt:5:7:5:7 | var ...; | +| Test.kt:8:7:8:7 | var ...; | Test.kt:6:7:6:7 | var ...; | +| Test.kt:8:7:8:7 | var ...; | Test.kt:7:7:7:7 | var ...; | +| Test.kt:11:3:16:3 | ... -> ... | Test.kt:4:13:79:2 | { ... } | +| Test.kt:11:3:16:3 | ... -> ... | Test.kt:5:7:5:7 | var ...; | +| Test.kt:11:3:16:3 | ... -> ... | Test.kt:6:7:6:7 | var ...; | +| Test.kt:11:3:16:3 | ... -> ... | Test.kt:7:7:7:7 | var ...; | +| Test.kt:11:3:16:3 | ... -> ... | Test.kt:8:7:8:7 | var ...; | +| Test.kt:11:3:16:3 | ... -> ... | Test.kt:11:3:16:3 | ; | +| Test.kt:11:3:16:3 | ; | Test.kt:4:13:79:2 | { ... } | +| Test.kt:11:3:16:3 | ; | Test.kt:5:7:5:7 | var ...; | +| Test.kt:11:3:16:3 | ; | Test.kt:6:7:6:7 | var ...; | +| Test.kt:11:3:16:3 | ; | Test.kt:7:7:7:7 | var ...; | +| Test.kt:11:3:16:3 | ; | Test.kt:8:7:8:7 | var ...; | +| Test.kt:12:4:12:4 | ; | Test.kt:11:14:14:3 | { ... } | +| Test.kt:13:4:13:4 | ; | Test.kt:11:14:14:3 | { ... } | +| Test.kt:13:4:13:4 | ; | Test.kt:12:4:12:4 | ; | +| Test.kt:14:10:16:3 | { ... } | Test.kt:11:3:16:3 | ... -> ... | +| Test.kt:15:4:15:4 | ; | Test.kt:11:3:16:3 | ... -> ... | +| Test.kt:15:4:15:4 | ; | Test.kt:14:10:16:3 | { ... } | +| Test.kt:18:3:18:3 | ; | Test.kt:4:13:79:2 | { ... } | +| Test.kt:18:3:18:3 | ; | Test.kt:5:7:5:7 | var ...; | +| Test.kt:18:3:18:3 | ; | Test.kt:6:7:6:7 | var ...; | +| Test.kt:18:3:18:3 | ; | Test.kt:7:7:7:7 | var ...; | +| Test.kt:18:3:18:3 | ; | Test.kt:8:7:8:7 | var ...; | +| Test.kt:18:3:18:3 | ; | Test.kt:11:3:16:3 | ... -> ... | +| Test.kt:18:3:18:3 | ; | Test.kt:11:3:16:3 | ... -> ... | +| Test.kt:18:3:18:3 | ; | Test.kt:11:3:16:3 | ; | +| Test.kt:18:3:18:3 | ; | Test.kt:11:14:14:3 | { ... } | +| Test.kt:18:3:18:3 | ; | Test.kt:12:4:12:4 | ; | +| Test.kt:18:3:18:3 | ; | Test.kt:13:4:13:4 | ; | +| Test.kt:18:3:18:3 | ; | Test.kt:14:10:16:3 | { ... } | +| Test.kt:18:3:18:3 | ; | Test.kt:15:4:15:4 | ; | +| Test.kt:21:3:24:9 | ... -> ... | Test.kt:4:13:79:2 | { ... } | +| Test.kt:21:3:24:9 | ... -> ... | Test.kt:5:7:5:7 | var ...; | +| Test.kt:21:3:24:9 | ... -> ... | Test.kt:6:7:6:7 | var ...; | +| Test.kt:21:3:24:9 | ... -> ... | Test.kt:7:7:7:7 | var ...; | +| Test.kt:21:3:24:9 | ... -> ... | Test.kt:8:7:8:7 | var ...; | +| Test.kt:21:3:24:9 | ... -> ... | Test.kt:11:3:16:3 | ... -> ... | +| Test.kt:21:3:24:9 | ... -> ... | Test.kt:11:3:16:3 | ... -> ... | +| Test.kt:21:3:24:9 | ... -> ... | Test.kt:11:3:16:3 | ; | +| Test.kt:21:3:24:9 | ... -> ... | Test.kt:11:14:14:3 | { ... } | +| Test.kt:21:3:24:9 | ... -> ... | Test.kt:12:4:12:4 | ; | +| Test.kt:21:3:24:9 | ... -> ... | Test.kt:13:4:13:4 | ; | +| Test.kt:21:3:24:9 | ... -> ... | Test.kt:14:10:16:3 | { ... } | +| Test.kt:21:3:24:9 | ... -> ... | Test.kt:15:4:15:4 | ; | +| Test.kt:21:3:24:9 | ... -> ... | Test.kt:18:3:18:3 | ; | +| Test.kt:21:3:24:9 | ... -> ... | Test.kt:21:3:24:9 | ; | +| Test.kt:21:3:24:9 | ; | Test.kt:4:13:79:2 | { ... } | +| Test.kt:21:3:24:9 | ; | Test.kt:5:7:5:7 | var ...; | +| Test.kt:21:3:24:9 | ; | Test.kt:6:7:6:7 | var ...; | +| Test.kt:21:3:24:9 | ; | Test.kt:7:7:7:7 | var ...; | +| Test.kt:21:3:24:9 | ; | Test.kt:8:7:8:7 | var ...; | +| Test.kt:21:3:24:9 | ; | Test.kt:11:3:16:3 | ... -> ... | +| Test.kt:21:3:24:9 | ; | Test.kt:11:3:16:3 | ... -> ... | +| Test.kt:21:3:24:9 | ; | Test.kt:11:3:16:3 | ; | +| Test.kt:21:3:24:9 | ; | Test.kt:11:14:14:3 | { ... } | +| Test.kt:21:3:24:9 | ; | Test.kt:12:4:12:4 | ; | +| Test.kt:21:3:24:9 | ; | Test.kt:13:4:13:4 | ; | +| Test.kt:21:3:24:9 | ; | Test.kt:14:10:16:3 | { ... } | +| Test.kt:21:3:24:9 | ; | Test.kt:15:4:15:4 | ; | +| Test.kt:21:3:24:9 | ; | Test.kt:18:3:18:3 | ; | +| Test.kt:24:4:24:9 | return ... | Test.kt:21:3:24:9 | ... -> ... | +| Test.kt:27:3:27:3 | ; | Test.kt:22:4:22:4 | ; | +| Test.kt:30:3:33:3 | ... -> ... | Test.kt:22:4:22:4 | ; | +| Test.kt:30:3:33:3 | ... -> ... | Test.kt:27:3:27:3 | ; | +| Test.kt:30:3:33:3 | ... -> ... | Test.kt:30:3:33:3 | ; | +| Test.kt:30:3:33:3 | ; | Test.kt:22:4:22:4 | ; | +| Test.kt:30:3:33:3 | ; | Test.kt:27:3:27:3 | ; | +| Test.kt:31:4:31:4 | ; | Test.kt:30:15:33:3 | { ... } | +| Test.kt:32:4:32:4 | ; | Test.kt:30:15:33:3 | { ... } | +| Test.kt:32:4:32:4 | ; | Test.kt:31:4:31:4 | ; | +| Test.kt:35:3:35:3 | ; | Test.kt:22:4:22:4 | ; | +| Test.kt:35:3:35:3 | ; | Test.kt:27:3:27:3 | ; | +| Test.kt:35:3:35:3 | ; | Test.kt:30:3:33:3 | ... -> ... | +| Test.kt:35:3:35:3 | ; | Test.kt:30:3:33:3 | ; | +| Test.kt:35:3:35:3 | ; | Test.kt:30:15:33:3 | { ... } | +| Test.kt:35:3:35:3 | ; | Test.kt:31:4:31:4 | ; | +| Test.kt:35:3:35:3 | ; | Test.kt:32:4:32:4 | ; | +| Test.kt:38:3:41:3 | while (...) | Test.kt:22:4:22:4 | ; | +| Test.kt:38:3:41:3 | while (...) | Test.kt:27:3:27:3 | ; | +| Test.kt:38:3:41:3 | while (...) | Test.kt:30:3:33:3 | ... -> ... | +| Test.kt:38:3:41:3 | while (...) | Test.kt:30:3:33:3 | ; | +| 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:4 | ; | +| Test.kt:38:3:41:3 | while (...) | Test.kt:32:4:32:4 | ; | +| Test.kt:38:3:41:3 | while (...) | Test.kt:35:3:35:3 | ; | +| Test.kt:39:4:39:4 | ; | Test.kt:38:16:41:3 | { ... } | +| Test.kt:40:4:40:4 | ; | Test.kt:38:16:41:3 | { ... } | +| Test.kt:40:4:40:4 | ; | Test.kt:39:4:39:4 | ; | +| Test.kt:40:4:40:4 | ; | Test.kt:40:4:40:6 | ; | +| Test.kt:40:4:40:4 | ; | Test.kt:40:4:40:6 | var ...; | +| Test.kt:40:4:40:4 | ; | 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:38:16:41:3 | { ... } | +| Test.kt:40:4:40:6 | ; | Test.kt:39:4:39:4 | ; | +| Test.kt:40:4:40:6 | ; | Test.kt:39:4:39:4 | ; | +| Test.kt:40:4:40:6 | ; | Test.kt:40:4:40:4 | ; | +| 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:38:16:41:3 | { ... } | +| Test.kt:40:4:40:6 | var ...; | Test.kt:39:4:39:4 | ; | +| 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:4 | ; | +| Test.kt:40:4:40:6 | { ... } | Test.kt:40:4:40:6 | ; | +| Test.kt:43:3:43:3 | ; | Test.kt:22:4:22:4 | ; | +| Test.kt:43:3:43:3 | ; | Test.kt:27:3:27:3 | ; | +| Test.kt:43:3:43:3 | ; | Test.kt:30:3:33:3 | ... -> ... | +| Test.kt:43:3:43:3 | ; | Test.kt:30:3:33:3 | ; | +| Test.kt:43:3:43:3 | ; | Test.kt:30:15:33:3 | { ... } | +| Test.kt:43:3:43:3 | ; | Test.kt:31:4:31:4 | ; | +| Test.kt:43:3:43:3 | ; | Test.kt:32:4:32:4 | ; | +| Test.kt:43:3:43:3 | ; | Test.kt:35:3:35:3 | ; | +| Test.kt:43:3:43:3 | ; | Test.kt:38:3:41:3 | while (...) | +| Test.kt:43:3:43:3 | ; | Test.kt:38:16:41:3 | { ... } | +| Test.kt:43:3:43:3 | ; | Test.kt:39:4:39:4 | ; | +| Test.kt:43:3:43:3 | ; | Test.kt:40:4:40:4 | ; | +| Test.kt:43:3:43:3 | ; | Test.kt:40:4:40:6 | ; | +| Test.kt:43:3:43:3 | ; | Test.kt:40:4:40:6 | ; | +| Test.kt:43:3:43:3 | ; | Test.kt:40:4:40:6 | var ...; | +| Test.kt:43:3:43:3 | ; | Test.kt:40:4:40:6 | { ... } | +| Test.kt:73:3:73:3 | ; | Test.kt:22:4:22:4 | ; | +| Test.kt:73:3:73:3 | ; | Test.kt:27:3:27:3 | ; | +| Test.kt:73:3:73:3 | ; | Test.kt:30:3:33:3 | ... -> ... | +| Test.kt:73:3:73:3 | ; | Test.kt:30:3:33:3 | ; | +| Test.kt:73:3:73:3 | ; | Test.kt:30:15:33:3 | { ... } | +| Test.kt:73:3:73:3 | ; | Test.kt:31:4:31:4 | ; | +| Test.kt:73:3:73:3 | ; | Test.kt:32:4:32:4 | ; | +| Test.kt:73:3:73:3 | ; | Test.kt:35:3:35:3 | ; | +| Test.kt:73:3:73:3 | ; | Test.kt:38:3:41:3 | while (...) | +| Test.kt:73:3:73:3 | ; | Test.kt:38:16:41:3 | { ... } | +| Test.kt:73:3:73:3 | ; | Test.kt:39:4:39:4 | ; | +| Test.kt:73:3:73:3 | ; | Test.kt:40:4:40:4 | ; | +| Test.kt:73:3:73:3 | ; | Test.kt:40:4:40:6 | ; | +| Test.kt:73:3:73:3 | ; | Test.kt:40:4:40:6 | ; | +| Test.kt:73:3:73:3 | ; | Test.kt:40:4:40:6 | var ...; | +| Test.kt:73:3:73:3 | ; | Test.kt:40:4:40:6 | { ... } | +| Test.kt:73:3:73:3 | ; | Test.kt:43:3:43:3 | ; | +| Test.kt:77:3:77:3 | ; | Test.kt:22:4:22:4 | ; | +| Test.kt:77:3:77:3 | ; | Test.kt:27:3:27:3 | ; | +| Test.kt:77:3:77:3 | ; | Test.kt:30:3:33:3 | ... -> ... | +| Test.kt:77:3:77:3 | ; | Test.kt:30:3:33:3 | ; | +| Test.kt:77:3:77:3 | ; | Test.kt:30:15:33:3 | { ... } | +| Test.kt:77:3:77:3 | ; | Test.kt:31:4:31:4 | ; | +| Test.kt:77:3:77:3 | ; | Test.kt:32:4:32:4 | ; | +| Test.kt:77:3:77:3 | ; | Test.kt:35:3:35:3 | ; | +| Test.kt:77:3:77:3 | ; | Test.kt:38:3:41:3 | while (...) | +| Test.kt:77:3:77:3 | ; | Test.kt:38:16:41:3 | { ... } | +| Test.kt:77:3:77:3 | ; | Test.kt:39:4:39:4 | ; | +| Test.kt:77:3:77:3 | ; | Test.kt:40:4:40:4 | ; | +| Test.kt:77:3:77:3 | ; | Test.kt:40:4:40:6 | ; | +| Test.kt:77:3:77:3 | ; | Test.kt:40:4:40:6 | ; | +| Test.kt:77:3:77:3 | ; | Test.kt:40:4:40:6 | var ...; | +| Test.kt:77:3:77:3 | ; | Test.kt:40:4:40:6 | { ... } | +| Test.kt:77:3:77:3 | ; | Test.kt:43:3:43:3 | ; | +| Test.kt:77:3:77:3 | ; | Test.kt:73:3:73:3 | ; | +| Test.kt:78:3:78:8 | return ... | Test.kt:22:4:22:4 | ; | +| Test.kt:78:3:78:8 | return ... | Test.kt:27:3:27:3 | ; | +| Test.kt:78:3:78:8 | return ... | Test.kt:30:3:33:3 | ... -> ... | +| Test.kt:78:3:78:8 | return ... | Test.kt:30:3:33:3 | ; | +| 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:4 | ; | +| Test.kt:78:3:78:8 | return ... | Test.kt:32:4:32:4 | ; | +| Test.kt:78:3:78:8 | return ... | Test.kt:35:3:35:3 | ; | +| 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:4 | ; | +| Test.kt:78:3:78:8 | return ... | Test.kt:40:4:40:4 | ; | +| 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:3 | ; | +| Test.kt:78:3:78:8 | return ... | Test.kt:73:3:73:3 | ; | +| Test.kt:78:3:78:8 | return ... | Test.kt:77:3:77:3 | ; | +| 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:7:84:7 | var ...; | Test.kt:82:21:89:1 | { ... } | +| Test.kt:84:7:84:7 | var ...; | Test.kt:83:2:88:2 | try ... | +| Test.kt:84:7:84:7 | 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:7:93:7 | var ...; | Test.kt:91:22:98:1 | { ... } | +| Test.kt:93:7:93:7 | var ...; | Test.kt:92:2:97:2 | try ... | +| Test.kt:93:7:93:7 | 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:5:103:5 | ... -> ... | Test.kt:101:5:103:5 | ; | +| Test.kt:101:5:103:5 | ; | Test.kt:100:25:110:1 | { ... } | +| Test.kt:102:9:102:25 | throw ... | Test.kt:101:33:103:5 | { ... } | +| Test.kt:105:9:107:5 | ... -> ... | 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:5:115:5 | ... -> ... | Test.kt:113:5:115:5 | ; | +| Test.kt:113:5:115:5 | ; | Test.kt:112:32:116: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: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..b76a7777a0d --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/controlflow/dominance/dominator.expected @@ -0,0 +1,157 @@ +| Test.kt:2:43:79:2 | { ... } | Test.kt:3:13:3:13 | var ...; | +| Test.kt:3:13:3:13 | var ...; | Test.kt:3:17:3:18 | px | +| Test.kt:3:13:3:13 | x | Test.kt:4:13:4:13 | var ...; | +| Test.kt:3:17:3:18 | px | Test.kt:3:13:3:13 | x | +| Test.kt:4:13:4:13 | var ...; | Test.kt:4:17:4:18 | pw | +| Test.kt:4:13:4:13 | w | Test.kt:5:13:5:13 | var ...; | +| Test.kt:4:17:4:18 | pw | Test.kt:4:13:4:13 | w | +| Test.kt:5:13:5:13 | var ...; | Test.kt:5:17:5:18 | pz | +| Test.kt:5:13:5:13 | z | Test.kt:7:7:7:7 | var ...; | +| Test.kt:5:17:5:18 | pz | Test.kt:5:13:5:13 | z | +| Test.kt:7:7:7:7 | j | Test.kt:8:7:8:7 | var ...; | +| Test.kt:7:7:7:7 | var ...; | Test.kt:7:7:7:7 | j | +| Test.kt:8:7:8:7 | var ...; | Test.kt:8:17:8:18 | 50 | +| Test.kt:8:7:8:7 | y | Test.kt:11:3:16:3 | ; | +| Test.kt:8:17:8:18 | 50 | Test.kt:8:7:8:7 | y | +| Test.kt:11:3:16:3 | ... -> ... | Test.kt:11:3:16:3 | true | +| Test.kt:11:3:16:3 | ... -> ... | Test.kt:11:7:11:7 | x | +| Test.kt:11:3:16:3 | ; | Test.kt:11:3:16:3 | when ... | +| Test.kt:11:3:16:3 | true | Test.kt:14:10:16:3 | { ... } | +| Test.kt:11:3:16:3 | when ... | Test.kt:11:3:16:3 | ... -> ... | +| Test.kt:11:7:11:7 | x | Test.kt:11:11:11:11 | 0 | +| Test.kt:11:7:11:11 | ... > ... | Test.kt:11:3:16:3 | ... -> ... | +| Test.kt:11:7:11:11 | ... > ... | Test.kt:11:14:14:3 | { ... } | +| Test.kt:11:7:11:11 | ... > ... | Test.kt:18:3:18:3 | ; | +| Test.kt:11:11:11:11 | 0 | Test.kt:11:7:11:11 | ... > ... | +| Test.kt:11:14:14:3 | { ... } | Test.kt:12:4:12:4 | ; | +| Test.kt:12:4:12:4 | ; | Test.kt:12:8:12:9 | 20 | +| Test.kt:12:4:12:9 | ...=... | Test.kt:13:4:13:4 | ; | +| Test.kt:12:8:12:9 | 20 | Test.kt:12:4:12:9 | ...=... | +| Test.kt:13:4:13:4 | ; | 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:15:4:15:4 | ; | +| Test.kt:15:4:15:4 | ; | 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:3 | ; | Test.kt:18:8:18:8 | x | +| Test.kt:18:3:18:20 | ...=... | Test.kt:21:3:24:11 | ; | +| 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 | true | +| Test.kt:21:3:24:11 | ... -> ... | Test.kt:21:7:21:7 | x | +| Test.kt:21:3:24:11 | ; | Test.kt:21:3:24:11 | when ... | +| Test.kt:21:3:24:11 | true | Test.kt:24:11:24:11 | z | +| Test.kt:21:3:24:11 | when ... | Test.kt:21:3:24:11 | ... -> ... | +| Test.kt:21:7:21:7 | x | Test.kt:21:11:21:11 | 0 | +| Test.kt:21:7:21:11 | ... < ... | Test.kt:2:2:79:2 | test | +| Test.kt:21:7:21:11 | ... < ... | Test.kt:21:3:24:11 | ... -> ... | +| Test.kt:21:7:21:11 | ... < ... | Test.kt:22:4:22:4 | ; | +| Test.kt:21:11:21:11 | 0 | Test.kt:21:7:21:11 | ... < ... | +| Test.kt:22:4:22:4 | ; | Test.kt:22:8:22:9 | 40 | +| Test.kt:22:4:22:9 | ...=... | Test.kt:27:3:27:3 | ; | +| Test.kt:22:8:22:9 | 40 | Test.kt:22:4:22:9 | ...=... | +| Test.kt:24:11:24:11 | z | Test.kt:24:4:24:11 | return ... | +| Test.kt:27:3:27:3 | ; | Test.kt:27:7:27:8 | 10 | +| Test.kt:27:3:27:8 | ...=... | Test.kt:30:3:33:3 | ; | +| Test.kt:27:7:27:8 | 10 | Test.kt:27:3:27:8 | ...=... | +| Test.kt:30:3:33:3 | ... -> ... | Test.kt:30:7:30:7 | x | +| Test.kt:30:3:33:3 | ; | Test.kt:30:3:33:3 | when ... | +| Test.kt:30:3:33:3 | when ... | Test.kt:30:3:33:3 | ... -> ... | +| 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:3 | ; | +| 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:4 | ; | +| Test.kt:31:4:31:4 | ; | Test.kt:31:8:31:9 | 60 | +| Test.kt:31:4:31:9 | ...=... | Test.kt:32:4:32:4 | ; | +| Test.kt:31:8:31:9 | 60 | Test.kt:31:4:31:9 | ...=... | +| Test.kt:32:4:32:4 | ; | 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:3 | ; | Test.kt:35:3:35:3 | z | +| Test.kt:35:3:35:3 | z | Test.kt:35:8:35:8 | x | +| Test.kt:35:3:35:8 | ...+=... | Test.kt:38:3:41:3 | while (...) | +| 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:3 | ; | +| Test.kt:38:14:38:14 | 0 | Test.kt:38:10:38:14 | ... > ... | +| Test.kt:38:17:41:3 | { ... } | Test.kt:39:4:39:4 | ; | +| Test.kt:39:4:39:4 | ; | Test.kt:39:8:39:9 | 10 | +| Test.kt:39:4:39:9 | ...=... | Test.kt:40:4:40:6 | ; | +| Test.kt:39:8:39:9 | 10 | Test.kt:39:4:39:9 | ...=... | +| Test.kt:40:4:40:4 | ; | Test.kt:40:4:40:6 | tmp0 | +| Test.kt:40:4:40:4 | x | Test.kt:40:4:40:6 | tmp0 | +| 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 | tmp0 | +| 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 | ...=... | +| Test.kt:40:4:40:6 | tmp0 | Test.kt:40:4:40:4 | ; | +| Test.kt:40:4:40:6 | tmp0 | Test.kt:40:4:40:6 | | +| Test.kt:40:4:40:6 | tmp0 | Test.kt:40:4:40:6 | dec(...) | +| 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:3 | ; | Test.kt:43:3:43:3 | z | +| Test.kt:43:3:43:3 | z | Test.kt:43:8:43:8 | y | +| Test.kt:43:3:43:15 | ...+=... | Test.kt:73:3:73:3 | ; | +| 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:3 | ; | Test.kt:73:3:73:3 | z | +| Test.kt:73:3:73:3 | z | Test.kt:73:8:73:8 | x | +| Test.kt:73:3:73:16 | ...+=... | Test.kt:77:3:77:3 | ; | +| 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:3 | ; | Test.kt:77:7:77:8 | 40 | +| Test.kt:77:3:77:8 | ...=... | Test.kt:78:10:78:10 | w | +| 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:7:83:7 | var ...; | +| Test.kt:83:7:83:7 | b | Test.kt:84:7:84:7 | var ...; | +| Test.kt:83:7:83:7 | var ...; | Test.kt:83:7:83:7 | b | +| Test.kt:84:7:84:7 | c | Test.kt:85:3:85:3 | ; | +| Test.kt:84:7:84:7 | var ...; | Test.kt:84:7:84:7 | c | +| Test.kt:85:3:85:3 | ; | Test.kt:85:7:85:7 | 0 | +| Test.kt:85:3:85:7 | ...=... | Test.kt:86:3:96:3 | while (...) | +| 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:4 | ; | +| Test.kt:87:4:87:4 | ; | Test.kt:87:8:87:9 | 10 | +| Test.kt:87:4:87:9 | ...=... | Test.kt:88:4:91:4 | ; | +| Test.kt:87:8:87:9 | 10 | Test.kt:87:4:87:9 | ...=... | +| Test.kt:88:4:91:4 | ... -> ... | Test.kt:88:8:88:8 | a | +| Test.kt:88:4:91:4 | ; | Test.kt:88:4:91:4 | when ... | +| Test.kt:88:4:91:4 | when ... | Test.kt:88:4:91:4 | ... -> ... | +| Test.kt:88:8:88:8 | a | Test.kt:88:12:88:14 | 100 | +| 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:5 | ; | +| Test.kt:89:5:89:5 | ; | Test.kt:89:9:89:10 | 10 | +| Test.kt:89:5:89:10 | ...=... | Test.kt:90:5:90:5 | ; | +| Test.kt:89:9:89:10 | 10 | Test.kt:89:5:89:10 | ...=... | +| Test.kt:90:5:90:5 | ; | 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:8:92:8 | a | +| Test.kt:92:4:93:9 | ; | Test.kt:92:4:93:9 | when ... | +| Test.kt:92:4:93:9 | when ... | Test.kt:92:4:93:9 | ... -> ... | +| 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: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:8:94:8 | a | +| Test.kt:94:4:95:12 | ; | Test.kt:94:4:95:12 | when ... | +| Test.kt:94:4:95:12 | when ... | Test.kt:94:4:95:12 | ... -> ... | +| 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: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..e5f44bdd7a8 --- /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:12: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..e8b7b5dc239 --- /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 +# 0| 2: [Method] getEntries +# 0| 3: [TypeAccess] EnumEntries +# 0| 0: [TypeAccess] Enu +# 0| 3: [Method] valueOf +# 0| 3: [TypeAccess] Enu +#-----| 4: (Parameters) +# 0| 0: [Parameter] value +# 0| 0: [TypeAccess] String +# 0| 4: [Method] values +# 0| 3: [TypeAccess] Enu[] +# 0| 0: [TypeAccess] Enu +# 23| 5: [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] { ... } +# 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..4aa35cde90b --- /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:34:21:36 | "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:26:22:28 | "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:26:23:28 | "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:40:25:42 | "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:32:26:34 | "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:29:27:31 | "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:38:28:40 | "foo" | +| extensions.kt:29:6:29:27 | bar(...) | extensions.kt:29:6:29:27 | ExtensionsKt | extensions.kt:29:6:29:15 | "someString" | +| extensions.kt:29:6:29:27 | bar(...) | extensions.kt:29:6:29:27 | ExtensionsKt | extensions.kt:29:23:29:25 | "foo" | +| extensions.kt:31:6:31:32 | baz(...) | extensions.kt:31:6:31:32 | new (...) | extensions.kt:31:6:31:15 | "someString" | +| extensions.kt:31:6:31:32 | baz(...) | extensions.kt:31:6:31:32 | new (...) | extensions.kt:31:23:31:30 | "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..dfbf92eb4f9 --- /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:34:21:36 | "foo" | +| extensions.kt:6:28:6:37 | p1 | 0 | extensions.kt:25:40:25:42 | "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:26:22:28 | "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:32:26:34 | "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:26:23:28 | "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:29:27:31 | "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:38:28:40 | "foo" | +| extensions.kt:18:5:18:10 | | 0 | extensions.kt:29:6:29:15 | "someString" | +| extensions.kt:18:16:18:25 | p1 | 1 | extensions.kt:29:23:29:25 | "foo" | +| extensions.kt:30:9:30:14 | | 0 | extensions.kt:31:6:31:15 | "someString" | +| extensions.kt:30:20:30:29 | p1 | 1 | extensions.kt:31:23:31:30 | "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..8b6a502898e --- /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:55:7:59 | "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:48:8:52 | "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:38:12:42 | "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:31:14:35 | "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:8:21:1 | OuterGeneric | +| OuterGeneric.kt:5:16:9:3 | InnerNotGeneric | +| OuterGeneric.kt:13:5:13:21 | InnerGeneric | +| OuterGeneric.kt:15:5:15:25 | InnerGeneric | +| OuterNotGeneric.kt:3:8:11:1 | OuterNotGeneric | +| OuterNotGeneric.kt:5:16: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..1360dba324b --- /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:31 | 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:1:13:1 | 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:1:13:1 | 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:1:13:1 | Generic | +| test.kt:1:1:13:1 | Generic | test.kt:1:1:13:1 | Generic | Generic(java.lang.Object) | T | void | test.kt:1:1:13:1 | Generic | test.kt:1:1:13:1 | 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:11: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:11:10:41 | privateid | privateid(java.lang.Object) | T | T | test.kt:1:1:13:1 | Generic | test.kt:10:11: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..d4b4a4bbff4 --- /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 | rawField | +| Test.kt:1:1:8:1 | TestKt | Test.kt:5:3:5:25 | getRawField | +| Test.kt:1:1:8:1 | TestKt | Test.kt:5: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..930459ffd8b --- /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:6:11:19 | C0 | C0() | +| generics.kt:13:1:18:1 | 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:1:22:1 | 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:11: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..27b9d5d23b7 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/inherited-default-value/test.expected @@ -0,0 +1,2 @@ +| test.kt:3:8:3:28 | f(...) | test.kt:3:8:3:28 | f | test.kt:1:1:5:1 | A | +| test.kt:11:16:11:23 | f$default(...) | test.kt:3:8: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..f1c9f054e08 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/interface-delegate/test.expected @@ -0,0 +1,8 @@ +fields +| intfDelegate.kt:7:26: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:12: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..77a06cf7310 --- /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:12:3:30 | getInternalVal$main | +| test.kt:6:3:6:36 | getInternalVal | +| test.kt:8:12:8:30 | getInternalVar$main | +| test.kt:8:12:8:30 | setInternalVar$main | +| test.kt:10:12: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..993ddb13e55 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/java-lang-number-conversions/test.expected @@ -0,0 +1,53 @@ +| 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 | describeConstable | +| 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..3ae886713c3 --- /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:10:8:38 | fn0 | +| Kotlin.kt:13:40:13:51 | fn0(...) | Kotlin.kt:8:10:8:38 | fn0 | +| Kotlin.kt:14:48:14:59 | fn1(...) | Kotlin.kt:9:18: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:10:8:38 | fn0 | fn0(int) | +| Kotlin.kt:9:18:9:46 | fn1 | fn1(int) | +| Kotlin.kt:13:14:13:51 | fn0 | fn0(int) | +| Kotlin.kt:14:22:14:59 | fn1 | fn1(int) | +overrides +| Java.java:10:17:10:19 | fn0 | Kotlin.kt:8:10:8:38 | fn0 | +| Kotlin.kt:13:14:13:51 | fn0 | Kotlin.kt:8:10:8:38 | fn0 | +| Kotlin.kt:14:22:14:59 | fn1 | Kotlin.kt:9:18:9:46 | fn1 | +signature_mismatch +| Kotlin.kt:9:18: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..43e5e8eefbe --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/java_and_kotlin_internal/visibility.expected @@ -0,0 +1,16 @@ +#select +| Kotlin.kt:2:11:3:2 | kotlinFun$main | final | +| Kotlin.kt:2:11:3:2 | kotlinFun$main | internal | +| Kotlin.kt:6:10:6:36 | topLevelKotlinFun | final | +| Kotlin.kt:6:10:6:36 | topLevelKotlinFun | internal | +| Kotlin.kt:6:10:6:36 | topLevelKotlinFun | static | +isPublic +isInternal +| Kotlin.kt:2:11:3:2 | kotlinFun$main | +| Kotlin.kt:6:10:6:36 | topLevelKotlinFun | +modifiers_methods +| file://:0:0:0:0 | final | Kotlin.kt:2:11:3:2 | kotlinFun$main | +| file://:0:0:0:0 | final | Kotlin.kt:6:10:6:36 | topLevelKotlinFun | +| file://:0:0:0:0 | internal | Kotlin.kt:2:11:3:2 | kotlinFun$main | +| file://:0:0:0:0 | internal | Kotlin.kt:6:10:6:36 | topLevelKotlinFun | +| file://:0:0:0:0 | static | Kotlin.kt:6:10: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..aed31ecc1f8 --- /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" +# 45| 2: [ExtensionMethod] testExtensionFunction +# 45| 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 +# 45| 5: [BlockStmt] { ... } +# 45| 0: [ReturnStmt] return ... +# 45| 0: [MethodCall] testExtensionFunction$default(...) +# 45| -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 +# 45| 3: [ExtensionMethod] testExtensionFunction +#-----| 1: (Annotations) +# 44| 1: [Annotation] JvmOverloads +# 45| 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 +# 45| 4: [ExtensionMethod] testExtensionFunction +# 45| 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 +# 45| 5: [BlockStmt] { ... } +# 45| 0: [ReturnStmt] return ... +# 45| 0: [MethodCall] testExtensionFunction$default(...) +# 45| -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 +# 45| 5: [ExtensionMethod] testExtensionFunction$default +# 45| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 45| 0: [Parameter] p0 +# 45| 0: [TypeAccess] Test +# 45| 1: [Parameter] p1 +# 45| 0: [TypeAccess] int +# 45| 2: [Parameter] p2 +# 45| 0: [TypeAccess] String +# 45| 3: [Parameter] p3 +# 45| 0: [TypeAccess] double +# 45| 4: [Parameter] p4 +# 45| 0: [TypeAccess] float +# 45| 5: [Parameter] p5 +# 45| 0: [TypeAccess] boolean +# 45| 6: [Parameter] p6 +# 45| 0: [TypeAccess] int +# 45| 7: [Parameter] p7 +# 45| 0: [TypeAccess] Object +# 45| 5: [BlockStmt] { ... } +# 45| 0: [IfStmt] if (...) +# 45| 0: [EQExpr] ... == ... +# 45| 0: [AndBitwiseExpr] ... & ... +# 45| 0: [IntegerLiteral] 2 +# 45| 1: [VarAccess] p6 +# 45| 1: [IntegerLiteral] 0 +# 45| 1: [ExprStmt] ; +# 45| 0: [AssignExpr] ...=... +# 45| 0: [VarAccess] p2 +# 45| 1: [MethodCall] getString(...) +# 45| -1: [TypeAccess] TestKt +# 45| 1: [IfStmt] if (...) +# 45| 0: [EQExpr] ... == ... +# 45| 0: [AndBitwiseExpr] ... & ... +# 45| 0: [IntegerLiteral] 8 +# 45| 1: [VarAccess] p6 +# 45| 1: [IntegerLiteral] 0 +# 45| 1: [ExprStmt] ; +# 45| 0: [AssignExpr] ...=... +# 45| 0: [VarAccess] p4 +# 45| 1: [FloatLiteral] 1.0 +# 45| 2: [ReturnStmt] return ... +# 45| 0: [MethodCall] testExtensionFunction(...) +# 45| -1: [TypeAccess] TestKt +# 45| 0: [ExtensionReceiverAccess] this +# 45| 1: [VarAccess] p1 +# 45| 2: [VarAccess] p2 +# 45| 3: [VarAccess] p3 +# 45| 4: [VarAccess] p4 +# 45| 5: [VarAccess] p5 +# 3| 2: [Class] Test +# 3| 1: [Constructor] Test +# 3| 5: [BlockStmt] { ... } +# 3| 0: [SuperConstructorInvocationStmt] super(...) +# 3| 1: [BlockStmt] { ... } +# 6| 2: [Method] testStaticFunction +# 6| 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 +# 6| 5: [BlockStmt] { ... } +# 6| 0: [ReturnStmt] return ... +# 6| 0: [MethodCall] testStaticFunction$default(...) +# 6| -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 +# 6| 3: [Method] testStaticFunction +#-----| 1: (Annotations) +# 5| 1: [Annotation] JvmOverloads +# 5| 2: [Annotation] JvmStatic +# 6| 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 +# 6| 4: [Method] testStaticFunction +# 6| 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 +# 6| 5: [BlockStmt] { ... } +# 6| 0: [ReturnStmt] return ... +# 6| 0: [MethodCall] testStaticFunction$default(...) +# 6| -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 +# 6| 5: [Method] testStaticFunction$default +# 6| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 6| 0: [Parameter] p0 +# 6| 0: [TypeAccess] int +# 6| 1: [Parameter] p1 +# 6| 0: [TypeAccess] String +# 6| 2: [Parameter] p2 +# 6| 0: [TypeAccess] double +# 6| 3: [Parameter] p3 +# 6| 0: [TypeAccess] float +# 6| 4: [Parameter] p4 +# 6| 0: [TypeAccess] boolean +# 6| 5: [Parameter] p5 +# 6| 0: [TypeAccess] int +# 6| 6: [Parameter] p6 +# 6| 0: [TypeAccess] Object +# 6| 5: [BlockStmt] { ... } +# 6| 0: [IfStmt] if (...) +# 6| 0: [EQExpr] ... == ... +# 6| 0: [AndBitwiseExpr] ... & ... +# 6| 0: [IntegerLiteral] 2 +# 6| 1: [VarAccess] p5 +# 6| 1: [IntegerLiteral] 0 +# 6| 1: [ExprStmt] ; +# 6| 0: [AssignExpr] ...=... +# 6| 0: [VarAccess] p1 +# 6| 1: [MethodCall] getString(...) +# 6| -1: [TypeAccess] TestKt +# 6| 1: [IfStmt] if (...) +# 6| 0: [EQExpr] ... == ... +# 6| 0: [AndBitwiseExpr] ... & ... +# 6| 0: [IntegerLiteral] 8 +# 6| 1: [VarAccess] p5 +# 6| 1: [IntegerLiteral] 0 +# 6| 1: [ExprStmt] ; +# 6| 0: [AssignExpr] ...=... +# 6| 0: [VarAccess] p3 +# 6| 1: [FloatLiteral] 1.0 +# 6| 2: [ReturnStmt] return ... +# 6| 0: [MethodCall] testStaticFunction(...) +# 6| -1: [TypeAccess] Test +# 6| 0: [VarAccess] p0 +# 6| 1: [VarAccess] p1 +# 6| 2: [VarAccess] p2 +# 6| 3: [VarAccess] p3 +# 6| 4: [VarAccess] p4 +# 9| 6: [Method] testMemberFunction +# 9| 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 +# 9| 5: [BlockStmt] { ... } +# 9| 0: [ReturnStmt] return ... +# 9| 0: [MethodCall] testMemberFunction$default(...) +# 9| -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 +# 9| 7: [Method] testMemberFunction +#-----| 1: (Annotations) +# 8| 1: [Annotation] JvmOverloads +# 9| 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 +# 9| 8: [Method] testMemberFunction +# 9| 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 +# 9| 5: [BlockStmt] { ... } +# 9| 0: [ReturnStmt] return ... +# 9| 0: [MethodCall] testMemberFunction$default(...) +# 9| -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 +# 9| 9: [Method] testMemberFunction$default +# 9| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 9| 0: [Parameter] p0 +# 9| 0: [TypeAccess] Test +# 9| 1: [Parameter] p1 +# 9| 0: [TypeAccess] int +# 9| 2: [Parameter] p2 +# 9| 0: [TypeAccess] String +# 9| 3: [Parameter] p3 +# 9| 0: [TypeAccess] double +# 9| 4: [Parameter] p4 +# 9| 0: [TypeAccess] float +# 9| 5: [Parameter] p5 +# 9| 0: [TypeAccess] boolean +# 9| 6: [Parameter] p6 +# 9| 0: [TypeAccess] int +# 9| 7: [Parameter] p7 +# 9| 0: [TypeAccess] Object +# 9| 5: [BlockStmt] { ... } +# 9| 0: [IfStmt] if (...) +# 9| 0: [EQExpr] ... == ... +# 9| 0: [AndBitwiseExpr] ... & ... +# 9| 0: [IntegerLiteral] 2 +# 9| 1: [VarAccess] p6 +# 9| 1: [IntegerLiteral] 0 +# 9| 1: [ExprStmt] ; +# 9| 0: [AssignExpr] ...=... +# 9| 0: [VarAccess] p2 +# 9| 1: [MethodCall] getString(...) +# 9| -1: [TypeAccess] TestKt +# 9| 1: [IfStmt] if (...) +# 9| 0: [EQExpr] ... == ... +# 9| 0: [AndBitwiseExpr] ... & ... +# 9| 0: [IntegerLiteral] 8 +# 9| 1: [VarAccess] p6 +# 9| 1: [IntegerLiteral] 0 +# 9| 1: [ExprStmt] ; +# 9| 0: [AssignExpr] ...=... +# 9| 0: [VarAccess] p4 +# 9| 1: [FloatLiteral] 1.0 +# 9| 2: [ReturnStmt] return ... +# 9| 0: [MethodCall] testMemberFunction(...) +# 9| -1: [VarAccess] p0 +# 9| 0: [VarAccess] p1 +# 9| 1: [VarAccess] p2 +# 9| 2: [VarAccess] p3 +# 9| 3: [VarAccess] p4 +# 9| 4: [VarAccess] p5 +# 12| 10: [ExtensionMethod] testMemberExtensionFunction +# 12| 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 +# 12| 5: [BlockStmt] { ... } +# 12| 0: [ReturnStmt] return ... +# 12| 0: [MethodCall] testMemberExtensionFunction$default(...) +# 12| -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 +# 12| 11: [ExtensionMethod] testMemberExtensionFunction +#-----| 1: (Annotations) +# 11| 1: [Annotation] JvmOverloads +# 12| 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 +# 12| 12: [ExtensionMethod] testMemberExtensionFunction +# 12| 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 +# 12| 5: [BlockStmt] { ... } +# 12| 0: [ReturnStmt] return ... +# 12| 0: [MethodCall] testMemberExtensionFunction$default(...) +# 12| -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 +# 12| 13: [ExtensionMethod] testMemberExtensionFunction$default +# 12| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 12| 0: [Parameter] p0 +# 12| 0: [TypeAccess] Test +# 12| 1: [Parameter] p1 +# 12| 0: [TypeAccess] Test2 +# 12| 2: [Parameter] p2 +# 12| 0: [TypeAccess] int +# 12| 3: [Parameter] p3 +# 12| 0: [TypeAccess] String +# 12| 4: [Parameter] p4 +# 12| 0: [TypeAccess] double +# 12| 5: [Parameter] p5 +# 12| 0: [TypeAccess] float +# 12| 6: [Parameter] p6 +# 12| 0: [TypeAccess] boolean +# 12| 7: [Parameter] p7 +# 12| 0: [TypeAccess] int +# 12| 8: [Parameter] p8 +# 12| 0: [TypeAccess] Object +# 12| 5: [BlockStmt] { ... } +# 12| 0: [IfStmt] if (...) +# 12| 0: [EQExpr] ... == ... +# 12| 0: [AndBitwiseExpr] ... & ... +# 12| 0: [IntegerLiteral] 2 +# 12| 1: [VarAccess] p7 +# 12| 1: [IntegerLiteral] 0 +# 12| 1: [ExprStmt] ; +# 12| 0: [AssignExpr] ...=... +# 12| 0: [VarAccess] p3 +# 12| 1: [MethodCall] getString(...) +# 12| -1: [TypeAccess] TestKt +# 12| 1: [IfStmt] if (...) +# 12| 0: [EQExpr] ... == ... +# 12| 0: [AndBitwiseExpr] ... & ... +# 12| 0: [IntegerLiteral] 8 +# 12| 1: [VarAccess] p7 +# 12| 1: [IntegerLiteral] 0 +# 12| 1: [ExprStmt] ; +# 12| 0: [AssignExpr] ...=... +# 12| 0: [VarAccess] p5 +# 12| 1: [FloatLiteral] 1.0 +# 12| 2: [ReturnStmt] return ... +# 12| 0: [MethodCall] testMemberExtensionFunction(...) +# 12| -1: [VarAccess] p0 +# 12| 0: [ExtensionReceiverAccess] this +# 12| 1: [VarAccess] p2 +# 12| 2: [VarAccess] p3 +# 12| 3: [VarAccess] p4 +# 12| 4: [VarAccess] p5 +# 12| 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] { ... } +# 21| 2: [Method] testCompanionFunction +# 21| 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 +# 21| 5: [BlockStmt] { ... } +# 21| 0: [ReturnStmt] return ... +# 21| 0: [MethodCall] testCompanionFunction$default(...) +# 21| -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 +# 21| 3: [Method] testCompanionFunction +#-----| 1: (Annotations) +# 20| 1: [Annotation] JvmOverloads +# 21| 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 +# 21| 4: [Method] testCompanionFunction +# 21| 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 +# 21| 5: [BlockStmt] { ... } +# 21| 0: [ReturnStmt] return ... +# 21| 0: [MethodCall] testCompanionFunction$default(...) +# 21| -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 +# 21| 5: [Method] testCompanionFunction$default +# 21| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 21| 0: [Parameter] p0 +# 21| 0: [TypeAccess] Companion +# 21| 1: [Parameter] p1 +# 21| 0: [TypeAccess] int +# 21| 2: [Parameter] p2 +# 21| 0: [TypeAccess] String +# 21| 3: [Parameter] p3 +# 21| 0: [TypeAccess] double +# 21| 4: [Parameter] p4 +# 21| 0: [TypeAccess] float +# 21| 5: [Parameter] p5 +# 21| 0: [TypeAccess] boolean +# 21| 6: [Parameter] p6 +# 21| 0: [TypeAccess] int +# 21| 7: [Parameter] p7 +# 21| 0: [TypeAccess] Object +# 21| 5: [BlockStmt] { ... } +# 21| 0: [IfStmt] if (...) +# 21| 0: [EQExpr] ... == ... +# 21| 0: [AndBitwiseExpr] ... & ... +# 21| 0: [IntegerLiteral] 2 +# 21| 1: [VarAccess] p6 +# 21| 1: [IntegerLiteral] 0 +# 21| 1: [ExprStmt] ; +# 21| 0: [AssignExpr] ...=... +# 21| 0: [VarAccess] p2 +# 21| 1: [MethodCall] getString(...) +# 21| -1: [TypeAccess] TestKt +# 21| 1: [IfStmt] if (...) +# 21| 0: [EQExpr] ... == ... +# 21| 0: [AndBitwiseExpr] ... & ... +# 21| 0: [IntegerLiteral] 8 +# 21| 1: [VarAccess] p6 +# 21| 1: [IntegerLiteral] 0 +# 21| 1: [ExprStmt] ; +# 21| 0: [AssignExpr] ...=... +# 21| 0: [VarAccess] p4 +# 21| 1: [FloatLiteral] 1.0 +# 21| 2: [ReturnStmt] return ... +# 21| 0: [MethodCall] testCompanionFunction(...) +# 21| -1: [VarAccess] p0 +# 21| 0: [VarAccess] p1 +# 21| 1: [VarAccess] p2 +# 21| 2: [VarAccess] p3 +# 21| 3: [VarAccess] p4 +# 21| 4: [VarAccess] p5 +# 24| 6: [Method] testStaticCompanionFunction +# 24| 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 +# 24| 5: [BlockStmt] { ... } +# 24| 0: [ReturnStmt] return ... +# 24| 0: [MethodCall] testStaticCompanionFunction$default(...) +# 24| -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 +# 24| 7: [Method] testStaticCompanionFunction +#-----| 1: (Annotations) +# 23| 1: [Annotation] JvmOverloads +# 23| 2: [Annotation] JvmStatic +# 24| 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 +# 24| 8: [Method] testStaticCompanionFunction +# 24| 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 +# 24| 5: [BlockStmt] { ... } +# 24| 0: [ReturnStmt] return ... +# 24| 0: [MethodCall] testStaticCompanionFunction$default(...) +# 24| -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 +# 24| 9: [Method] testStaticCompanionFunction$default +# 24| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 24| 0: [Parameter] p0 +# 24| 0: [TypeAccess] Companion +# 24| 1: [Parameter] p1 +# 24| 0: [TypeAccess] int +# 24| 2: [Parameter] p2 +# 24| 0: [TypeAccess] String +# 24| 3: [Parameter] p3 +# 24| 0: [TypeAccess] double +# 24| 4: [Parameter] p4 +# 24| 0: [TypeAccess] float +# 24| 5: [Parameter] p5 +# 24| 0: [TypeAccess] boolean +# 24| 6: [Parameter] p6 +# 24| 0: [TypeAccess] int +# 24| 7: [Parameter] p7 +# 24| 0: [TypeAccess] Object +# 24| 5: [BlockStmt] { ... } +# 24| 0: [IfStmt] if (...) +# 24| 0: [EQExpr] ... == ... +# 24| 0: [AndBitwiseExpr] ... & ... +# 24| 0: [IntegerLiteral] 2 +# 24| 1: [VarAccess] p6 +# 24| 1: [IntegerLiteral] 0 +# 24| 1: [ExprStmt] ; +# 24| 0: [AssignExpr] ...=... +# 24| 0: [VarAccess] p2 +# 24| 1: [MethodCall] getString(...) +# 24| -1: [TypeAccess] TestKt +# 24| 1: [IfStmt] if (...) +# 24| 0: [EQExpr] ... == ... +# 24| 0: [AndBitwiseExpr] ... & ... +# 24| 0: [IntegerLiteral] 8 +# 24| 1: [VarAccess] p6 +# 24| 1: [IntegerLiteral] 0 +# 24| 1: [ExprStmt] ; +# 24| 0: [AssignExpr] ...=... +# 24| 0: [VarAccess] p4 +# 24| 1: [FloatLiteral] 1.0 +# 24| 2: [ReturnStmt] return ... +# 24| 0: [MethodCall] testStaticCompanionFunction(...) +# 24| -1: [VarAccess] p0 +# 24| 0: [VarAccess] p1 +# 24| 1: [VarAccess] p2 +# 24| 2: [VarAccess] p3 +# 24| 3: [VarAccess] p4 +# 24| 4: [VarAccess] p5 +# 24| 6: [Method] testStaticCompanionFunction +# 24| 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 +# 24| 5: [BlockStmt] { ... } +# 24| 0: [ReturnStmt] return ... +# 24| 0: [MethodCall] testStaticCompanionFunction$default(...) +# 24| -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 +# 24| 7: [Method] testStaticCompanionFunction +# 24| 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: [MethodCall] testStaticCompanionFunction(...) +# 24| -1: [VarAccess] Test2.Companion +# 24| -1: [TypeAccess] Test2 +# 24| 0: [VarAccess] a +# 24| 1: [VarAccess] b +# 24| 2: [VarAccess] c +# 24| 3: [VarAccess] d +# 24| 4: [VarAccess] e +# 24| 8: [Method] testStaticCompanionFunction +# 24| 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 +# 24| 5: [BlockStmt] { ... } +# 24| 0: [ReturnStmt] return ... +# 24| 0: [MethodCall] testStaticCompanionFunction$default(...) +# 24| -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 +# 33| 5: [Method] testMemberFunction +# 33| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 33| 0: [Parameter] b +# 33| 0: [TypeAccess] T +# 33| 1: [Parameter] d +# 33| 0: [TypeAccess] T +# 33| 5: [BlockStmt] { ... } +# 33| 0: [ReturnStmt] return ... +# 33| 0: [MethodCall] testMemberFunction$default(...) +# 33| -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 +# 33| 6: [Method] testMemberFunction +#-----| 1: (Annotations) +# 32| 1: [Annotation] JvmOverloads +# 33| 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 +# 33| 7: [Method] testMemberFunction +# 33| 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 +# 33| 5: [BlockStmt] { ... } +# 33| 0: [ReturnStmt] return ... +# 33| 0: [MethodCall] testMemberFunction$default(...) +# 33| -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 +# 33| 8: [Method] testMemberFunction$default +# 33| 3: [TypeAccess] int +#-----| 4: (Parameters) +# 33| 0: [Parameter] p0 +# 33| 0: [TypeAccess] GenericTest<> +# 33| 1: [Parameter] p1 +# 33| 0: [TypeAccess] int +# 33| 2: [Parameter] p2 +# 33| 0: [TypeAccess] Object +# 33| 3: [Parameter] p3 +# 33| 0: [TypeAccess] String +# 33| 4: [Parameter] p4 +# 33| 0: [TypeAccess] Object +# 33| 5: [Parameter] p5 +# 33| 0: [TypeAccess] int +# 33| 6: [Parameter] p6 +# 33| 0: [TypeAccess] Object +# 33| 5: [BlockStmt] { ... } +# 33| 0: [IfStmt] if (...) +# 33| 0: [EQExpr] ... == ... +# 33| 0: [AndBitwiseExpr] ... & ... +# 33| 0: [IntegerLiteral] 1 +# 33| 1: [VarAccess] p5 +# 33| 1: [IntegerLiteral] 0 +# 33| 1: [ExprStmt] ; +# 33| 0: [AssignExpr] ...=... +# 33| 0: [VarAccess] p1 +# 33| 1: [IntegerLiteral] 1 +# 33| 1: [IfStmt] if (...) +# 33| 0: [EQExpr] ... == ... +# 33| 0: [AndBitwiseExpr] ... & ... +# 33| 0: [IntegerLiteral] 4 +# 33| 1: [VarAccess] p5 +# 33| 1: [IntegerLiteral] 0 +# 33| 1: [ExprStmt] ; +# 33| 0: [AssignExpr] ...=... +# 33| 0: [VarAccess] p3 +# 33| 1: [StringLiteral] "Hello world" +# 33| 2: [ReturnStmt] return ... +# 33| 0: [MethodCall] testMemberFunction(...) +# 33| -1: [VarAccess] p0 +# 33| 0: [VarAccess] p1 +# 33| 1: [VarAccess] p2 +# 33| 2: [VarAccess] p3 +# 33| 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..5fcccaca991 --- /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:45:1:45:112 | testExtensionFunction | testExtensionFunction(Test,int,double,boolean) | +| test.kt:0:0:0:0 | TestKt | test.kt:45:1:45:112 | testExtensionFunction | testExtensionFunction(Test,int,java.lang.String,double,boolean) | +| test.kt:0:0:0:0 | TestKt | test.kt:45:1:45:112 | testExtensionFunction | testExtensionFunction(Test,int,java.lang.String,double,float,boolean) | +| test.kt:0:0:0:0 | TestKt | test.kt:45: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:6:3:6:106 | testStaticFunction | testStaticFunction(int,double,boolean) | +| test.kt:3:1:14:1 | Test | test.kt:6:3:6:106 | testStaticFunction | testStaticFunction(int,java.lang.String,double,boolean) | +| test.kt:3:1:14:1 | Test | test.kt:6:3:6:106 | testStaticFunction | testStaticFunction(int,java.lang.String,double,float,boolean) | +| test.kt:3:1:14:1 | Test | test.kt:6: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:9:3:9:106 | testMemberFunction | testMemberFunction(int,double,boolean) | +| test.kt:3:1:14:1 | Test | test.kt:9:3:9:106 | testMemberFunction | testMemberFunction(int,java.lang.String,double,boolean) | +| test.kt:3:1:14:1 | Test | test.kt:9:3:9:106 | testMemberFunction | testMemberFunction(int,java.lang.String,double,float,boolean) | +| test.kt:3:1:14:1 | Test | test.kt:9: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:12:3:12:121 | testMemberExtensionFunction | testMemberExtensionFunction(Test2,int,double,boolean) | +| test.kt:3:1:14:1 | Test | test.kt:12:3:12:121 | testMemberExtensionFunction | testMemberExtensionFunction(Test2,int,java.lang.String,double,boolean) | +| test.kt:3:1:14:1 | Test | test.kt:12:3:12:121 | testMemberExtensionFunction | testMemberExtensionFunction(Test2,int,java.lang.String,double,float,boolean) | +| test.kt:3:1:14:1 | Test | test.kt:12: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:34:28:1 | Test2 | Test2(int,double,boolean) | +| test.kt:16:1:28:1 | Test2 | test.kt:16:34:28:1 | Test2 | Test2(int,java.lang.String,double,boolean) | +| test.kt:16:1:28:1 | Test2 | test.kt:16:34:28:1 | Test2 | Test2(int,java.lang.String,double,float,boolean) | +| test.kt:16:1:28:1 | Test2 | test.kt:16:34:28:1 | Test2 | Test2(int,java.lang.String,double,float,boolean,int,kotlin.jvm.internal.DefaultConstructorMarker) | +| test.kt:16:1:28:1 | Test2 | test.kt:24:5:24:117 | testStaticCompanionFunction | testStaticCompanionFunction(int,double,boolean) | +| test.kt:16:1:28:1 | Test2 | test.kt:24:5:24:117 | testStaticCompanionFunction | testStaticCompanionFunction(int,java.lang.String,double,boolean) | +| test.kt:16:1:28:1 | Test2 | test.kt:24: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:21:5:21:111 | testCompanionFunction | testCompanionFunction(int,double,boolean) | +| test.kt:18:3:26:3 | Companion | test.kt:21:5:21:111 | testCompanionFunction | testCompanionFunction(int,java.lang.String,double,boolean) | +| test.kt:18:3:26:3 | Companion | test.kt:21:5:21:111 | testCompanionFunction | testCompanionFunction(int,java.lang.String,double,float,boolean) | +| test.kt:18:3:26:3 | Companion | test.kt:21: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:24:5:24:117 | testStaticCompanionFunction | testStaticCompanionFunction(int,double,boolean) | +| test.kt:18:3:26:3 | Companion | test.kt:24:5:24:117 | testStaticCompanionFunction | testStaticCompanionFunction(int,java.lang.String,double,boolean) | +| test.kt:18:3:26:3 | Companion | test.kt:24:5:24:117 | testStaticCompanionFunction | testStaticCompanionFunction(int,java.lang.String,double,float,boolean) | +| test.kt:18:3:26:3 | Companion | test.kt:24: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:43:42:1 | GenericTest | GenericTest(int,java.lang.Object,java.lang.Object) | +| test.kt:30:1:42:1 | GenericTest | test.kt:30:43:42:1 | GenericTest | GenericTest(int,java.lang.Object,java.lang.String,java.lang.Object) | +| test.kt:30:1:42:1 | GenericTest | test.kt:30:43:42:1 | 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:43:42:1 | GenericTest | GenericTest(java.lang.Object,java.lang.Object) | +| test.kt:30:1:42:1 | GenericTest | test.kt:33:3:33:84 | testMemberFunction | testMemberFunction(int,java.lang.Object,java.lang.Object) | +| test.kt:30:1:42:1 | GenericTest | test.kt:33:3:33:84 | testMemberFunction | testMemberFunction(int,java.lang.Object,java.lang.String,java.lang.Object) | +| test.kt:30:1:42:1 | GenericTest | test.kt:33:3:33:84 | testMemberFunction | testMemberFunction(java.lang.Object,java.lang.Object) | +| test.kt:30:1:42:1 | GenericTest | test.kt:33: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..24e63cec2a6 --- /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:10:3:10:87 | taintSuppliedAsDefault$default | +| test.kt:22:63:22:70 | source(...) | test.kt:22:92:22:92 | s | test.kt:22:5:22:95 | taintSuppliedAsDefaultStatic$default | +| test.kt:30:55:30:62 | source(...) | test.kt:30:84:30:84 | s | test.kt:30:3:30:87 | taintSuppliedAsDefault$default | +| test.kt:40:53:40:60 | source(...) | test.kt:40:80:40:80 | s | test.kt:40:3:40:83 | taintSuppliedAsDefault$default | +| test.kt:47:92:47:99 | source(...) | test.kt:50:10:50:10 | s | test.kt:47:55:53:1 | ConstructorTaintsByDefault | +| test.kt:63:100:63:107 | source(...) | test.kt:66:10:66:10 | s | test.kt:63:65:69:1 | 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..7bd54989bcf --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/jvmoverloads_generics/test.expected @@ -0,0 +1,9 @@ +| test.kt:4:3:4:94 | genericFunctionWithOverloads | genericFunctionWithOverloads() | return | T | genericFunctionWithOverloads() | +| test.kt:4:3:4:94 | genericFunctionWithOverloads | genericFunctionWithOverloads(java.lang.Object) | param | T | genericFunctionWithOverloads(java.lang.Object) | +| test.kt:4:3:4:94 | genericFunctionWithOverloads | genericFunctionWithOverloads(java.lang.Object) | return | T | genericFunctionWithOverloads(java.lang.Object) | +| test.kt:4:3:4:94 | genericFunctionWithOverloads | genericFunctionWithOverloads(java.lang.Object,java.util.List) | param | List | genericFunctionWithOverloads(java.lang.Object,java.util.List) | +| test.kt:4:3:4:94 | genericFunctionWithOverloads | genericFunctionWithOverloads(java.lang.Object,java.util.List) | param | T | genericFunctionWithOverloads(java.lang.Object,java.util.List) | +| test.kt:4:3:4:94 | genericFunctionWithOverloads | genericFunctionWithOverloads(java.lang.Object,java.util.List) | return | T | genericFunctionWithOverloads(java.lang.Object,java.util.List) | +| test.kt:4: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:4: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:4: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..3f56ec47f8f --- /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:16:13:71 | staticMethod | Method | +| test.kt:9:1:29:1 | HasCompanion | test.kt:16:16:16:43 | getStaticProp | Method | +| test.kt:9:1:29:1 | HasCompanion | test.kt:16:16:16:43 | setStaticProp | Method | +| test.kt:9:1:29:1 | HasCompanion | test.kt:20:18:20:45 | getPropWithStaticGetter | Method | +| test.kt:9:1:29:1 | HasCompanion | test.kt:25:18: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:14:33:69 | staticMethod | Method | +| test.kt:31:1:47:1 | NonCompanion | test.kt:36:14:36:41 | getStaticProp | Method | +| test.kt:31:1:47:1 | NonCompanion | test.kt:36:14:36:41 | setStaticProp | Method | +| test.kt:31:1:47:1 | NonCompanion | test.kt:40:16:40:43 | getPropWithStaticGetter | Method | +| test.kt:31:1:47:1 | NonCompanion | test.kt:45:16: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:16:13:71 | staticMethod(...) | test.kt:13:16: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:16:16:43 | getStaticProp(...) | test.kt:16:16:16:43 | HasCompanion.Companion | instance | +| test.kt:11:3:27:3 | Companion | test.kt:16:16:16:43 | setStaticProp(...) | test.kt:16:16:16:43 | HasCompanion.Companion | instance | +| test.kt:11:3:27:3 | Companion | test.kt:20:18:20:45 | getPropWithStaticGetter(...) | test.kt:20:18: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:43 | setPropWithStaticSetter(...) | test.kt:21:24:21:43 | 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:18:25:60 | setPropWithStaticSetter(...) | test.kt:25:18:25:60 | HasCompanion.Companion | instance | +| test.kt:11:3:27:3 | Companion | test.kt:25:35:25:54 | setPropWithStaticGetter(...) | test.kt:25:35:25:54 | 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:25 | 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:28 | 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:35 | 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:35 | 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:41 | setPropWithStaticSetter(...) | test.kt:41:22:41:41 | 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:52 | setPropWithStaticGetter(...) | test.kt:45:33:45:52 | 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:25 | setStaticProp(...) | test.kt:62:3:62:25 | 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:28 | 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:35 | 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:35 | setPropWithStaticSetter(...) | test.kt:65:3:65:35 | 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..4a54d9d2858 --- /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:22: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:22:2:40 | getTest0$private | +| test.kt:10:13:10:23 | setTest0$private(...) | test.kt:2:22: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..52760d1a6be --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/lazy-val-multiple-constructors/test.expected @@ -0,0 +1,2 @@ +| test.kt:3:20:3:32 | new KProperty1(...) { ... } | test.kt:3:20: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..a22709ce194 --- /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:30: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:32: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:34: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:35:29:45 | "Some string" | StringLiteral | +| literals.kt:30:35:30:46 | "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..12654f3142a --- /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:14:8:34 | foo | k.B.foo | foo(java.lang.String) | W.kt:8:14: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..e254e862090 --- /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 | component1 | component1() | final, public | Compiler generated | +| dataClass.kt:1:1:1:47 | DataClass | dataClass.kt:0:0:0:0 | component2 | component2() | final, public | Compiler generated | +| dataClass.kt:1:1:1:47 | DataClass | dataClass.kt:0:0:0:0 | copy | copy(int,java.lang.String) | final, public | Compiler generated | +| dataClass.kt:1:1:1:47 | DataClass | dataClass.kt:0:0:0:0 | 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: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:22:1:31 | getX | getX() | 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:18:6:5 | getLazyProp | getLazyProp() | final, public | Compiler generated | +| delegates.kt:3:1:12:1 | MyClass | delegates.kt:8:32:11:5 | getObservableProp | getObservableProp() | final, public | Compiler generated | +| delegates.kt:3:1:12:1 | MyClass | delegates.kt:8:32:11:5 | setObservableProp | setObservableProp(java.lang.String) | final, public | Compiler generated | +| delegates.kt:4:18:6:5 | new KProperty1(...) { ... } | delegates.kt:4:18:6:5 | get | get(MyClass) | override, public | | +| delegates.kt:4:18:6:5 | new KProperty1(...) { ... } | delegates.kt:4:18: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:32:11:5 | new KMutableProperty1(...) { ... } | delegates.kt:8:32:11:5 | get | get(MyClass) | override, public | | +| delegates.kt:8:32:11:5 | new KMutableProperty1(...) { ... } | delegates.kt:8:32:11:5 | get | get(MyClass) | override, public | | +| delegates.kt:8:32:11:5 | new KMutableProperty1(...) { ... } | delegates.kt:8:32:11:5 | invoke | invoke(MyClass) | override, public | | +| delegates.kt:8:32:11:5 | new KMutableProperty1(...) { ... } | delegates.kt:8:32:11:5 | invoke | invoke(MyClass) | override, public | | +| delegates.kt:8:32:11:5 | new KMutableProperty1(...) { ... } | delegates.kt:8:32:11:5 | set | set(MyClass,java.lang.String) | override, public | | +| delegates.kt:8:32:11:5 | new KMutableProperty1(...) { ... } | delegates.kt:8:32: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:0:0:0:0 | getEntries | getEntries() | final, public, static | Compiler generated | +| enumClass.kt:1:1:4:1 | EnumClass | enumClass.kt:0:0:0:0 | valueOf | valueOf(java.lang.String) | final, public, static | Compiler generated | +| enumClass.kt:1:1:4:1 | EnumClass | enumClass.kt:0:0:0:0 | 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:0:0:0:0 | getEntries | getEntries() | final, public, static | Compiler generated | +| enumClass.kt:6:1:16:1 | EnumWithFunctions | enumClass.kt:0:0:0:0 | valueOf | valueOf(java.lang.String) | final, public, static | Compiler generated | +| enumClass.kt:6:1:16:1 | EnumWithFunctions | enumClass.kt:0:0:0:0 | values | values() | final, public, static | Compiler generated | +| enumClass.kt:6:1:16:1 | EnumWithFunctions | enumClass.kt:13:12:13:29 | f | f(int) | abstract, public | | +| enumClass.kt:6:1:16:1 | EnumWithFunctions | enumClass.kt:14:12:14:29 | g | g(int) | abstract, public | | +| enumClass.kt:8:3:11:4 | VAL | enumClass.kt:9:14:9:30 | f | f(int) | override, public | | +| enumClass.kt:8:3:11:4 | VAL | enumClass.kt:10:14: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:9: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:12:14:29 | publicFun | publicFun() | final, public | | +| methods.kt:5:1:20:1 | Class | methods.kt:15:15:15:35 | protectedFun | protectedFun() | final, protected | | +| methods.kt:5:1:20:1 | Class | methods.kt:16:13:16:31 | privateFun | privateFun() | final, private | | +| methods.kt:5:1:20:1 | Class | methods.kt:17:14: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:12:19:29 | inlineFun | inlineFun() | final, inline, public | | +constructors +| dataClass.kt:1:1:1:47 | DataClass | dataClass.kt:1:6: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:18:6:5 | new KProperty1(...) { ... } | delegates.kt:4:18:6:5 | | | +| delegates.kt:4:26:6:5 | new Function0(...) { ... } | delegates.kt:4:26:6:5 | | | +| delegates.kt:8:32:11:5 | new KMutableProperty1(...) { ... } | delegates.kt:8:32:11:5 | | | +| delegates.kt:8:32:11:5 | new KMutableProperty1(...) { ... } | delegates.kt:8:32: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:6:4:1 | EnumClass | EnumClass(int) | +| enumClass.kt:6:1:16:1 | EnumWithFunctions | enumClass.kt:6:6: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..d4b3a2e2411 --- /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 | copy | dataClass.kt:1:22:1:31 | x | 0 | +| dataClass.kt:0:0:0:0 | copy | dataClass.kt:1:34:1:46 | y | 1 | +| dataClass.kt:0:0:0:0 | copy$default | dataClass.kt:0:0:0:0 | p0 | 0 | +| dataClass.kt:0:0:0:0 | copy$default | dataClass.kt:0:0:0:0 | p1 | 1 | +| dataClass.kt:0:0:0:0 | copy$default | dataClass.kt:0:0:0:0 | p2 | 2 | +| dataClass.kt:0:0:0:0 | copy$default | dataClass.kt:0:0:0:0 | p3 | 3 | +| dataClass.kt:0:0:0:0 | copy$default | dataClass.kt:0:0:0:0 | p4 | 4 | +| dataClass.kt:0:0:0:0 | equals | dataClass.kt:0:0:0:0 | other | 0 | +| dataClass.kt:1:34:1:46 | setY | dataClass.kt:1:34:1:46 | | 0 | +| delegates.kt:4:18:6:5 | get | delegates.kt:4:18:6:5 | a0 | 0 | +| delegates.kt:4:18:6:5 | invoke | delegates.kt:4:18:6:5 | a0 | 0 | +| delegates.kt:8:32:11:5 | get | delegates.kt:8:32:11:5 | a0 | 0 | +| delegates.kt:8:32:11:5 | get | delegates.kt:8:32:11:5 | a0 | 0 | +| delegates.kt:8:32:11:5 | invoke | delegates.kt:8:32:11:5 | a0 | 0 | +| delegates.kt:8:32:11:5 | invoke | delegates.kt:8:32:11:5 | a0 | 0 | +| delegates.kt:8:32:11:5 | set | delegates.kt:8:32:11:5 | a0 | 0 | +| delegates.kt:8:32:11:5 | set | delegates.kt:8:32:11:5 | a0 | 0 | +| delegates.kt:8:32:11:5 | set | delegates.kt:8:32:11:5 | a1 | 1 | +| delegates.kt:8:32:11:5 | set | delegates.kt:8:32:11:5 | a1 | 1 | +| delegates.kt:8:32:11:5 | setObservableProp | delegates.kt:8:32:11:5 | | 0 | +| 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:0:0:0:0 | valueOf | enumClass.kt:0:0:0:0 | value | 0 | +| enumClass.kt:0:0:0:0 | valueOf | enumClass.kt:0:0:0:0 | value | 0 | +| enumClass.kt:9:14:9:30 | f | enumClass.kt:9:20:9:25 | i | 0 | +| enumClass.kt:10:14:10:42 | g | enumClass.kt:10:20:10:25 | i | 0 | +| enumClass.kt:13:12:13:29 | f | enumClass.kt:13:18:13:23 | i | 0 | +| enumClass.kt:14:12: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..045fdb6d21c --- /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:6: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:13:2:21 | getA$private | Method | final | +| modifiers.kt:2:13: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:15:3:23 | getB | Method | final | +| modifiers.kt:3:15: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:14:4:22 | getC$main | Method | final | +| modifiers.kt:4:14: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:15: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:16:8:29 | getE | Method | final | +| modifiers.kt:8:16: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:12:26:46 | fn4 | Method | final | +| modifiers.kt:26:12:26:46 | fn4 | Method | inline | +| modifiers.kt:26:12:26:46 | fn4 | Method | public | +| modifiers.kt:26:20:26:41 | f | Parameter | noinline | +| modifiers.kt:27:12:27:49 | fn5 | Method | final | +| modifiers.kt:27:12:27:49 | fn5 | Method | inline | +| modifiers.kt:27:12:27:49 | fn5 | Method | public | +| modifiers.kt:27:20:27:44 | f | Parameter | crossinline | +| modifiers.kt:28:12:28:39 | fn6 | Method | final | +| modifiers.kt:28:12:28:39 | fn6 | Method | inline | +| modifiers.kt:28:12: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:8:41:1 | LateInit | Constructor | public | +| 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:36:22:36:40 | getTest0$private | Method | final | +| modifiers.kt:36:22:36:40 | getTest0$private | Method | private | +| modifiers.kt:36:22:36:40 | setTest0$private | Method | final | +| modifiers.kt:36:22:36:40 | setTest0$private | Method | private | +| modifiers.kt:38:5:40:5 | fn | Method | final | +| modifiers.kt:38:5:40:5 | fn | Method | public | +| modifiers.kt:39:22:39:26 | 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..f441807d2f5 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/no-when-branch-found/test.expected @@ -0,0 +1 @@ +| test.kt:0:0:0:0 | throw ... | test.kt:0:0:0:0 | 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..d22a81210ba --- /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: [ArrayAccess] ...[...] +# 2| 0: [VarAccess] arr +# 2| 1: [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..766185e4931 --- /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:6:22:1 | 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 | privateAnonType | +| test.kt:7:1:22:1 | A | test.kt:13:11:15:3 | getPrivateAnonType$private | +| 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 | x | +| test.kt:9:18:11:3 | new If(...) { ... } | test.kt:10:14:10:22 | getX | +| 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 | x | +| test.kt:13:33:15:3 | new If(...) { ... } | test.kt:14:14:14:22 | getX | +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..1f60e9054b2 --- /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:14: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:14:34:36 | getLateInitVar | properties.kt:34:14:34:36 | setLateInitVar | properties.kt:34:5:34:36 | lateInitVar | lateinit, public | +| properties.kt:35:5:35:32 | privateProp | properties.kt:35:13: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:15: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:12: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:14: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:7: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:13:84:29 | getData$private | properties.kt:84:13: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:13: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]

  • CERT C Coding -Standard: FIO30-C. Exclude -user input from format strings.